Last but of rt_ifp cleanup. Since we want to print the interface names in
those log messages we need to do the if_get/if_put dance there. Since this
is only in 2 places which should not be super common that should be fine
and with this arp should be MP save :)
--
:wq Claudio
Index: if_ether.c
===================================================================
RCS file: /cvs/src/sys/netinet/if_ether.c,v
retrieving revision 1.196
diff -u -p -r1.196 if_ether.c
--- if_ether.c 2 Dec 2015 21:09:06 -0000 1.196
+++ if_ether.c 2 Dec 2015 21:16:14 -0000
@@ -565,14 +565,19 @@ in_arpinput(struct mbuf *m)
if (ifp->if_type != IFT_CARP)
#endif
{
+ struct ifnet *rifp = if_get(
+ rt->rt_ifidx);
+ if (rifp == NULL)
+ goto out;
inet_ntop(AF_INET, &isaddr,
addr, sizeof(addr));
log(LOG_WARNING, "arp: attempt"
" to overwrite entry for"
" %s on %s by %s on %s\n",
- addr, rt->rt_ifp->if_xname,
+ addr, rifp->if_xname,
ether_sprintf(ea->arp_sha),
ifp->if_xname);
+ if_put(rifp);
}
goto out;
} else {
@@ -587,13 +592,17 @@ in_arpinput(struct mbuf *m)
changed = 1;
}
} else if (!if_isconnected(ifp, rt->rt_ifidx)) {
+ struct ifnet *rifp = if_get(rt->rt_ifidx);
+ if (rifp == NULL)
+ goto out;
inet_ntop(AF_INET, &isaddr, addr, sizeof(addr));
log(LOG_WARNING,
"arp: attempt to add entry for %s "
"on %s by %s on %s\n", addr,
- rt->rt_ifp->if_xname,
+ rifp->if_xname,
ether_sprintf(ea->arp_sha),
ifp->if_xname);
+ if_put(rifp);
goto out;
}
sdl->sdl_alen = sizeof(ea->arp_sha);