On 24/01/18(Wed) 09:30, Alexander Bluhm wrote:
> On Mon, Jan 22, 2018 at 11:58:30AM +0100, Martin Pieuchot wrote:
> > Check if `if_carp' is empty inside carp_ourether() instead of outside. 
> > 
> > ok?
> 
> Maybe I am confused by the ! and && but I think this diff changes the
> logic.

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.

ok?

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