Add uniqueids=never to ignore INITIAL_CONTACT notifies
authorTobias Brunner <tobias@strongswan.org>
Mon, 10 Sep 2012 15:24:21 +0000 (17:24 +0200)
committerTobias Brunner <tobias@strongswan.org>
Mon, 10 Sep 2012 15:37:18 +0000 (17:37 +0200)
With uniqueids=no the daemon still deletes any existing IKE_SA with the
same peer if an INITIAL_CONTACT notify is received.  With this new option
it also ignores these notifies.

man/ipsec.conf.5.in
src/libcharon/config/peer_cfg.h
src/libcharon/plugins/stroke/stroke_config.c
src/libcharon/sa/ike_sa_manager.c
src/libcharon/sa/ikev2/tasks/ike_auth.c
src/starter/args.c

index 7c336c4..73db235 100644 (file)
@@ -1035,19 +1035,26 @@ if at least one CRL URI is defined and to
 .B no
 if no URI is known.
 .TP
-.BR uniqueids " = " yes " | no | replace | keep"
+.BR uniqueids " = " yes " | no | never | replace | keep"
 whether a particular participant ID should be kept unique,
-with any new (automatically keyed)
-connection using an ID from a different IP address
-deemed to replace all old ones using that ID;
+with any new IKE_SA using an ID deemed to replace all old ones using that ID;
 acceptable values are
-.B yes
+.BR yes ,
 (the default)
+.B no
 and
-.BR no .
-Participant IDs normally \fIare\fR unique,
-so a new (automatically-keyed) connection using the same ID is
-almost invariably intended to replace an old one.
+.BR never .
+Participant IDs normally \fIare\fR unique, so a new IKE_SA using the same ID is
+almost invariably intended to replace an old one. The difference between
+.B no
+and
+.B never
+is that the daemon will replace old IKE_SAs when receving an INITIAL_CONTACT
+notify when the option is
+.B no
+but will ignore these notifies if
+.B never
+is configured.
 The daemon also accepts the value
 .B replace
 which is identical to
index f65b912..418e455 100644 (file)
@@ -81,11 +81,13 @@ extern enum_name_t *cert_policy_names;
  * Uniqueness of an IKE_SA, used to drop multiple connections with one peer.
  */
 enum unique_policy_t {
-       /** do not check for client uniqueness */
+       /** never check for client uniqueness */
+       UNIQUE_NEVER,
+       /** only check for client uniqueness when receiving an INITIAL_CONTACT */
        UNIQUE_NO,
-       /** replace unique IKE_SAs if new ones get established */
+       /** replace existing IKE_SAs when new ones get established by a client */
        UNIQUE_REPLACE,
-       /** keep existing IKE_SAs, close the new ones on connection attept */
+       /** keep existing IKE_SAs, close the new ones on connection attempt */
        UNIQUE_KEEP,
 };
 
index e3c78f7..fd11826 100644 (file)
@@ -690,6 +690,9 @@ static peer_cfg_t *build_peer_cfg(private_stroke_config_t *this,
                case 3: /* keep */
                        unique = UNIQUE_KEEP;
                        break;
+               case 4: /* never */
+                       unique = UNIQUE_NEVER;
+                       break;
                default: /* no */
                        unique = UNIQUE_NO;
                        break;
index b707b6a..a396235 100644 (file)
@@ -1711,7 +1711,7 @@ METHOD(ike_sa_manager_t, check_uniqueness, bool,
 
        peer_cfg = ike_sa->get_peer_cfg(ike_sa);
        policy = peer_cfg->get_unique_policy(peer_cfg);
-       if (policy == UNIQUE_NO && !force_replace)
+       if (policy == UNIQUE_NEVER || (policy == UNIQUE_NO && !force_replace))
        {
                return FALSE;
        }
index 36f8acf..7d462f1 100644 (file)
@@ -435,7 +435,8 @@ METHOD(task_t, build_i, status_t,
                message->add_payload(message, (payload_t*)id_payload);
 
                if (idr && message->get_message_id(message) == 1 &&
-                       this->peer_cfg->get_unique_policy(this->peer_cfg) != UNIQUE_NO)
+                       this->peer_cfg->get_unique_policy(this->peer_cfg) != UNIQUE_NO &&
+                       this->peer_cfg->get_unique_policy(this->peer_cfg) != UNIQUE_NEVER)
                {
                        host_t *host;
 
index eb25b2a..2416960 100644 (file)
@@ -61,6 +61,7 @@ static const char *LST_unique[] = {
        "yes",
        "replace",
        "keep",
+       "never",
         NULL
 };