On Sat, Feb 07, 2026 at 10:26:07AM +0000, Martin Mayer wrote:
M> Based on the previous comments, I can conclude that the current behavior can 
be called a bug.
M> How should we proceed? Does somebody who is more familiar with the topic 
open a bug or should I register to the bugtracker and open an issue?

Can you please test the attached patch?

-- 
Gleb Smirnoff
commit eda1e75240758a12c58599b831961016cfcb1e03
Author: Gleb Smirnoff <[email protected]>
Date:   Wed Feb 11 15:04:43 2026 -0800

    ethernet: restore M_PROMISC if ng_ether(4) or bridge(4) return a packet

diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c
index 812a31595df9..fac0d9fb6462 100644
--- a/sys/net/if_ethersubr.c
+++ b/sys/net/if_ethersubr.c
@@ -515,6 +515,7 @@ static void
 ether_input_internal(struct ifnet *ifp, struct mbuf *m)
 {
 	struct ether_header *eh;
+	u_int pflag;
 	u_short etype;
 
 	if ((ifp->if_flags & IFF_UP) == 0) {
@@ -640,6 +641,7 @@ ether_input_internal(struct ifnet *ifp, struct mbuf *m)
 	if (ifp->if_l2com != NULL) {
 		KASSERT(ng_ether_input_p != NULL,
 		    ("%s: ng_ether_input_p is NULL", __func__));
+		pflag = m->m_flags & M_PROMISC;
 		m->m_flags &= ~M_PROMISC;
 		(*ng_ether_input_p)(ifp, &m);
 		if (m == NULL) {
@@ -647,6 +649,7 @@ ether_input_internal(struct ifnet *ifp, struct mbuf *m)
 			return;
 		}
 		eh = mtod(m, struct ether_header *);
+		m->m_flags |= pflag;
 	}
 
 	/*
@@ -660,6 +663,7 @@ ether_input_internal(struct ifnet *ifp, struct mbuf *m)
 	 * should be re-examined.
 	 */
 	if (ifp->if_bridge != NULL || (m->m_flags & M_BRIDGE_INJECT) != 0) {
+		pflag = m->m_flags & M_PROMISC;
 		m->m_flags &= ~M_PROMISC;
 		BRIDGE_INPUT(ifp, m);
 		if (m == NULL) {
@@ -667,6 +671,7 @@ ether_input_internal(struct ifnet *ifp, struct mbuf *m)
 			return;
 		}
 		eh = mtod(m, struct ether_header *);
+		m->m_flags |= pflag;
 	}
 
 #if defined(INET) || defined(INET6)

Reply via email to