diff options
author | qingli <qingli@FreeBSD.org> | 2009-09-05 20:24:37 +0000 |
---|---|---|
committer | qingli <qingli@FreeBSD.org> | 2009-09-05 20:24:37 +0000 |
commit | 5b9cf14b541867aeeeabf34edade1a0f5c528580 (patch) | |
tree | 23e5204856c079440b9f1c66f4db0b5f98d03023 | |
parent | fb643392b2cef85ef9905fe0bedb32bd926fe9dc (diff) | |
download | FreeBSD-src-5b9cf14b541867aeeeabf34edade1a0f5c528580.zip FreeBSD-src-5b9cf14b541867aeeeabf34edade1a0f5c528580.tar.gz |
The addresses that are assigned to the loopback interface
should be part of the kernel routing table.
Reviewed by: bz
MFC after: immediately
-rw-r--r-- | sys/net/if_llatbl.c | 9 | ||||
-rw-r--r-- | sys/netinet6/in6.c | 11 |
2 files changed, 7 insertions, 13 deletions
diff --git a/sys/net/if_llatbl.c b/sys/net/if_llatbl.c index fb94f73..b66d6e1 100644 --- a/sys/net/if_llatbl.c +++ b/sys/net/if_llatbl.c @@ -263,15 +263,6 @@ lla_rt_output(struct rt_msghdr *rtm, struct rt_addrinfo *info) __func__, dl->sdl_index); return EINVAL; } - if (ifp->if_flags & IFF_LOOPBACK) { - struct ifaddr *ia; - ia = ifa_ifwithaddr(dst); - if (ia != NULL) { - ifp = ia->ifa_ifp; - ifa_free(ia); - } else - return EINVAL; - } switch (rtm->rtm_type) { case RTM_ADD: diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c index 9521e8e..c832305 100644 --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -1192,9 +1192,10 @@ in6_purgeaddr(struct ifaddr *ifa) /* * Remove the loopback route to the interface address. - * The check for the current setting of "nd6_useloopback" is not needed. + * The check for the current setting of "nd6_useloopback" + * is not needed. */ - if (!(ia->ia_ifp->if_flags & IFF_LOOPBACK)) { + { struct rt_addrinfo info; struct sockaddr_dl null_sdl; @@ -1767,7 +1768,9 @@ in6_ifinit(struct ifnet *ifp, struct in6_ifaddr *ia, /* * add a loopback route to self */ - if (V_nd6_useloopback && !(ifp->if_flags & IFF_LOOPBACK)) { + 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}; @@ -1788,7 +1791,7 @@ in6_ifinit(struct ifnet *ifp, struct in6_ifaddr *ia, RT_REMREF(rt); RT_UNLOCK(rt); } else if (error != 0) - log(LOG_INFO, "in6_ifinit: insertion failed\n"); + log(LOG_INFO, "in6_ifinit: error = %d, insertion failed\n", error); } /* Add ownaddr as loopback rtentry, if necessary (ex. on p2p link). */ |