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