diff options
-rw-r--r-- | sys/net/if_bridge.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/net/if_bridge.c b/sys/net/if_bridge.c index caf24af..2adf062 100644 --- a/sys/net/if_bridge.c +++ b/sys/net/if_bridge.c @@ -2076,7 +2076,7 @@ bridge_broadcast(struct bridge_softc *sc, struct ifnet *src_if, struct bridge_iflist *bif; struct mbuf *mc; struct ifnet *dst_if; - int error = 0, used = 0; + int error = 0, used = 0, i; BRIDGE_LOCK_ASSERT(sc); BRIDGE_LOCK2REF(sc, error); @@ -2121,7 +2121,7 @@ bridge_broadcast(struct bridge_softc *sc, struct ifnet *src_if, mc = m; used = 1; } else { - mc = m_copypacket(m, M_DONTWAIT); + mc = m_dup(m, M_DONTWAIT); if (mc == NULL) { sc->sc_ifp->if_oerrors++; continue; @@ -2138,6 +2138,15 @@ bridge_broadcast(struct bridge_softc *sc, struct ifnet *src_if, || PFIL_HOOKED(&inet6_pfil_hook) #endif )) { + if (used == 0) { + /* Keep the layer3 header aligned */ + i = min(mc->m_pkthdr.len, max_protohdr); + mc = m_copyup(mc, i, ETHER_ALIGN); + if (mc == NULL) { + sc->sc_ifp->if_oerrors++; + continue; + } + } if (bridge_pfil(&mc, NULL, dst_if, PFIL_OUT) != 0) continue; if (mc == NULL) |