From 19f10c785b2cc483c5c71169abb7e99b39c181aa Mon Sep 17 00:00:00 2001 From: Rui Paulo Date: Sun, 21 Mar 2010 16:10:11 +0000 Subject: [PATCH] Implement bpf_track and iflladdr event handlers and activate the net80211 code to use them. This makes raw packet capturing work. --- sys/net/bpf.c | 5 +++++ sys/net/if.c | 4 +++- sys/net/if_var.h | 4 ++++ sys/netproto/802_11/wlan/ieee80211_dragonfly.c | 6 +----- sys/sys/eventhandler.h | 6 ++++++ 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/sys/net/bpf.c b/sys/net/bpf.c index 1a69b1e037..b7b2f1dd7d 100644 --- a/sys/net/bpf.c +++ b/sys/net/bpf.c @@ -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. diff --git a/sys/net/if.c b/sys/net/if.c index 4186d2f158..47c9dc42d1 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -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; diff --git a/sys/net/if_var.h b/sys/net/if_var.h index 0d2f1996ba..40a78cb6aa 100644 --- a/sys/net/if_var.h +++ b/sys/net/if_var.h @@ -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) diff --git a/sys/netproto/802_11/wlan/ieee80211_dragonfly.c b/sys/netproto/802_11/wlan/ieee80211_dragonfly.c index 93cbb7f2c4..8288d07509 100644 --- a/sys/netproto/802_11/wlan/ieee80211_dragonfly.c +++ b/sys/netproto/802_11/wlan/ieee80211_dragonfly.c @@ -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 } } diff --git a/sys/sys/eventhandler.h b/sys/sys/eventhandler.h index 5df59b8055..c334310f74 100644 --- a/sys/sys/eventhandler.h +++ b/sys/sys/eventhandler.h @@ -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; -- 2.41.0