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);