ikev1: Trigger down events for CHILD_SAs if reauthentication failed due to retransmits
authorTobias Brunner <tobias@strongswan.org>
Thu, 1 Mar 2018 17:02:08 +0000 (18:02 +0100)
committerTobias Brunner <tobias@strongswan.org>
Thu, 12 Apr 2018 13:17:24 +0000 (15:17 +0200)
src/libcharon/sa/ike_sa.c

index 7f272a9..c6cacdf 100644 (file)
@@ -2350,11 +2350,27 @@ METHOD(ike_sa_t, retransmit, status_t,
 
                                if (this->version == IKEV1 && array_count(this->child_sas))
                                {
+                                       enumerator_t *enumerator;
+                                       child_sa_t *child_sa;
+
                                        /* if reauthenticating an IKEv1 SA failed (assumed for an SA
                                         * in this state with CHILD_SAs), try again from scratch */
                                        DBG1(DBG_IKE, "reauthentication failed, trying to "
                                                 "reestablish IKE_SA");
                                        reestablish(this);
+                                       /* trigger down events for the CHILD_SAs, as no down event
+                                        * is triggered below for IKE SAs in this state */
+                                       enumerator = array_create_enumerator(this->child_sas);
+                                       while (enumerator->enumerate(enumerator, &child_sa))
+                                       {
+                                               if (child_sa->get_state(child_sa) != CHILD_REKEYED &&
+                                                       child_sa->get_state(child_sa) != CHILD_DELETED)
+                                               {
+                                                       charon->bus->child_updown(charon->bus, child_sa,
+                                                                                                         FALSE);
+                                               }
+                                       }
+                                       enumerator->destroy(enumerator);
                                }
                                break;
                        }