diff --git a/chkconf_kernel.sh b/chkconf_kernel.sh
index e9822be..1743336 100755
--- a/chkconf_kernel.sh
+++ b/chkconf_kernel.sh
@@ -24,19 +24,18 @@ INET=y 
 IPV6=y
 INET6_ESP=y
 IPV6_TUNNEL=y
-IPV6_ADVANCED_ROUTER=y
 IPV6_MULTIPLE_TABLES=y
 IPV6_SUBTREES=y
 IPV6_MIP6=y
 XFRM=y
 XFRM_USER=y
-CONFIG_XFRM_SUB_POLICY=y
+XFRM_SUB_POLICY=y
 INET6_XFRM_MODE_ROUTEOPTIMIZATION=y
 
 COMMON="EXPERIMENTAL SYSVIPC PROC_FS NET INET IPV6 IPV6_MIP6 \
 	XFRM XFRM_USER XFRM_SUB_POLICY INET6_XFRM_MODE_ROUTEOPTIMIZATION"
 
-MNHA="IPV6_TUNNEL IPV6_ADVANCED_ROUTER IPV6_MULTIPLE_TABLES"
+MNHA="IPV6_TUNNEL IPV6_MULTIPLE_TABLES"
 
 MN="IPV6_SUBTREES"
 
@@ -46,7 +45,7 @@ PFKEY="NET_KEY NET_KEY_MIGRATE"
 
 TAGS="$COMMON $MNHA $MN $IPSEC $PFKEY"
 
-if [ "$1" == "" ] ; then
+if [ "$1" = "" ] ; then
     KERNELCONFIG="/proc/config.gz"
     CAT=zcat
 else
diff --git a/config.h.in b/config.h.in
index a0044dd..cd05b93 100644
--- a/config.h.in
+++ b/config.h.in
@@ -10,6 +10,10 @@ #undef HAVE_ARPA_INET_H
    you don't. */
 #undef HAVE_DECL_IFA_F_HOMEADDRESS
 
+/* Define to 1 if you have the declaration of `IPV6_RTHDR_TYPE_2', and to 0 if
+   you don't. */
+#undef HAVE_DECL_IPV6_RTHDR_TYPE_2
+
 /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
 #undef HAVE_DOPRNT
 
@@ -250,7 +254,7 @@ #undef pid_t
    supported. Do not define if restrict is supported directly. */
 #undef restrict
 
-/* Define to `unsigned' if <sys/types.h> does not define. */
+/* Define to `unsigned int' if <sys/types.h> does not define. */
 #undef size_t
 
 /* Define as `fork' if `vfork' does not work. */
diff --git a/configure.ac b/configure.ac
index a241da9..9e3ed90 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@ dnl $Id: configure.ac 1.45 06/05/07 17:3
 dnl Process this file with autoconf to produce a configure script.
 
 AC_PREREQ(2.57)
-AC_INIT([MIPL Mobile IPv6 for Linux], [2.0.2-umip-0.3],
+AC_INIT([MIPL Mobile IPv6 for Linux], [2.0.2-umip-0.4],
 	[URL:http://www.mobile-ipv6.org/bugs/], mipv6)
 AC_DEFINE_UNQUOTED([PACKAGE_COPYRIGHT],
 	["Copyright (C) 2003-2006 Helsinki University of Technology, and others"], 
@@ -130,22 +130,34 @@ AC_CACHE_CHECK([whether to enable debug 
 	       [ac_cv_enable_vt], [ac_cv_enable_vt=no])
 AM_CONDITIONAL(ENABLE_VT, test x$enable_vt = xyes)
 
-dnl Check Advanced IPv6 Socket API function availability
-AC_MSG_NOTICE([*** checking for RFC3542: Advanced IPv6 Socket API support])
+dnl Check Advanced IPv6 Socket API destination options header function availability
+AC_MSG_NOTICE([*** checking inet6_opt for RFC3542: Advanced IPv6 Socket API support])
 AC_REPLACE_FUNCS(inet6_opt_find)
-AC_REPLACE_FUNCS(inet6_rth_space)
-AC_REPLACE_FUNCS(inet6_rth_init)
-AC_REPLACE_FUNCS(inet6_rth_add)
-AC_REPLACE_FUNCS(inet6_rth_getaddr)
-AC_REPLACE_FUNCS(inet6_rth_gettype)
+
+dnl Check Advanced IPv6 Socket API routing header function availability
+AC_MSG_NOTICE([*** checking inet6_rth for RFC3542: Advanced IPv6 Socket API support])
+dnl Check Extension to Socket API for MIPv6 availability
+AC_MSG_NOTICE([*** checking RH2 for RFC4584: Extension to Socket API for MIPv6])
+AC_CHECK_DECLS([IPV6_RTHDR_TYPE_2],
+	[AC_REPLACE_FUNCS(inet6_rth_space)
+	 AC_REPLACE_FUNCS(inet6_rth_init)
+	 AC_REPLACE_FUNCS(inet6_rth_add)
+	 AC_REPLACE_FUNCS(inet6_rth_getaddr)
+	 AC_REPLACE_FUNCS(inet6_rth_gettype)],
+	[AC_LIBOBJ(inet6_rth_space)
+	 AC_LIBOBJ(inet6_rth_init)
+	 AC_LIBOBJ(inet6_rth_add)
+	 AC_LIBOBJ(inet6_rth_getaddr)
+	 AC_LIBOBJ(inet6_rth_gettype)],)
+
 dnl Check some functions are really missing so we don't build empty libmissing
 AM_CONDITIONAL(MISSING,
-   test x$ac_cv_func_inet6_opt_find = xno -o \
-	x$ac_cv_func_inet6_rth_space = xno -o \
-	x$ac_cv_func_inet6_rth_init = xno -o \
-	x$ac_cv_func_inet6_rth_add = xno -o \
-	x$ac_cv_func_inet6_rth_getaddr = xno -o \
-	x$ac_cv_func_inet6_rth_gettype = xno)
+   test x$ac_cv_func_inet6_opt_find != xyes -o \
+	x$ac_cv_func_inet6_rth_space != xyes -o \
+	x$ac_cv_func_inet6_rth_init != xyes -o \
+	x$ac_cv_func_inet6_rth_add != xyes -o \
+	x$ac_cv_func_inet6_rth_getaddr != xyes -o \
+	x$ac_cv_func_inet6_rth_gettype != xyes)
 
 AC_MSG_NOTICE([*** checking for Mobile IPv6 support in kernel headers])
 AC_CHECK_DECLS([IFA_F_HOMEADDRESS],,
diff --git a/src/ipsec.c b/src/ipsec.c
index 9f70077..d038c69 100644
--- a/src/ipsec.c
+++ b/src/ipsec.c
@@ -105,7 +105,7 @@ static void _set_sp(struct xfrm_userpoli
 
 	switch (e->type) {
 	case IPSEC_POLICY_TYPE_TUNNELHOMETESTING:
-		if (dir == XFRM_POLICY_IN) {
+		if (dir == XFRM_POLICY_IN || dir == XFRM_POLICY_FWD) {
 			if (nodetype == MIP6_ENTITY_MN) {
 				sp->sel.sport = htons(IP6_MH_TYPE_HOT);
 				sp->sel.sport_mask = ~((__u16)0);
diff --git a/src/mh.c b/src/mh.c
index b0a9520..dd700cb 100644
--- a/src/mh.c
+++ b/src/mh.c
@@ -619,6 +619,10 @@ int mh_send(const struct in6_addr_bundle
 	cmsglen = CMSG_SPACE(sizeof(pinfo));
 	if (addrs->remote_coa != NULL) {
 		rthlen = inet6_rth_space(IPV6_RTHDR_TYPE_2, 1);
+		if (!rthlen) {
+			MDBG("inet6_rth_space error\n");
+			return -1;
+		}
 		cmsglen += CMSG_SPACE(rthlen);
 	}
 	cmsg = malloc(cmsglen);
@@ -658,6 +662,7 @@ int mh_send(const struct in6_addr_bundle
 		rthp = inet6_rth_init(rthp, rthlen, IPV6_RTHDR_TYPE_2, 1);
 		if (rthp == NULL) {
 			free(msg.msg_control);
+			MDBG("inet6_rth_init error\n");
 			return -3;
 		}
 		inet6_rth_add(rthp, addrs->remote_coa);
diff --git a/src/mn.c b/src/mn.c
index da67ef3..701bc05 100644
--- a/src/mn.c
+++ b/src/mn.c
@@ -129,7 +129,7 @@ static int mn_block_rule_add(struct home
 	if ((ret = rule_add(NULL, 0, IP6_RULE_PRIO_MIP6_BLOCK, RTN_BLACKHOLE,
 		     &hai->hoa.addr, 128, &in6addr_any, 0,
 		     FIB_RULE_FIND_SADDR)) < 0)
-		MDBG("failed to delete blackhole rule.\n");
+		MDBG("failed to add blackhole rule.\n");
 	else
 		hai->home_block |= HOME_ADDR_RULE_BLOCK;
 
diff --git a/src/movement.c b/src/movement.c
index 2a5fb39..e0edb82 100644
--- a/src/movement.c
+++ b/src/movement.c
@@ -74,15 +74,11 @@ static pthread_mutex_t iface_lock;
 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 = 1;
-static int conf_ra_pinfo = 1;
 static int conf_ra_defrtr = 0;
 static int conf_rs = 0;
 
@@ -286,7 +282,7 @@ static void md_expire_router(struct md_i
 
 static void md_block_rule_del(struct md_inet6_iface *iface)
 {
-	rule_del(NULL, 0, IP6_RULE_PRIO_MIP6_BLOCK, RTN_BLACKHOLE,
+	rule_del(NULL, 0, IP6_RULE_PRIO_MIP6_BLOCK_HOA, RTN_BLACKHOLE,
 		 &in6addr_any, 0, &in6addr_any, 0, 0);
 	rule_del(NULL, RT6_TABLE_MAIN, IP6_RULE_PRIO_MIP6_COA_OUT, RTN_UNICAST,
 		 &in6addr_any, 128, &in6addr_any, 0, 0);
@@ -818,7 +814,7 @@ static int process_neigh(struct nlmsghdr
 	return 0;
 }
 
-static int process_nlmsg(struct sockaddr_nl *who,
+static int process_nlmsg(const struct sockaddr_nl *who,
 			 struct nlmsghdr *n, void *arg)
 {
 	pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
@@ -1332,7 +1328,7 @@ static int md_block_rule_add(struct md_i
 	   on CoA to make routing and tunnel end-point updates atomic
 	   during handoff */
 	return rule_add(NULL, 0,
-			IP6_RULE_PRIO_MIP6_BLOCK, RTN_BLACKHOLE,
+			IP6_RULE_PRIO_MIP6_BLOCK_HOA, RTN_BLACKHOLE,
 			&in6addr_any, 0, &in6addr_any, 0, 0);
 }
 
diff --git a/src/proc_sys.h b/src/proc_sys.h
index d28b7b2..5632472 100644
--- a/src/proc_sys.h
+++ b/src/proc_sys.h
@@ -4,7 +4,7 @@ #ifndef __PROC_SYS_H__
 #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"
diff --git a/src/retrout.c b/src/retrout.c
index d8ad49c..7b2df45 100644
--- a/src/retrout.c
+++ b/src/retrout.c
@@ -703,6 +703,8 @@ static void mn_recv_cot(const struct ip6
 			continue;
 		}
 
+		bule->rr.co_ni = index;
+
 		if (!bule->do_send_bu) {
 			/* This happens when we automatically refresh home
 			 * keygen token while binding still in use */
@@ -717,7 +719,6 @@ static void mn_recv_cot(const struct ip6
 		RRDBG("Got CoT and found RR entry for home address\n");
 		bule->rr.state = RR_READY;
 		bule->rr.ho_ni = rre_ho->index;
-		bule->rr.co_ni = index;
 		rr_mn_calc_Kbm(rre_ho->kgen_token, keygen, bule->Kbm);
 		mn_send_cn_bu(bule);
 	}
@@ -784,20 +785,13 @@ static void mn_recv_hot(const struct ip6
 	rre_ho->resend_count = 0;
 	memcpy(rre_ho->kgen_token, keygen, sizeof(rre_ho->kgen_token));
 	rre_ho->index = index;
-
-	if (!bule->do_send_bu) {
-		/* This happens when we automatically refresh home
-		 * keygen token while binding still in use */
-		pthread_rwlock_unlock(&mn_lock);
-		return;
-	}
+	bule->rr.ho_ni = index;
 
 	if (bule->dereg) {
 		/* Dereg BUL entry waiting for RR_READY */
 		RRDBG("Got HoT\n");
 		if (bule->do_send_bu) {
 			bule->rr.state = RR_READY;
-			bule->rr.ho_ni = index;
 			bule->rr.co_ni = 0;
 			rr_mn_calc_Kbm(keygen, NULL, bule->Kbm);
 			mn_send_cn_bu(bule);
@@ -810,7 +804,6 @@ static void mn_recv_hot(const struct ip6
 			RRDBG("Got HoT and found RR entry for care-of address\n");
 			/* Foreign Reg BU case */
 			bule->rr.state = RR_READY;
-			bule->rr.ho_ni = index;
 			bule->rr.co_ni = rre_co->index;
 			rr_mn_calc_Kbm(keygen, rre_co->kgen_token, bule->Kbm);
 			mn_send_cn_bu(bule);
diff --git a/src/rtnl.h b/src/rtnl.h
index 26cd452..9cc9b34 100644
--- a/src/rtnl.h
+++ b/src/rtnl.h
@@ -19,7 +19,8 @@ #define IP6_RT_PRIO_ADDRCONF 256
 #define IP6_RULE_PRIO_MIP6_HOA_OUT   1001
 #define IP6_RULE_PRIO_MIP6_COA_OUT   1002
 #define IP6_RULE_PRIO_MIP6_BLOCK     1003
-#define IP6_RULE_PRIO_MIP6_FWD       1004
+#define IP6_RULE_PRIO_MIP6_BLOCK_HOA 1004
+#define IP6_RULE_PRIO_MIP6_FWD       1005
 
 static inline int rtnl_route_open(struct rtnl_handle *rth, 
 				  unsigned subscriptions)
diff --git a/src/vt.c b/src/vt.c
index f5152cc..08981b7 100644
--- a/src/vt.c
+++ b/src/vt.c
@@ -684,7 +684,7 @@ static int bcache_vt_dump(void *data, vo
 static int vt_str_to_uint32(const struct vt_handle *vh, const char *str,
 			    uint32_t *val)
 {
-	uint32_t v;
+	long int v;
 	char *ptr = NULL;
 
 	v = strtoul(str, &ptr, 0);
@@ -697,7 +697,7 @@ static int vt_str_to_uint32(const struct
 		return -ERANGE;
 	}
 
-	*val = v;
+	*val = (uint32_t)v;
 	return 0;
 }
 
diff --git a/src/xfrm.c b/src/xfrm.c
index d7284d5..8e92e37 100644
--- a/src/xfrm.c
+++ b/src/xfrm.c
@@ -703,6 +703,14 @@ static int xfrm_mn_init(void)
 	if (conf.UseMnHaIPsec && mn_ha_ipsec_init() < 0)
 		return -1;
 
+	/* policy for sending BE */
+	/* The priolity is higher than the block policy so that MN can send BE during registration */
+	set_selector(&in6addr_any, &in6addr_any,
+		     IPPROTO_MH, IP6_MH_TYPE_BERROR, 0, 0, &sel);
+	if (xfrm_mip_policy_add(&sel, 0, XFRM_POLICY_OUT, XFRM_POLICY_ALLOW,
+				MIP6_PRIO_HOME_SIG_ANY, NULL, 0) < 0)
+		return -1;
+
 	XDBG2("Adding RTHdr type 2 handling 2 state for MN\n");
 	set_selector(&in6addr_any, &in6addr_any, 0, 0, 0, 0, &sel);
 	create_rh_tmpl(&tmpl);
@@ -789,6 +797,13 @@ static inline void mn_ha_ipsec_cleanup(v
 static void xfrm_mn_cleanup(void)
 {
 	struct xfrm_selector sel;
+
+	/* the policy for sending BE */
+	set_selector(&in6addr_any, &in6addr_any,
+		     IPPROTO_MH, IP6_MH_TYPE_BERROR, 0, 0, &sel);
+	xfrm_mip_policy_del(&sel, XFRM_POLICY_OUT);
+
+
 	XDBG("Deleting policies and states for MN\n");
 	XDBG2("Deleting RTHdr type 2 handling 2 state for MN\n");
 	set_selector(&in6addr_any, &in6addr_any, 0, 0, 0, 0, &sel);
@@ -999,11 +1014,15 @@ static int xfrm_cn_init(void)
 				MIP6_PRIO_NO_RO_SIG_ANY, NULL, 0) < 0)
 		return -1;
 
-	/* Let Neighbor Advertisement messages bypass bindings */
+	/*
+	 * Let Neighbor Advertisement messages bypass bindings 
+	 * This policy is high priority(priory 3) not to block 
+	 * by the BlockPolicy during registration.
+	 */
 	set_selector(&in6addr_any, &in6addr_any,
 		     IPPROTO_ICMPV6, ND_NEIGHBOR_ADVERT, 0, 0, &sel);
 	if (xfrm_mip_policy_add(&sel, 0, XFRM_POLICY_OUT, XFRM_POLICY_ALLOW,
-				MIP6_PRIO_NO_RO_SIG_ANY, NULL, 0) < 0)
+				MIP6_PRIO_HOME_SIG_ANY, NULL, 0) < 0)
 		return -1;
 
 	/* Let ICMPv6 error messages bypass bindings */
@@ -1213,13 +1232,6 @@ #endif
 static void _mn_bule_ro_pol_del(struct bulentry *e, int iif)
 {
 	struct xfrm_selector sel;
-	set_selector(&e->peer_addr, &e->hoa, 0, 0, 0, iif, &sel);
-	xfrm_mip_policy_del(&sel, XFRM_POLICY_OUT);
-
-	/*
-	 * XXX: Trying to delete RO policy which is added by
-	 * xfrm_post_ba_mod_bule()
-	 */
 	set_selector(&e->peer_addr, &e->hoa, 0, 0, 0, 0, &sel);
 	xfrm_mip_policy_del(&sel, XFRM_POLICY_OUT);
 
@@ -1278,9 +1290,11 @@ void mn_ro_pol_del(struct home_addr_info
 		set_selector(&in6addr_any, &hai->hoa.addr, 0,
 			     0, 0, 0, &sel);
 		xfrm_mip_policy_del(&sel, XFRM_POLICY_OUT);
+#if 0  // Disable inboud trigger because of ifindex problem
 		set_selector(&hai->hoa.addr, &in6addr_any,
 			     0, 0, 0, 0, &sel);
 		xfrm_mip_policy_del(&sel, XFRM_POLICY_IN);
+#endif
 	}
 }
 
@@ -1458,11 +1472,25 @@ int xfrm_add_bce(const struct in6_addr *
 
 	/* Create policy for outbound RO data traffic */
 	set_selector(peer_addr, our_addr, 0, 0, 0, 0, &sel);
-	if (xfrm_state_add(&sel, IPPROTO_ROUTING, coa, replace, 0))
-		return -1;
+	if (xfrm_state_add(&sel, IPPROTO_ROUTING, coa, replace, 0)){
+		/* 
+		 * WORKAROUND 
+		 * In some cases, MN fail to add it because of the state
+		 * inserted by kernel when notifying aquire. So,update it.
+		 */
+		if (xfrm_state_add(&sel, IPPROTO_ROUTING, coa, 1, 0))
+			return -1;
+	}
 	set_selector(our_addr, peer_addr, 0, 0, 0, 0, &sel);
-	if (xfrm_state_add(&sel, IPPROTO_DSTOPTS, coa, replace, 0))
+	if (xfrm_state_add(&sel, IPPROTO_DSTOPTS, coa, replace, 0)){
+		/* 
+		 * WORKAROUND 
+		 * In some cases, MN fail to add it because of the state
+		 * inserted by kernel when notifying aquire. So,update it.
+		 */
+		if (xfrm_state_add(&sel, IPPROTO_DSTOPTS, coa, 1, 0))
 		return -1;
+	}
 	if (is_mn() && !xfrm_bule_bce_update(our_addr, peer_addr, replace))
 		return 0;
 	if (is_ha() && conf.UseMnHaIPsec) {
@@ -1492,6 +1520,20 @@ void xfrm_del_bce(const struct in6_addr 
 	set_selector(our_addr, peer_addr, 0, 0, 0, 0, &sel);
 	xfrm_mip_policy_del(&sel, XFRM_POLICY_IN);
 	xfrm_state_del(IPPROTO_DSTOPTS, &sel);
+
+	if (is_mn()){
+		struct home_addr_info *hai;
+		struct bulentry *e;
+		/* for MN-MN communications, checking BUL to insert RO policy */
+		pthread_rwlock_rdlock(&mn_lock);
+		if ((hai = mn_get_home_addr(our_addr)) != NULL) {
+			if ((e = bul_get(hai, NULL, peer_addr)) != NULL) {
+				if (e->type == BUL_ENTRY)
+			    	_xfrm_add_bule_bce(our_addr, peer_addr, 0);
+			}
+		}
+		pthread_rwlock_unlock(&mn_lock);
+	}
 }
 
 /** 
@@ -1670,6 +1712,7 @@ int xfrm_pre_bu_add_bule(struct bulentry
 	int rsig = bule->xfrm_state & BUL_XFRM_STATE_SIG;
 	int rdata = bule->xfrm_state & BUL_XFRM_STATE_DATA;
 	int prio;
+	int exist = 0;
 
 	if (bule->flags & IP6_MH_BU_HOME) {
 		struct home_addr_info *hai = bule->home;
@@ -1715,9 +1758,10 @@ int xfrm_pre_bu_add_bule(struct bulentry
 				return -1;
 			}
 			bcache_release_entry(bce);
+			exist = 1;
 		}
 	}
-	if (_mn_bule_ro_pol_add(bule, bule->home->if_tunnel, rdata))
+	if(!exist &&_mn_bule_ro_pol_add(bule, bule->home->if_tunnel, rdata))
 		return -1;
 	set_selector(&bule->peer_addr, &bule->hoa, 0, 0, 0, 0, &sel);
 	/* XXX: acquired state is already inserted */
@@ -1755,6 +1799,8 @@ int xfrm_post_ba_mod_bule(struct bulentr
 				return -1;
 			}
 			bcache_release_entry(bce);
+			/* return 0: not to overwrite policy (for MN-MN communication) */
+			return 0;
 		}
 	}
 	prio = (bule->flags & IP6_MH_BU_HOME ?
@@ -1967,12 +2013,7 @@ int xfrm_block_link(struct home_addr_inf
 	struct xfrm_selector sel;
 	hai->home_block |= HOME_LINK_BLOCK;
 	hai->if_block = hai->hoa.iif;
-	/* allow MN to send NA messages to HA while returning home */
-	set_selector(&in6addr_any, &in6addr_any, IPPROTO_ICMPV6,
-		     ND_NEIGHBOR_ADVERT, 0, hai->if_block, &sel);
-	if ((ret = xfrm_mip_policy_add(&sel, 0, XFRM_POLICY_OUT, XFRM_POLICY_ALLOW,
-				       MIP6_PRIO_HOME_SIG_ANY, NULL, 0)))
-		return ret;
+
 	/* block any packets from HoA to the CN */
 	set_selector(&in6addr_any, &in6addr_any, 0, 0, 0, hai->if_block, &sel);
 	if ((ret = xfrm_mip_policy_add(&sel, 0, XFRM_POLICY_OUT,
@@ -1987,9 +2028,7 @@ void xfrm_unblock_link(struct home_addr_
 	struct xfrm_selector sel;
 	set_selector(&in6addr_any, &in6addr_any, 0, 0, 0, hai->if_block, &sel);
 	xfrm_mip_policy_del(&sel, XFRM_POLICY_OUT);
-	set_selector(&in6addr_any, &in6addr_any, IPPROTO_ICMPV6,
-		     ND_NEIGHBOR_ADVERT, 0, hai->if_block, &sel);
-	xfrm_mip_policy_del(&sel, XFRM_POLICY_OUT);
+
 	hai->if_block = 0;
 	hai->home_block &= ~HOME_LINK_BLOCK;
 }
