Implement bpf_track and iflladdr event handlers and activate the
authorRui Paulo <rpaulo@FreeBSD.org>
Sun, 21 Mar 2010 16:10:11 +0000 (16:10 +0000)
committerRui Paulo <rpaulo@FreeBSD.org>
Sun, 21 Mar 2010 16:10:11 +0000 (16:10 +0000)
net80211 code to use them. This makes raw packet capturing work.

sys/net/bpf.c
sys/net/if.c
sys/net/if_var.h
sys/netproto/802_11/wlan/ieee80211_dragonfly.c
sys/sys/eventhandler.h

index 1a69b1e..b7b2f1d 100644 (file)
@@ -265,6 +265,8 @@ bpf_attachd(struct bpf_d *d, struct bpf_if *bp)
        d->bd_bif = bp;
        SLIST_INSERT_HEAD(&bp->bif_dlist, d, bd_next);
        *bp->bif_driverp = bp;
+
+       EVENTHANDLER_INVOKE(bpf_track, bp->bif_ifp, bp->bif_dlt, 1);
 }
 
 /*
@@ -290,6 +292,9 @@ bpf_detachd(struct bpf_d *d)
                *bp->bif_driverp = NULL;
        }
        d->bd_bif = NULL;
+
+       EVENTHANDLER_INVOKE(bpf_track, ifp, bp->bif_dlt, 0);
+
        /*
         * Check if this descriptor had requested promiscuous mode.
         * If so, turn it off.
index 4186d2f..47c9dc4 100644 (file)
@@ -1551,8 +1551,10 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct ucred *cred)
                error = priv_check_cred(cred, PRIV_ROOT, 0);
                if (error)
                        return (error);
-               return if_setlladdr(ifp,
+               error = if_setlladdr(ifp,
                    ifr->ifr_addr.sa_data, ifr->ifr_addr.sa_len);
+               EVENTHANDLER_INVOKE(iflladdr_event, ifp);
+               return (error);
 
        default:
                oif_flags = ifp->if_flags;
index 0d2f199..40a78cb 100644 (file)
@@ -354,6 +354,10 @@ typedef void if_init_f_t (void *);
 
 #ifdef _KERNEL
 
+/* interface link layer address change event */
+typedef void (*iflladdr_event_handler_t)(void *, struct ifnet *);
+EVENTHANDLER_DECLARE(iflladdr_event, iflladdr_event_handler_t);
+
 #ifdef INVARIANTS
 #define ASSERT_IFNET_SERIALIZED_ALL(ifp) \
        (ifp)->if_serialize_assert((ifp), IFNET_SERIALIZE_ALL, TRUE)
index 93cbb7f..8288d07 100644 (file)
@@ -838,9 +838,7 @@ bpf_track(void *arg, struct ifnet *ifp, int dlt, int attach)
 {
        /* NB: identify vap's by if_start */
        if (dlt == DLT_IEEE802_11_RADIO && ifp->if_start == ieee80211_start) {
-#ifdef notyet
                struct ieee80211vap *vap = ifp->if_softc;
-#endif
                /*
                 * Track bpf radiotap listener state.  We mark the vap
                 * to indicate if any listener is present and the com
@@ -848,17 +846,15 @@ bpf_track(void *arg, struct ifnet *ifp, int dlt, int attach)
                 * vap.  This flag is used by drivers to prepare radiotap
                 * state only when needed.
                 */
-#ifdef notyet
                if (attach) {
                        ieee80211_syncflag_ext(vap, IEEE80211_FEXT_BPF);
                        if (vap->iv_opmode == IEEE80211_M_MONITOR)
                                atomic_add_int(&vap->iv_ic->ic_montaps, 1);
-               } else if (!bpf_peers_present(vap->iv_rawbpf)) {
+               } else if (!vap->iv_rawbpf) {
                        ieee80211_syncflag_ext(vap, -IEEE80211_FEXT_BPF);
                        if (vap->iv_opmode == IEEE80211_M_MONITOR)
                                atomic_subtract_int(&vap->iv_ic->ic_montaps, 1);
                }
-#endif
        }
 }
 
index 5df59b8..c334310 100644 (file)
@@ -158,6 +158,12 @@ extern struct eventhandler_list    *eventhandler_find_list(char *name);
 #define        EVENTHANDLER_PRI_ANY    10000
 #define        EVENTHANDLER_PRI_LAST   20000
 
+/* BPF attach/detach events */
+struct ifnet;
+typedef void (*bpf_track_fn)(void *, struct ifnet *, int /* dlt */,
+    int /* 1 =>'s attach */);
+EVENTHANDLER_DECLARE(bpf_track, bpf_track_fn);
+
 struct image_params;
 struct proc;