kern/64718: [patch] Bridged packets still seen by BPF listener
after BIOCSEESENT ioctl.
Ed Maste
emaste at sandvine.com
Mon Mar 29 13:00:32 PST 2004
The following reply was made to PR kern/64718; it has been noted by GNATS.
From: Ed Maste <emaste at sandvine.com>
To: freebsd-gnats-submit at FreeBSD.org, emaste at sandvine.com
Cc:
Subject: Re: kern/64718: [patch] Bridged packets still seen by BPF listener
after BIOCSEESENT ioctl.
Date: Mon, 29 Mar 2004 15:59:15 -0500
Here's a better patch for this issue. This was actually my first
idea, but it didn't work due to a bug in ether_input and bpf_mtap.
ether_input creates an m_hdr on the stack to put back the ether
header for bpf_mtap. It then casts this to a struct mbuf *.
However, it doesn't set mh_flags. In the non-seesent case, bpf_mtap
checks m->m_pkthdr.rcvif, but that's not valid on the passed in
"mbuf." Clearing mh_flags before calling bpf_mtap fixed this issue.
Here's my new patches:
--- if_ethersubr.c.orig 2004-02-05 12:33:44.000000000 -0500
+++ if_ethersubr.c 2004-03-29 14:36:20.000000000 -0500
@@ -599,6 +599,7 @@
struct m_hdr mh;
/* This kludge is OK; BPF treats the "mbuf" as read-only */
+ mh.mh_flags = 0;
mh.mh_next = m;
mh.mh_data = (char *)eh;
mh.mh_len = ETHER_HDR_LEN;
--- bpf.c.orig 2004-03-04 12:34:26.000000000 -0500
+++ bpf.c 2004-03-29 15:09:45.000000000 -0500
@@ -1249,8 +1249,14 @@
pktlen += m0->m_len;
for (d = bp->bif_dlist; d != 0; d = d->bd_next) {
- if (!d->bd_seesent && (m->m_pkthdr.rcvif == NULL))
- continue;
+ if (!d->bd_seesent) {
+ for (m0 = m; m0 != 0; m0 = m0->m_next)
+ if (m0->m_flags & M_PKTHDR)
+ break;
+ if (m0 && m0->m_pkthdr.rcvif != ifp)
+ continue;
+ }
++d->bd_rcount;
slen = bpf_filter(d->bd_filter, (u_char *)m, pktlen, 0);
if (slen != 0)
More information about the freebsd-bugs
mailing list