diff options
author | qingli <qingli@FreeBSD.org> | 2009-09-15 22:46:06 +0000 |
---|---|---|
committer | qingli <qingli@FreeBSD.org> | 2009-09-15 22:46:06 +0000 |
commit | ceec1be0ff52ee7829036be5125f8e0795e26acd (patch) | |
tree | 7a6943da62a24cfc1fbb15895ce30d5364139a38 /sys/netinet6/in6.c | |
parent | 38280845b774e14ca6f0ead4f6a7e808055acb06 (diff) | |
download | FreeBSD-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.c | 44 |
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). */ |