aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorClavister OpenSource <opensource@clavister.com>2011-11-24 11:12:59 +0100
committerClavister OpenSource <opensource@clavister.com>2012-03-20 17:30:51 +0100
commitadf7b76f4c7e01963ab0fac1f7e2456d501a55fc (patch)
tree925bbf41144896e9bbfadc261b1b2056fc8cafd2 /src
parent9cc38c8efb4e0f0e7354a62c1e42e0eba04248c1 (diff)
downloadstrongswan-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.h5
-rw-r--r--src/libcharon/sa/task_manager_v1.c27
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;