Module Name:    src
Committed By:   ozaki-r
Date:           Mon Dec 16 05:21:24 UTC 2024

Modified Files:
        src/sys/net: if_bridge.c

Log Message:
bridge: unify frame discarding paths (NFC)


To generate a diff of this commit:
cvs rdiff -u -r1.195 -r1.196 src/sys/net/if_bridge.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/if_bridge.c
diff -u src/sys/net/if_bridge.c:1.195 src/sys/net/if_bridge.c:1.196
--- src/sys/net/if_bridge.c:1.195	Mon Dec 16 05:20:31 2024
+++ src/sys/net/if_bridge.c	Mon Dec 16 05:21:24 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_bridge.c,v 1.195 2024/12/16 05:20:31 ozaki-r Exp $	*/
+/*	$NetBSD: if_bridge.c,v 1.196 2024/12/16 05:21:24 ozaki-r Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -80,7 +80,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.195 2024/12/16 05:20:31 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.196 2024/12/16 05:21:24 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -1816,8 +1816,7 @@ bridge_forward(struct bridge_softc *sc, 
 	src_if = m_get_rcvif_psref(m, &psref_src);
 	if (src_if == NULL) {
 		/* Interface is being destroyed? */
-		m_freem(m);
-		goto out;
+		goto discard;
 	}
 
 	if_statadd2(&sc->sc_if, if_ipackets, 1, if_ibytes, m->m_pkthdr.len);
@@ -1828,8 +1827,7 @@ bridge_forward(struct bridge_softc *sc, 
 	bif = bridge_lookup_member_if(sc, src_if, &psref);
 	if (bif == NULL) {
 		/* Interface is not a bridge member (anymore?) */
-		m_freem(m);
-		goto out;
+		goto discard;
 	}
 
 	if (bif->bif_flags & IFBIF_STP) {
@@ -1837,9 +1835,8 @@ bridge_forward(struct bridge_softc *sc, 
 		case BSTP_IFSTATE_BLOCKING:
 		case BSTP_IFSTATE_LISTENING:
 		case BSTP_IFSTATE_DISABLED:
-			m_freem(m);
 			bridge_release_member(sc, bif, &psref);
-			goto out;
+			goto discard;
 		}
 	}
 
@@ -1864,9 +1861,8 @@ bridge_forward(struct bridge_softc *sc, 
 
 	if ((bif->bif_flags & IFBIF_STP) != 0 &&
 	    bif->bif_state == BSTP_IFSTATE_LEARNING) {
-		m_freem(m);
 		bridge_release_member(sc, bif, &psref);
-		goto out;
+		goto discard;
 	}
 
 	src_if_protected = ((bif->bif_flags & IFBIF_PROTECTED) != 0);
@@ -1884,22 +1880,18 @@ bridge_forward(struct bridge_softc *sc, 
 	 */
 	if ((m->m_flags & (M_BCAST|M_MCAST)) == 0) {
 		dst_if = bridge_rtlookup(sc, eh->ether_dhost);
-		if (src_if == dst_if) {
-			m_freem(m);
-			goto out;
-		}
+		if (src_if == dst_if)
+			goto discard;
 	} else {
 		/* ...forward it to all interfaces. */
 		if_statinc(&sc->sc_if, if_imcasts);
 		dst_if = NULL;
 	}
 
-	if (pfil_run_hooks(sc->sc_if.if_pfil, &m, src_if, PFIL_IN) != 0) {
-		m_freem(m);
-		goto out;
+	if (pfil_run_hooks(sc->sc_if.if_pfil, &m, src_if, PFIL_IN) != 0 ||
+	    m == NULL) {
+		goto discard;
 	}
-	if (m == NULL)
-		goto out;
 
 	if (dst_if == NULL) {
 		bridge_broadcast(sc, src_if, src_if_protected, m);
@@ -1913,32 +1905,27 @@ bridge_forward(struct bridge_softc *sc, 
 	 * At this point, we're dealing with a unicast frame
 	 * going to a different interface.
 	 */
-	if ((dst_if->if_flags & IFF_RUNNING) == 0) {
-		m_freem(m);
-		goto out;
-	}
+	if ((dst_if->if_flags & IFF_RUNNING) == 0)
+		goto discard;
 
 	bif = bridge_lookup_member_if(sc, dst_if, &psref);
 	if (bif == NULL) {
 		/* Not a member of the bridge (anymore?) */
-		m_freem(m);
-		goto out;
+		goto discard;
 	}
 
 	if (bif->bif_flags & IFBIF_STP) {
 		switch (bif->bif_state) {
 		case BSTP_IFSTATE_DISABLED:
 		case BSTP_IFSTATE_BLOCKING:
-			m_freem(m);
 			bridge_release_member(sc, bif, &psref);
-			goto out;
+			goto discard;
 		}
 	}
 
 	if ((bif->bif_flags & IFBIF_PROTECTED) && src_if_protected) {
-		m_freem(m);
 		bridge_release_member(sc, bif, &psref);
-		goto out;
+		goto discard;
 	}
 
 	bridge_release_member(sc, bif, &psref);
@@ -1957,6 +1944,10 @@ out:
 	if (src_if != NULL)
 		m_put_rcvif_psref(src_if, &psref_src);
 	return;
+
+discard:
+	m_freem(m);
+	goto out;
 }
 
 static bool

Reply via email to