summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorqingli <qingli@FreeBSD.org>2009-09-05 20:24:37 +0000
committerqingli <qingli@FreeBSD.org>2009-09-05 20:24:37 +0000
commit5b9cf14b541867aeeeabf34edade1a0f5c528580 (patch)
tree23e5204856c079440b9f1c66f4db0b5f98d03023
parentfb643392b2cef85ef9905fe0bedb32bd926fe9dc (diff)
downloadFreeBSD-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.c9
-rw-r--r--sys/netinet6/in6.c11
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). */
OpenPOWER on IntegriCloud