]> xenbits.xensource.com Git - people/julieng/freebsd.git/commitdiff
Add an external facing function to manually set the RX A-MPDU parameters
authoradrian <adrian@FreeBSD.org>
Fri, 18 Sep 2015 05:01:05 +0000 (05:01 +0000)
committeradrian <adrian@FreeBSD.org>
Fri, 18 Sep 2015 05:01:05 +0000 (05:01 +0000)
for re-ordering.

Devices like if_rsu don't pass through action/management frames but do send
firmware commands to inform us of things.  One of those notifications is
the RX A-MPDU negotiated parameters.

sys/net80211/ieee80211_ht.c
sys/net80211/ieee80211_ht.h

index d83cf6511f2ffe96d394670530a6797441c6a616..09c007a9d6ce5fbec8e8cfbf4a151d6522a5d2bd 100644 (file)
@@ -557,6 +557,43 @@ ampdu_rx_start(struct ieee80211_node *ni, struct ieee80211_rx_ampdu *rap,
        return 0;
 }
 
+/*
+ * Public function; manually setup the RX ampdu state.
+ */
+int
+ieee80211_ampdu_rx_start_ext(struct ieee80211_node *ni, int tid, int seq, int baw)
+{
+       struct ieee80211_rx_ampdu *rap;
+
+       /* XXX TODO: sanity check tid, seq, baw */
+
+       rap = &ni->ni_rx_ampdu[tid];
+
+       if (rap->rxa_flags & IEEE80211_AGGR_RUNNING) {
+               /*
+                * AMPDU previously setup and not terminated with a DELBA,
+                * flush the reorder q's in case anything remains.
+                */
+               ampdu_rx_purge(rap);
+       }
+
+       memset(rap, 0, sizeof(*rap));
+       rap->rxa_wnd = (baw== 0) ?
+           IEEE80211_AGGR_BAWMAX : min(baw, IEEE80211_AGGR_BAWMAX);
+       rap->rxa_start = seq;
+       rap->rxa_flags |=  IEEE80211_AGGR_RUNNING | IEEE80211_AGGR_XCHGPEND;
+
+       IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni,
+           "%s: tid=%d, start=%d, wnd=%d, flags=0x%08x\n",
+           __func__,
+           tid,
+           seq,
+           rap->rxa_wnd,
+           rap->rxa_flags);
+
+       return 0;
+}
+
 /*
  * Stop A-MPDU rx processing for the specified TID.
  */
index 3bda5fe4580f7db2b64bdf57e93d429d536de97f..f7ba6c63c36a01392b320bb32d01460ecd37204c 100644 (file)
@@ -200,4 +200,7 @@ uint8_t     *ieee80211_add_htinfo_vendor(uint8_t *, struct ieee80211_node *);
 struct ieee80211_beacon_offsets;
 void   ieee80211_ht_update_beacon(struct ieee80211vap *,
                struct ieee80211_beacon_offsets *);
+int    ieee80211_ampdu_rx_start_ext(struct ieee80211_node *ni, int tid,
+           int seq, int baw);
+
 #endif /* _NET80211_IEEE80211_HT_H_ */