Change nd6_nud_hint() to no longer use rt_ifp directly.  While here
remove unused argument and convert the route check to rtisvalid(9).

ok?

Index: netinet/tcp_input.c
===================================================================
RCS file: /cvs/src/sys/netinet/tcp_input.c,v
retrieving revision 1.307
diff -u -p -r1.307 tcp_input.c
--- netinet/tcp_input.c 28 Oct 2015 12:14:25 -0000      1.307
+++ netinet/tcp_input.c 5 Nov 2015 10:47:29 -0000
@@ -144,10 +144,9 @@ struct timeval tcp_ackdrop_ppslim_last;
 #ifdef INET6
 #define ND6_HINT(tp) \
 do { \
-       if (tp && tp->t_inpcb && (tp->t_inpcb->inp_flags & INP_IPV6) && \
-           tp->t_inpcb->inp_route6.ro_rt) { \
-               nd6_nud_hint(tp->t_inpcb->inp_route6.ro_rt, \
-                   tp->t_inpcb->inp_rtableid); \
+       if (tp && tp->t_inpcb && (tp->t_inpcb->inp_flags & INP_IPV6) && \
+           rtisvalid(tp->t_inpcb->inp_route6.ro_rt)) {                 \
+               nd6_nud_hint(tp->t_inpcb->inp_route6.ro_rt);            \
        } \
 } while (0)
 #else
Index: netinet6/nd6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/nd6.c,v
retrieving revision 1.171
diff -u -p -r1.171 nd6.c
--- netinet6/nd6.c      2 Nov 2015 12:51:16 -0000       1.171
+++ netinet6/nd6.c      5 Nov 2015 10:49:44 -0000
@@ -847,25 +847,26 @@ nd6_free(struct rtentry *rt, int gc)
  * XXX cost-effective methods?
  */
 void
-nd6_nud_hint(struct rtentry *rt, u_int rtableid)
+nd6_nud_hint(struct rtentry *rt)
 {
        struct llinfo_nd6 *ln;
+       struct ifnet *ifp;
 
-       if (rt == NULL) {
+       ifp = if_get(rt->rt_ifidx);
+       if (ifp == NULL)
                return;
-       }
 
        if ((rt->rt_flags & RTF_GATEWAY) != 0 ||
            (rt->rt_flags & RTF_LLINFO) == 0 ||
            rt->rt_llinfo == NULL || rt->rt_gateway == NULL ||
            rt->rt_gateway->sa_family != AF_LINK) {
                /* This is not a host route. */
-               return;
+               goto out;
        }
 
        ln = (struct llinfo_nd6 *)rt->rt_llinfo;
        if (ln->ln_state < ND6_LLINFO_REACHABLE)
-               return;
+               goto out;
 
        /*
         * if we get upper-layer reachability confirmation many times,
@@ -873,13 +874,13 @@ nd6_nud_hint(struct rtentry *rt, u_int r
         */
        ln->ln_byhint++;
        if (ln->ln_byhint > nd6_maxnudhint)
-               return;
+               goto out;
 
        ln->ln_state = ND6_LLINFO_REACHABLE;
-       if (!ND6_LLINFO_PERMANENT(ln)) {
-               nd6_llinfo_settimer(ln,
-                   (long)ND_IFINFO(rt->rt_ifp)->reachable * hz);
-       }
+       if (!ND6_LLINFO_PERMANENT(ln))
+               nd6_llinfo_settimer(ln, (long)ND_IFINFO(ifp)->reachable * hz);
+out:
+       if_put(ifp);
 }
 
 void
Index: netinet6/nd6.h
===================================================================
RCS file: /cvs/src/sys/netinet6/nd6.h,v
retrieving revision 1.54
diff -u -p -r1.54 nd6.h
--- netinet6/nd6.h      2 Nov 2015 12:51:16 -0000       1.54
+++ netinet6/nd6.h      5 Nov 2015 10:42:51 -0000
@@ -258,7 +258,7 @@ void nd6_setmtu(struct ifnet *);
 void nd6_llinfo_settimer(struct llinfo_nd6 *, long);
 void nd6_timer(void *);
 void nd6_purge(struct ifnet *);
-void nd6_nud_hint(struct rtentry *, u_int);
+void nd6_nud_hint(struct rtentry *);
 int nd6_resolve(struct ifnet *, struct rtentry *,
        struct mbuf *, struct sockaddr *, u_char *);
 void nd6_rtrequest(struct ifnet *, int, struct rtentry *);

Reply via email to