[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openbsd-tech
Subject:    bridge(4) and if_input()
From:       Martin Pieuchot <mpi () openbsd ! org>
Date:       2015-05-28 9:23:12
Message-ID: 20150528092312.GC21491 () figo ! nolizard ! org
[Download RAW message or body]

Let's use if_input() rather than ether_input_mbuf().  This simplifies
the bpf(4) bits and removes some duplicate "rcvif" assignments.

Once ether_input_mbuf() is no more my plan is to start merging various
ifp counters and put an interface index in the packet header.

ok?

Index: net/if_bridge.c
===================================================================
RCS file: /cvs/src/sys/net/if_bridge.c,v
retrieving revision 1.239
diff -u -p -r1.239 if_bridge.c
--- net/if_bridge.c	18 May 2015 11:43:57 -0000	1.239
+++ net/if_bridge.c	22 May 2015 13:39:16 -0000
@@ -1364,6 +1364,7 @@ bridge_dispatch(struct bridge_iflist *if
 	struct bridge_iflist *srcifl;
 	struct ether_header *eh;
 	struct arpcom *ac;
+	struct mbuf_list ml = MBUF_LIST_INITIALIZER();
 	struct mbuf *mc;
 	int s;
 
@@ -1411,21 +1412,14 @@ bridge_dispatch(struct bridge_iflist *if
 		schednetisr(NETISR_BRIDGE);
 		if (ifp->if_type == IFT_GIF) {
 			TAILQ_FOREACH(ifl, &sc->sc_iflist, next) {
-				if (ifl->ifp->if_type == IFT_ETHER)
-					break;
-			}
-			if (ifl != NULL) {
-				m->m_pkthdr.rcvif = ifl->ifp;
-				m->m_pkthdr.ph_rtableid = ifl->ifp->if_rdomain;
-#if NBPFILTER > 0
-				if (ifl->ifp->if_bpf)
-					bpf_mtap_ether(ifl->ifp->if_bpf, m,
-					    BPF_DIRECTION_IN);
-#endif
+				if (ifl->ifp->if_type != IFT_ETHER)
+					continue;
+
 				m->m_flags |= M_PROTO1;
-				ether_input_mbuf(ifl->ifp, m);
+				ml_enqueue(&ml, m);
+				if_input(ifl->ifp, &ml);
 				ifl->ifp->if_ipackets++;
-				m = NULL;
+				return (NULL);
 			}
 		}
 		return (m);
@@ -1462,24 +1456,14 @@ bridge_dispatch(struct bridge_iflist *if
 				return (NULL);
 			}
 
-			/* Make sure the real incoming interface
-			 * is aware */
-#if NBPFILTER > 0
-			if (ifl->ifp->if_bpf)
-				bpf_mtap_ether(ifl->ifp->if_bpf, m,
-				    BPF_DIRECTION_IN);
-#endif
-			/* Count for the interface we are going to */
-			ifl->ifp->if_ipackets++;
-
 			/* Count for the bridge */
 			sc->sc_if.if_ipackets++;
 			sc->sc_if.if_ibytes += m->m_pkthdr.len;
 
-			m->m_pkthdr.rcvif = ifl->ifp;
-			m->m_pkthdr.ph_rtableid = ifl->ifp->if_rdomain;
 			m->m_flags |= M_PROTO1;
-			ether_input_mbuf(ifl->ifp, m);
+			ml_enqueue(&ml, m);
+			if_input(ifl->ifp, &ml);
+			ifl->ifp->if_ipackets++;
 			return (NULL);
 		}
 		if (bcmp(ac->ac_enaddr, eh->ether_shost, ETHER_ADDR_LEN) == 0
@@ -1615,8 +1599,10 @@ void
 bridge_localbroadcast(struct bridge_softc *sc, struct ifnet *ifp,
     struct ether_header *eh, struct mbuf *m)
 {
+	struct mbuf_list ml = MBUF_LIST_INITIALIZER();
 	struct mbuf *m1;
 	u_int16_t etype;
+	int s;
 
 	/*
 	 * quick optimisation, don't send packets up the stack if no
@@ -1638,18 +1624,11 @@ bridge_localbroadcast(struct bridge_soft
 		sc->sc_if.if_oerrors++;
 		return;
 	}
-	/* fixup header a bit */
-	m1->m_pkthdr.rcvif = ifp;
-	m1->m_pkthdr.ph_rtableid = ifp->if_rdomain;
 	m1->m_flags |= M_PROTO1;
-
-#if NBPFILTER > 0
-	if (ifp->if_bpf)
-		bpf_mtap(ifp->if_bpf, m1,
-		    BPF_DIRECTION_IN);
-#endif
-
-	ether_input_mbuf(ifp, m1);
+	ml_enqueue(&ml, m1);
+	s = splnet();
+	if_input(ifp, &ml);
+	splx(s);
 	ifp->if_ipackets++;
 }
 

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic