diff options
author | jkim <jkim@FreeBSD.org> | 2008-04-15 17:08:24 +0000 |
---|---|---|
committer | jkim <jkim@FreeBSD.org> | 2008-04-15 17:08:24 +0000 |
commit | 17592597420bddf1004fcfa1a8707155cbe78ab0 (patch) | |
tree | a65c45b8e80350f173a118c7a8476c6b0b8bd680 /sys/net | |
parent | e920d11c2c3dcf18a24213ffd10a3d466f6af47c (diff) | |
download | FreeBSD-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')
-rw-r--r-- | sys/net/bpf.c | 25 |
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 |