charon-tkm: Store reqid in SAD
authorReto Buerki <reet@codelabs.ch>
Thu, 18 Dec 2014 16:58:26 +0000 (17:58 +0100)
committerMartin Willi <martin@revosec.ch>
Fri, 20 Feb 2015 12:34:53 +0000 (13:34 +0100)
src/charon-tkm/src/tkm/tkm_kernel_ipsec.c
src/charon-tkm/src/tkm/tkm_kernel_sad.c
src/charon-tkm/src/tkm/tkm_kernel_sad.h
src/charon-tkm/tests/kernel_sad_tests.c

index 3f1b0bb..a62e2b1 100644 (file)
@@ -136,7 +136,8 @@ METHOD(kernel_ipsec_t, add_sa, status_t,
        }
 
        esa_id = tkm->idmgr->acquire_id(tkm->idmgr, TKM_CTX_ESA);
-       if (!tkm->sad->insert(tkm->sad, esa_id, local, peer, spi_rem, protocol))
+       if (!tkm->sad->insert(tkm->sad, reqid, esa_id, local, peer, spi_rem,
+                                                 protocol))
        {
                DBG1(DBG_KNL, "unable to add entry (%llu) to SAD", esa_id);
                goto sad_failure;
index 360a47b..3dcecb5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 Reto Buerki
+ * Copyright (C) 2012-2014 Reto Buerki
  * Copyright (C) 2012 Adrian-Ken Rueegsegger
  * Hochschule fuer Technik Rapperswil
  *
@@ -57,6 +57,11 @@ struct sad_entry_t {
        esa_id_type esa_id;
 
        /**
+        * Reqid.
+        */
+       u_int32_t reqid;
+
+       /**
         * Source address of CHILD SA.
         */
        host_t *src;
@@ -119,6 +124,7 @@ static bool sad_entry_equal(sad_entry_t * const left, sad_entry_t * const right)
                return FALSE;
        }
        return left->esa_id == right->esa_id &&
+                  left->reqid == right->reqid &&
                   left->src->ip_equals(left->src, right->src) &&
                   left->dst->ip_equals(left->dst, right->dst) &&
                   left->spi == right->spi && left->proto == right->proto;
@@ -126,14 +132,15 @@ static bool sad_entry_equal(sad_entry_t * const left, sad_entry_t * const right)
 
 METHOD(tkm_kernel_sad_t, insert, bool,
        private_tkm_kernel_sad_t * const this, const esa_id_type esa_id,
-       const host_t * const src, const host_t * const dst, const u_int32_t spi,
-       const u_int8_t proto)
+       const u_int32_t reqid, const host_t * const src, const host_t * const dst,
+       const u_int32_t spi, const u_int8_t proto)
 {
        status_t result;
        sad_entry_t *new_entry;
 
        INIT(new_entry,
                 .esa_id = esa_id,
+                .reqid = reqid,
                 .src = (host_t *)src,
                 .dst = (host_t *)dst,
                 .spi = spi,
@@ -146,8 +153,9 @@ METHOD(tkm_kernel_sad_t, insert, bool,
                                                                        new_entry);
        if (result == NOT_FOUND)
        {
-               DBG3(DBG_KNL, "inserting SAD entry (esa: %llu, src: %H, dst: %H, "
-                        "spi: %x, proto: %u)", esa_id, src, dst, ntohl(spi), proto);
+               DBG3(DBG_KNL, "inserting SAD entry (esa: %llu, reqid: %u, src: %H, "
+                        "dst: %H, spi: %x, proto: %u)", esa_id, reqid, src, dst,
+                        ntohl(spi), proto);
                new_entry->src = src->clone((host_t *)src);
                new_entry->dst = dst->clone((host_t *)dst);
                this->data->insert_last(this->data, new_entry);
index 0194cd3..39388f8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 Reto Buerki
+ * Copyright (C) 2012-2014 Reto Buerki
  * Copyright (C) 2012 Adrian-Ken Rueegsegger
  * Hochschule fuer Technik Rapperswil
  *
@@ -37,6 +37,7 @@ struct tkm_kernel_sad_t {
         * Insert new SAD entry with specified parameters.
         *
         * @param esa_id                ESP SA context identifier
+        * @param reqid                 reqid of the SA
         * @param src                   source address of CHILD SA
         * @param dst                   destination address of CHILD SA
         * @param spi                   SPI of CHILD SA
@@ -44,8 +45,9 @@ struct tkm_kernel_sad_t {
         * @return                              TRUE if entry was inserted, FALSE otherwise
         */
        bool (*insert)(tkm_kernel_sad_t * const this, const esa_id_type esa_id,
-                                  const host_t * const src, const host_t * const dst,
-                                  const u_int32_t spi, const u_int8_t proto);
+                                  const u_int32_t reqid, const host_t * const src,
+                                  const host_t * const dst, const u_int32_t spi,
+                                  const u_int8_t proto);
 
        /**
         * Get ESA id for entry with given parameters.
index 6f0b396..7eb2ff8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 Reto Buerki
+ * Copyright (C) 2012-2014 Reto Buerki
  * Copyright (C) 2012 Adrian-Ken Rueegsegger
  * Hochschule fuer Technik Rapperswil
  *
@@ -34,7 +34,7 @@ START_TEST(test_insert)
        host_t *addr = host_create_from_string("127.0.0.1", 1024);
        tkm_kernel_sad_t *sad = tkm_kernel_sad_create();
 
-       fail_unless(sad->insert(sad, 1, addr, addr, 42, 50),
+       fail_unless(sad->insert(sad, 1, 2, addr, addr, 42, 50),
                                "Error inserting SAD entry");
 
        sad->destroy(sad);
@@ -47,9 +47,9 @@ START_TEST(test_insert_duplicate)
        host_t *addr = host_create_from_string("127.0.0.1", 1024);
        tkm_kernel_sad_t *sad = tkm_kernel_sad_create();
 
-       fail_unless(sad->insert(sad, 1, addr, addr, 42, 50),
+       fail_unless(sad->insert(sad, 1, 2, addr, addr, 42, 50),
                                "Error inserting SAD entry");
-       fail_if(sad->insert(sad, 1, addr, addr, 42, 50),
+       fail_if(sad->insert(sad, 1, 2, addr, addr, 42, 50),
                        "Expected error inserting duplicate entry");
 
        sad->destroy(sad);
@@ -61,7 +61,7 @@ START_TEST(test_get_esa_id)
 {
        host_t *addr = host_create_from_string("127.0.0.1", 1024);
        tkm_kernel_sad_t *sad = tkm_kernel_sad_create();
-       fail_unless(sad->insert(sad, 23, addr, addr, 42, 50),
+       fail_unless(sad->insert(sad, 23, 54, addr, addr, 42, 50),
                                "Error inserting SAD entry");
        fail_unless(sad->get_esa_id(sad, addr, addr, 42, 50) == 23,
                                "Error getting esa id");
@@ -85,7 +85,7 @@ START_TEST(test_remove)
 {
        host_t *addr = host_create_from_string("127.0.0.1", 1024);
        tkm_kernel_sad_t *sad = tkm_kernel_sad_create();
-       fail_unless(sad->insert(sad, 23, addr, addr, 42, 50),
+       fail_unless(sad->insert(sad, 23, 54, addr, addr, 42, 50),
                                "Error inserting SAD entry");
        fail_unless(sad->get_esa_id(sad, addr, addr, 42, 50) == 23,
                                "Error getting esa id");