More rt_ifp killing. This time in in_arpinput(). This function is a bit special because of the way we propagte multicast and broadcast packets it is possible that multiple interfaces recieve the same request. In most cases this is because of -- you can guess -- carp(4). So simplify these checks and make them more generic at the same time (in the SINPROXY case). In other words only the interface holding the proxy arp route will answer to the requests.
OK? -- :wq Claudio Index: if_ether.c =================================================================== RCS file: /cvs/src/sys/netinet/if_ether.c,v retrieving revision 1.195 diff -u -p -r1.195 if_ether.c --- if_ether.c 2 Dec 2015 18:38:19 -0000 1.195 +++ if_ether.c 2 Dec 2015 18:42:36 -0000 @@ -560,7 +560,7 @@ in_arpinput(struct mbuf *m) ether_sprintf(ea->arp_sha), ifp->if_xname); goto out; - } else if (rt->rt_ifp != ifp) { + } else if (rt->rt_ifidx != ifp->if_index) { #if NCARP > 0 if (ifp->if_type != IFT_CARP) #endif @@ -639,10 +639,9 @@ out: rt = arplookup(itaddr.s_addr, 0, SIN_PROXY, rdomain); if (rt == NULL) goto out; -#if NCARP > 0 - if (rt->rt_ifp->if_type == IFT_CARP && ifp->if_type != IFT_CARP) + /* protect from possible duplicates only owner should respond */ + if (rt->rt_ifidx != ifp->if_index) goto out; -#endif memcpy(ea->arp_tha, ea->arp_sha, sizeof(ea->arp_sha)); sdl = satosdl(rt->rt_gateway); memcpy(ea->arp_sha, LLADDR(sdl), sizeof(ea->arp_sha));