Diff below indicates by using a `l' flag which entries are local to the
machine.

It also skips broadcast entries from the "arp -a" output because even if
they are implemented as llinfo entries, they'll never be resolved and can
be safely ignored.

Finally it change arp(8) to display 'permanent' instead of 'static' for
local entries, to be coherent with ndp(8).

Ok?

Index: arp/arp.8
===================================================================
RCS file: /home/ncvs/src/usr.sbin/arp/arp.8,v
retrieving revision 1.34
diff -u -p -r1.34 arp.8
--- arp/arp.8   21 Aug 2014 10:23:47 -0000      1.34
+++ arp/arp.8   2 Sep 2014 08:18:23 -0000
@@ -99,7 +99,9 @@ or
 it will never expire.
 .It Flags
 Flags on the ARP entry, in a single letter.
-They are: proxy
+They are: local
+.Pq Sq l ,
+proxy
 .Pq Sq P
 and published
 .Pq Sq p .
Index: arp/arp.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/arp/arp.c,v
retrieving revision 1.60
diff -u -p -r1.60 arp.c
--- arp/arp.c   22 Aug 2014 22:14:53 -0000      1.60
+++ arp/arp.c   2 Sep 2014 08:18:23 -0000
@@ -493,6 +493,8 @@ search(in_addr_t addr, void (*action)(st
                rtm = (struct rt_msghdr *)next;
                if (rtm->rtm_version != RTM_VERSION)
                        continue;
+               if (rtm->rtm_flags & RTF_BROADCAST)
+                       continue;
                sin = (struct sockaddr_inarp *)(next + rtm->rtm_hdrlen);
                sdl = (struct sockaddr_dl *)(sin + 1);
                if (addr) {
@@ -557,7 +559,7 @@ print_entry(struct sockaddr_dl *sdl, str
        printf("%-*.*s %-*.*s %*.*s", addrwidth, addrwidth, host,
            llwidth, llwidth, ether_str(sdl), ifwidth, ifwidth, ifname);
 
-       if (rtm->rtm_flags & RTF_PERMANENT_ARP)
+       if (rtm->rtm_flags & (RTF_PERMANENT_ARP|RTF_LOCAL|RTF_BROADCAST))
                printf(" %-10.10s", "permanent");
        else if (rtm->rtm_rmx.rmx_expire == 0)
                printf(" %-10.10s", "static");
@@ -567,7 +569,8 @@ print_entry(struct sockaddr_dl *sdl, str
        else
                printf(" %-10.10s", "expired");
 
-       snprintf(flgbuf, sizeof(flgbuf), "%s%s",
+       snprintf(flgbuf, sizeof(flgbuf), "%s%s%s",
+           (rtm->rtm_flags & RTF_LOCAL) ? "l" : "",
            (sin->sin_other & SIN_PROXY) ? "P" : "",
            (rtm->rtm_flags & RTF_ANNOUNCE) ? "p" : "");
 
Index: ndp/ndp.8
===================================================================
RCS file: /home/ncvs/src/usr.sbin/ndp/ndp.8,v
retrieving revision 1.32
diff -u -p -r1.32 ndp.8
--- ndp/ndp.8   12 Jul 2014 17:03:47 -0000      1.32
+++ ndp/ndp.8   2 Sep 2014 08:18:23 -0000
@@ -105,7 +105,9 @@ Unknown state (should never happen).
 .El
 .It Flags
 Flags on the neighbor cache entry, in a single letter.
-They are: Router
+They are: local
+.Pq Sq l ,
+Router
 .Pq Sq R
 and proxy neighbor advertisement
 .Pq Sq p .
Index: ndp/ndp.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/ndp/ndp.c,v
retrieving revision 1.56
diff -u -p -r1.56 ndp.c
--- ndp/ndp.c   22 Aug 2014 22:37:32 -0000      1.56
+++ ndp/ndp.c   2 Sep 2014 08:18:23 -0000
@@ -714,23 +714,17 @@ again:;
                 * other flags. R: router, P: proxy, W: ??
                 */
                if ((rtm->rtm_addrs & RTA_NETMASK) == 0) {
-                       snprintf(flgbuf, sizeof(flgbuf), "%s%s",
+                       snprintf(flgbuf, sizeof(flgbuf), "%s%s%s",
+                           (rtm->rtm_flags & RTF_LOCAL) ? "l" : "",
                            isrouter ? "R" : "",
                            (rtm->rtm_flags & RTF_ANNOUNCE) ? "p" : "");
                } else {
                        sin = (struct sockaddr_in6 *)
                            (sdl->sdl_len + (char *)sdl);
-#if 0  /* W and P are mystery even for us */
-                       snprintf(flgbuf, sizeof(flgbuf), "%s%s%s%s",
+                       snprintf(flgbuf, sizeof(flgbuf), "%s%s%s",
+                           (rtm->rtm_flags & RTF_LOCAL) ? "l" : "",
                            isrouter ? "R" : "",
-                           !IN6_IS_ADDR_UNSPECIFIED(&sin->sin6_addr) ? "P" : 
"",
-                           (sin->sin6_len != sizeof(struct sockaddr_in6)) ? 
"W" : "",
                            (rtm->rtm_flags & RTF_ANNOUNCE) ? "p" : "");
-#else
-                       snprintf(flgbuf, sizeof(flgbuf), "%s%s",
-                           isrouter ? "R" : "",
-                           (rtm->rtm_flags & RTF_ANNOUNCE) ? "p" : "");
-#endif
                }
                printf(" %s", flgbuf);
 

Reply via email to