diff options
author | rik <rik@FreeBSD.org> | 2006-03-23 22:57:10 +0000 |
---|---|---|
committer | rik <rik@FreeBSD.org> | 2006-03-23 22:57:10 +0000 |
commit | 9e842a6a8c0a1088abc16fdf98bd8bc6b9964067 (patch) | |
tree | 763ffa6f6442f22be210094e068161bb83019f1c /sys/net/if_bridge.c | |
parent | 9c68158992c6d4be151ddee0ab218260101aade6 (diff) | |
download | FreeBSD-src-9e842a6a8c0a1088abc16fdf98bd8bc6b9964067.zip FreeBSD-src-9e842a6a8c0a1088abc16fdf98bd8bc6b9964067.tar.gz |
m_dup () packet not m_copypacket () since we will modify it. For more
details see PR kern/94448.
PR: kern/94448
Original patch: Eygene A. Ryabinkin <rea-fbsd at rea dot mbslab dot kiae dot ru>Final patch: thompsa@
Tested by: thompsa@, Eygene A. Ryabinkin
MFC after: 7 days
Diffstat (limited to 'sys/net/if_bridge.c')
-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) |