summaryrefslogtreecommitdiffstats
path: root/sys/net/if_bridge.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/net/if_bridge.c')
-rw-r--r--sys/net/if_bridge.c13
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)
OpenPOWER on IntegriCloud