diff options
author | Stefan Sperling <stsp@cvs.openbsd.org> | 2019-07-29 10:50:10 +0000 |
---|---|---|
committer | Stefan Sperling <stsp@cvs.openbsd.org> | 2019-07-29 10:50:10 +0000 |
commit | caa3b8b901ba1e6c8ba8e97a24d569469740fe84 (patch) | |
tree | a807daeb66a8fe3b093278ae1df0d3696d739106 /sys/net80211/ieee80211_node.h | |
parent | 327a419834f008d00b035a1f4997292b8346aad9 (diff) |
Add support for 802.11n Tx aggregation to net80211 and the iwn(4) driver.
In particular, add Tx block ack session management to net80211, with
enough funcionality to support Tx aggregation on devices which perform
A-MPDU subframe scheduling in firmware.
Make use of the iwn(4) firmware Tx scheduler to build A-MPDUs.
net80211's QoS support code is now enabled and used by Tx aggregation.
A-MSDU frames inside A-MPDUs have been tested and work in principle.
For now, this feature is disabled because unfair TCP connection sharing
was observed during testing, where bursts of TCP Ack frames for a single
tcpbench(1) connection arriving in A-MSDUs made other TCP connections stall.
Switch off support for A-MSDUs inside A-MPDUs on the Rx side as well.
Tested on iwn chipsets 1000, 4965, 5100, 5300, 2200, 6200, 6205, 6300
(committed version of tested diff has all debug printfs removed)
tests/ok benno kmos mlarkin kevlo
Diffstat (limited to 'sys/net80211/ieee80211_node.h')
-rw-r--r-- | sys/net80211/ieee80211_node.h | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/sys/net80211/ieee80211_node.h b/sys/net80211/ieee80211_node.h index 0b891938db0..af6ad346c60 100644 --- a/sys/net80211/ieee80211_node.h +++ b/sys/net80211/ieee80211_node.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ieee80211_node.h,v 1.80 2019/03/01 08:13:11 stsp Exp $ */ +/* $OpenBSD: ieee80211_node.h,v 1.81 2019/07/29 10:50:09 stsp Exp $ */ /* $NetBSD: ieee80211_node.h,v 1.9 2004/04/30 22:57:32 dyoung Exp $ */ /*- @@ -204,6 +204,9 @@ struct ieee80211_tx_ba { #define IEEE80211_BA_MAX_WINSZ 64 /* corresponds to maximum ADDBA BUFSZ */ u_int8_t ba_token; + + /* Bitmap for ACK'd frames in the current BA window. */ + uint64_t ba_bitmap; }; struct ieee80211_rx_ba { @@ -330,6 +333,11 @@ struct ieee80211_node { uint16_t ni_htop2; uint8_t ni_basic_mcs[howmany(128,NBBY)]; + /* Timeout handlers which trigger Tx Block Ack negotiation. */ + struct timeout ni_addba_req_to[IEEE80211_NUM_TID]; + int ni_addba_req_intval[IEEE80211_NUM_TID]; +#define IEEE80211_ADDBA_REQ_INTVAL_MAX 30 /* in seconds */ + /* Block Ack records */ struct ieee80211_tx_ba ni_tx_ba[IEEE80211_NUM_TID]; struct ieee80211_rx_ba ni_rx_ba[IEEE80211_NUM_TID]; @@ -472,6 +480,7 @@ struct ieee80211_node *ieee80211_dup_bss(struct ieee80211com *, const u_int8_t *); struct ieee80211_node *ieee80211_find_node(struct ieee80211com *, const u_int8_t *); +void ieee80211_ba_del(struct ieee80211_node *); struct ieee80211_node *ieee80211_find_rxnode(struct ieee80211com *, const struct ieee80211_frame *); struct ieee80211_node *ieee80211_find_txnode(struct ieee80211com *, @@ -494,6 +503,7 @@ int ieee80211_setup_htop(struct ieee80211_node *, const uint8_t *, uint8_t, int); int ieee80211_setup_rates(struct ieee80211com *, struct ieee80211_node *, const u_int8_t *, const u_int8_t *, int); +void ieee80211_node_trigger_addba_req(struct ieee80211_node *, int); int ieee80211_iserp_sta(const struct ieee80211_node *); void ieee80211_count_longslotsta(void *, struct ieee80211_node *); void ieee80211_count_nonerpsta(void *, struct ieee80211_node *); |