summaryrefslogtreecommitdiffstats
path: root/sys/net/if_bridge.c
diff options
context:
space:
mode:
authorrik <rik@FreeBSD.org>2006-03-23 22:57:10 +0000
committerrik <rik@FreeBSD.org>2006-03-23 22:57:10 +0000
commit9e842a6a8c0a1088abc16fdf98bd8bc6b9964067 (patch)
tree763ffa6f6442f22be210094e068161bb83019f1c /sys/net/if_bridge.c
parent9c68158992c6d4be151ddee0ab218260101aade6 (diff)
downloadFreeBSD-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.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