diff options
author | kuriyama <kuriyama@FreeBSD.org> | 2001-03-16 10:58:16 +0000 |
---|---|---|
committer | kuriyama <kuriyama@FreeBSD.org> | 2001-03-16 10:58:16 +0000 |
commit | 560883e2d1b072efd0971e9d2789487e7cd62550 (patch) | |
tree | e72c11f5cafbed63e9e8053074fd4cf0c8597779 /sys | |
parent | 7dd89327ab569672f03619ff4541a1272f43ba41 (diff) | |
download | FreeBSD-src-560883e2d1b072efd0971e9d2789487e7cd62550.zip FreeBSD-src-560883e2d1b072efd0971e9d2789487e7cd62550.tar.gz |
Merge from kame (1.175 -> 1.176):
cope with freebsd4 bridge code.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/netinet6/ip6_input.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/sys/netinet6/ip6_input.c b/sys/netinet6/ip6_input.c index 0ffe494..ea37440 100644 --- a/sys/netinet6/ip6_input.c +++ b/sys/netinet6/ip6_input.c @@ -270,7 +270,33 @@ ip6_input(m) ip6stat.ip6s_total++; #ifndef PULLDOWN_TEST - /* XXX is the line really necessary? */ + /* + * L2 bridge code and some other code can return mbuf chain + * that does not conform to KAME requirement. too bad. + * XXX: fails to join if interface MTU > MCLBYTES. jumbogram? + */ + if (m && m->m_next != NULL && m->m_pkthdr.len < MCLBYTES) { + struct mbuf *n; + + MGETHDR(n, M_DONTWAIT, MT_HEADER); + if (n && m->m_pkthdr.len > MHLEN) { + MCLGET(n, M_DONTWAIT); + if ((n->m_flags & M_EXT) == 0) { + m_freem(n); + n = NULL; + } + } + if (!n) + return; /*ENOBUFS*/ + + m_copydata(m, 0, m->m_pkthdr.len, mtod(n, caddr_t)); + n->m_pkthdr = m->m_pkthdr; + n->m_len = m->m_pkthdr.len; + n->m_pkthdr.aux = m->m_pkthdr.aux; + m->m_pkthdr.aux = (struct mbuf *)NULL; + m_freem(m); + m = n; + } IP6_EXTHDR_CHECK(m, 0, sizeof(struct ip6_hdr), /*nothing*/); #endif |