Add IFF_MONITOR support.
authorMatthew Dillon <dillon@dragonflybsd.org>
Tue, 19 Dec 2006 00:11:13 +0000 (00:11 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Tue, 19 Dec 2006 00:11:13 +0000 (00:11 +0000)
Submitted-by: "Vlad Galu" <dudu@dudu.ro>
Obtained-from: FreeBSD

sbin/ifconfig/ifconfig.8
sbin/ifconfig/ifconfig.c
sys/net/bridge/if_bridge.c
sys/net/if.h
sys/net/if_ethersubr.c

index 529357a..8724c10 100644 (file)
@@ -27,7 +27,7 @@
 .\"
 .\"     From: @(#)ifconfig.8   8.3 (Berkeley) 1/5/94
 .\" $FreeBSD: src/sbin/ifconfig/ifconfig.8,v 1.124 2006/10/10 09:44:08 ru Exp $
-.\" $DragonFly: src/sbin/ifconfig/ifconfig.8,v 1.13 2006/11/25 05:54:22 sephe Exp $
+.\" $DragonFly: src/sbin/ifconfig/ifconfig.8,v 1.14 2006/12/19 00:11:09 dillon Exp $
 .\"
 .Dd November 19, 2006
 .Dt IFCONFIG 8
@@ -523,13 +523,13 @@ parameter.
 Another name for the
 .Cm link1
 parameter.
-.\".It Cm monitor
-.\"Put the interface in monitor mode.
-.\"No packets are transmitted, and received packets are discarded after
-.\".Xr bpf 4
-.\"processing.
-.\".It Fl monitor
-.\"Take the interface out of monitor mode.
+.It Cm monitor
+Put the interface in monitor mode.
+No packets are transmitted, and received packets are discarded after
+.Xr bpf 4
+processing.
+.It Fl monitor
+Take the interface out of monitor mode.
 .It Cm up
 Mark an interface
 .Dq up .
index 5fa20a8..6984dfd 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sbin/ifconfig/ifconfig.c,v 1.113.2.4 2006/02/09 10:48:43 yar Exp $
- * $DragonFly: src/sbin/ifconfig/ifconfig.c,v 1.27 2006/05/05 14:53:41 sephe Exp $
+ * $DragonFly: src/sbin/ifconfig/ifconfig.c,v 1.28 2006/12/19 00:11:09 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -1040,9 +1040,9 @@ static struct cmd basic_cmds[] = {
        DEF_CMD("-link1",       -IFF_LINK1,     setifflags),
        DEF_CMD("link2",        IFF_LINK2,      setifflags),
        DEF_CMD("-link2",       -IFF_LINK2,     setifflags),
-#ifdef notyet
        DEF_CMD("monitor",      IFF_MONITOR,    setifflags),
        DEF_CMD("-monitor",     -IFF_MONITOR,   setifflags),
+#ifdef notyet
        DEF_CMD("staticarp",    IFF_STATICARP,  setifflags),
        DEF_CMD("-staticarp",   -IFF_STATICARP, setifflags),
 #endif
index 4c0fb34..76fea15 100644 (file)
@@ -66,7 +66,7 @@
  * $OpenBSD: if_bridge.c,v 1.60 2001/06/15 03:38:33 itojun Exp $
  * $NetBSD: if_bridge.c,v 1.31 2005/06/01 19:45:34 jdc Exp $
  * $FreeBSD: src/sys/net/if_bridge.c,v 1.26 2005/10/13 23:05:55 thompsa Exp $
- * $DragonFly: src/sys/net/bridge/if_bridge.c,v 1.13 2006/09/30 21:10:19 swildner Exp $
+ * $DragonFly: src/sys/net/bridge/if_bridge.c,v 1.14 2006/12/19 00:11:13 dillon Exp $
  */
 
 /*
@@ -1723,6 +1723,21 @@ bridge_input(struct ifnet *ifp, struct mbuf *m)
        if ((sc->sc_ifp->if_flags & IFF_RUNNING) == 0)
                goto out;
 
+       /*
+        * Implement support for bridge monitoring. If this flag has been
+        * set on this interface, discard the packet once we push it through
+        * the bpf(4) machinery, but before we do, increment the byte and
+        * packet counters associated with this interface.
+        */
+        if ((bifp->if_flags & IFF_MONITOR) != 0) {
+               m->m_pkthdr.rcvif = bifp;
+               BPF_MTAP(bifp, m);
+               bifp->if_ipackets++;
+               bifp->if_ibytes += m->m_pkthdr.len;
+               m_freem(m);
+               goto out;
+       }
+
        bif = bridge_lookup_member_if(sc, ifp);
        if (bif == NULL)
                goto out;
index 1f9b860..fa9e5d4 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)if.h        8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/if.h,v 1.58.2.9 2002/08/30 14:23:38 sobomax Exp $
- * $DragonFly: src/sys/net/if.h,v 1.16 2006/05/20 02:42:08 dillon Exp $
+ * $DragonFly: src/sys/net/if.h,v 1.17 2006/12/19 00:11:12 dillon Exp $
  */
 
 #ifndef _NET_IF_H_
@@ -148,6 +148,7 @@ struct if_data {
 #define        IFF_MULTICAST   0x8000          /* supports multicast */
 #define        IFF_POLLING     0x10000         /* Interface is in polling mode. */
 #define        IFF_PPROMISC    0x20000         /* user-requested promisc mode */
+#define        IFF_MONITOR     0x40000         /* user-requested monitor mode */
 
 /* flags set internally only: */
 #define        IFF_CANTCHANGE \
index 583c9d6..51f329f 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)if_ethersubr.c      8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/net/if_ethersubr.c,v 1.70.2.33 2003/04/28 15:45:53 archie Exp $
- * $DragonFly: src/sys/net/if_ethersubr.c,v 1.37 2006/07/02 00:49:22 corecode Exp $
+ * $DragonFly: src/sys/net/if_ethersubr.c,v 1.38 2006/12/19 00:11:12 dillon Exp $
  */
 
 #include "opt_atalk.h"
@@ -162,6 +162,8 @@ ether_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
 
        ASSERT_SERIALIZED(ifp->if_serializer);
 
+       if (ifp->if_flags & IFF_MONITOR)
+               gotoerr(ENETDOWN);
        if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) != (IFF_UP | IFF_RUNNING))
                gotoerr(ENETDOWN);
 
@@ -570,6 +572,14 @@ ether_input(struct ifnet *ifp, struct ether_header *eh, struct mbuf *m)
        BPF_MTAP(ifp, m);
 
        ifp->if_ibytes += m->m_pkthdr.len;
+       
+       if (ifp->if_flags & IFF_MONITOR) {
+               /*
+                * Interface marked for monitoring; discard packet.
+                */
+                m_freem(m);
+                return;
+       }
 
        /*
         * Tap the packet off here for a bridge.  bridge_input()