full support of ikev1 and ikev2 connection flags
[strongswan.git] / src / pluto / connections.c
index 6cf6a6a..e05a1d0 100644 (file)
@@ -29,7 +29,7 @@
 #include <sys/queue.h>
 
 #include <freeswan.h>
-#include <freeswan/ipsec_policy.h>
+#include <ipsec_policy.h>
 #include "kameipsec.h"
 
 #include "constants.h"
@@ -58,7 +58,6 @@
 #include "whack.h"
 #include "alg_info.h"
 #include "ike_alg.h"
-#include "kernel_alg.h"
 #ifdef NAT_TRAVERSAL
 #include "nat_traversal.h"
 #endif
@@ -351,7 +350,7 @@ delete_connection(struct connection *c, bool relations)
     free_ietfAttrList(c->spd.that.groups);
     free_generalNames(c->requested_ca, TRUE);
     gw_delref(&c->gw_info);
-    
+
     lock_certs_and_keys("delete_connection");
     release_cert(c->spd.this.cert);
     scx_release(c->spd.this.sc);
@@ -361,7 +360,7 @@ delete_connection(struct connection *c, bool relations)
 
     alg_info_delref((struct alg_info **)&c->alg_info_esp);
     alg_info_delref((struct alg_info **)&c->alg_info_ike);
-    
+
     pfree(c);
 }
 
@@ -979,8 +978,8 @@ add_connection(const whack_message_t *wm)
        bool same_rightca, same_leftca;
        struct connection *c = alloc_thing(struct connection, "struct connection");
 
-       c->name = wm->name;
-
+       c->name   = wm->name;
+       c->ikev1  = wm->ikev1;
        c->policy = wm->policy;
 
        if ((c->policy & POLICY_COMPRESS) && !can_do_IPcomp)
@@ -1139,7 +1138,9 @@ add_connection(const whack_message_t *wm)
 
        unshare_connection_strings(c);
        (void)orient(c);
-       connect_to_host_pair(c);
+
+       if (c->ikev1)
+           connect_to_host_pair(c);
 
        /* log all about this connection */
        plog("added connection description \"%s\"", c->name);
@@ -1825,7 +1826,7 @@ initiate_connection(const char *name, int whackfd)
 {
     struct connection *c = con_by_name(name, TRUE);
 
-    if (c != NULL)
+    if (c != NULL && c->ikev1)
     {
        set_cur_connection(c);
        if (!oriented(*c))
@@ -2984,11 +2985,15 @@ terminate_connection(const char *nm)
     /* Loop because more than one may match (master and instances)
      * But at least one is required (enforced by con_by_name).
      */
-    struct connection *c, *n;
+    struct connection *c = con_by_name(nm, TRUE);
 
-    for (c = con_by_name(nm, TRUE); c != NULL; c = n)
+    if (c == NULL || !c->ikev1)
+       return;
+
+    do
     {
-       n = c->ac_next; /* grab this before c might disappear */
+       struct connection *n = c->ac_next;  /* grab this before c might disappear */
+
        if (streq(c->name, nm)
        && c->kind >= CK_PERMANENT
        && !NEVER_NEGOTIATE(c->policy))
@@ -3000,7 +3005,8 @@ terminate_connection(const char *nm)
            delete_states_by_connection(c, FALSE);
            reset_cur_connection();
        }
-    }
+       c = n;
+    } while (c != NULL);
 }
 
 /* check nexthop safety
@@ -4007,7 +4013,7 @@ show_connections_status(bool all, const char *name)
     count = 0;
     for (c = connections; c != NULL; c = c->ac_next)
     {
-       if (name == NULL || streq(c->name, name))
+       if (c->ikev1 && (name == NULL || streq(c->name, name)))
            count++;
     }
     array = alloc_bytes(sizeof(struct connection *)*count, "connection array");
@@ -4015,7 +4021,7 @@ show_connections_status(bool all, const char *name)
     count=0;
     for (c = connections; c != NULL; c = c->ac_next)
     {
-       if (name == NULL || streq(c->name, name))
+       if (c->ikev1 && (name == NULL || streq(c->name, name)))
            array[count++]=c;
     }