On Tue, Feb 06, 2018 at 01:05:44PM +0100, Martin Pieuchot wrote:
> > You're right.  The current logic is broken since the last refactoring.
> > It should read "if it's not my MAC nor the one of my carp(4) children".
> > Diff below corrects that in a way that should prevent future refactoring
> > to break it again.
> 
> Anyone?

OK bluhm@

> > Index: net/if_bridge.c
> > ===================================================================
> > RCS file: /cvs/src/sys/net/if_bridge.c,v
> > retrieving revision 1.301
> > diff -u -p -r1.301 if_bridge.c
> > --- net/if_bridge.c 10 Jan 2018 23:50:39 -0000      1.301
> > +++ net/if_bridge.c 25 Jan 2018 14:27:43 -0000
> > @@ -997,6 +997,25 @@ bridgeintr_frame(struct bridge_softc *sc
> >  }
> >  
> >  /*
> > + * Return 1 if `ena' belongs to `ifl', 0 otherwise.
> > + */
> > +int
> > +bridge_ourether(struct bridge_iflist *ifl, uint8_t *ena)
> > +{
> > +   struct arpcom *ac = (struct arpcom *)ifl->ifp;
> > +
> > +   if (bcmp(ac->ac_enaddr, ena, ETHER_ADDR_LEN) == 0)
> > +           return (1);
> > +
> > +#if NCARP > 0
> > +   if (carp_ourether(ifl->ifp, ena))
> > +           return (1);
> > +#endif
> > +
> > +   return (0);
> > +}
> > +
> > +/*
> >   * Receive input from an interface.  Queue the packet for bridging if its
> >   * not for us, and schedule an interrupt.
> >   */
> > @@ -1022,7 +1041,6 @@ bridge_process(struct ifnet *ifp, struct
> >     struct bridge_iflist *ifl;
> >     struct bridge_iflist *srcifl;
> >     struct ether_header *eh;
> > -   struct arpcom *ac;
> >     struct mbuf *mc;
> >  
> >     ifl = (struct bridge_iflist *)ifp->if_bridgeport;
> > @@ -1105,13 +1123,7 @@ bridge_process(struct ifnet *ifp, struct
> >     TAILQ_FOREACH(ifl, &sc->sc_iflist, next) {
> >             if (ifl->ifp->if_type != IFT_ETHER)
> >                     continue;
> > -           ac = (struct arpcom *)ifl->ifp;
> > -           if (bcmp(ac->ac_enaddr, eh->ether_dhost, ETHER_ADDR_LEN) == 0
> > -#if NCARP > 0
> > -               || (!SRPL_EMPTY_LOCKED(&ifl->ifp->if_carp) &&
> > -                   !carp_ourether(ifl->ifp, eh->ether_dhost))
> > -#endif
> > -               ) {
> > +           if (bridge_ourether(ifl, eh->ether_dhost)) {
> >                     if (srcifl->bif_flags & IFBIF_LEARNING)
> >                             bridge_rtupdate(sc,
> >                                 (struct ether_addr *)&eh->ether_shost,
> > @@ -1129,12 +1141,7 @@ bridge_process(struct ifnet *ifp, struct
> >                     bridge_ifinput(ifl->ifp, m);
> >                     return;
> >             }
> > -           if (bcmp(ac->ac_enaddr, eh->ether_shost, ETHER_ADDR_LEN) == 0
> > -#if NCARP > 0
> > -               || (!SRPL_EMPTY_LOCKED(&ifl->ifp->if_carp) &&
> > -                   !carp_ourether(ifl->ifp, eh->ether_shost))
> > -#endif
> > -               ) {
> > +           if (bridge_ourether(ifl, eh->ether_shost)) {
> >                     m_freem(m);
> >                     return;
> >             }
> > Index: netinet/ip_carp.c
> > ===================================================================
> > RCS file: /cvs/src/sys/netinet/ip_carp.c,v
> > retrieving revision 1.327
> > diff -u -p -r1.327 ip_carp.c
> > --- netinet/ip_carp.c       12 Jan 2018 23:47:24 -0000      1.327
> > +++ netinet/ip_carp.c       25 Jan 2018 14:18:44 -0000
> > @@ -1339,12 +1348,15 @@ carp_iamatch(struct ifnet *ifp)
> >  int
> >  carp_ourether(struct ifnet *ifp, u_int8_t *ena)
> >  {
> > -   struct srpl *cif;
> > +   struct srpl *cif = &ifp->if_carp;
> >     struct carp_softc *vh;
> >  
> >     KERNEL_ASSERT_LOCKED(); /* touching if_carp + carp_vhosts */
> > +
> > +   if (SRPL_EMPTY_LOCKED(cif))
> > +           return (0);
> > +
> >     KASSERT(ifp->if_type == IFT_ETHER);
> > -   cif = &ifp->if_carp;
> >  
> >     SRPL_FOREACH_LOCKED(vh, cif, sc_list) {
> >             struct carp_vhost_entry *vhe;
> > 

Reply via email to