@@ @@ #include "if_athioctl.h" +#include "wprobe.h" @@ @@ struct ath_vap { ... + struct wprobe_iface av_wpif; }; @@ @@ struct ath_node { ... + struct wprobe_link an_wplink; + uint8_t an_wplink_active; + struct work_struct an_destroy; u_int16_t an_decomp_index; ... }; @@ @@ ath_vap_create(...) { <... + ath_init_wprobe_dev(avp); return vap; ...> } @ rule5 @ expression vap; @@ ath_vap_delete(...) { <... ieee80211_vap_detach(vap); + ath_remove_wprobe_dev(ATH_VAP(vap)); ...> } @ rule6 @ @@ static int xchanmode = -1; + +#include "ath_wprobe.c" @ rule7 @ expression sc, ni; @@ <... sc->sc_rc->ops->newassoc(sc, ATH_NODE(ni), isnew); + ath_wprobe_node_join(ni->ni_vap, ni); ...> @ rule8 @ expression ni; expression sc; @@ <... sc->sc_rc->ops->node_cleanup(sc, ATH_NODE(ni)); + ath_wprobe_node_leave(ni->ni_vap, ni); ...> @ rule9 @ expression ni; expression rs; @@ <... ATH_RSSI_LPF(ATH_NODE(ni)->an_avgrssi, rs->rs_rssi); + ath_node_sample_rx(ni, rs); ...> @ rule10 @ expression an; expression ts; @@ <... ATH_RSSI_LPF(an->an_halstats.ns_avgtxrssi, ts->ts_rssi); + ath_node_sample_tx(&an->an_node, ts, bf->bf_skb->len); ...>