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)