summaryrefslogtreecommitdiffstats
path: root/sys/net/bpf.c
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2008-07-14 22:41:48 +0000
committerjkim <jkim@FreeBSD.org>2008-07-14 22:41:48 +0000
commit5faf505c390908d62332e2ac208325f34e98d3a5 (patch)
tree5a654fc1db22a583ca005de463359f6f39abb2a6 /sys/net/bpf.c
parentc131962593b3653c8ba7b19472b185cf815b50ab (diff)
downloadFreeBSD-src-5faf505c390908d62332e2ac208325f34e98d3a5.zip
FreeBSD-src-5faf505c390908d62332e2ac208325f34e98d3a5.tar.gz
Allow injecting big packets via bpf(4) up to min(MTU, 16K-byte).
MFC after: 1 week
Diffstat (limited to 'sys/net/bpf.c')
-rw-r--r--sys/net/bpf.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/sys/net/bpf.c b/sys/net/bpf.c
index ffaa762..e11b3e0 100644
--- a/sys/net/bpf.c
+++ b/sys/net/bpf.c
@@ -443,13 +443,19 @@ bpf_movein(struct uio *uio, int linktype, struct ifnet *ifp, struct mbuf **mp,
if (len - hlen > ifp->if_mtu)
return (EMSGSIZE);
- if ((unsigned)len > MCLBYTES)
+ if ((unsigned)len > MJUM16BYTES)
return (EIO);
- if (len > MHLEN)
+ if (len <= MHLEN)
+ MGETHDR(m, M_WAIT, MT_DATA);
+ else if (len <= MCLBYTES)
m = m_getcl(M_WAIT, MT_DATA, M_PKTHDR);
else
- MGETHDR(m, M_WAIT, MT_DATA);
+ m = m_getjcl(M_WAIT, MT_DATA, M_PKTHDR,
+#if (MJUMPAGESIZE > MCLBYTES)
+ len <= MJUMPAGESIZE ? MJUMPAGESIZE :
+#endif
+ (len <= MJUM9BYTES ? MJUM9BYTES : MJUM16BYTES));
m->m_pkthdr.len = m->m_len = len;
m->m_pkthdr.rcvif = NULL;
*mp = m;
OpenPOWER on IntegriCloud