merge madwifi and wprobe into 8.09
[openwrt/svn-archive/archive.git] / package / madwifi / patches / 416-wprobe.patch
index 0eb5f8928df32d61139eda42f5e935226b0fdcb9..73cf85fae4dd1da7264a5c1ee0554305f7af78f1 100644 (file)
@@ -1,6 +1,6 @@
 --- /dev/null
 +++ b/ath/ath_wprobe.c
-@@ -0,0 +1,392 @@
+@@ -0,0 +1,433 @@
 +#include <net80211/ieee80211_node.h>
 +#include <linux/wprobe.h>
 +
 +      if ((rate < 0) || (rate >= rt->rateCount))
 +              return -1;
 +
-+      return rt->info[rate].rateKbps / 10;
++      return rt->info[rate].rateKbps;
 +}
 +
 +static void
++ath_wprobe_report_rx(struct ieee80211vap *vap, struct ath_rx_status *rs, struct sk_buff *skb)
++{
++      const struct ieee80211_frame *wh = (struct ieee80211_frame *)skb->data;
++      struct wprobe_wlan_hdr hdr;
++      struct ath_vap *avp;
++      int hdrsize;
++
++      if (wprobe_disabled())
++              return;
++
++      avp = ATH_VAP(vap);
++      avp->av_rxframes++;
++      if (wh->i_fc[0] == (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_REQ))
++              avp->av_rxprobereq++;
++
++      memset(&hdr, 0, sizeof(hdr));
++      hdr.len = skb->len;
++      hdr.snr = rs->rs_rssi;
++      hdr.type = WPROBE_PKT_RX;
++      if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL)
++              hdrsize = sizeof(struct ieee80211_ctlframe_addr2);
++      else
++              hdrsize = ieee80211_hdrsize(skb->data);
++      wprobe_add_frame(&avp->av_wpif, &hdr, skb->data, hdrsize + 0x42);
++}
++
++
++static void
 +ath_node_sample_rx(struct ieee80211_node *ni, struct ath_rx_status *rs)
 +{
 +      struct ath_node *an = ATH_NODE(ni);
 +}
 +
 +static void
-+ath_node_sample_tx(struct ieee80211_node *ni, struct ath_tx_status *ts, int len)
++ath_wprobe_report_tx(struct ieee80211vap *vap, struct ath_tx_status *ts, struct sk_buff *skb)
++{
++      const struct ieee80211_frame *wh = (struct ieee80211_frame *)skb->data;
++      struct wprobe_wlan_hdr hdr;
++      struct ath_vap *avp;
++      int hdrsize;
++
++      if (wprobe_disabled())
++              return;
++
++      avp = ATH_VAP(vap);
++
++      memset(&hdr, 0, sizeof(hdr));
++      hdr.len = skb->len;
++      hdr.snr = ts->ts_rssi;
++      hdr.type = WPROBE_PKT_TX;
++      if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL)
++              hdrsize = sizeof(struct ieee80211_ctlframe_addr2);
++      else
++              hdrsize = ieee80211_hdrsize(skb->data);
++      wprobe_add_frame(&avp->av_wpif, &hdr, skb->data, hdrsize + 0x42);
++}
++
++
++
++static void
++ath_node_sample_tx(struct ieee80211_node *ni, struct ath_tx_status *ts, struct sk_buff *skb)
 +{
 +      struct ath_node *an = ATH_NODE(ni);
 +      struct ieee80211vap *vap = ni->ni_vap;
 +      struct wprobe_value *v = l->val;
 +      unsigned long flags;
 +      int rate, rexmit_counter;
++      int len = skb->len;
 +
 +      if (wprobe_disabled() || !an->an_wplink_active || !l->val)
 +              return;
 +
++      ath_wprobe_report_tx(vap, ts, skb);
 +      rate = ath_lookup_rateval(ni, ts->ts_rate);
 +
 +      spin_lock_irqsave(&l->iface->lock, flags);
 +}
 +
 +static void
-+ath_wprobe_report_rx(struct ieee80211vap *vap, struct sk_buff *skb)
-+{
-+      struct ieee80211_frame *wh = (struct ieee80211_frame *)skb->data;
-+      struct ath_vap *avp;
-+
-+      if (wprobe_disabled())
-+              return;
-+
-+      avp = ATH_VAP(vap);
-+      avp->av_rxframes++;
-+      if (wh->i_fc[0] == (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_REQ))
-+              avp->av_rxprobereq++;
-+}
-+
-+static void
 +ath_wprobe_node_join(struct ieee80211vap *vap, struct ieee80211_node *ni)
 +{
 +      struct wprobe_iface *dev;
        return vap;
  }
  
-@@ -1605,6 +1607,7 @@ ath_vap_delete(struct ieee80211vap *vap)
+@@ -1606,6 +1608,7 @@ ath_vap_delete(struct ieee80211vap *vap)
                decrease = 0;
  
        ieee80211_vap_detach(vap);
        /* NB: memory is reclaimed through dev->destructor callback */
        if (decrease)
                sc->sc_nvaps--;
-@@ -5939,6 +5942,7 @@ ath_node_cleanup(struct ieee80211_node *
+@@ -5940,6 +5943,7 @@ ath_node_cleanup(struct ieee80211_node *
        /* Clean up node-specific rate things - this currently appears to 
         * always be a no-op */
        sc->sc_rc->ops->node_cleanup(sc, ATH_NODE(ni));
  
        ATH_NODE_UAPSD_LOCK_IRQ(an);
  #ifdef IEEE80211_DEBUG_REFCNT
-@@ -7009,6 +7013,8 @@ drop_micfail:
+@@ -7010,6 +7014,8 @@ drop_micfail:
                                goto lookup_slowpath;
                        }
                        ATH_RSSI_LPF(ATH_NODE(ni)->an_avgrssi, rs->rs_rssi);
 +                      ath_node_sample_rx(ni, rs);
-+                      ath_wprobe_report_rx(ni->ni_vap, skb);
++                      ath_wprobe_report_rx(ni->ni_vap, rs, skb);
                        type = ieee80211_input(ni->ni_vap, ni, skb, rs->rs_rssi, bf->bf_tsf);
                        ieee80211_unref_node(&ni);
                } else {
-@@ -7019,15 +7025,22 @@ drop_micfail:
+@@ -7020,15 +7026,22 @@ drop_micfail:
  
  lookup_slowpath:
                        vap = ieee80211_find_rxvap(ic, wh->i_addr1);
 -                      if (vap)
 +                      if (vap) {
-+                              ath_wprobe_report_rx(vap, skb);
++                              ath_wprobe_report_rx(vap, rs, skb);
                                ni = ieee80211_find_rxnode(ic, vap, wh);
 -                      else
 +                      } else {
 +                              TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) {
-+                                      ath_wprobe_report_rx(vap, skb);
++                                      ath_wprobe_report_rx(vap, rs, skb);
 +                              }
 +                              vap = NULL;
                                ni = NULL;
                                type = ieee80211_input(vap, ni, skb, rs->rs_rssi, bf->bf_tsf);
                                /*
                                 * If the station has a key cache slot assigned
-@@ -8607,6 +8620,7 @@ ath_tx_processq(struct ath_softc *sc, st
+@@ -8608,6 +8621,7 @@ ath_tx_processq(struct ath_softc *sc, st
                                sc->sc_stats.ast_tx_rssi = ts->ts_rssi;
                                ATH_RSSI_LPF(an->an_halstats.ns_avgtxrssi,
                                        ts->ts_rssi);
-+                                      ath_node_sample_tx(&an->an_node, ts, bf->bf_skb->len);
++                                      ath_node_sample_tx(&an->an_node, ts, bf->bf_skb);
                                if (bf->bf_skb->priority == WME_AC_VO ||
                                    bf->bf_skb->priority == WME_AC_VI)
                                        ni->ni_ic->ic_wme.wme_hipri_traffic++;
-@@ -10106,6 +10120,7 @@ ath_newassoc(struct ieee80211_node *ni, 
+@@ -10107,6 +10121,7 @@ ath_newassoc(struct ieee80211_node *ni, 
        struct ath_softc *sc = ic->ic_dev->priv;
  
        sc->sc_rc->ops->newassoc(sc, ATH_NODE(ni), isnew);