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));

Reply via email to