diff options
author | qingli <qingli@FreeBSD.org> | 2009-09-15 19:18:34 +0000 |
---|---|---|
committer | qingli <qingli@FreeBSD.org> | 2009-09-15 19:18:34 +0000 |
commit | 3a82e44273f4a5c05d848c2959b2a9d8188b1ba0 (patch) | |
tree | 8e25508f7a40afe500dc06cba8d3a6b18f4d7335 /sys/netinet6 | |
parent | 620c678111a81c88256575cb8a1e9fff36f90003 (diff) | |
download | FreeBSD-src-3a82e44273f4a5c05d848c2959b2a9d8188b1ba0.zip FreeBSD-src-3a82e44273f4a5c05d848c2959b2a9d8188b1ba0.tar.gz |
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
MFC after: immediately
Diffstat (limited to 'sys/netinet6')
-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 04f1bf0..ccea27a 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> @@ -1199,24 +1200,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); @@ -1775,27 +1760,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). */ |