This brings arplookup() in sync with nd6_lookup() and is necessary for upcoming "struct rtentry" reference count.
Ok? Index: netinet/if_ether.c =================================================================== RCS file: /cvs/src/sys/netinet/if_ether.c,v retrieving revision 1.160 diff -u -p -r1.160 if_ether.c --- netinet/if_ether.c 17 Aug 2015 09:58:10 -0000 1.160 +++ netinet/if_ether.c 17 Aug 2015 10:02:22 -0000 @@ -93,7 +93,7 @@ int arpt_down = 20; /* once declared do void arptfree(struct llinfo_arp *); void arptimer(void *); -struct llinfo_arp *arplookup(u_int32_t, int, int, u_int); +struct rtentry *arplookup(u_int32_t, int, int, u_int); void in_arpinput(struct mbuf *); LIST_HEAD(, llinfo_arp) llinfo_arp; @@ -372,9 +372,9 @@ arpresolve(struct ifnet *ifp, struct rte "local address\n", __func__, inet_ntop(AF_INET, &satosin(dst)->sin_addr, addr, sizeof(addr))); } else { - if ((la = arplookup(satosin(dst)->sin_addr.s_addr, 1, 0, + if ((rt = arplookup(satosin(dst)->sin_addr.s_addr, 1, 0, ifp->if_rdomain)) != NULL) - rt = la->la_rt; + la = ((struct llinfo_arp *)rt->rt_llinfo); else log(LOG_DEBUG, "%s: %s: can't allocate llinfo\n", __func__, @@ -633,9 +633,10 @@ in_arpinput(struct mbuf *m) itaddr = myaddr; goto reply; } - la = arplookup(isaddr.s_addr, itaddr.s_addr == myaddr.s_addr, 0, + rt = arplookup(isaddr.s_addr, itaddr.s_addr == myaddr.s_addr, 0, rtable_l2(m->m_pkthdr.ph_rtableid)); - if (la && (rt = la->la_rt) && (sdl = SDL(rt->rt_gateway))) { + if (rt != NULL && (la = (struct llinfo_arp *)rt->rt_llinfo) && + (sdl = SDL(rt->rt_gateway))) { if (sdl->sdl_alen) { if (memcmp(ea->arp_sha, LLADDR(sdl), sdl->sdl_alen)) { if (rt->rt_flags & @@ -730,11 +731,10 @@ out: memcpy(ea->arp_tha, ea->arp_sha, sizeof(ea->arp_sha)); memcpy(ea->arp_sha, enaddr, sizeof(ea->arp_sha)); } else { - la = arplookup(itaddr.s_addr, 0, SIN_PROXY, + rt = arplookup(itaddr.s_addr, 0, SIN_PROXY, rtable_l2(m->m_pkthdr.ph_rtableid)); - if (la == NULL) + if (rt == NULL) goto out; - rt = la->la_rt; if (rt->rt_ifp->if_type == IFT_CARP && ifp->if_type != IFT_CARP) goto out; memcpy(ea->arp_tha, ea->arp_sha, sizeof(ea->arp_sha)); @@ -790,7 +790,7 @@ arptfree(struct llinfo_arp *la) /* * Lookup or enter a new address in arptab. */ -struct llinfo_arp * +struct rtentry * arplookup(u_int32_t addr, int create, int proxy, u_int tableid) { struct rtentry *rt; @@ -818,7 +818,7 @@ arplookup(u_int32_t addr, int create, in } return (0); } - return ((struct llinfo_arp *)rt->rt_llinfo); + return (rt); } /* @@ -827,13 +827,15 @@ arplookup(u_int32_t addr, int create, in int arpproxy(struct in_addr in, u_int rdomain) { + struct rtentry *rt; struct llinfo_arp *la; struct ifnet *ifp; int found = 0; - la = arplookup(in.s_addr, 0, SIN_PROXY, rdomain); - if (la == NULL) + rt = arplookup(in.s_addr, 0, SIN_PROXY, rdomain); + if (rt == NULL) return (0); + la = ((struct llinfo_arp *)rt->rt_llinfo); TAILQ_FOREACH(ifp, &ifnet, if_list) { if (ifp->if_rdomain != rdomain)