Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src-draft/trunk]: src/sys/net80211 Use proper BPF link type and track listen...
details: https://anonhg.NetBSD.org/src-all/rev/3077743f7a6b
branches: trunk
changeset: 375701:3077743f7a6b
user: Martin Husemann <martin%NetBSD.org@localhost>
date: Mon Sep 20 16:51:59 2021 +0200
description:
Use proper BPF link type and track listeners.
diffstat:
sys/net80211/ieee80211_netbsd.c | 25 ++++++++++++++-----------
1 files changed, 14 insertions(+), 11 deletions(-)
diffs (89 lines):
diff -r f626c7f06476 -r 3077743f7a6b sys/net80211/ieee80211_netbsd.c
--- a/sys/net80211/ieee80211_netbsd.c Sun Sep 05 14:22:51 2021 +0200
+++ b/sys/net80211/ieee80211_netbsd.c Mon Sep 20 16:51:59 2021 +0200
@@ -75,6 +75,8 @@ static int ieee80211_sysctl_parent(SYSCT
static int ieee80211_sysctl_radar(SYSCTLFN_ARGS);
static int ieee80211_sysctl_vap_restart(SYSCTLFN_ARGS);
+static void bpf_track(struct bpf_if *, struct ifnet *, int, int);
+
static const char wlanname[] = "wlan";
static int wlan_clone_create(struct if_clone *, int, size_t, void*);
@@ -239,6 +241,7 @@ wlan_clone_create(struct if_clone *ifc,
return EIO;
ieee80211_com_vincref(vap);
+ bpf_register_track_event(&vap->iv_rawbpf, bpf_track);
return 0;
}
@@ -256,6 +259,7 @@ void
ieee80211_vap_destroy(struct ieee80211vap *vap)
{
+ bpf_deregister_track_event(&vap->iv_rawbpf, bpf_track);
wlan_clone_destroy(vap->iv_ifp);
}
@@ -1246,17 +1250,14 @@ ieee80211_load_module(const char *modnam
}
#endif
-#ifdef notyet
-static eventhandler_tag wlan_bpfevent;
-static eventhandler_tag wlan_ifllevent;
+static void
+bpf_track(struct bpf_if *bpf, struct ifnet *ifp, int dlt, int event)
+{
-static void
-bpf_track(void *arg, struct ifnet *ifp, int dlt, int attach)
-{
- /* NB: identify vap's by if_init */ // NNN won't work with urtwn ...
if (dlt == DLT_IEEE802_11_RADIO &&
ifp->if_init == ieee80211_init) {
struct ieee80211vap *vap = ifp->if_softc;
+
/*
* Track bpf radiotap listener state. We mark the vap
* to indicate if any listener is present and the com
@@ -1264,11 +1265,12 @@ bpf_track(void *arg, struct ifnet *ifp,
* vap. This flag is used by drivers to prepare radiotap
* state only when needed.
*/
- if (attach) {
+ if (event == BPF_TRACK_EVENT_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 (event == BPF_TRACK_EVENT_DETACH &&
+ !bpf_peers_present(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);
@@ -1276,6 +1278,7 @@ bpf_track(void *arg, struct ifnet *ifp,
}
}
+#ifdef notyet
/*
* Change MAC address on the vap (if was not started).
*/
@@ -1569,7 +1572,7 @@ ieee80211_if_attach(struct ifnet *ifp, c
{
ifp->if_type = IFT_ETHER;
ifp->if_hdrlen = ETHER_HDR_LEN;
- ifp->if_dlt = DLT_EN10MB;
+ ifp->if_dlt = DLT_IEEE802_11;
ifp->if_mtu = ETHERMTU;
ifp->if_output = ether_output;
ifp->_if_input = ether_input;
@@ -1580,5 +1583,5 @@ ieee80211_if_attach(struct ifnet *ifp, c
if_set_sadl(ifp, lla, ETHER_ADDR_LEN, !ETHER_IS_LOCAL(lla));
ifp->if_broadcastaddr = etherbroadcastaddr;
- bpf_attach(ifp, DLT_EN10MB, sizeof(struct ether_header));
+ bpf_attach(ifp, DLT_IEEE802_11, sizeof(struct ieee80211_frame));
}
Home |
Main Index |
Thread Index |
Old Index