summaryrefslogtreecommitdiffstats
path: root/sys/netinet6/ip6_input.c
diff options
context:
space:
mode:
authorkuriyama <kuriyama@FreeBSD.org>2001-03-16 10:58:16 +0000
committerkuriyama <kuriyama@FreeBSD.org>2001-03-16 10:58:16 +0000
commit560883e2d1b072efd0971e9d2789487e7cd62550 (patch)
treee72c11f5cafbed63e9e8053074fd4cf0c8597779 /sys/netinet6/ip6_input.c
parent7dd89327ab569672f03619ff4541a1272f43ba41 (diff)
downloadFreeBSD-src-560883e2d1b072efd0971e9d2789487e7cd62550.zip
FreeBSD-src-560883e2d1b072efd0971e9d2789487e7cd62550.tar.gz
Merge from kame (1.175 -> 1.176):
cope with freebsd4 bridge code.
Diffstat (limited to 'sys/netinet6/ip6_input.c')
-rw-r--r--sys/netinet6/ip6_input.c28
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
OpenPOWER on IntegriCloud