On Thu, Oct 29, 2015 at 03:54:29PM +0100, Martin Pieuchot wrote:
> When we already had a valid ``ifp'' I used it.  Since defrouter_lookup()
> is only doing a comparison, let's use interface indexes.
> 
> ok?

OK bluhm@

> 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