This is suboptimal with respect to performance, but "correctly work-around"
the problem, that is, bpf against an bridge'ed interface receives duplicate
frames.  (It happens for not only broadcast but also unicast.)

diff --git a/sys/net/if.c b/sys/net/if.c
index 9b53bf1..5209281 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -568,7 +568,8 @@ if_enqueue(struct ifnet *ifp, struct mbuf *m)
        unsigned short mflags;
 
 #if NBRIDGE > 0
-       if (ifp->if_bridgeport && (m->m_flags & M_PROTO1) == 0) {
+       /* Loop prevention. */
+       if (ifp->if_bridgeport != NULL && (m->m_flags & M_PROTO1) == 0) {
                KERNEL_LOCK();
                error = bridge_output(ifp, m, NULL, NULL);
                KERNEL_UNLOCK();
@@ -618,7 +619,13 @@ if_input(struct ifnet *ifp, struct mbuf_list *ml)
        if_bpf = ifp->if_bpf;
        if (if_bpf) {
                MBUF_LIST_FOREACH(ml, m)
-                       if (bpf_mtap_ether(if_bpf, m, BPF_DIRECTION_IN) != 0)
+                       if (
+#if NBRIDGE > 0
+                           /* Loop prevention. */
+                           !(ifp->if_bridgeport != NULL &&
+                             (m->m_flags & M_PROTO1) != 0) &&
+#endif
+                           bpf_mtap_ether(if_bpf, m, BPF_DIRECTION_IN) != 0)
                                m->m_flags |= M_FILDROP;
        }
 #endif

Reply via email to