Port-xen archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: xennet input processing and mac filtering



On Wed, Aug 28, 2024 at 12:43:39PM -0400, Greg Troxel wrote:
> mlelstv%serpens.de@localhost (Michael van Elst) writes:
> 
> > ether_input did (and still does) check if the packet is neither
> > multi-/broadcast nor for its own address and then marks the packets
> > as M_PROMISC.
> >
> >                 if ((m->m_flags & (M_BCAST|M_MCAST)) == 0 &&
> >                     (ifp->if_flags & IFF_PROMISC) != 0 &&
> >                     memcmp(LLADDR(ifp->if_sadl), eh->ether_dhost,
> >                            ETHER_ADDR_LEN) != 0) {
> >                         m->m_flags |= M_PROMISC;
> >                 }
> >
> > If M_PROMISC is set, the packet filter is skipped (?) and if it isn't
> > consumed by agr(4), vlan(4), carp(4) or pppoe(4), then the packet
> > is dropped later.
> >
> > But the check above only takes place when the interface is
> > in promiscous mode. Without promiscous mode, the code assumes
> > that all packets are actually for the machine.
> 
> That makes sense: there's a (not really well documented, perhaps) rule
> that interfaces must not inject non-matching unicast packets unless
> IFF_PROMISC.  Most drivers ensure this by hardware filtering, but xennet
> does not.
> 
> I see two possible fixes:
> 
>   in xennet, set IFF_PROMISC because the required mac filtering does not
>   happen
> 
>   in xennet, implement the filter that would been done in hardware,
>   basically in the receive path
> 
>     if ( not IFF_PROMISC and not (dst-ether matches ours) )
>       drop packet
> 
> 
> To see if this would fix the issue, someone could run tcpdump on the
> machine that responds when it shouldn't (after clearing the bridge
> cache).

I don't think we should set IFF_PROMISC; better to check the dst address
in the receive path.

-- 
Manuel Bouyer <bouyer%antioche.eu.org@localhost>
     NetBSD: 26 ans d'experience feront toujours la difference
--


Home | Main Index | Thread Index | Old Index