Most of the local routes added on a system contain the link-layer
address of the interface they are attached too.  It is like that
because these routes must be compatible with the cloned routes for
ARP or ND.

But for loopback or point-to-point interfaces it is different since
the 'gateway' of such routes contain 127.0.0.1.  So there's no reason
to flag such route with RTF_LLINFO.  Diff below does that, as a result
you won't see an incomplete entry in arp(8) for loopback addresses.

-127.0.0.1          127.0.0.1          UHLl       1        0 32768     1 lo0
+127.0.0.1          127.0.0.1          UHl        1        0 32768     1 lo0

ok?

Index: net/route.c
===================================================================
RCS file: /cvs/src/sys/net/route.c,v
retrieving revision 1.184
diff -u -p -r1.184 route.c
--- net/route.c 1 Oct 2014 08:38:29 -0000       1.184
+++ net/route.c 2 Oct 2014 08:09:58 -0000
@@ -1202,6 +1202,7 @@ void
 rt_ifa_addloop(struct ifaddr *ifa)
 {
        struct rtentry *rt;
+       u_int flags = RTF_HOST|RTF_LOCAL;
 
        /*
         * If the configured address correspond to the magical "any"
@@ -1225,11 +1226,13 @@ rt_ifa_addloop(struct ifaddr *ifa)
                break;
        }
 
+       if (!ISSET(ifa->ifa_ifp->if_flags, (IFF_LOOPBACK|IFF_POINTOPOINT)))
+               flags |= RTF_LLINFO;
+
        /* If there is no loopback entry, allocate one. */
        rt = rtalloc1(ifa->ifa_addr, 0, ifa->ifa_ifp->if_rdomain);
-       if (rt == NULL || (rt->rt_flags & (RTF_HOST|RTF_LLINFO|RTF_LOCAL)) == 0)
-               rt_ifa_add(ifa, RTF_UP| RTF_HOST | RTF_LLINFO | RTF_LOCAL,
-                   ifa->ifa_addr);
+       if (rt == NULL || !ISSET(rt->rt_flags, flags));
+               rt_ifa_add(ifa, RTF_UP | flags, ifa->ifa_addr);
        if (rt)
                rt->rt_refcnt--;
 }
@@ -1241,6 +1244,7 @@ void
 rt_ifa_delloop(struct ifaddr *ifa)
 {
        struct rtentry *rt;
+       u_int flags = RTF_HOST|RTF_LOCAL;
 
        /*
         * We do not add local routes for such address, so do not bother
@@ -1262,6 +1266,9 @@ rt_ifa_delloop(struct ifaddr *ifa)
                break;
        }
 
+       if (!ISSET(ifa->ifa_ifp->if_flags, (IFF_LOOPBACK|IFF_POINTOPOINT)))
+               flags |= RTF_LLINFO;
+
        /*
         * Before deleting, check if a corresponding local host
         * route surely exists.  With this check, we can avoid to
@@ -1271,9 +1278,8 @@ rt_ifa_delloop(struct ifaddr *ifa)
         * to a shared medium.
         */
        rt = rtalloc1(ifa->ifa_addr, 0, ifa->ifa_ifp->if_rdomain);
-       if (rt != NULL && (rt->rt_flags & (RTF_HOST|RTF_LLINFO|RTF_LOCAL)) != 0)
-               rt_ifa_del(ifa,  RTF_HOST | RTF_LLINFO | RTF_LOCAL,
-                   ifa->ifa_addr);
+       if (rt != NULL && ISSET(rt->rt_flags, flags))
+               rt_ifa_del(ifa, flags, ifa->ifa_addr);
        if (rt)
                rt->rt_refcnt--;
 }

Reply via email to