qcacld-3.0: Fix data stall when connect a special SAP
For SAP with special OUI, if DUT STA connect with 11ax mode with ht control enabled, SAP can't decode unicast pkt from DUT. Fix it by clearing ht control bit in he cap when send peer assoc cmd to firmware when connect such IOT AP with 11ax mode. Steps: 1. When wlan driver is loaded, psoc ht cap is initialized by ini or default value in hdd_component_psoc_open->mlme_init_he_cap_in_cfg. mac->mlme_cfg = &mlme_ext_obj->cfg in mac_open. 2. When WMI_SERVICE_READY_EXT_EVENT is received from firmware, psoc he cap is updated in wma_update_hdd_cfg->hdd_update_tgt_cfg-> hdd_update_tgt_he_cap->mlme_update_tgt_he_caps_in_cfg. 3. When wlan0 up, vdev0 is created, mlme_priv->he_config is copied from psoc he cap in sme_vdev_post_vdev_create_setup->csr_setup_vdev_session-> csr_update_session_he_cap. 4. When DUT STA connect, check OUI in beacon when join request in lim_check_oui_and_update_session, if matched special pattern of SAP which doesn't support htc he, htc he in vdev mlme_priv->he_config is disabled, then session->he_config is copied from vdev mlme_priv->he_config in lim_fill_pe_session->lim_copy_join_req_he_cap with htc he disabled too. 5. When assoc rsp is received, ht cap of peer and DUT are intersected and set to add_bss->staContext.he_config in lim_process_assoc_rsp_frame-> lim_sta_send_add_bss->lim_intersect_ap_he_caps->lim_intersect_he_caps. so htc he is also disabled in peer_he_cap_macinfo. htc he in peer_he_cap_info is disabled when WMI_PEER_ASSOC_CMDID is sent in wma_send_peer_assoc->wma_populate_peer_he_cap. then htc he is disabled in all tx pkts in he mode. Change-Id: Icf9d6d7ddc370c79e615a713c76606e7fd195fd3 CRs-Fixed: 3004761
This commit is contained in:

committed by
Madan Koyyalamudi

parent
f3a611e14d
commit
8a1b7512eb
@@ -342,6 +342,10 @@
|
||||
#define SIR_MAC_BA_2K_JUMP_AP_VENDOR_OUI "\x00\x14\x6C"
|
||||
#define SIR_MAC_BA_2K_JUMP_AP_VENDOR_OUI_LEN 3
|
||||
|
||||
#define SIR_MAC_BAD_HTC_HE_VENDOR_OUI1 "\x00\x50\xF2\x11"
|
||||
#define SIR_MAC_BAD_HTC_HE_VENDOR_OUI2 "\x00\x50\xF2\x12"
|
||||
#define SIR_MAC_BAD_HTC_HE_VENDOR_OUI_LEN 4
|
||||
|
||||
/* Maximum allowable size of a beacon and probe rsp frame */
|
||||
#define SIR_MAX_BEACON_SIZE 512
|
||||
#define SIR_MAX_PROBE_RESP_SIZE 512
|
||||
|
@@ -1574,11 +1574,37 @@ lim_update_he_caps_mcs(struct mac_context *mac, struct pe_session *session)
|
||||
mlme_priv->he_config.tx_he_mcs_map_lt_80 = tx_mcs_map;
|
||||
mlme_priv->he_config.rx_he_mcs_map_lt_80 = rx_mcs_map;
|
||||
}
|
||||
|
||||
/**
|
||||
* lim_update_he_caps_htc() - Update htc in he caps
|
||||
* @session: Pointer to PE session
|
||||
* @val: htc he enabled status
|
||||
*
|
||||
* Return: void
|
||||
*/
|
||||
static void
|
||||
lim_update_he_caps_htc(struct pe_session *session, bool val)
|
||||
{
|
||||
struct wlan_objmgr_vdev *vdev = session->vdev;
|
||||
struct mlme_legacy_priv *mlme_priv;
|
||||
|
||||
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
||||
if (!mlme_priv)
|
||||
return;
|
||||
|
||||
pe_debug("new htc he: %d", val);
|
||||
mlme_priv->he_config.htc_he = val;
|
||||
}
|
||||
#else
|
||||
static void
|
||||
lim_update_he_caps_mcs(struct mac_context *mac, struct pe_session *session)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
lim_update_he_caps_htc(struct pe_session *session, bool val)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef WLAN_FEATURE_11BE
|
||||
@@ -1752,6 +1778,23 @@ static void lim_check_oui_and_update_session(struct mac_context *mac_ctx,
|
||||
SIR_MAC_BA_2K_JUMP_AP_VENDOR_OUI_LEN,
|
||||
vendor_ap_search_attr.ie_data, ie_len);
|
||||
wlan_mlme_set_ba_2k_jump_iot_ap(session->vdev, is_vendor_ap_present);
|
||||
|
||||
is_vendor_ap_present = wlan_get_vendor_ie_ptr_from_oui
|
||||
(SIR_MAC_BAD_HTC_HE_VENDOR_OUI1,
|
||||
SIR_MAC_BAD_HTC_HE_VENDOR_OUI_LEN,
|
||||
vendor_ap_search_attr.ie_data, ie_len) &&
|
||||
wlan_get_vendor_ie_ptr_from_oui
|
||||
(SIR_MAC_BAD_HTC_HE_VENDOR_OUI2,
|
||||
SIR_MAC_BAD_HTC_HE_VENDOR_OUI_LEN,
|
||||
vendor_ap_search_attr.ie_data, ie_len);
|
||||
|
||||
/*
|
||||
* For SAP with special OUI, if DUT STA connect with 11ax mode with ht
|
||||
* control enabled, SAP can't decode unicast pkt from DUT.
|
||||
* Fix it by clearing ht control bit in he cap when send peer assoc cmd
|
||||
* to firmware when connect such IOT AP with 11ax mode.
|
||||
*/
|
||||
lim_update_he_caps_htc(session, !is_vendor_ap_present);
|
||||
}
|
||||
|
||||
static enum mlme_dot11_mode
|
||||
|
@@ -6914,6 +6914,12 @@ static void lim_intersect_he_caps(tDot11fIEhe_cap *rcvd_he,
|
||||
else
|
||||
peer_he->tb_ppdu_tx_stbc_gt_80mhz = 0;
|
||||
|
||||
if (session_he->htc_he && peer_he->htc_he)
|
||||
peer_he->htc_he = 1;
|
||||
else
|
||||
peer_he->htc_he = 0;
|
||||
pe_debug("intersected htc he is: %d", peer_he->htc_he);
|
||||
|
||||
/* Tx Doppler is first bit and Rx Doppler is second bit */
|
||||
if (session_he->doppler) {
|
||||
val = 0;
|
||||
|
Reference in New Issue
Block a user