On 02/12/15(Wed) 19:48, Claudio Jeker wrote:
> 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?

ok mpi@

> -- 
> :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