diff options
author | Tobias Brunner <tobias@strongswan.org> | 2015-09-28 17:30:36 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2015-10-30 10:27:09 +0100 |
commit | b0b0c9137d7bfd7afe54f64e49bc45d317a8e101 (patch) | |
tree | 32aa6248111ce92f7b36f75490eb70628cdda6da /src | |
parent | 0cb8752b857487a706f4ab12e0c71dae615648b0 (diff) | |
download | strongswan-b0b0c9137d7bfd7afe54f64e49bc45d317a8e101.tar.bz2 strongswan-b0b0c9137d7bfd7afe54f64e49bc45d317a8e101.tar.xz |
ikev1: Drop TRANSACTION/QUICK_MODE requests until we received the last AM message
Diffstat (limited to 'src')
-rw-r--r-- | src/libcharon/sa/ikev1/task_manager_v1.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/libcharon/sa/ikev1/task_manager_v1.c b/src/libcharon/sa/ikev1/task_manager_v1.c index e1747d2c6..1a6f868dd 100644 --- a/src/libcharon/sa/ikev1/task_manager_v1.c +++ b/src/libcharon/sa/ikev1/task_manager_v1.c @@ -935,6 +935,28 @@ static bool have_quick_mode_task(private_task_manager_t *this, u_int32_t mid) } /** + * Check if we still have an aggressive mode task queued + */ +static bool have_aggressive_mode_task(private_task_manager_t *this) +{ + enumerator_t *enumerator; + task_t *task; + bool found = FALSE; + + enumerator = this->passive_tasks->create_enumerator(this->passive_tasks); + while (enumerator->enumerate(enumerator, &task)) + { + if (task->get_type(task) == TASK_AGGRESSIVE_MODE) + { + found = TRUE; + break; + } + } + enumerator->destroy(enumerator); + return found; +} + +/** * handle an incoming request message */ static status_t process_request(private_task_manager_t *this, @@ -1340,6 +1362,16 @@ METHOD(task_manager_t, process_message, status_t, } } + /* drop XAuth/Mode Config/Quick Mode messages until we received the last + * Aggressive Mode message */ + if (have_aggressive_mode_task(this) && + msg->get_exchange_type(msg) != AGGRESSIVE) + { + DBG1(DBG_IKE, "ignoring %N request while phase 1 is incomplete", + exchange_type_names, msg->get_exchange_type(msg)); + return FAILED; + } + if (msg->get_exchange_type(msg) == TRANSACTION && this->active_tasks->get_count(this->active_tasks)) { /* main mode not yet complete, queue XAuth/Mode config tasks */ |