When we already had a valid ``ifp'' I used it.  Since defrouter_lookup()
is only doing a comparison, let's use interface indexes.

ok?

Index: netinet6/nd6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/nd6.c,v
retrieving revision 1.166
diff -u -p -r1.166 nd6.c
--- netinet6/nd6.c      29 Oct 2015 14:28:34 -0000      1.166
+++ netinet6/nd6.c      29 Oct 2015 14:49:03 -0000
@@ -658,7 +658,7 @@ nd6_lookup(struct in6_addr *addr6, int c
         */
        if ((rt->rt_flags & RTF_GATEWAY) || (rt->rt_flags & RTF_LLINFO) == 0 ||
            rt->rt_gateway->sa_family != AF_LINK || rt->rt_llinfo == NULL ||
-           (ifp != NULL && rt->rt_ifp != ifp)) {
+           (ifp != NULL && rt->rt_ifidx != ifp->if_index)) {
                if (create) {
                        char addr[INET6_ADDRSTRLEN];
                        nd6log((LOG_DEBUG, "%s: failed to lookup %s (if=%s)\n",
@@ -751,17 +751,19 @@ nd6_free(struct rtentry *rt, int gc)
        struct llinfo_nd6 *ln = (struct llinfo_nd6 *)rt->rt_llinfo, *next;
        struct in6_addr in6 = satosin6(rt_key(rt))->sin6_addr;
        struct nd_defrouter *dr;
+       struct ifnet *ifp;
        int s;
 
        /*
         * we used to have pfctlinput(PRC_HOSTDEAD) here.
         * even though it is not harmful, it was not really necessary.
         */
+       ifp = if_get(rt->rt_ifidx);
 
        s = splsoftnet();
        if (!ip6_forwarding) {
                dr = defrouter_lookup(&satosin6(rt_key(rt))->sin6_addr,
-                   rt->rt_ifp);
+                   rt->rt_ifidx);
 
                if (dr != NULL && dr->expire &&
                    ln->ln_state == ND6_LLINFO_STALE && gc) {
@@ -783,6 +785,7 @@ nd6_free(struct rtentry *rt, int gc)
                        } else
                                nd6_llinfo_settimer(ln, (long)nd6_gctimer * hz);
                        splx(s);
+                       if_put(ifp);
                        return (ln->ln_next);
                }
 
@@ -792,7 +795,7 @@ nd6_free(struct rtentry *rt, int gc)
                         * is in the Default Router List.
                         * See a corresponding comment in nd6_na_input().
                         */
-                       rt6_flush(&in6, rt->rt_ifp);
+                       rt6_flush(&in6, ifp);
                }
 
                if (dr) {
@@ -839,9 +842,11 @@ nd6_free(struct rtentry *rt, int gc)
         * caches, and disable the route entry not to be used in already
         * cached routes.
         */
-       rtdeletemsg(rt, rt->rt_ifp->if_rdomain);
+       rtdeletemsg(rt, ifp->if_rdomain);
        splx(s);
 
+       if_put(ifp);
+
        return (next);
 }
 
@@ -899,7 +904,8 @@ nd6_rtrequest(struct ifnet *ifp, int req
            &in6addr_any) && rt_mask(rt) && (rt_mask(rt)->sa_len == 0 ||
            IN6_ARE_ADDR_EQUAL(&(satosin6(rt_mask(rt)))->sin6_addr,
            &in6addr_any)))) {
-               dr = defrouter_lookup(&satosin6(gate)->sin6_addr, ifp);
+               dr = defrouter_lookup(&satosin6(gate)->sin6_addr,
+                   ifp->if_index);
                if (dr)
                        dr->installed = 0;
        }
Index: netinet6/nd6.h
===================================================================
RCS file: /cvs/src/sys/netinet6/nd6.h,v
retrieving revision 1.52
diff -u -p -r1.52 nd6.h
--- netinet6/nd6.h      28 Oct 2015 12:14:25 -0000      1.52
+++ netinet6/nd6.h      29 Oct 2015 14:42:35 -0000
@@ -299,7 +299,7 @@ int prelist_update(struct nd_prefix *, s
 int nd6_prelist_add(struct nd_prefix *, struct nd_defrouter *,
        struct nd_prefix **);
 void pfxlist_onlink_check(void);
-struct nd_defrouter *defrouter_lookup(struct in6_addr *, struct ifnet *);
+struct nd_defrouter *defrouter_lookup(struct in6_addr *, unsigned int);
 
 struct nd_prefix *nd6_prefix_lookup(struct nd_prefix *);
 int in6_ifdel(struct ifnet *, struct in6_addr *);
Index: netinet6/nd6_nbr.c
===================================================================
RCS file: /cvs/src/sys/netinet6/nd6_nbr.c,v
retrieving revision 1.97
diff -u -p -r1.97 nd6_nbr.c
--- netinet6/nd6_nbr.c  22 Oct 2015 15:37:47 -0000      1.97
+++ netinet6/nd6_nbr.c  29 Oct 2015 14:47:42 -0000
@@ -730,7 +730,7 @@ nd6_na_input(struct mbuf *m, int off, in
                        ln->ln_byhint = 0;
                        if (!ND6_LLINFO_PERMANENT(ln)) {
                                nd6_llinfo_settimer(ln,
-                                   (long)ND_IFINFO(rt->rt_ifp)->reachable * 
hz);
+                                   (long)ND_IFINFO(ifp)->reachable * hz);
                        }
                } else {
                        ln->ln_state = ND6_LLINFO_STALE;
@@ -851,7 +851,7 @@ nd6_na_input(struct mbuf *m, int off, in
                         * context.  However, we keep it just for safety.
                         */
                        s = splsoftnet();
-                       dr = defrouter_lookup(in6, rt->rt_ifp);
+                       dr = defrouter_lookup(in6, rt->rt_ifidx);
                        if (dr)
                                defrtrlist_del(dr);
                        else if (!ip6_forwarding) {
@@ -862,7 +862,7 @@ nd6_na_input(struct mbuf *m, int off, in
                                 * (e.g. redirect case). So we must
                                 * call rt6_flush explicitly.
                                 */
-                               rt6_flush(&ip6->ip6_src, rt->rt_ifp);
+                               rt6_flush(&ip6->ip6_src, ifp);
                        }
                        splx(s);
                }
Index: netinet6/nd6_rtr.c
===================================================================
RCS file: /cvs/src/sys/netinet6/nd6_rtr.c,v
retrieving revision 1.130
diff -u -p -r1.130 nd6_rtr.c
--- netinet6/nd6_rtr.c  28 Oct 2015 12:14:25 -0000      1.130
+++ netinet6/nd6_rtr.c  29 Oct 2015 14:46:19 -0000
@@ -611,12 +611,13 @@ defrouter_addreq(struct nd_defrouter *ne
 }
 
 struct nd_defrouter *
-defrouter_lookup(struct in6_addr *addr, struct ifnet *ifp)
+defrouter_lookup(struct in6_addr *addr, unsigned int ifidx)
 {
        struct nd_defrouter *dr;
 
        TAILQ_FOREACH(dr, &nd_defrouter, dr_entry)
-               if (dr->ifp == ifp && IN6_ARE_ADDR_EQUAL(addr, &dr->rtaddr))
+               if (dr->ifp->if_index == ifidx &&
+                   IN6_ARE_ADDR_EQUAL(addr, &dr->rtaddr))
                        return (dr);
 
        return (NULL);          /* search failed */
@@ -873,7 +874,7 @@ defrtrlist_update(struct nd_defrouter *n
        struct in6_ifextra *ext = new->ifp->if_afdata[AF_INET6];
        int s = splsoftnet();
 
-       if ((dr = defrouter_lookup(&new->rtaddr, new->ifp)) != NULL) {
+       if ((dr = defrouter_lookup(&new->rtaddr, new->ifp->if_index)) != NULL) {
                /* entry exists */
                if (new->rtlifetime == 0) {
                        defrtrlist_del(dr);

Reply via email to