could someone test this on a strict arch? ok?
Index: if_bridge.c =================================================================== RCS file: /cvs/src/sys/net/if_bridge.c,v retrieving revision 1.276 diff -u -p -r1.276 if_bridge.c --- if_bridge.c 8 Mar 2016 09:09:43 -0000 1.276 +++ if_bridge.c 21 Mar 2016 10:54:20 -0000 @@ -137,7 +137,6 @@ int bridge_ipsec(struct bridge_softc *, int bridge_clone_create(struct if_clone *, int); int bridge_clone_destroy(struct ifnet *ifp); int bridge_delete(struct bridge_softc *, struct bridge_iflist *); -struct mbuf *bridge_m_dup(struct mbuf *); #define ETHERADDR_IS_IP_MCAST(a) \ /* struct etheraddr *a; */ \ @@ -800,7 +799,7 @@ bridge_output(struct ifnet *ifp, struct used = 1; mc = m; } else { - mc = bridge_m_dup(m); + mc = m_dup_pkt(m, ETHER_ALIGN, M_NOWAIT); if (mc == NULL) { sc->sc_if.if_oerrors++; continue; @@ -1090,7 +1089,7 @@ bridge_process(struct ifnet *ifp, struct (ifl->bif_state == BSTP_IFSTATE_DISCARDING)) goto reenqueue; - mc = bridge_m_dup(m); + mc = m_dup_pkt(m, ETHER_ALIGN, M_NOWAIT); if (mc == NULL) goto reenqueue; @@ -1227,7 +1226,7 @@ bridge_broadcast(struct bridge_softc *sc mc = m; used = 1; } else { - mc = bridge_m_dup(m); + mc = m_dup_pkt(m, ETHER_ALIGN, M_NOWAIT); if (mc == NULL) { sc->sc_if.if_oerrors++; continue; @@ -1277,7 +1276,7 @@ bridge_localbroadcast(struct bridge_soft return; } - m1 = bridge_m_dup(m); + m1 = m_dup_pkt(m, ETHER_ALIGN, M_NOWAIT); if (m1 == NULL) { sc->sc_if.if_oerrors++; return; @@ -2021,37 +2020,4 @@ bridge_copyaddr(struct sockaddr *src, st memcpy(dst, src, src->sa_len); else dst->sa_family = AF_UNSPEC; -} - -/* - * Specialized deep copy to ensure that the payload after the Ethernet - * header is nicely aligned. - */ -struct mbuf * -bridge_m_dup(struct mbuf *m) -{ - struct mbuf *m1, *m2, *mx; - - m1 = m_copym2(m, 0, ETHER_HDR_LEN, M_DONTWAIT); - if (m1 == NULL) { - return (NULL); - } - m2 = m_copym2(m, ETHER_HDR_LEN, M_COPYALL, M_DONTWAIT); - if (m2 == NULL) { - m_freem(m1); - return (NULL); - } - - for (mx = m1; mx->m_next != NULL; mx = mx->m_next) - /*EMPTY*/; - mx->m_next = m2; - - if (m1->m_flags & M_PKTHDR) { - int len = 0; - for (mx = m1; mx != NULL; mx = mx->m_next) - len += mx->m_len; - m1->m_pkthdr.len = len; - } - - return (m1); }