summaryrefslogtreecommitdiffstats
path: root/sys/netinet6/in6.c
diff options
context:
space:
mode:
authorqingli <qingli@FreeBSD.org>2009-09-15 22:46:06 +0000
committerqingli <qingli@FreeBSD.org>2009-09-15 22:46:06 +0000
commitceec1be0ff52ee7829036be5125f8e0795e26acd (patch)
tree7a6943da62a24cfc1fbb15895ce30d5364139a38 /sys/netinet6/in6.c
parent38280845b774e14ca6f0ead4f6a7e808055acb06 (diff)
downloadFreeBSD-src-ceec1be0ff52ee7829036be5125f8e0795e26acd.zip
FreeBSD-src-ceec1be0ff52ee7829036be5125f8e0795e26acd.tar.gz
MFC r197227
Self pointing routes are installed for configured interface addresses and address aliases. After an interface is brought down and brought back up again, those self pointing routes disappeared. This patch ensures after an interface is brought back up, the loopback routes are reinstalled properly. Reviewed by: bz Approved by: re
Diffstat (limited to 'sys/netinet6/in6.c')
-rw-r--r--sys/netinet6/in6.c44
1 files changed, 5 insertions, 39 deletions
diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
index c832305..aef2908 100644
--- a/sys/netinet6/in6.c
+++ b/sys/netinet6/in6.c
@@ -81,6 +81,7 @@ __FBSDID("$FreeBSD$");
#include <sys/syslog.h>
#include <net/if.h>
+#include <net/if_var.h>
#include <net/if_types.h>
#include <net/route.h>
#include <net/if_dl.h>
@@ -1195,24 +1196,8 @@ in6_purgeaddr(struct ifaddr *ifa)
* The check for the current setting of "nd6_useloopback"
* is not needed.
*/
- {
- struct rt_addrinfo info;
- struct sockaddr_dl null_sdl;
-
- bzero(&null_sdl, sizeof(null_sdl));
- null_sdl.sdl_len = sizeof(null_sdl);
- null_sdl.sdl_family = AF_LINK;
- null_sdl.sdl_type = ia->ia_ifp->if_type;
- null_sdl.sdl_index = ia->ia_ifp->if_index;
- bzero(&info, sizeof(info));
- info.rti_flags = ia->ia_flags | RTF_HOST | RTF_STATIC;
- info.rti_info[RTAX_DST] = (struct sockaddr *)&ia->ia_addr;
- info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&null_sdl;
- error = rtrequest1_fib(RTM_DELETE, &info, NULL, 0);
-
- if (error != 0)
- log(LOG_INFO, "in6_purgeaddr: deletion failed\n");
- }
+ error = ifa_del_loopback_route((struct ifaddr *)ia,
+ (struct sockaddr *)&ia->ia_addr);
/* stop DAD processing */
nd6_dad_stop(ifa);
@@ -1771,27 +1756,8 @@ in6_ifinit(struct ifnet *ifp, struct in6_ifaddr *ia,
if (!(ia->ia_flags & IFA_ROUTE)
&& (V_nd6_useloopback
|| (ifp->if_flags & IFF_LOOPBACK))) {
- struct rt_addrinfo info;
- struct rtentry *rt = NULL;
- static struct sockaddr_dl null_sdl = {sizeof(null_sdl), AF_LINK};
-
- bzero(&info, sizeof(info));
- info.rti_ifp = V_loif;
- info.rti_flags = ia->ia_flags | RTF_HOST | RTF_STATIC;
- info.rti_info[RTAX_DST] = (struct sockaddr *)&ia->ia_addr;
- info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&null_sdl;
- error = rtrequest1_fib(RTM_ADD, &info, &rt, 0);
-
- if (error == 0 && rt != NULL) {
- RT_LOCK(rt);
- ((struct sockaddr_dl *)rt->rt_gateway)->sdl_type =
- ifp->if_type;
- ((struct sockaddr_dl *)rt->rt_gateway)->sdl_index =
- ifp->if_index;
- RT_REMREF(rt);
- RT_UNLOCK(rt);
- } else if (error != 0)
- log(LOG_INFO, "in6_ifinit: error = %d, insertion failed\n", error);
+ error = ifa_add_loopback_route((struct ifaddr *)ia,
+ (struct sockaddr *)&ia->ia_addr);
}
/* Add ownaddr as loopback rtentry, if necessary (ex. on p2p link). */
OpenPOWER on IntegriCloud