aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2013-07-04 19:14:44 +0200
committerTobias Brunner <tobias@strongswan.org>2013-07-17 18:16:59 +0200
commita9ffb48f2132780f72a525bfd061afa8c1d8afe4 (patch)
tree6c18e3bda0ed8504d2e869bf83f86b57a09aa77d
parent68db844f99d7221e5336c93b13765a395980ba81 (diff)
downloadstrongswan-a9ffb48f2132780f72a525bfd061afa8c1d8afe4.tar.bz2
strongswan-a9ffb48f2132780f72a525bfd061afa8c1d8afe4.tar.xz
ikev1: Reestablish IKE_SA/CHILD_SAs if it gets deleted by the peer
We call ike_sa_t.reestablish() so the IKE_SA is only recreated if any CHILD_SA requires it.
-rw-r--r--src/libcharon/sa/ikev1/tasks/isakmp_delete.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/libcharon/sa/ikev1/tasks/isakmp_delete.c b/src/libcharon/sa/ikev1/tasks/isakmp_delete.c
index 0640d13b1..a44f3c4a9 100644
--- a/src/libcharon/sa/ikev1/tasks/isakmp_delete.c
+++ b/src/libcharon/sa/ikev1/tasks/isakmp_delete.c
@@ -85,6 +85,11 @@ METHOD(task_t, process_r, status_t,
this->ike_sa->get_other_host(this->ike_sa),
this->ike_sa->get_other_id(this->ike_sa));
+ if (this->ike_sa->get_state(this->ike_sa) == IKE_ESTABLISHED)
+ {
+ this->ike_sa->set_state(this->ike_sa, IKE_DELETING);
+ this->ike_sa->reestablish(this->ike_sa);
+ }
this->ike_sa->set_state(this->ike_sa, IKE_DELETING);
charon->bus->ike_updown(charon->bus, this->ike_sa, FALSE);
return DESTROY_ME;