diff --git a/core/mac/src/pe/lim/lim_assoc_utils.c b/core/mac/src/pe/lim/lim_assoc_utils.c index b7b99785d0..5c97adb4fd 100644 --- a/core/mac/src/pe/lim/lim_assoc_utils.c +++ b/core/mac/src/pe/lim/lim_assoc_utils.c @@ -1580,7 +1580,7 @@ static bool lim_check_valid_mcs_for_nss(struct pe_session *session, uint16_t mcs_map; uint8_t mcs_count = 2, i; - if (!session->he_capable || !he_caps) + if (!session->he_capable || !he_caps || !he_caps->present) return true; mcs_map = he_caps->rx_he_mcs_map_lt_80; diff --git a/core/mac/src/pe/lim/lim_prop_exts_utils.c b/core/mac/src/pe/lim/lim_prop_exts_utils.c index a678b86af6..9fe39bf01f 100644 --- a/core/mac/src/pe/lim/lim_prop_exts_utils.c +++ b/core/mac/src/pe/lim/lim_prop_exts_utils.c @@ -162,8 +162,8 @@ static void lim_extract_he_op(struct pe_session *session, static bool lim_check_he_80_mcs11_supp(struct pe_session *session, tSirProbeRespBeacon *beacon_struct) { - uint8_t rx_mcs_map; - uint8_t tx_mcs_map; + uint16_t rx_mcs_map; + uint16_t tx_mcs_map; rx_mcs_map = beacon_struct->he_cap.rx_he_mcs_map_lt_80; tx_mcs_map = beacon_struct->he_cap.tx_he_mcs_map_lt_80; if ((session->nss == NSS_1x1_MODE) && @@ -201,6 +201,31 @@ static void lim_check_he_ldpc_cap(struct pe_session *session, } } +static void lim_check_is_he_mcs_valid(struct pe_session *session, + tSirProbeRespBeacon *beacon_struct) +{ + uint8_t i; + uint16_t mcs_map; + + if (!session->he_capable || !beacon_struct->he_cap.present) + return; + + mcs_map = beacon_struct->he_cap.rx_he_mcs_map_lt_80; + for (i = 0; i < session->nss; i++) { + if (((mcs_map >> (i * 2)) & 0x3) != 0x3) + return; + } + session->he_capable = false; + pe_err("AP does not have valid MCS map"); + if (session->vhtCapability) { + session->dot11mode = MLME_DOT11_MODE_11AC; + pe_debug("Update dot11mode to 11ac"); + } else { + session->dot11mode = MLME_DOT11_MODE_11N; + pe_debug("Update dot11mode to 11N"); + } +} + void lim_update_he_bw_cap_mcs(struct pe_session *session, tSirProbeRespBeacon *beacon) { @@ -278,6 +303,10 @@ static inline void lim_extract_he_op(struct pe_session *session, static void lim_check_he_ldpc_cap(struct pe_session *session, tSirProbeRespBeacon *beacon_struct) {} +static void lim_check_is_he_mcs_valid(struct pe_session *session, + tSirProbeRespBeacon *beacon_struct) +{ +} #endif void lim_objmgr_update_vdev_nss(struct wlan_objmgr_psoc *psoc, @@ -535,6 +564,7 @@ void lim_extract_ap_capability(struct mac_context *mac_ctx, uint8_t *p_ie, pe_err("AP does not support op_mode rx"); } } + lim_check_is_he_mcs_valid(session, beacon_struct); lim_check_he_ldpc_cap(session, beacon_struct); lim_extract_he_op(session, beacon_struct); lim_update_he_bw_cap_mcs(session, beacon_struct);