As per 802.11ac spec: 'Maximum AMPDU Length Exponent' field value is in
range of 0 to 7. Existing implementation assumes EXP0 to be max length
(bits 23, 24 and 25 set) what is incorrect.

This patch adds options to set it up within the 0 to 7 range.

Signed-off-by: Bartosz Markowski <bartosz.markowski at tieto.com>
Signed-off-by: Matti Laakso <malaakso at elisanet.fi>
---

Index: trunk/package/network/services/hostapd/patches/700-max_a_mpdu.patch
===================================================================
--- trunk/package/network/services/hostapd/patches/700-max_a_mpdu.patch 
(revision 0)
+++ trunk/package/network/services/hostapd/patches/700-max_a_mpdu.patch 
(working copy)
@@ -0,0 +1,73 @@
+As per 802.11ac spec: 'Maximum AMPDU Length Exponent' field value
+is in range of 0 to 7. Existing implementation assumes
+EXP0 to be max length (bits 23, 24 and 25 set) what is incorrect.
+
+This patch adds options to set it up within the 0 to 7 range.
+
+Signed-off-by: Bartosz Markowski <bartosz.markow...@tieto.com>
+---
+ hostapd/config_file.c        |   16 ++++++++++++++--
+ src/ap/hw_features.c         |    2 +-
+ src/common/ieee802_11_defs.h |    9 ++++++++-
+ 3 files changed, 23 insertions(+), 4 deletions(-)
+
+diff --git a/hostapd/config_file.c b/hostapd/config_file.c
+index fa7d14a..cae5a92 100644
+--- a/hostapd/config_file.c
++++ b/hostapd/config_file.c
+@@ -1096,8 +1096,20 @@ static int hostapd_config_vht_capab(struct 
hostapd_config *conf,
+               conf->vht_capab |= VHT_CAP_VHT_TXOP_PS;
+       if (os_strstr(capab, "[HTC-VHT]"))
+               conf->vht_capab |= VHT_CAP_HTC_VHT;
+-      if (os_strstr(capab, "[MAX-A-MPDU-LEN-EXP0]"))
+-              conf->vht_capab |= VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT;
++      if (os_strstr(capab, "[MAX-A-MPDU-LEN-EXP1]"))
++              conf->vht_capab |= VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_1;
++      if (os_strstr(capab, "[MAX-A-MPDU-LEN-EXP2]"))
++              conf->vht_capab |= VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_2;
++      if (os_strstr(capab, "[MAX-A-MPDU-LEN-EXP3]"))
++              conf->vht_capab |= VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_3;
++      if (os_strstr(capab, "[MAX-A-MPDU-LEN-EXP4]"))
++              conf->vht_capab |= VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_4;
++      if (os_strstr(capab, "[MAX-A-MPDU-LEN-EXP5]"))
++              conf->vht_capab |= VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_5;
++      if (os_strstr(capab, "[MAX-A-MPDU-LEN-EXP6]"))
++              conf->vht_capab |= VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_6;
++      if (os_strstr(capab, "[MAX-A-MPDU-LEN-EXP7]"))
++              conf->vht_capab |= VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX;
+       if (os_strstr(capab, "[VHT-LINK-ADAPT2]") &&
+           (conf->vht_capab & VHT_CAP_HTC_VHT))
+               conf->vht_capab |= VHT_CAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB;
+diff --git a/src/ap/hw_features.c b/src/ap/hw_features.c
+index 7d36790..62ee84a 100644
+--- a/src/ap/hw_features.c
++++ b/src/ap/hw_features.c
+@@ -764,7 +764,7 @@ static int ieee80211ac_supported_vht_capab(struct 
hostapd_iface *iface)
+       VHT_CAP_CHECK(VHT_CAP_MU_BEAMFORMEE_CAPABLE);
+       VHT_CAP_CHECK(VHT_CAP_VHT_TXOP_PS);
+       VHT_CAP_CHECK(VHT_CAP_HTC_VHT);
+-      VHT_CAP_CHECK_MAX(VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT);
++      VHT_CAP_CHECK_MAX(VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX);
+       VHT_CAP_CHECK(VHT_CAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB);
+       VHT_CAP_CHECK(VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB);
+       VHT_CAP_CHECK(VHT_CAP_RX_ANTENNA_PATTERN);
+diff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h
+index 520e55d..70e3c5c 100644
+--- a/src/common/ieee802_11_defs.h
++++ b/src/common/ieee802_11_defs.h
+@@ -757,7 +757,14 @@ struct ieee80211_vht_operation {
+ #define VHT_CAP_MU_BEAMFORMEE_CAPABLE               ((u32) BIT(20))
+ #define VHT_CAP_VHT_TXOP_PS                         ((u32) BIT(21))
+ #define VHT_CAP_HTC_VHT                             ((u32) BIT(22))
+-#define VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT          ((u32) BIT(23) | \
++
++#define VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_1        ((u32) BIT(23))
++#define VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_2        ((u32) BIT(24))
++#define VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_3        ((u32) BIT(23) | BIT(24))
++#define VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_4        ((u32) BIT(25))
++#define VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_5        ((u32) BIT(23) | BIT(25))
++#define VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_6        ((u32) BIT(24) | BIT(25))
++#define VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX      ((u32) BIT(23) | \
+                                                          BIT(24) | BIT(25))
+ #define VHT_CAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB   ((u32) BIT(27))
+ #define VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB     ((u32) BIT(26) | BIT(27))
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to