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"