qcacld-3.0: Add 11AX cap checks in Assoc Request handler

Add following 11ax checks while processing assoc request:
1) If SAP is 11AX only - reject non 11ax STA
2) If connecting STA does not support basic HE MCS as
   advertised by SAP then reject STA connection

Change-Id: Ic2aee9ee92a189ca611a1264dcc23b4b93e0d856
CRs-Fixed: 2159243
This commit is contained in:
Naveen Rawat 2017-12-11 17:25:27 -08:00 • committed by snandini
commit 441bc87f12

View file

@ -512,6 +512,94 @@ static bool lim_chk_11ac_only(tpAniSirGlobal mac_ctx, tpSirMacMgmtHdr hdr,
return true;
}
/**
* lim_chk_11ax_only() - checks for non 11ax STA
* @mac_ctx: pointer to Global MAC structure
* @hdr: pointer to the MAC head
* @session: pointer to pe session entry
* @assoc_req: pointer to ASSOC/REASSOC Request frame
* @sub_type: Assoc(=0) or Reassoc(=1) Requestframe
*
* Checks for non 11ax STA
*
* Return: true of no error, false otherwise
*/
#ifdef WLAN_FEATURE_11AX
static bool lim_chk_11ax_only(tpAniSirGlobal mac_ctx, tpSirMacMgmtHdr hdr,
tpPESession session, tpSirAssocReq assoc_req,
uint8_t sub_type)
{
if (LIM_IS_AP_ROLE(session) &&
(session->dot11mode == WNI_CFG_DOT11_MODE_11AX_ONLY) &&
!assoc_req->he_cap.present) {
lim_send_assoc_rsp_mgmt_frame(mac_ctx,
eSIR_MAC_CAPABILITIES_NOT_SUPPORTED_STATUS,
1, hdr->sa, sub_type, 0, session);
pe_err("SOFTAP was in 11AX only mode, reject");
return false;
}
return true;
}
/**
* lim_check_11ax_basic_mcs() - checks for 11ax basic MCS rates
* @mac_ctx: pointer to Global MAC structure
* @hdr: pointer to the MAC head
* @session: pointer to pe session entry
* @assoc_req: pointer to ASSOC/REASSOC Request frame
* @sub_type: Assoc(=0) or Reassoc(=1) Requestframe
*
* Checks for non 11ax STA
*
* Return: true of no error, false otherwise
*/
static bool lim_check_11ax_basic_mcs(tpAniSirGlobal mac_ctx,
tpSirMacMgmtHdr hdr,
tpPESession session,
tpSirAssocReq assoc_req,
uint8_t sub_type)
{
uint32_t val;
uint16_t basic_mcs, sta_mcs, rx_mcs, tx_mcs, final_mcs;
if (LIM_IS_AP_ROLE(session) &&
assoc_req->he_cap.present) {
rx_mcs = assoc_req->he_cap.rx_he_mcs_map_lt_80;
tx_mcs = assoc_req->he_cap.tx_he_mcs_map_lt_80;
sta_mcs = HE_INTERSECT_MCS(rx_mcs, tx_mcs);
if (eSIR_SUCCESS != wlan_cfg_get_int(mac_ctx,
WNI_CFG_HE_OPS_BASIC_MCS_NSS, &val))
val = WNI_CFG_HE_OPS_BASIC_MCS_NSS_DEF;
basic_mcs = (uint16_t)val;
final_mcs = HE_INTERSECT_MCS(sta_mcs, basic_mcs);
if (final_mcs != basic_mcs) {
lim_send_assoc_rsp_mgmt_frame(mac_ctx,
eSIR_MAC_CAPABILITIES_NOT_SUPPORTED_STATUS,
1, hdr->sa, sub_type, 0, session);
pe_err("STA did not suport basic MCS required by SAP");
return false;
}
}
return true;
}
#else
static bool lim_chk_11ax_only(tpAniSirGlobal mac_ctx, tpSirMacMgmtHdr hdr,
tpPESession session, tpSirAssocReq assoc_req,
uint8_t sub_type)
{
return true;
}
static bool lim_check_11ax_basic_mcs(tpAniSirGlobal mac_ctx,
tpSirMacMgmtHdr hdr,
tpPESession session,
tpSirAssocReq assoc_req,
uint8_t sub_type)
{
return true;
}
#endif
/**
* lim_process_for_spectrum_mgmt() - process assoc req for spectrum mgmt
* @mac_ctx: pointer to Global MAC structure
@ -1901,6 +1989,14 @@ void lim_process_assoc_req_frame(tpAniSirGlobal mac_ctx, uint8_t *rx_pkt_info,
sub_type))
goto error;
if (false == lim_chk_11ax_only(mac_ctx, hdr, session, assoc_req,
sub_type))
goto error;
if (false == lim_check_11ax_basic_mcs(mac_ctx, hdr, session, assoc_req,
sub_type))
goto error;
/* Spectrum Management (11h) specific checks */
lim_process_for_spectrum_mgmt(mac_ctx, hdr, session,
assoc_req, sub_type, local_cap);