diff options
author | jkim <jkim@FreeBSD.org> | 2008-07-14 22:41:48 +0000 |
---|---|---|
committer | jkim <jkim@FreeBSD.org> | 2008-07-14 22:41:48 +0000 |
commit | 5faf505c390908d62332e2ac208325f34e98d3a5 (patch) | |
tree | 5a654fc1db22a583ca005de463359f6f39abb2a6 /sys/net | |
parent | c131962593b3653c8ba7b19472b185cf815b50ab (diff) | |
download | FreeBSD-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')
-rw-r--r-- | sys/net/bpf.c | 12 |
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; |