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