Fewer rt_ifp in arp, ok?
Index: netinet/if_ether.c
===================================================================
RCS file: /cvs/src/sys/netinet/if_ether.c,v
retrieving revision 1.188
diff -u -p -r1.188 if_ether.c
--- netinet/if_ether.c 18 Nov 2015 13:58:02 -0000 1.188
+++ netinet/if_ether.c 19 Nov 2015 10:52:54 -0000
@@ -621,7 +621,7 @@ in_arpinput(struct mbuf *m)
rt->rt_flags &= ~RTF_REJECT;
/* Notify userland that an ARP resolution has been done. */
if (la->la_asked || changed)
- rt_sendmsg(rt, RTM_RESOLVE, rt->rt_ifp->if_rdomain);
+ rt_sendmsg(rt, RTM_RESOLVE, ifp->if_rdomain);
la->la_asked = 0;
while ((len = ml_len(&la->la_ml)) != 0) {
mh = ml_dequeue(&la->la_ml);
@@ -680,7 +680,6 @@ out:
sa.sa_len = sizeof(sa);
ifp->if_output(ifp, m, &sa, NULL);
if_put(ifp);
- return;
}
/*
@@ -691,13 +690,16 @@ arptfree(struct rtentry *rt)
{
struct llinfo_arp *la = (struct llinfo_arp *)rt->rt_llinfo;
struct sockaddr_dl *sdl = satosdl(rt->rt_gateway);
+ struct ifnet *ifp;
+ ifp = if_get(rt->rt_ifidx);
if ((sdl != NULL) && (sdl->sdl_family == AF_LINK)) {
sdl->sdl_alen = 0;
la->la_asked = 0;
}
- rtdeletemsg(rt, rt->rt_ifp->if_rdomain);
+ rtdeletemsg(rt, ifp->if_rdomain);
+ if_put(ifp);
}
/*
@@ -742,8 +744,10 @@ arpproxy(struct in_addr in, unsigned int
int found = 0;
rt = arplookup(in.s_addr, 0, SIN_PROXY, rtableid);
- if (rt == NULL)
+ if (!rtisvalid(rt)) {
+ rtfree(rt);
return (0);
+ }
/* Check that arp information are correct. */
sdl = satosdl(rt->rt_gateway);
@@ -752,10 +756,16 @@ arpproxy(struct in_addr in, unsigned int
return (0);
}
- ifp = rt->rt_ifp;
+ ifp = if_get(rt->rt_ifidx);
+ if (ifp == NULL) {
+ rtfree(rt);
+ return (0);
+ }
+
if (!memcmp(LLADDR(sdl), LLADDR(ifp->if_sadl), sdl->sdl_alen))
found = 1;
+ if_put(ifp);
rtfree(rt);
return (found);
}