aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Willi <martin@strongswan.org>2008-11-28 10:49:14 +0000
committerMartin Willi <martin@strongswan.org>2008-11-28 10:49:14 +0000
commitc610f424306ff261b6d5d438f8009f05c6cfa3d9 (patch)
tree2bc0c398954efbaeafa43872f7fe622430f33a1c /src
parentddef45521943034c9c43fe3c39fc3e3fa74e3bf0 (diff)
downloadstrongswan-c610f424306ff261b6d5d438f8009f05c6cfa3d9.tar.bz2
strongswan-c610f424306ff261b6d5d438f8009f05c6cfa3d9.tar.xz
added a PASSIVE IKE_SA state to manage it externally
Diffstat (limited to 'src')
-rw-r--r--src/charon/sa/ike_sa.c24
-rw-r--r--src/charon/sa/ike_sa.h5
2 files changed, 25 insertions, 4 deletions
diff --git a/src/charon/sa/ike_sa.c b/src/charon/sa/ike_sa.c
index cc74a953a..ea25dea99 100644
--- a/src/charon/sa/ike_sa.c
+++ b/src/charon/sa/ike_sa.c
@@ -66,6 +66,7 @@ ENUM(ike_sa_state_names, IKE_CREATED, IKE_DESTROYING,
"CREATED",
"CONNECTING",
"ESTABLISHED",
+ "PASSIVE",
"REKEYING",
"DELETING",
"DESTROYING",
@@ -1214,11 +1215,17 @@ static status_t acquire(private_ike_sa_t *this, u_int32_t reqid)
iterator_t *iterator;
child_sa_t *current, *child_sa = NULL;
- if (this->state == IKE_DELETING)
+ switch (this->state)
{
- DBG1(DBG_IKE, "acquiring CHILD_SA {reqid %d} failed: "
- "IKE_SA is deleting", reqid);
- return FAILED;
+ case IKE_DELETING:
+ DBG1(DBG_IKE, "acquiring CHILD_SA {reqid %d} failed: "
+ "IKE_SA is deleting", reqid);
+ return FAILED;
+ case IKE_PASSIVE:
+ /* do not process acquires if passive */
+ return FAILED;
+ default:
+ break;
}
/* find CHILD_SA */
@@ -1280,6 +1287,7 @@ static status_t route(private_ike_sa_t *this, child_cfg_t *child_cfg)
case IKE_CREATED:
case IKE_CONNECTING:
case IKE_ESTABLISHED:
+ case IKE_PASSIVE:
default:
break;
}
@@ -1368,6 +1376,11 @@ static status_t process_message(private_ike_sa_t *this, message_t *message)
status_t status;
bool is_request;
+ if (this->state == IKE_PASSIVE)
+ { /* do not handle messages in passive state */
+ return FAILED;
+ }
+
is_request = message->get_request(message);
status = message->parse_body(message,
@@ -1685,6 +1698,8 @@ static status_t delete_(private_ike_sa_t *this)
case IKE_CREATED:
DBG1(DBG_IKE, "deleting unestablished IKE_SA");
break;
+ case IKE_PASSIVE:
+ break;
default:
DBG1(DBG_IKE, "destroying IKE_SA in state %N "
"without notification", ike_sa_state_names, this->state);
@@ -1958,6 +1973,7 @@ static status_t roam(private_ike_sa_t *this, bool address)
{
case IKE_CREATED:
case IKE_DELETING:
+ case IKE_PASSIVE:
return SUCCESS;
default:
break;
diff --git a/src/charon/sa/ike_sa.h b/src/charon/sa/ike_sa.h
index 634e78a31..c792ed2e1 100644
--- a/src/charon/sa/ike_sa.h
+++ b/src/charon/sa/ike_sa.h
@@ -200,6 +200,11 @@ enum ike_sa_state_t {
IKE_ESTABLISHED,
/**
+ * IKE_SA is managed externally and does not process messages
+ */
+ IKE_PASSIVE,
+
+ /**
* IKE_SA rekeying in progress
*/
IKE_REKEYING,