On Tue, Mar 25, 2014 at 11:39:30AM +0100, Martin Pieuchot wrote:
> Why do we do a lookup on all the addresses of the systems to know if the
> destination address given to ether_output() is on the carp interface?
> 
> If this address is on any of our interfaces we should not even end up
> here.  Since both arp_rtrequest() and nd6_rtrequest() change the ifp
> of the route entries for our addresses to loopback, if `dst' is one 
> of our addresses it won't be passed to ether_output() but looutput().
> 
> ok?

I think this is OK and the check should die in a fire but...
What about bpf senders or more exotic things like MPLS?
I think ifa_ifwithaddr() will fail on them but I learned that some of
those checks are non obivous but needed. 
 
> Index: net/if_ethersubr.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/net/if_ethersubr.c,v
> retrieving revision 1.162
> diff -u -p -r1.162 if_ethersubr.c
> --- net/if_ethersubr.c        17 Feb 2014 14:48:48 -0000      1.162
> +++ net/if_ethersubr.c        24 Mar 2014 15:35:53 -0000
> @@ -226,27 +226,16 @@ ether_output(struct ifnet *ifp0, struct 
>               senderr(EBUSY);
>  #endif
>  
> +     if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING))
> +             senderr(ENETDOWN);
> +
>  #if NCARP > 0
>       if (ifp->if_type == IFT_CARP) {
> -             struct ifaddr *ifa;
> -
> -             /* loop back if this is going to the carp interface */
> -             if (dst != NULL && LINK_STATE_IS_UP(ifp0->if_link_state) &&
> -                 (ifa = ifa_ifwithaddr(dst, ifp->if_rdomain)) != NULL &&
> -                 ifa->ifa_ifp == ifp0)
> -                     return (looutput(ifp0, m, dst, rt0));
> -
>               ifp = ifp->if_carpdev;
>               ac = (struct arpcom *)ifp;
> -
> -             if ((ifp0->if_flags & (IFF_UP|IFF_RUNNING)) !=
> -                 (IFF_UP|IFF_RUNNING))
> -                     senderr(ENETDOWN);
>       }
>  #endif /* NCARP > 0 */
>  
> -     if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING))
> -             senderr(ENETDOWN);
>       if ((rt = rt0) != NULL) {
>               if ((rt->rt_flags & RTF_UP) == 0) {
>                       if ((rt0 = rt = rtalloc1(dst, RT_REPORT,
> 

-- 
:wq Claudio

Reply via email to