summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Pieuchot <mpi@cvs.openbsd.org>2015-08-19 10:50:15 +0000
committerMartin Pieuchot <mpi@cvs.openbsd.org>2015-08-19 10:50:15 +0000
commit3ea99e53194ef1b152fc90dbf12279cd5ce16207 (patch)
tree9b4cb9d95a5b434e4737ad362937bedee7c7aec6
parent62ab3c78cf5995f2ed92bac446afb56db2b7e9b7 (diff)
Make arplookup() return a pointer to a "struct rtentry".
This is needed for proper refcounting of rtentries and reduce differences with nd6_lookup(). Tweak and ok bluhm@
-rw-r--r--sys/netinet/if_ether.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c
index e3d8c803a3f..335276db4ca 100644
--- a/sys/netinet/if_ether.c
+++ b/sys/netinet/if_ether.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_ether.c,v 1.160 2015/08/17 09:58:10 mpi Exp $ */
+/* $OpenBSD: if_ether.c,v 1.161 2015/08/19 10:50:14 mpi Exp $ */
/* $NetBSD: if_ether.c,v 1.31 1996/05/11 12:59:58 mycroft Exp $ */
/*
@@ -93,7 +93,7 @@ int arpt_down = 20; /* once declared down, don't send for 20 secs */
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 rtentry *rt0, struct mbuf *m,
"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 && (sdl = SDL(rt->rt_gateway)) != NULL) {
+ la = (struct llinfo_arp *)rt->rt_llinfo;
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;
@@ -806,7 +806,7 @@ arplookup(u_int32_t addr, int create, int proxy, u_int tableid)
rt = rtalloc((struct sockaddr *)&sin, flags, tableid);
if (rt == NULL)
- return (0);
+ return (NULL);
rt->rt_refcnt--;
if ((rt->rt_flags & RTF_GATEWAY) || (rt->rt_flags & RTF_LLINFO) == 0 ||
rt->rt_gateway->sa_family != AF_LINK) {
@@ -816,9 +816,9 @@ arplookup(u_int32_t addr, int create, int proxy, u_int tableid)
rtdeletemsg(rt, tableid);
}
}
- return (0);
+ return (NULL);
}
- return ((struct llinfo_arp *)rt->rt_llinfo);
+ return (rt);
}
/*
@@ -827,13 +827,15 @@ arplookup(u_int32_t addr, int create, int proxy, u_int tableid)
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)