From bcf32359008bd114ce3ebc4ab10533eb2869fa50 Mon Sep 17 00:00:00 2001
From: TAKAMIYA Noriaki <takamiya@po.ntts.co.jp>
Date: Tue, 13 Feb 2007 23:05:49 +0900
Subject: [KERNELIF] MN: Fix to use new kernel interface for MN.

Introduce no DAD flag and proc files like accept_ra_pinfo
and accept_ra_defrtr on 2.6.19 kernel.
---
 src/mn.c       |    8 ++++----
 src/mn.h       |    2 ++
 src/movement.c |   24 ++++++++++++++----------
 src/movement.h |    2 ++
 src/proc_sys.h |    4 +++-
 5 files changed, 25 insertions(+), 15 deletions(-)

diff --git a/src/mn.c b/src/mn.c
index a94f687..1c4fb2b 100644
--- a/src/mn.c
+++ b/src/mn.c
@@ -563,7 +563,7 @@ static int mv_hoa(struct ifaddrmsg *ifa, struct rtattr *rta_tb[], void *arg)
 	     NIP6ADDR(&hoa->addr), plen, ifa->ifa_index, mha->if_next);
 
 	err = addr_add(&hoa->addr, plen,
-		       ifa->ifa_flags|IFA_F_HOMEADDRESS,
+		       ifa->ifa_flags|IFA_F_HOMEADDRESS_NODAD,
 		       ifa->ifa_scope, mha->if_next, preferred, valid);
 	if (err < 0)
 		return err;
@@ -1190,9 +1190,9 @@ static int flag_hoa(struct ifaddrmsg *ifa, struct rtattr *rta_tb[], void *arg)
 				     hoa->valid_time.tv_sec);
 	}
 	if (fhoa->flag)
-		ifa->ifa_flags |= IFA_F_HOMEADDRESS;
+		ifa->ifa_flags |= IFA_F_HOMEADDRESS_NODAD;
 	else
-		ifa->ifa_flags &= ~IFA_F_HOMEADDRESS;
+		ifa->ifa_flags &= ~IFA_F_HOMEADDRESS_NODAD;
 
 	MDBG("set HoA %x:%x:%x:%x:%x:%x:%x:%x/%d iif %d flags %x preferred_time %u valid_time %u\n",
 	     NIP6ADDR(addr), plen, ifa->ifa_index, ifa->ifa_flags, preferred, valid);
@@ -1686,7 +1686,7 @@ static int mn_hoa_add(struct home_addr_info *hai,
 		valid = mpd_curr_lft(&now, &hoa->timestamp,
 				     hoa->valid_time.tv_sec);
 
-		flag = IFA_F_HOMEADDRESS;
+		flag = IFA_F_HOMEADDRESS_NODAD;
 	}
 	return addr_add(addr, plen, flag, scope, ifindex, preferred, valid);
 }
diff --git a/src/mn.h b/src/mn.h
index dacd942..1cf9d49 100644
--- a/src/mn.h
+++ b/src/mn.h
@@ -19,6 +19,8 @@ extern const struct timespec dereg_bu_lifetime_ts;
 #define MN_RR_BEFORE_EXPIRE             1 /* second */
 #define MN_TEST_INIT_DELAY		5 /* XXX: second */
 
+#define	IFA_F_HOMEADDRESS_NODAD	(IFA_F_HOMEADDRESS | IFA_F_NODAD)
+
 #define NON_MIP_CN_LTIME                420 /* s */
 extern const struct timespec non_mip_cn_ltime_ts;
 #define NON_MIP_CN_LTIME_TS non_mip_cn_ltime_ts
diff --git a/src/movement.c b/src/movement.c
index 378b51c..f37aa52 100644
--- a/src/movement.c
+++ b/src/movement.c
@@ -73,11 +73,15 @@ static pthread_t md_listener;
 
 static int conf_default_autoconf = 1;
 static int conf_default_ra = 1;
+static int conf_default_ra_defrtr = 1;
+static int conf_default_ra_pinfo = 1;
 static int conf_default_rs = 3;
 static int conf_default_rs_ival = 4;
 
 static int conf_autoconf = 1;
-static int conf_ra = 0;
+static int conf_ra = 1;
+static int conf_ra_pinfo = 1;
+static int conf_ra_defrtr = 0;
 static int conf_rs = 0;
 
 static unsigned int adv_ivals_md_trigger = 1;
@@ -130,7 +134,7 @@ static inline void md_free_coa(struct md_coa *coa)
 
 static void md_flush_coa(struct md_coa *coa)
 {
-	if (!(coa->flags&IFA_F_HOMEADDRESS)) {
+	if (!(coa->flags&IFA_F_HOMEADDRESS_NODAD)) {
 		MDBG2("deleting CoA "
 		      "%x:%x:%x:%x:%x:%x:%x:%x on iface %d\n", 
 		      NIP6ADDR(&coa->addr), coa->ifindex);
@@ -648,7 +652,7 @@ static void iface_proc_entries_init(struct md_inet6_iface *iface)
 {
 	set_iface_proc_entry(PROC_SYS_IP6_AUTOCONF, iface->name,
 			     conf_autoconf);
-	set_iface_proc_entry(PROC_SYS_IP6_ACCEPT_RA, iface->name, conf_ra);
+	set_iface_proc_entry(PROC_SYS_IP6_ACCEPT_RA_DEFRTR, iface->name, conf_ra_defrtr);
 	set_iface_proc_entry(PROC_SYS_IP6_RTR_SOLICITS, iface->name, conf_rs);
 	tssetmsec(iface->reachable, DEFAULT_REACHABLE_TIME);
 	tssetmsec(iface->retransmit, DEFAULT_RETRANSMIT_TIMER);
@@ -1642,15 +1646,15 @@ static void iface_default_proc_entries_init(void)
 {
 	get_iface_proc_entry(PROC_SYS_IP6_AUTOCONF,
 			     "default", &conf_default_autoconf);
-	get_iface_proc_entry(PROC_SYS_IP6_ACCEPT_RA,
-			     "default", &conf_default_ra);
+	get_iface_proc_entry(PROC_SYS_IP6_ACCEPT_RA_DEFRTR,
+			     "default", &conf_default_ra_defrtr);
 	get_iface_proc_entry(PROC_SYS_IP6_RTR_SOLICITS,
 			     "default", &conf_default_rs);
 	get_iface_proc_entry(PROC_SYS_IP6_RTR_SOLICIT_INTERVAL,
 			     "default", &conf_default_rs_ival);
 
 	set_iface_proc_entry(PROC_SYS_IP6_AUTOCONF, "default", conf_autoconf);
-	set_iface_proc_entry(PROC_SYS_IP6_ACCEPT_RA, "default", conf_ra);
+	set_iface_proc_entry(PROC_SYS_IP6_ACCEPT_RA_DEFRTR, "default", conf_ra_defrtr);
 	set_iface_proc_entry(PROC_SYS_IP6_RTR_SOLICITS, "default", conf_rs);
 }
 
@@ -1719,8 +1723,8 @@ static void iface_default_proc_entries_cleanup(void)
 {
 	set_iface_proc_entry(PROC_SYS_IP6_AUTOCONF,
 			     "default", conf_default_autoconf);
-	set_iface_proc_entry(PROC_SYS_IP6_ACCEPT_RA,
-			     "default", conf_default_ra);
+	set_iface_proc_entry(PROC_SYS_IP6_ACCEPT_RA_DEFRTR,
+			     "default", conf_default_ra_defrtr);
 	set_iface_proc_entry(PROC_SYS_IP6_RTR_SOLICITS,
 			     "default", conf_default_rs);
 }
@@ -1729,8 +1733,8 @@ static void iface_proc_entries_cleanup(struct md_inet6_iface *iface)
 {
 	set_iface_proc_entry(PROC_SYS_IP6_AUTOCONF, iface->name,
 			     iface->devconf[DEVCONF_AUTOCONF]);
-	set_iface_proc_entry(PROC_SYS_IP6_ACCEPT_RA, iface->name,
-			     iface->devconf[DEVCONF_ACCEPT_RA]);
+	set_iface_proc_entry(PROC_SYS_IP6_ACCEPT_RA_DEFRTR, iface->name,
+			     iface->devconf[DEVCONF_ACCEPT_RA_DEFRTR]);
 	set_iface_proc_entry(PROC_SYS_IP6_RTR_SOLICITS, iface->name, 
 			     iface->devconf[DEVCONF_RTR_SOLICITS]);
 }
diff --git a/src/movement.h b/src/movement.h
index b861cf8..0e532c3 100644
--- a/src/movement.h
+++ b/src/movement.h
@@ -65,6 +65,8 @@ enum {
 	DEVCONF_HOPLIMIT,
 	DEVCONF_MTU6,
 	DEVCONF_ACCEPT_RA,
+	DEVCONF_ACCEPT_RA_DEFRTR,
+	DEVCONF_ACCEPT_RA_PINFO,
 	DEVCONF_ACCEPT_REDIRECTS,
 	DEVCONF_AUTOCONF,
 	DEVCONF_DAD_TRANSMITS,
diff --git a/src/proc_sys.h b/src/proc_sys.h
index f308d59..d28b7b2 100644
--- a/src/proc_sys.h
+++ b/src/proc_sys.h
@@ -4,7 +4,9 @@
 #define __PROC_SYS_H__ 1
 
 #define PROC_SYS_IP6_AUTOCONF "/proc/sys/net/ipv6/conf/%s/autoconf"
-#define PROC_SYS_IP6_ACCEPT_RA "/proc/sys/net/ipv6/conf/%s/accept_ra"
+#define PROC_SYS_IP6_ACCEPT_RA"/proc/sys/net/ipv6/conf/%s/accept_ra"
+#define PROC_SYS_IP6_ACCEPT_RA_DEFRTR "/proc/sys/net/ipv6/conf/%s/accept_ra_defrtr"
+#define PROC_SYS_IP6_ACCEPT_RA_PINFO "/proc/sys/net/ipv6/conf/%s/accept_ra_pinfo"
 #define PROC_SYS_IP6_RTR_SOLICITS "/proc/sys/net/ipv6/conf/%s/router_solicitations"
 #define PROC_SYS_IP6_RTR_SOLICIT_INTERVAL "/proc/sys/net/ipv6/conf/%s/router_solicitation_interval"
 #define PROC_SYS_IP6_LINKMTU "/proc/sys/net/ipv6/conf/%s/mtu"
-- 
1.5.0.3

