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
This commit is contained in:
parent
adc1aa7a29
commit
427c2f4ef0
@ -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
|
||||
|
@ -2359,13 +2359,20 @@ in6_lltable_dump_entry(struct lltable *llt, struct llentry *lle,
|
||||
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));
|
||||
|
||||
|
@ -1748,7 +1748,7 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp)
|
||||
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;
|
||||
|
@ -563,8 +563,8 @@ dump(struct sockaddr_in6 *addr, int cflag)
|
||||
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");
|
||||
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");
|
||||
|
||||
switch (nbi->state) {
|
||||
case ND6_LLINFO_NOSTATE:
|
||||
printf(" N");
|
||||
break;
|
||||
switch (rtm->rtm_rmx.rmx_state) {
|
||||
case ND6_LLINFO_NOSTATE:
|
||||
printf(" N");
|
||||
break;
|
||||
#ifdef ND6_LLINFO_WAITDELETE
|
||||
case ND6_LLINFO_WAITDELETE:
|
||||
printf(" W");
|
||||
break;
|
||||
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 = nbi->isrouter;
|
||||
prbs = nbi->asked;
|
||||
} else {
|
||||
warnx("failed to get neighbor information");
|
||||
printf(" ");
|
||||
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: ??
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user