summaryrefslogtreecommitdiffstats
path: root/sys/net/bpf.c
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2008-04-15 17:08:24 +0000
committerjkim <jkim@FreeBSD.org>2008-04-15 17:08:24 +0000
commit17592597420bddf1004fcfa1a8707155cbe78ab0 (patch)
treea65c45b8e80350f173a118c7a8476c6b0b8bd680 /sys/net/bpf.c
parente920d11c2c3dcf18a24213ffd10a3d466f6af47c (diff)
downloadFreeBSD-src-17592597420bddf1004fcfa1a8707155cbe78ab0.zip
FreeBSD-src-17592597420bddf1004fcfa1a8707155cbe78ab0.tar.gz
Revert the previous commit and use M_PROMISC flag instead.
It is safer because it will never be used for outgoing packets.
Diffstat (limited to 'sys/net/bpf.c')
-rw-r--r--sys/net/bpf.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/sys/net/bpf.c b/sys/net/bpf.c
index 35509e8..f61fcfa 100644
--- a/sys/net/bpf.c
+++ b/sys/net/bpf.c
@@ -841,6 +841,9 @@ bpfwrite(struct cdev *dev, struct uio *uio, int ioflag)
mc = m_dup(m, M_DONTWAIT);
if (mc != NULL)
mc->m_pkthdr.rcvif = ifp;
+ /* Set M_PROMISC for outgoing packets to be discarded. */
+ if (d->bd_direction == BPF_D_INOUT)
+ m->m_flags |= M_PROMISC;
} else
mc = NULL;
@@ -1571,9 +1574,6 @@ bpf_tap(struct bpf_if *bp, u_char *pkt, u_int pktlen)
#define BPF_CHECK_DIRECTION(d, i) \
(((d)->bd_direction == BPF_D_IN && (i) == NULL) || \
((d)->bd_direction == BPF_D_OUT && (i) != NULL))
-#define BPF_CHECK_DUPLICATE(d, i) \
- ((d)->bd_feedback && \
- (d)->bd_direction == BPF_D_INOUT && (i) == NULL)
/*
* Incoming linkage from device drivers, when packet is in an mbuf chain.
@@ -1586,14 +1586,19 @@ bpf_mtap(struct bpf_if *bp, struct mbuf *m)
int gottime;
struct timeval tv;
+ /* Skip outgoing duplicate packets. */
+ if ((m->m_flags & M_PROMISC) != 0 && m->m_pkthdr.rcvif == NULL) {
+ m->m_flags &= ~M_PROMISC;
+ return;
+ }
+
gottime = 0;
pktlen = m_length(m, NULL);
BPFIF_LOCK(bp);
LIST_FOREACH(d, &bp->bif_dlist, bd_next) {
- if (BPF_CHECK_DIRECTION(d, m->m_pkthdr.rcvif) ||
- BPF_CHECK_DUPLICATE(d, m->m_pkthdr.rcvif))
+ if (BPF_CHECK_DIRECTION(d, m->m_pkthdr.rcvif))
continue;
BPFD_LOCK(d);
++d->bd_rcount;
@@ -1636,6 +1641,12 @@ bpf_mtap2(struct bpf_if *bp, void *data, u_int dlen, struct mbuf *m)
int gottime;
struct timeval tv;
+ /* Skip outgoing duplicate packets. */
+ if ((m->m_flags & M_PROMISC) != 0 && m->m_pkthdr.rcvif == NULL) {
+ m->m_flags &= ~M_PROMISC;
+ return;
+ }
+
gottime = 0;
pktlen = m_length(m, NULL);
@@ -1651,8 +1662,7 @@ bpf_mtap2(struct bpf_if *bp, void *data, u_int dlen, struct mbuf *m)
BPFIF_LOCK(bp);
LIST_FOREACH(d, &bp->bif_dlist, bd_next) {
- if (BPF_CHECK_DIRECTION(d, m->m_pkthdr.rcvif) ||
- BPF_CHECK_DUPLICATE(d, m->m_pkthdr.rcvif))
+ if (BPF_CHECK_DIRECTION(d, m->m_pkthdr.rcvif))
continue;
BPFD_LOCK(d);
++d->bd_rcount;
@@ -1675,7 +1685,6 @@ bpf_mtap2(struct bpf_if *bp, void *data, u_int dlen, struct mbuf *m)
}
#undef BPF_CHECK_DIRECTION
-#undef BPF_CHECK_DUPLICATE
/*
* Move the packet data from interface memory (pkt) into the
OpenPOWER on IntegriCloud