Author: melifaro
Date: Wed Dec 16 10:14:16 2015
New Revision: 292333
URL: https://svnweb.freebsd.org/changeset/base/292333

Log:
  Provide additional lle data in IPv6 lltable dump used by ndp(8).
  
  Before the change, things like lle state were queried via
    SIOCGNBRINFO_IN6 by ndp(8) for _each_ lle entry in dump.
  This ioctl was added in 1999, probably to avoid touching rtsock code.
  
  This change maps SIOCGNBRINFO_IN6 data to standard rtsock dump the
   following way:
    expire (already) maps to rtm_rmx.rmx_expire
    isrouter -> rtm_flags & RTF_GATEWAY
    asked -> rtm_rmx.rmx_pksent
    state -> rtm_rmx.rmx_state (maps to rmx_weight via define)
  
  Reviewed by:  ae

Modified:
  head/sys/net/route.h
  head/sys/netinet6/in6.c
  head/sys/netinet6/nd6.c
  head/usr.sbin/ndp/ndp.c

Modified: head/sys/net/route.h
==============================================================================
--- head/sys/net/route.h        Wed Dec 16 09:20:45 2015        (r292332)
+++ head/sys/net/route.h        Wed Dec 16 10:14:16 2015        (r292333)
@@ -83,6 +83,9 @@ struct rt_metrics {
 #define        RTM_RTTUNIT     1000000 /* units for rtt, rttvar, as units per 
sec */
 #define        RTTTOPRHZ(r)    ((r) / (RTM_RTTUNIT / PR_SLOWHZ))
 
+/* lle state is exported in rmx_state rt_metrics field */
+#define        rmx_state       rmx_weight
+
 #define        RT_DEFAULT_FIB  0       /* Explicitly mark fib=0 restricted 
cases */
 #define        RT_ALL_FIBS     -1      /* Announce event for every fib */
 #ifdef _KERNEL

Modified: head/sys/netinet6/in6.c
==============================================================================
--- head/sys/netinet6/in6.c     Wed Dec 16 09:20:45 2015        (r292332)
+++ head/sys/netinet6/in6.c     Wed Dec 16 10:14:16 2015        (r292333)
@@ -2359,13 +2359,20 @@ in6_lltable_dump_entry(struct lltable *l
                        sdl->sdl_index = ifp->if_index;
                        sdl->sdl_type = ifp->if_type;
                        bcopy(&lle->ll_addr, LLADDR(sdl), ifp->if_addrlen);
-                       ndpc.rtm.rtm_rmx.rmx_expire = lle->la_expire +
-                           lle->lle_remtime / hz;
+                       if (lle->la_expire != 0)
+                               ndpc.rtm.rtm_rmx.rmx_expire = lle->la_expire +
+                                   lle->lle_remtime / hz +
+                                   time_second - time_uptime;
                        ndpc.rtm.rtm_flags |= (RTF_HOST | RTF_LLDATA);
                        if (lle->la_flags & LLE_STATIC)
                                ndpc.rtm.rtm_flags |= RTF_STATIC;
                        if (lle->la_flags & LLE_IFADDR)
                                ndpc.rtm.rtm_flags |= RTF_PINNED;
+                       if (lle->ln_router != 0)
+                               ndpc.rtm.rtm_flags |= RTF_GATEWAY;
+                       ndpc.rtm.rtm_rmx.rmx_pksent = lle->la_asked;
+                       /* Store state in rmx_weight value */
+                       ndpc.rtm.rtm_rmx.rmx_state = lle->ln_state;
                        ndpc.rtm.rtm_index = ifp->if_index;
                        error = SYSCTL_OUT(wr, &ndpc, sizeof(ndpc));
 

Modified: head/sys/netinet6/nd6.c
==============================================================================
--- head/sys/netinet6/nd6.c     Wed Dec 16 09:20:45 2015        (r292332)
+++ head/sys/netinet6/nd6.c     Wed Dec 16 10:14:16 2015        (r292333)
@@ -1748,7 +1748,7 @@ nd6_ioctl(u_long cmd, caddr_t data, stru
                if (ln->la_expire == 0)
                        nbi->expire = 0;
                else
-                       nbi->expire = ln->la_expire +
+                       nbi->expire = ln->la_expire + ln->lle_remtime / hz +
                            (time_second - time_uptime);
                LLE_RUNLOCK(ln);
                break;

Modified: head/usr.sbin/ndp/ndp.c
==============================================================================
--- head/usr.sbin/ndp/ndp.c     Wed Dec 16 09:20:45 2015        (r292332)
+++ head/usr.sbin/ndp/ndp.c     Wed Dec 16 10:14:16 2015        (r292333)
@@ -563,8 +563,8 @@ dump(struct sockaddr_in6 *addr, int cfla
        struct sockaddr_in6 *sin;
        struct sockaddr_dl *sdl;
        extern int h_errno;
-       struct in6_nbrinfo *nbi;
        struct timeval now;
+       u_long expire;
        int addrwidth;
        int llwidth;
        int ifwidth;
@@ -676,52 +676,46 @@ again:;
                    llwidth, llwidth, ether_str(sdl), ifwidth, ifwidth, ifname);
 
                /* Print neighbor discovery specific information */
-               nbi = getnbrinfo(&sin->sin6_addr, sdl->sdl_index, 1);
-               if (nbi) {
-                       if (nbi->expire > now.tv_sec) {
-                               printf(" %-9.9s",
-                                   sec2str(nbi->expire - now.tv_sec));
-                       } else if (nbi->expire == 0)
-                               printf(" %-9.9s", "permanent");
-                       else
-                               printf(" %-9.9s", "expired");
-
-                       switch (nbi->state) {
-                       case ND6_LLINFO_NOSTATE:
-                                printf(" N");
-                                break;
-#ifdef ND6_LLINFO_WAITDELETE
-                       case ND6_LLINFO_WAITDELETE:
-                                printf(" W");
-                                break;
-#endif
-                       case ND6_LLINFO_INCOMPLETE:
-                                printf(" I");
-                                break;
-                       case ND6_LLINFO_REACHABLE:
-                                printf(" R");
-                                break;
-                       case ND6_LLINFO_STALE:
-                                printf(" S");
-                                break;
-                       case ND6_LLINFO_DELAY:
-                                printf(" D");
-                                break;
-                       case ND6_LLINFO_PROBE:
-                                printf(" P");
-                                break;
-                       default:
-                                printf(" ?");
-                                break;
-                       }
+               expire = rtm->rtm_rmx.rmx_expire;
+               if (expire > now.tv_sec)
+                       printf(" %-9.9s", sec2str(expire - now.tv_sec));
+               else if (expire == 0)
+                       printf(" %-9.9s", "permanent");
+               else
+                       printf(" %-9.9s", "expired");
 
-                       isrouter = nbi->isrouter;
-                       prbs = nbi->asked;
-               } else {
-                       warnx("failed to get neighbor information");
-                       printf("  ");
+               switch (rtm->rtm_rmx.rmx_state) {
+               case ND6_LLINFO_NOSTATE:
+                        printf(" N");
+                        break;
+#ifdef ND6_LLINFO_WAITDELETE
+               case ND6_LLINFO_WAITDELETE:
+                        printf(" W");
+                        break;
+#endif
+               case ND6_LLINFO_INCOMPLETE:
+                        printf(" I");
+                        break;
+               case ND6_LLINFO_REACHABLE:
+                        printf(" R");
+                        break;
+               case ND6_LLINFO_STALE:
+                        printf(" S");
+                        break;
+               case ND6_LLINFO_DELAY:
+                        printf(" D");
+                        break;
+               case ND6_LLINFO_PROBE:
+                        printf(" P");
+                        break;
+               default:
+                        printf(" ?");
+                        break;
                }
 
+               isrouter = rtm->rtm_flags & RTF_GATEWAY;
+               prbs = rtm->rtm_rmx.rmx_pksent;
+
                /*
                 * other flags. R: router, P: proxy, W: ??
                 */
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to