]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
ike: Mark child-creating tasks if they are recreating CHILD_SAs
authorTobias Brunner <tobias@strongswan.org>
Tue, 26 Nov 2013 13:47:28 +0000 (14:47 +0100)
committerTobias Brunner <tobias@strongswan.org>
Tue, 26 Nov 2013 13:47:28 +0000 (14:47 +0100)
17 files changed:
src/charon-nm/nm/nm_service.c
src/frontends/android/jni/libandroidbridge/backend/android_service.c
src/libcharon/control/controller.c
src/libcharon/plugins/maemo/maemo_service.c
src/libcharon/sa/ike_sa.c
src/libcharon/sa/ike_sa.h
src/libcharon/sa/ikev1/task_manager_v1.c
src/libcharon/sa/ikev1/tasks/quick_delete.c
src/libcharon/sa/ikev1/tasks/quick_mode.c
src/libcharon/sa/ikev1/tasks/quick_mode.h
src/libcharon/sa/ikev2/task_manager_v2.c
src/libcharon/sa/ikev2/tasks/child_create.c
src/libcharon/sa/ikev2/tasks/child_create.h
src/libcharon/sa/ikev2/tasks/child_delete.c
src/libcharon/sa/ikev2/tasks/child_rekey.c
src/libcharon/sa/task_manager.h
src/libcharon/sa/trap_manager.c

index f3736753208946e63228662c1bf80c5c62ebf40e..114783e4b0e7e9bc43fd919253cb81b408876ca7 100644 (file)
@@ -596,7 +596,7 @@ static gboolean connect_(NMVPNPlugin *plugin, NMConnection *connection,
         * Initiate
         */
        child_cfg->get_ref(child_cfg);
-       if (ike_sa->initiate(ike_sa, child_cfg, 0, NULL, NULL) != SUCCESS)
+       if (ike_sa->initiate(ike_sa, child_cfg, 0, FALSE, NULL, NULL) != SUCCESS)
        {
                charon->bus->remove_listener(charon->bus, &priv->listener);
                charon->ike_sa_manager->checkin_and_destroy(charon->ike_sa_manager, ike_sa);
index ccf5ce8e72f588450ed254367459e7183acfb458..9b0bb0f8a7650b0866b869ec2e54e7e43ea3c45e 100644 (file)
@@ -612,7 +612,7 @@ static job_requeue_t initiate(private_android_service_t *this)
 
        /* get an additional reference because initiate consumes one */
        child_cfg->get_ref(child_cfg);
-       if (ike_sa->initiate(ike_sa, child_cfg, 0, NULL, NULL) != SUCCESS)
+       if (ike_sa->initiate(ike_sa, child_cfg, 0, FALSE, NULL, NULL) != SUCCESS)
        {
                DBG1(DBG_CFG, "failed to initiate tunnel");
                charon->ike_sa_manager->checkin_and_destroy(charon->ike_sa_manager,
index c546da5446c3e38d44222f09156708ddf23645eb..1424859c79569e713f635b5cf2d1e06fd7dbd255 100644 (file)
@@ -361,7 +361,8 @@ METHOD(job_t, initiate_execute, job_requeue_t,
        }
        peer_cfg->destroy(peer_cfg);
 
-       if (ike_sa->initiate(ike_sa, listener->child_cfg, 0, NULL, NULL) == SUCCESS)
+       if (ike_sa->initiate(ike_sa, listener->child_cfg, 0, FALSE,
+                                                NULL, NULL) == SUCCESS)
        {
                if (!listener->logger.callback)
                {
index f0f3105c4b21a7269c6c473114e2e4205b2ee8c0..9716bdbf0ceb53525ab7d464f0081b6e53c10102 100644 (file)
@@ -382,7 +382,7 @@ static gboolean initiate_connection(private_maemo_service_t *this,
 
        /* get an additional reference because initiate consumes one */
        child_cfg->get_ref(child_cfg);
-       if (ike_sa->initiate(ike_sa, child_cfg, 0, NULL, NULL) != SUCCESS)
+       if (ike_sa->initiate(ike_sa, child_cfg, 0, FALSE, NULL, NULL) != SUCCESS)
        {
                DBG1(DBG_CFG, "failed to initiate tunnel");
                charon->bus->remove_listener(charon->bus, &this->public.listener);
index d482f8b49c9f9b3574484b9ce5895dd104a2387f..15298a9dd7224baa86a1efc8bb7a0afa831f2794 100644 (file)
@@ -1152,7 +1152,7 @@ static void resolve_hosts(private_ike_sa_t *this)
 
 METHOD(ike_sa_t, initiate, status_t,
        private_ike_sa_t *this, child_cfg_t *child_cfg, u_int32_t reqid,
-       traffic_selector_t *tsi, traffic_selector_t *tsr)
+       bool recreate, traffic_selector_t *tsi, traffic_selector_t *tsr)
 {
        bool defer_initiate = FALSE;
 
@@ -1221,7 +1221,7 @@ METHOD(ike_sa_t, initiate, status_t,
        {
                /* normal IKE_SA with CHILD_SA */
                this->task_manager->queue_child(this->task_manager, child_cfg, reqid,
-                                                                               tsi, tsr);
+                                                                               recreate, tsi, tsr);
 #ifdef ME
                if (this->peer_cfg->get_mediated_by(this->peer_cfg))
                {
@@ -1254,7 +1254,7 @@ METHOD(ike_sa_t, retry_initiate, status_t,
        if (this->retry_initiate_queued)
        {
                this->retry_initiate_queued = FALSE;
-               return initiate(this, NULL, 0, NULL, NULL);
+               return initiate(this, NULL, 0, FALSE, NULL, NULL);
        }
        return SUCCESS;
 }
@@ -1676,7 +1676,7 @@ METHOD(ike_sa_t, reestablish, status_t,
 #ifdef ME
        if (this->peer_cfg->is_mediation(this->peer_cfg))
        {
-               status = new->initiate(new, NULL, 0, NULL, NULL);
+               status = new->initiate(new, NULL, 0, FALSE, NULL, NULL);
        }
        else
 #endif /* ME */
@@ -1722,7 +1722,8 @@ METHOD(ike_sa_t, reestablish, status_t,
                                                 child_cfg->get_name(child_cfg));
                                        child_cfg->get_ref(child_cfg);
                                        status = new->initiate(new, child_cfg,
-                                                                       child_sa->get_reqid(child_sa), NULL, NULL);
+                                                                                  child_sa->get_reqid(child_sa), TRUE,
+                                                                                  NULL, NULL);
                                        break;
                                default:
                                        continue;
@@ -1740,7 +1741,7 @@ METHOD(ike_sa_t, reestablish, status_t,
                        other_tasks->adopt_child_tasks(other_tasks, this->task_manager);
                        if (new->get_state(new) == IKE_CREATED)
                        {
-                               status = new->initiate(new, NULL, 0, NULL, NULL);
+                               status = new->initiate(new, NULL, 0, FALSE, NULL, NULL);
                        }
                }
        }
index 00c16c05e5dc268538347c3c540e3174cff2f000..377eccebab8f5fea16a5f6eae7319a68cdd5a8d2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006-2012 Tobias Brunner
+ * Copyright (C) 2006-2013 Tobias Brunner
  * Copyright (C) 2006 Daniel Roethlisberger
  * Copyright (C) 2005-2009 Martin Willi
  * Copyright (C) 2005 Jan Hutter
@@ -706,7 +706,8 @@ struct ike_sa_t {
         * to the CHILD_SA.
         *
         * @param child_cfg             child config to create CHILD from
-        * @param reqid                 reqid to use for CHILD_SA, 0 assigne uniquely
+        * @param reqid                 reqid to use for CHILD_SA, 0 assign uniquely
+        * @param recreate              TRUE if recreating a previously established CHILD_SA
         * @param tsi                   source of triggering packet
         * @param tsr                   destination of triggering packet.
         * @return
@@ -714,8 +715,8 @@ struct ike_sa_t {
         *                                              - DESTROY_ME if initialization failed
         */
        status_t (*initiate) (ike_sa_t *this, child_cfg_t *child_cfg,
-                                                 u_int32_t reqid, traffic_selector_t *tsi,
-                                                 traffic_selector_t *tsr);
+                                                 u_int32_t reqid, bool recreate,
+                                                 traffic_selector_t *tsi, traffic_selector_t *tsr);
 
        /**
         * Retry initiation of this IKE_SA after it got deferred previously.
index 597416e36c6ed72bb069701b9d8060c16e469cd4..a038b69ec37f2029631c091643b56d174b922da1 100644 (file)
@@ -1086,7 +1086,7 @@ static status_t process_request(private_task_manager_t *this,
                                                 "unestablished IKE_SA, ignored");
                                        return FAILED;
                                }
-                               task = (task_t *)quick_mode_create(this->ike_sa, NULL,
+                               task = (task_t *)quick_mode_create(this->ike_sa, NULL, FALSE,
                                                                                                   NULL, NULL);
                                this->passive_tasks->insert_last(this->passive_tasks, task);
                                break;
@@ -1715,7 +1715,7 @@ METHOD(task_manager_t, queue_ike_reauth, void,
                enumerator->destroy(enumerator);
        }
 
-       if (new->initiate(new, NULL, 0, NULL, NULL) != DESTROY_ME)
+       if (new->initiate(new, NULL, 0, FALSE, NULL, NULL) != DESTROY_ME)
        {
                charon->ike_sa_manager->checkin(charon->ike_sa_manager, new);
                this->ike_sa->set_state(this->ike_sa, IKE_REKEYING);
@@ -1760,11 +1760,11 @@ METHOD(task_manager_t, queue_mobike, void,
 
 METHOD(task_manager_t, queue_child, void,
        private_task_manager_t *this, child_cfg_t *cfg, u_int32_t reqid,
-       traffic_selector_t *tsi, traffic_selector_t *tsr)
+       bool recreate, traffic_selector_t *tsi, traffic_selector_t *tsr)
 {
        quick_mode_t *task;
 
-       task = quick_mode_create(this->ike_sa, cfg, tsi, tsr);
+       task = quick_mode_create(this->ike_sa, cfg, recreate, tsi, tsr);
        task->use_reqid(task, reqid);
 
        queue_task(this, &task->task);
@@ -1859,7 +1859,7 @@ METHOD(task_manager_t, queue_child_rekey, void,
                {
                        child_sa->set_state(child_sa, CHILD_REKEYING);
                        cfg = child_sa->get_config(child_sa);
-                       task = quick_mode_create(this->ike_sa, cfg->get_ref(cfg),
+                       task = quick_mode_create(this->ike_sa, cfg->get_ref(cfg), FALSE,
                                get_first_ts(child_sa, TRUE), get_first_ts(child_sa, FALSE));
                        task->use_reqid(task, child_sa->get_reqid(child_sa));
                        task->rekey(task, child_sa->get_spi(child_sa, TRUE));
index 605c10cea88aad50fe14a92802aeb6511c73d3fe..00fd3c2dbb3dd428ac3b2c74b0cc56397ec0ad61 100644 (file)
@@ -149,7 +149,7 @@ static bool delete_child(private_quick_delete_t *this, protocol_id_t protocol,
                                case ACTION_RESTART:
                                        child_cfg->get_ref(child_cfg);
                                        this->ike_sa->initiate(this->ike_sa, child_cfg,
-                                                                       child_sa->get_reqid(child_sa), NULL, NULL);
+                                                               child_sa->get_reqid(child_sa), TRUE, NULL, NULL);
                                        break;
                                case ACTION_ROUTE:
                                        charon->traps->install(charon->traps,
index 12ee594b9b90dd9bc39077e798c4ae3cb15bfedb..c9e30a9b46c46a5529d14f1adc9a9c6430c2b3af 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 Tobias Brunner
+ * Copyright (C) 2012-2013 Tobias Brunner
  * Hochschule fuer Technik Rapperswil
  *
  * Copyright (C) 2011 Martin Willi
@@ -175,6 +175,11 @@ struct private_quick_mode_t {
         */
        bool udp;
 
+       /**
+        * TRUE if recreating a previously established CHILD_SA
+        */
+       bool recreate;
+
        /** states of quick mode */
        enum {
                QM_INIT,
@@ -1293,6 +1298,12 @@ METHOD(quick_mode_t, rekey, void,
        this->rekey = spi;
 }
 
+METHOD(quick_mode_t, is_recreating, bool,
+       private_quick_mode_t *this)
+{
+       return this->recreate;
+}
+
 METHOD(task_t, migrate, void,
        private_quick_mode_t *this, ike_sa_t *ike_sa)
 {
@@ -1340,7 +1351,8 @@ METHOD(task_t, destroy, void,
  * Described in header.
  */
 quick_mode_t *quick_mode_create(ike_sa_t *ike_sa, child_cfg_t *config,
-                                                       traffic_selector_t *tsi, traffic_selector_t *tsr)
+                                                               bool recreate, traffic_selector_t *tsi,
+                                                               traffic_selector_t *tsr)
 {
        private_quick_mode_t *this;
 
@@ -1353,6 +1365,7 @@ quick_mode_t *quick_mode_create(ike_sa_t *ike_sa, child_cfg_t *config,
                        },
                        .use_reqid = _use_reqid,
                        .rekey = _rekey,
+                       .is_recreating = _is_recreating,
                },
                .ike_sa = ike_sa,
                .initiator = config != NULL,
@@ -1362,6 +1375,7 @@ quick_mode_t *quick_mode_create(ike_sa_t *ike_sa, child_cfg_t *config,
                .tsi = tsi ? tsi->clone(tsi) : NULL,
                .tsr = tsr ? tsr->clone(tsr) : NULL,
                .proto = PROTO_ESP,
+               .recreate = recreate,
        );
 
        if (config)
index 0b80cb836e49e5ea5294c1ce56b9aa3aca57f132..377fc96d42bd8ea71d2d1da7bcb7ecfdf783401c 100644 (file)
@@ -1,4 +1,7 @@
 /*
+ * Copyright (C) 2013 Tobias Brunner
+ * Hochschule fuer Technik Rapperswil
+ *
  * Copyright (C) 2011 Martin Willi
  * Copyright (C) 2011 revosec AG
  *
@@ -50,6 +53,11 @@ struct quick_mode_t {
         * @param spi                   spi of SA to rekey
         */
        void (*rekey)(quick_mode_t *this, u_int32_t spi);
+
+       /**
+        * Whether this task recreates a previously established CHILD_SA.
+        */
+       bool (*is_recreating)(quick_mode_t *this);
 };
 
 /**
@@ -57,11 +65,13 @@ struct quick_mode_t {
  *
  * @param ike_sa               IKE_SA this task works for
  * @param config               child_cfg if task initiator, NULL if responder
+ * @param recreate             TRUE if recreating a previously established CHILD_SA
  * @param tsi                  source of triggering packet, or NULL
  * @param tsr                  destination of triggering packet, or NULL
  * @return                             task to handle by the task_manager
  */
 quick_mode_t *quick_mode_create(ike_sa_t *ike_sa, child_cfg_t *config,
-                                                       traffic_selector_t *tsi, traffic_selector_t *tsr);
+                                                               bool recreate, traffic_selector_t *tsi,
+                                                               traffic_selector_t *tsr);
 
 #endif /** QUICK_MODE_H_ @}*/
index 8e6da16096f2dec7dc2566166dba450aebcffbff..2b8bc10621c78fa2172c8a68dd557d0ddd25e299 100644 (file)
@@ -769,7 +769,7 @@ static status_t process_request(private_task_manager_t *this,
                                task = (task_t*)ike_config_create(this->ike_sa, FALSE);
                                array_insert(this->passive_tasks, ARRAY_TAIL, task);
                                task = (task_t*)child_create_create(this->ike_sa, NULL, FALSE,
-                                                                                                       NULL, NULL);
+                                                                                                       FALSE, NULL, NULL);
                                array_insert(this->passive_tasks, ARRAY_TAIL, task);
                                task = (task_t*)ike_auth_lifetime_create(this->ike_sa, FALSE);
                                array_insert(this->passive_tasks, ARRAY_TAIL, task);
@@ -818,7 +818,7 @@ static status_t process_request(private_task_manager_t *this,
                                        else
                                        {
                                                task = (task_t*)child_create_create(this->ike_sa, NULL,
-                                                                                                                       FALSE, NULL, NULL);
+                                                                                                       FALSE, FALSE, NULL, NULL);
                                        }
                                }
                                else
@@ -1372,11 +1372,11 @@ METHOD(task_manager_t, queue_mobike, void,
 
 METHOD(task_manager_t, queue_child, void,
        private_task_manager_t *this, child_cfg_t *cfg, u_int32_t reqid,
-       traffic_selector_t *tsi, traffic_selector_t *tsr)
+       bool recreate, traffic_selector_t *tsi, traffic_selector_t *tsr)
 {
        child_create_t *task;
 
-       task = child_create_create(this->ike_sa, cfg, FALSE, tsi, tsr);
+       task = child_create_create(this->ike_sa, cfg, FALSE, recreate, tsi, tsr);
        if (reqid)
        {
                task->use_reqid(task, reqid);
index 7cfa537a98de7ddb3e1071cd92e5af6b64bd1cca..8dde28437d0364a9afd8066fe568b376e6972df4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 Tobias Brunner
+ * Copyright (C) 2008-2013 Tobias Brunner
  * Copyright (C) 2005-2008 Martin Willi
  * Copyright (C) 2005 Jan Hutter
  * Hochschule fuer Technik Rapperswil
@@ -178,6 +178,11 @@ struct private_child_create_t {
         * whether we are retrying with another DH group
         */
        bool retry;
+
+       /**
+        * whether we are recreating a previously establishd CHILD_SA
+        */
+       bool recreate;
 };
 
 /**
@@ -1498,6 +1503,12 @@ METHOD(child_create_t, get_lower_nonce, chunk_t,
        }
 }
 
+METHOD(child_create_t, is_recreating, bool,
+       private_child_create_t *this)
+{
+       return this->recreate;
+}
+
 METHOD(task_t, get_type, task_type_t,
        private_child_create_t *this)
 {
@@ -1575,7 +1586,7 @@ METHOD(task_t, destroy, void,
  * Described in header.
  */
 child_create_t *child_create_create(ike_sa_t *ike_sa,
-                                                       child_cfg_t *config, bool rekey,
+                                                       child_cfg_t *config, bool rekey, bool recreate,
                                                        traffic_selector_t *tsi, traffic_selector_t *tsr)
 {
        private_child_create_t *this;
@@ -1586,6 +1597,7 @@ child_create_t *child_create_create(ike_sa_t *ike_sa,
                        .set_config = _set_config,
                        .get_lower_nonce = _get_lower_nonce,
                        .use_reqid = _use_reqid,
+                       .is_recreating = _is_recreating,
                        .task = {
                                .get_type = _get_type,
                                .migrate = _migrate,
@@ -1604,6 +1616,7 @@ child_create_t *child_create_create(ike_sa_t *ike_sa,
                .ipcomp_received = IPCOMP_NONE,
                .rekey = rekey,
                .retry = FALSE,
+               .recreate = recreate,
        );
 
        if (config)
index d29ba3d987bc410a4f0f6f5d07063000297ce7c2..896e7fcf189f91532b5a09fea1b0c37472c49457 100644 (file)
@@ -1,4 +1,5 @@
 /*
+ * Copyright (C) 2013 Tobias Brunner
  * Copyright (C) 2007 Martin Willi
  * Hochschule fuer Technik Rapperswil
  *
@@ -71,6 +72,11 @@ struct child_create_t {
         * @param cfg           configuration to enforce, reference gets owned
         */
        void (*set_config)(child_create_t *this, child_cfg_t *cfg);
+
+       /**
+        * Whether this task recreates a previously established CHILD_SA.
+        */
+       bool (*is_recreating)(child_create_t *this);
 };
 
 /**
@@ -79,12 +85,13 @@ struct child_create_t {
  * @param ike_sa               IKE_SA this task works for
  * @param config               child_cfg if task initiator, NULL if responder
  * @param rekey                        whether we do a rekey or not
+ * @param recreate             whether we recreate a previous CHILD_SA
  * @param tsi                  source of triggering packet, or NULL
  * @param tsr                  destination of triggering packet, or NULL
  * @return                             child_create task to handle by the task_manager
  */
 child_create_t *child_create_create(ike_sa_t *ike_sa,
-                                                       child_cfg_t *config, bool rekey,
+                                                       child_cfg_t *config, bool rekey, bool recreate,
                                                        traffic_selector_t *tsi, traffic_selector_t *tsr);
 
 #endif /** CHILD_CREATE_H_ @}*/
index e898efc88e235e6951e6846ce979bc27753837cf..3f2f30d5b60f18750e177eb441e36c7b44634a29 100644 (file)
@@ -224,7 +224,7 @@ static status_t destroy_and_reestablish(private_child_delete_t *this)
                                case ACTION_RESTART:
                                        child_cfg->get_ref(child_cfg);
                                        status = this->ike_sa->initiate(this->ike_sa, child_cfg,
-                                                                                                       reqid, NULL, NULL);
+                                                                                                       reqid, TRUE, NULL, NULL);
                                        break;
                                case ACTION_ROUTE:
                                        charon->traps->install(charon->traps,
index d2003bb452de7c67b2c8ce0b0d769ee309bfd16d..0fa90545cd546eccdc0db7a1c672ca03a9a259ce 100644 (file)
@@ -179,8 +179,9 @@ METHOD(task_t, build_i, status_t,
        /* ... our CHILD_CREATE task does the hard work for us. */
        if (!this->child_create)
        {
-               this->child_create = child_create_create(this->ike_sa,
-                                                                       config->get_ref(config), TRUE, NULL, NULL);
+               config = config->get_ref(config);
+               this->child_create = child_create_create(this->ike_sa, config, TRUE,
+                                                                                                FALSE, NULL, NULL);
        }
        reqid = this->child_sa->get_reqid(this->child_sa);
        this->child_create->use_reqid(this->child_create, reqid);
@@ -498,7 +499,8 @@ child_rekey_t *child_rekey_create(ike_sa_t *ike_sa, protocol_id_t protocol,
                this->public.task.build = _build_r;
                this->public.task.process = _process_r;
                this->initiator = FALSE;
-               this->child_create = child_create_create(ike_sa, NULL, TRUE, NULL, NULL);
+               this->child_create = child_create_create(ike_sa, NULL, TRUE, FALSE,
+                                                                                                NULL, NULL);
        }
 
        return &this->public;
index a1ebb4117b2953a0b57916c8aaa4b0a2248c5e78..191ef1ddb0d32bfa970a7eb44084cc4fd21c980d 100644 (file)
@@ -1,4 +1,5 @@
 /*
+ * Copyright (C) 2013 Tobias Brunner
  * Copyright (C) 2006 Martin Willi
  * Hochschule fuer Technik Rapperswil
  *
@@ -157,11 +158,13 @@ struct task_manager_t {
         *
         * @param cfg                   CHILD_SA config to establish
         * @param reqid                 reqid to use for CHILD_SA
+        * @param recreate              TRUE if recreating a previously established CHILD_SA
         * @param tsi                   initiator traffic selector, if packet-triggered
         * @param tsr                   responder traffic selector, if packet-triggered
         */
        void (*queue_child)(task_manager_t *this, child_cfg_t *cfg, u_int32_t reqid,
-                                               traffic_selector_t *tsi, traffic_selector_t *tsr);
+                                               bool recreate, traffic_selector_t *tsi,
+                                               traffic_selector_t *tsr);
 
        /**
         * Queue CHILD_SA rekeying tasks.
index 7e55d6b0f5b032a36ed81960645174ece775ca42..79929f97d286bf6e15b030dc91fcace798174e2e 100644 (file)
@@ -358,7 +358,8 @@ METHOD(trap_manager_t, acquire, void,
                         * have a single TS that we can establish in a Quick Mode. */
                        src = dst = NULL;
                }
-               if (ike_sa->initiate(ike_sa, child, reqid, src, dst) != DESTROY_ME)
+               if (ike_sa->initiate(ike_sa, child, reqid, FALSE,
+                                                        src, dst) != DESTROY_ME)
                {
                        /* make sure the entry is still there */
                        this->lock->read_lock(this->lock);