full support of ikev1 and ikev2 connection flags
[strongswan.git] / src / pluto / connections.c
index 263bdbd..e05a1d0 100644 (file)
@@ -11,7 +11,7 @@
  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  * for more details.
  *
- * RCSID $Id: connections.c,v 1.42 2006/04/22 21:59:20 as Exp $
+ * RCSID $Id: connections.c,v 1.43 2006/04/29 18:16:02 as Exp $
  */
 
 #include <string.h>
@@ -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);
+
+    if (c == NULL || !c->ikev1)
+       return;
 
-    for (c = con_by_name(nm, TRUE); c != NULL; c = n)
+    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,14 +4021,14 @@ 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;
     }
 
     /* sort it! */
     qsort(array, count, sizeof(struct connection *), connection_compare_qsort);
 
-    for (i=0; i<count; i++)
+    for (i = 0; i < count; i++)
     {
        const char *ifn;
        char instance[1 + 10 + 1];
@@ -4076,7 +4082,7 @@ show_connections_status(bool all, const char *name)
            if (c->spd.that.groups != NULL)
            {
                char buf[BUF_LEN];
-           
+       
                format_groups(c->spd.that.groups, buf, BUF_LEN);
                whack_log(RC_COMMENT
                    , "\"%s\"%s:   groups: %s"
@@ -4097,7 +4103,7 @@ show_connections_status(bool all, const char *name)
                , (unsigned long) c->sa_keying_tries);
 
            /* show DPD parameters if defined */
-           
+       
            if (c->dpd_action != DPD_ACTION_NONE)
                whack_log(RC_COMMENT
                    , "\"%s\"%s:   dpd_action: %s;"
@@ -4141,6 +4147,9 @@ show_connections_status(bool all, const char *name)
            kernel_alg_show_connection(c, instance);
        }
     }
+    if (count > 0)
+       whack_log(RC_COMMENT, BLANK_FORMAT);    /* spacer */
+
     pfree(array);
 }