diff options
author | Clavister OpenSource <opensource@clavister.com> | 2011-11-24 11:12:59 +0100 |
---|---|---|
committer | Clavister OpenSource <opensource@clavister.com> | 2012-03-20 17:30:51 +0100 |
commit | adf7b76f4c7e01963ab0fac1f7e2456d501a55fc (patch) | |
tree | 925bbf41144896e9bbfadc261b1b2056fc8cafd2 /src | |
parent | 9cc38c8efb4e0f0e7354a62c1e42e0eba04248c1 (diff) | |
download | strongswan-adf7b76f4c7e01963ab0fac1f7e2456d501a55fc.tar.bz2 strongswan-adf7b76f4c7e01963ab0fac1f7e2456d501a55fc.tar.xz |
IKEv1 XAuth: Temporarilty add an "initiate_later" flag to the task manager. When set to TRUE it will cause "initiate" to be called when the current process_response call is finished. This change should be reverted once we have a better method in place.
Diffstat (limited to 'src')
-rw-r--r-- | src/libcharon/sa/task_manager.h | 5 | ||||
-rw-r--r-- | src/libcharon/sa/task_manager_v1.c | 27 |
2 files changed, 31 insertions, 1 deletions
diff --git a/src/libcharon/sa/task_manager.h b/src/libcharon/sa/task_manager.h index 42a04fb64..f0a1921c0 100644 --- a/src/libcharon/sa/task_manager.h +++ b/src/libcharon/sa/task_manager.h @@ -192,6 +192,11 @@ struct task_manager_t { * Destroy the task_manager_t. */ void (*destroy) (task_manager_t *this); + + /** + * Signals the task manager to initiate immediately after completing a response + */ + void (*initiate_later) (task_manager_t *this); }; /** diff --git a/src/libcharon/sa/task_manager_v1.c b/src/libcharon/sa/task_manager_v1.c index cecb87902..13d95b4fa 100644 --- a/src/libcharon/sa/task_manager_v1.c +++ b/src/libcharon/sa/task_manager_v1.c @@ -144,6 +144,11 @@ struct private_task_manager_t { * Base to calculate retransmission timeout */ double retransmit_base; + + /** + * Signal to the task manager that we need to initiate a transaction after the response is sent. + */ + bool initiate_later_flag; }; /** @@ -297,6 +302,10 @@ METHOD(task_manager_t, initiate, status_t, case TASK_QUICK_MODE: exchange = QUICK_MODE; break; + case TASK_XAUTH_REQUEST: + exchange = TRANSACTION; + new_mid = TRUE; + break; default: continue; } @@ -477,6 +486,7 @@ static status_t process_request(private_task_manager_t *this, { enumerator_t *enumerator; task_t *task = NULL; + status_t process_status; if (this->passive_tasks->get_count(this->passive_tasks) == 0) { /* create tasks depending on request type, if not already some queued */ @@ -530,7 +540,14 @@ static status_t process_request(private_task_manager_t *this, } enumerator->destroy(enumerator); - return build_response(this, message); + process_status = build_response(this, message); + + if(((process_status == SUCCESS) || (process_status == NEED_MORE)) && (this->initiate_later_flag == TRUE)) + { + this->initiate_later_flag = FALSE; + return initiate(this); + } + return process_status; } /** @@ -704,6 +721,12 @@ METHOD(task_manager_t, destroy, void, free(this); } +METHOD(task_manager_t, initiate_later, void, + private_task_manager_t *this) +{ + this->initiate_later_flag = TRUE; +} + /* * see header file */ @@ -724,6 +747,7 @@ task_manager_v1_t *task_manager_v1_create(ike_sa_t *ike_sa) .busy = _busy, .create_task_enumerator = _create_task_enumerator, .destroy = _destroy, + .initiate_later = _initiate_later, }, }, .ike_sa = ike_sa, @@ -738,6 +762,7 @@ task_manager_v1_t *task_manager_v1_create(ike_sa_t *ike_sa) "charon.retransmit_timeout", RETRANSMIT_TIMEOUT), .retransmit_base = lib->settings->get_double(lib->settings, "charon.retransmit_base", RETRANSMIT_BASE), + .initiate_later_flag = FALSE, ); return &this->public; |