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);