(usagi-users 04018) [patch] mip6d daemon: set the (K) bit according to KeyMngMobCapability option

Sebastien Decugis <[email protected]> Mon, 21 Jan 2008 18:15:42 +0900
Newsgroups gmane.linux.ipv6.usagi.users
Message-ID <[email protected]>
This is a multi-part message in MIME format.
--------------000602070909070303010900
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hi,

This small patch for umip 0.4 aims to properly set the (K) bit in BU and 
BA messages according to the KeyMngMobCapability option. If a 
misconfiguration is detected, a message is generated. The information is 
saved in the bule (MN) or bce (HA) data, and can be used later to check 
if movement must be signaled to an IKE daemon.

Thanks,
Sebastien.

-- 
Sebastien Decugis
http://www.nautilus6.org

--------------000602070909070303010900
Content-Type: text/plain;
 name="k_flag.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="k_flag.patch"

Support of the (K) flag in BU/BA messages

This patch adds a lite support of the (K) flag (IKE session survival) in
the BU and BA exchanges, conforming to KeyMngMobCapability option.

--- a/src/mn.c
+++ b/src/mn.c
@@ -675,6 +675,8 @@
 	int err = 0;
 	bule->type = BUL_ENTRY;
 	bule->flags = IP6_MH_BU_HOME | IP6_MH_BU_ACK | hai->lladdr_comp;
+	if (conf.UseMnHaIPsec && conf.KeyMngMobCapability)
+		bule->flags |= IP6_MH_BU_KEYM;
 	bule->coa_changed = -1;
 	bule->coa = hai->primary_coa.addr;
 	bule->if_coa = hai->primary_coa.iif;
@@ -1113,8 +1115,18 @@
 		if (bule->flags & IP6_MH_BU_KEYM) {
 			if (ba->ip6mhba_flags & IP6_MH_BA_KEYM) {
 				/* Inform IKE  to send readdress msg */
+
 			} else {
 				/* Inform IKE to renegotiate SAs */
+
+				/* Remove the flag from this bule */
+				bule->flags &= ~IP6_MH_BU_KEYM;
+
+				/* Issue a warning */
+				syslog(LOG_ERR,
+			         "HA does not support IKE session surviving, "
+			         "traffic may be interrupted after movements.\n"
+				 );
 			}
 		}
 		bra = mh_opt(&ba->ip6mhba_hdr, &mh_opts, IP6_MHOPT_BREFRESH);
--- a/src/ha.c
+++ b/src/ha.c
@@ -836,9 +836,28 @@
 	if (!tsisset(lft))
 		bcache_delete(out.src, out.dst);
 
-	if ((bu_flags & IP6_MH_BU_KEYM) && 
-	    conf.pmgr.use_keymgm(out.dst, out.src))
-		ba_flags |= IP6_MH_BA_KEYM;
+	if (conf.pmgr.use_keymgm(out.dst, out.src))
+	{
+		if (bu_flags & IP6_MH_BU_KEYM) {
+			ba_flags |= IP6_MH_BA_KEYM;
+		} else {
+			/* The remote MN does not support session mvt,
+			   so we remove from the bce. */
+			bce->flags &= ~IP6_MH_BU_KEYM;
+			cdbg(
+			 "MN (%x:%x:%x:%x:%x:%x:%x:%x) does not support IKE session movement.\n",
+			 NIP6ADDR(out.src));
+		}
+	} else {
+		if (bu_flags & IP6_MH_BU_KEYM) {
+			/* Local policy does not allow using IKE movement */
+			bce->flags &= ~IP6_MH_BU_KEYM;
+			cdbg(
+			 "MN (%x:%x:%x:%x:%x:%x:%x:%x) would support IKE session movement,"
+			 " but local policy denies it.\n",
+			 NIP6ADDR(out.src));
+		}
+	}
 
 	if (ba_flags & IP6_MH_BA_KEYM) {
 		/* FUTURE */
--- a/src/policy.c
+++ b/src/policy.c
@@ -168,7 +168,7 @@
 int default_use_keymgm(const struct in6_addr *remote_addr,
 		       const struct in6_addr *local_addr)
 {
-	return 0;
+	return conf.KeyMngMobCapability;
 }
 
 /**

--------------000602070909070303010900--