child-sa: Introduce a unique CHILD_SA identifier
authorMartin Willi <martin@revosec.ch>
Thu, 23 Oct 2014 09:27:25 +0000 (11:27 +0200)
committerMartin Willi <martin@revosec.ch>
Fri, 20 Feb 2015 12:34:49 +0000 (13:34 +0100)
As the reqid is not that unique even among multiple IKE_SAs anymore, we need
an identifier to uniquely identify a specific CHILD_SA instance.

src/libcharon/sa/child_sa.c
src/libcharon/sa/child_sa.h

index af9e754..7625be1 100644 (file)
@@ -105,6 +105,11 @@ struct private_child_sa_t {
         */
        bool reqid_allocated;
 
+       /*
+        * Unique CHILD_SA identifier
+        */
+       u_int32_t unique_id;
+
        /**
         * inbound mark used for this child_sa
         */
@@ -234,6 +239,12 @@ METHOD(child_sa_t, get_reqid, u_int32_t,
        return this->reqid;
 }
 
+METHOD(child_sa_t, get_unique_id, u_int32_t,
+       private_child_sa_t *this)
+{
+       return this->unique_id;
+}
+
 METHOD(child_sa_t, get_config, child_cfg_t*,
           private_child_sa_t *this)
 {
@@ -1190,11 +1201,13 @@ child_sa_t * child_sa_create(host_t *me, host_t* other,
                                                         child_cfg_t *config, u_int32_t rekey, bool encap)
 {
        private_child_sa_t *this;
+       static refcount_t unique_id = 0;
 
        INIT(this,
                .public = {
                        .get_name = _get_name,
                        .get_reqid = _get_reqid,
+                       .get_unique_id = _get_unique_id,
                        .get_config = _get_config,
                        .get_state = _get_state,
                        .set_state = _set_state,
@@ -1236,6 +1249,7 @@ child_sa_t * child_sa_create(host_t *me, host_t* other,
                .close_action = config->get_close_action(config),
                .dpd_action = config->get_dpd_action(config),
                .reqid = config->get_reqid(config),
+               .unique_id = ref_get(&unique_id),
                .mark_in = config->get_mark(config, TRUE),
                .mark_out = config->get_mark(config, FALSE),
                .install_time = time_monotonic(NULL),
index 30a0edf..f0ec016 100644 (file)
@@ -126,6 +126,16 @@ struct child_sa_t {
        u_int32_t (*get_reqid)(child_sa_t *this);
 
        /**
+        * Get the unique numerical identifier for this CHILD_SA.
+        *
+        * While the same reqid might be shared between multiple SAs, the unique_id
+        * is truly unique for all CHILD_SA instances.
+        *
+        * @return                      unique CHILD_SA identifier
+        */
+       u_int32_t (*get_unique_id)(child_sa_t *this);
+
+       /**
         * Get the config used to set up this child sa.
         *
         * @return                      child_cfg