Both are initalised with compile-time constants and never written to. They are part of the Neighbour Discovery machinery and only surface through the single-user SIOCGIFINFO_IN6: $ ndp -i lo0 basereachable=30s0ms, reachable=39s, retrans=1s0ms
These values are read-only since 2017 sys/netinet6/nd6.c r1.217 usr.sbin/ndp/ndp.c r1.85 Remove knob and always do neighbor unreachable detection Inline the macros (to keep meaningful names), shrink the per-interface allocated struct nd_ifinfo to what is actually needed and inline nd6_dad_starttimer()'s constant `msec' argument. This makes it clear how SIOCGIFINFO_IN6 is less useful than it seems: $ ./obj/ndp -i lo0 reachable=39s Nothing else in base, incl. regress, uses SIOCGIFINFO_IN6 or `ndp -i'. Feedback? Objection? OK? (Sorry for the header/ABI churn, I could've cleaned this up earlier... if I had seen this right away between all the other dead code.) diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c index 10753026d4b..0a1d5fb24c7 100644 --- a/sys/netinet6/nd6.c +++ b/sys/netinet6/nd6.c @@ -124,9 +124,7 @@ nd6_ifattach(struct ifnet *ifp) nd = malloc(sizeof(*nd), M_IP6NDP, M_WAITOK | M_ZERO); - nd->basereachable = REACHABLE_TIME; - nd->reachable = ND_COMPUTE_RTIME(nd->basereachable); - nd->retrans = RETRANS_TIMER; + nd->reachable = ND_COMPUTE_RTIME(REACHABLE_TIME); ifp->if_nd = nd; } @@ -349,7 +347,7 @@ nd6_llinfo_timer(struct rtentry *rt) case ND6_LLINFO_INCOMPLETE: if (ln->ln_asked < nd6_mmaxtries) { ln->ln_asked++; - nd6_llinfo_settimer(ln, ifp->if_nd->retrans / 1000); + nd6_llinfo_settimer(ln, RETRANS_TIMER / 1000); nd6_ns_output(ifp, NULL, &dst->sin6_addr, ln, 0); } else { struct mbuf *m = ln->ln_hold; @@ -396,13 +394,13 @@ nd6_llinfo_timer(struct rtentry *rt) /* We need NUD */ ln->ln_asked = 1; ln->ln_state = ND6_LLINFO_PROBE; - nd6_llinfo_settimer(ln, ifp->if_nd->retrans / 1000); + nd6_llinfo_settimer(ln, RETRANS_TIMER / 1000); nd6_ns_output(ifp, &dst->sin6_addr, &dst->sin6_addr, ln, 0); break; case ND6_LLINFO_PROBE: if (ln->ln_asked < nd6_umaxtries) { ln->ln_asked++; - nd6_llinfo_settimer(ln, ifp->if_nd->retrans / 1000); + nd6_llinfo_settimer(ln, RETRANS_TIMER / 1000); nd6_ns_output(ifp, &dst->sin6_addr, &dst->sin6_addr, ln, 0); } else { @@ -1281,8 +1279,7 @@ nd6_slowtimo(void *ignored_arg) TAILQ_FOREACH(ifp, &ifnetlist, if_list) { nd6if = ifp->if_nd; - if (nd6if->basereachable && /* already initialized */ - (nd6if->recalctm -= ND6_SLOWTIMER_INTERVAL) <= 0) { + if ((nd6if->recalctm -= ND6_SLOWTIMER_INTERVAL) <= 0) { /* * Since reachable time rarely changes by router * advertisements, we SHOULD insure that a new random @@ -1290,7 +1287,7 @@ nd6_slowtimo(void *ignored_arg) * (RFC 2461, 6.3.4) */ nd6if->recalctm = ND6_RECALC_REACHTM_INTERVAL; - nd6if->reachable = ND_COMPUTE_RTIME(nd6if->basereachable); + nd6if->reachable = ND_COMPUTE_RTIME(REACHABLE_TIME); } } NET_UNLOCK(); @@ -1399,7 +1396,7 @@ nd6_resolve(struct ifnet *ifp, struct rtentry *rt0, struct mbuf *m, */ if (!ND6_LLINFO_PERMANENT(ln) && ln->ln_asked == 0) { ln->ln_asked++; - nd6_llinfo_settimer(ln, ifp->if_nd->retrans / 1000); + nd6_llinfo_settimer(ln, RETRANS_TIMER / 1000); nd6_ns_output(ifp, NULL, &satosin6(dst)->sin6_addr, ln, 0); } return (EAGAIN); diff --git a/sys/netinet6/nd6.h b/sys/netinet6/nd6.h index d55bab0027e..897147e5501 100644 --- a/sys/netinet6/nd6.h +++ b/sys/netinet6/nd6.h @@ -45,14 +45,11 @@ /* * Locks used to protect struct members in this file: - * I immutable after creation * N net lock */ struct nd_ifinfo { - u_int32_t basereachable; /* [I] BaseReachableTime */ u_int32_t reachable; /* [N] Reachable Time */ - u_int32_t retrans; /* [I] Retrans Timer */ int recalctm; /* [N] BaseReachable recalc timer */ }; diff --git a/sys/netinet6/nd6_nbr.c b/sys/netinet6/nd6_nbr.c index e68ccbd4944..6046b90dcb9 100644 --- a/sys/netinet6/nd6_nbr.c +++ b/sys/netinet6/nd6_nbr.c @@ -76,7 +76,7 @@ struct dadq { }; struct dadq *nd6_dad_find(struct ifaddr *); -void nd6_dad_starttimer(struct dadq *, int); +void nd6_dad_starttimer(struct dadq *); void nd6_dad_stoptimer(struct dadq *); void nd6_dad_timer(void *); void nd6_dad_ns_output(struct dadq *, struct ifaddr *); @@ -1050,17 +1050,15 @@ nd6_dad_find(struct ifaddr *ifa) } void -nd6_dad_starttimer(struct dadq *dp, int msec) +nd6_dad_starttimer(struct dadq *dp) { - timeout_set_proc(&dp->dad_timer_ch, nd6_dad_timer, dp->dad_ifa); - timeout_add_msec(&dp->dad_timer_ch, msec); + timeout_add_msec(&dp->dad_timer_ch, RETRANS_TIMER); } void nd6_dad_stoptimer(struct dadq *dp) { - timeout_del(&dp->dad_timer_ch); } @@ -1122,7 +1120,7 @@ nd6_dad_start(struct ifaddr *ifa) dp->dad_ns_icount = dp->dad_na_icount = 0; dp->dad_ns_ocount = dp->dad_ns_tcount = 0; nd6_dad_ns_output(dp, ifa); - nd6_dad_starttimer(dp, ifa->ifa_ifp->if_nd->retrans); + nd6_dad_starttimer(dp); } /* @@ -1201,7 +1199,7 @@ nd6_dad_timer(void *xifa) * We have more NS to go. Send NS packet for DAD. */ nd6_dad_ns_output(dp, ifa); - nd6_dad_starttimer(dp, ifa->ifa_ifp->if_nd->retrans); + nd6_dad_starttimer(dp); } else { /* * We have transmitted enough DAD packets. diff --git a/usr.sbin/ndp/ndp.c b/usr.sbin/ndp/ndp.c index 83147f7d748..13898e24b54 100644 --- a/usr.sbin/ndp/ndp.c +++ b/usr.sbin/ndp/ndp.c @@ -888,11 +888,7 @@ ifinfo(const char *ifname) if (ioctl(s, SIOCGIFINFO_IN6, (caddr_t)&nd) == -1) err(1, "ioctl(SIOCGIFINFO_IN6)"); - printf("basereachable=%ds%dms", - nd.ndi.basereachable / 1000, nd.ndi.basereachable % 1000); - printf(", reachable=%ds", nd.ndi.reachable); - printf(", retrans=%ds%dms\n", nd.ndi.retrans / 1000, - nd.ndi.retrans % 1000); + printf("reachable=%ds\n", nd.ndi.reachable); close(s); }