[strongSwan-dev] [PATCH] ikev1: send delete notification when deleting IKE_SA on rekeying

Timo Teräs timo.teras at iki.fi
Tue May 12 16:43:59 CEST 2015


In IKEv1 it's perfectly acceptable to have multiple IKE_SAs and
they never replace one another implicitly. It makes sense to delete
the obsoleted IKE_SA after rekeying, but delete notification needs
to be sent. Otherwise if the remote monitors the IKE_SA using DPD
it will consider us dead, and might end up flushing CHILD_SAs it
has maybe not yet moved (or potentially also other IKE_SAs like
racoon does).

This seems to fix IKEv1 rekeying against racoon.

Signed-off-by: Timo Teräs <timo.teras at iki.fi>
---
 src/libcharon/processing/jobs/adopt_children_job.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/src/libcharon/processing/jobs/adopt_children_job.c b/src/libcharon/processing/jobs/adopt_children_job.c
index c8a9c17..380900a 100644
--- a/src/libcharon/processing/jobs/adopt_children_job.c
+++ b/src/libcharon/processing/jobs/adopt_children_job.c
@@ -64,6 +64,7 @@ METHOD(job_t, execute, job_requeue_t,
 	ike_sa_id_t *id;
 	ike_sa_t *ike_sa;
 	child_sa_t *child_sa;
+	status_t status;
 
 	ike_sa = charon->ike_sa_manager->checkout(charon->ike_sa_manager, this->id);
 	if (ike_sa)
@@ -96,6 +97,7 @@ METHOD(job_t, execute, job_requeue_t,
 			{	/* not from self */
 				continue;
 			}
+			status = SUCCESS;
 			ike_sa = charon->ike_sa_manager->checkout(charon->ike_sa_manager, id);
 			if (ike_sa)
 			{
@@ -126,20 +128,24 @@ METHOD(job_t, execute, job_requeue_t,
 					ike_sa->clear_virtual_ips(ike_sa, FALSE);
 					if (children->get_count(children) || vips->get_count(vips))
 					{
-						DBG1(DBG_IKE, "detected reauth of existing IKE_SA, "
-							 "adopting %d children and %d virtual IPs",
+						DBG1(DBG_IKE, "adopt_chiren_job detected reauth of existing "
+							 "IKE_SA, adopting %d children and %d virtual IPs",
 							 children->get_count(children), vips->get_count(vips));
 					}
-					ike_sa->set_state(ike_sa, IKE_DELETING);
-					charon->bus->ike_updown(charon->bus, ike_sa, FALSE);
-					charon->ike_sa_manager->checkin_and_destroy(
-											charon->ike_sa_manager, ike_sa);
+					status = ike_sa->delete(ike_sa);
+				}
+
+				if (status == DESTROY_ME)
+				{
+					charon->ike_sa_manager->checkin_and_destroy(charon->ike_sa_manager,
+																ike_sa);
 				}
 				else
 				{
 					charon->ike_sa_manager->checkin(
 											charon->ike_sa_manager, ike_sa);
 				}
+
 				if (children->get_count(children) || vips->get_count(vips))
 				{
 					break;
-- 
2.4.0



More information about the Dev mailing list