qcacld-3.0: Add ini to disable aggressive EDCA config

Add action_oui ini gActionOUIDisableAggressiveEDCA to identify peers for
which aggressive EDCA configuration causes some IOT issues.

Change-Id: Ifea0c224cef2378727c9f78d8b571ea9c57bb662
CRs-Fixed: 2507191
This commit is contained in:
Paul Zhang
2019-10-09 11:22:32 +08:00
committed by Gerrit - the friendly Code Review server
parent 34eadc61ed
commit d34b575fc5
7 changed files with 109 additions and 4 deletions

View File

@@ -89,7 +89,8 @@
* @ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN: connect in 1x1 & disable diversity gain * @ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN: connect in 1x1 & disable diversity gain
* @ACTION_OUI_DISABLE_AGGRESSIVE_TX: disable aggressive TX in firmware * @ACTION_OUI_DISABLE_AGGRESSIVE_TX: disable aggressive TX in firmware
* @ACTION_OUI_FORCE_MAX_NSS: Force Max NSS connection with few IOT APs * @ACTION_OUI_FORCE_MAX_NSS: Force Max NSS connection with few IOT APs
* @ACTION_OUI_MAXIMUM_ID: maximun number of action oui types * @ACTION_OUI_DISABLE_AGGRESSIVE_EDCA: disable aggressive EDCA with the ap
* @ACTION_OUI_MAXIMUM_ID: maximum number of action oui types
*/ */
enum action_oui_id { enum action_oui_id {
ACTION_OUI_CONNECT_1X1 = 0, ACTION_OUI_CONNECT_1X1 = 0,
@@ -100,6 +101,7 @@ enum action_oui_id {
ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN = 5, ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN = 5,
ACTION_OUI_DISABLE_AGGRESSIVE_TX = 6, ACTION_OUI_DISABLE_AGGRESSIVE_TX = 6,
ACTION_OUI_FORCE_MAX_NSS = 7, ACTION_OUI_FORCE_MAX_NSS = 7,
ACTION_OUI_DISABLE_AGGRESSIVE_EDCA = 8,
ACTION_OUI_MAXIMUM_ID ACTION_OUI_MAXIMUM_ID
}; };

View File

@@ -118,6 +118,7 @@ struct wlan_mlme_roam {
* @vdev_start_failed: flag to indicate that vdev start failed. * @vdev_start_failed: flag to indicate that vdev start failed.
* @connection_fail: flag to indicate connection failed * @connection_fail: flag to indicate connection failed
* @cac_required_for_new_channel: if CAC is required for new channel * @cac_required_for_new_channel: if CAC is required for new channel
* @follow_ap_edca: if true, it is forced to follow the AP's edca.
* @assoc_type: vdev associate/reassociate type * @assoc_type: vdev associate/reassociate type
* @dynamic_cfg: current configuration of nss, chains for vdev. * @dynamic_cfg: current configuration of nss, chains for vdev.
* @ini_cfg: Max configuration of nss, chains supported for vdev. * @ini_cfg: Max configuration of nss, chains supported for vdev.
@@ -136,6 +137,7 @@ struct mlme_legacy_priv {
bool vdev_start_failed; bool vdev_start_failed;
bool connection_fail; bool connection_fail;
bool cac_required_for_new_channel; bool cac_required_for_new_channel;
bool follow_ap_edca;
enum vdev_assoc_type assoc_type; enum vdev_assoc_type assoc_type;
struct wlan_mlme_nss_chains dynamic_cfg; struct wlan_mlme_nss_chains dynamic_cfg;
struct wlan_mlme_nss_chains ini_cfg; struct wlan_mlme_nss_chains ini_cfg;
@@ -371,6 +373,23 @@ void mlme_set_peer_disconnect_ies(struct wlan_objmgr_vdev *vdev,
*/ */
void mlme_free_peer_disconnect_ies(struct wlan_objmgr_vdev *vdev); void mlme_free_peer_disconnect_ies(struct wlan_objmgr_vdev *vdev);
/**
* mlme_set_follow_ap_edca_flag() - Set follow ap's edca flag
* @vdev: vdev pointer
* @flag: carries if following ap's edca is true or not.
*
* Return: None
*/
void mlme_set_follow_ap_edca_flag(struct wlan_objmgr_vdev *vdev, bool flag);
/**
* mlme_get_follow_ap_edca_flag() - Get follow ap's edca flag
* @vdev: vdev pointer
*
* Return: value of follow_ap_edca
*/
bool mlme_get_follow_ap_edca_flag(struct wlan_objmgr_vdev *vdev);
/** /**
* mlme_get_peer_disconnect_ies() - Get diconnect IEs from vdev object * mlme_get_peer_disconnect_ies() - Get diconnect IEs from vdev object
* @vdev: vdev pointer * @vdev: vdev pointer

View File

@@ -2587,6 +2587,32 @@ struct wlan_ies *mlme_get_peer_disconnect_ies(struct wlan_objmgr_vdev *vdev)
return &mlme_priv->peer_disconnect_ies; return &mlme_priv->peer_disconnect_ies;
} }
void mlme_set_follow_ap_edca_flag(struct wlan_objmgr_vdev *vdev, bool flag)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_legacy_err("vdev legacy private object is NULL");
return;
}
mlme_priv->follow_ap_edca = flag;
}
bool mlme_get_follow_ap_edca_flag(struct wlan_objmgr_vdev *vdev)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_legacy_err("vdev legacy private object is NULL");
return false;
}
return mlme_priv->follow_ap_edca;
}
void mlme_set_peer_pmf_status(struct wlan_objmgr_peer *peer, void mlme_set_peer_pmf_status(struct wlan_objmgr_peer *peer,
bool is_pmf_enabled) bool is_pmf_enabled)
{ {

View File

@@ -1169,7 +1169,42 @@ struct dhcp_server {
"FFFFFF 00 2A F85971000000 E0 50 FFFFFF 00 2A 14ABC5000000 E0 50", \ "FFFFFF 00 2A F85971000000 E0 50 FFFFFF 00 2A 14ABC5000000 E0 50", \
"Used to specify action OUIs to disable aggressive TX") "Used to specify action OUIs to disable aggressive TX")
/* End of action oui inis */ /*
* <ini>
* gActionOUIDisableAggressiveEDCA - Used to specify action OUIs to control
* EDCA configuration when join the candidate AP
*
* @Default: NULL
* Note: User should strictly add new action OUIs at the end of this
* default value.
*
* This ini is used to specify AP OUIs. The station's EDCA should follow the
* APs' when connecting to those AP, even if the gEnableEdcaParams is set.
* For example, it follows the AP's EDCA whose OUI is 0050F2 with the
* following setting:
* gActionOUIDisableAggressiveEDCA=0050F2 00 01
* Explain: 0050F2: OUI
* 00: data length is 0
* 01: info mask, only OUI present in Info mask
* Refer to gEnableActionOUI for more detail about the format.
*
* Related: gEnableEdcaParams, gEnableActionOUI
*
* Supported Feature: Action OUIs
*
* Usage: External
*
* </ini>
*/
#define CFG_ACTION_OUI_DISABLE_AGGRESSIVE_EDCA CFG_INI_STRING( \
"gActionOUIDisableAggressiveEDCA", \
0, \
ACTION_OUI_MAX_STR_LEN, \
"", \
"Used to specify action OUIs to control edca configuration")
/* End of action oui inis */
#ifdef ENABLE_MTRACE_LOG #ifdef ENABLE_MTRACE_LOG
/* /*
* <ini> * <ini>
@@ -1451,6 +1486,7 @@ enum host_log_level {
CFG(CFG_ACTION_OUI_ITO_EXTENSION) \ CFG(CFG_ACTION_OUI_ITO_EXTENSION) \
CFG(CFG_ACTION_OUI_DISABLE_AGGRESSIVE_TX) \ CFG(CFG_ACTION_OUI_DISABLE_AGGRESSIVE_TX) \
CFG(CFG_ACTION_OUI_FORCE_MAX_NSS) \ CFG(CFG_ACTION_OUI_FORCE_MAX_NSS) \
CFG(CFG_ACTION_OUI_DISABLE_AGGRESSIVE_EDCA) \
CFG(CFG_ACTION_OUI_SWITCH_TO_11N_MODE) \ CFG(CFG_ACTION_OUI_SWITCH_TO_11N_MODE) \
CFG(CFG_ADVERTISE_CONCURRENT_OPERATION) \ CFG(CFG_ADVERTISE_CONCURRENT_OPERATION) \
CFG(CFG_BUG_ON_REINIT_FAILURE) \ CFG(CFG_BUG_ON_REINIT_FAILURE) \

View File

@@ -10183,7 +10183,12 @@ static void hdd_cfg_params_init(struct hdd_context *hdd_ctx)
ACTION_OUI_MAX_STR_LEN); ACTION_OUI_MAX_STR_LEN);
qdf_str_lcopy(config->action_oui_str[ACTION_OUI_FORCE_MAX_NSS], qdf_str_lcopy(config->action_oui_str[ACTION_OUI_FORCE_MAX_NSS],
cfg_get(psoc, CFG_ACTION_OUI_FORCE_MAX_NSS), cfg_get(psoc, CFG_ACTION_OUI_FORCE_MAX_NSS),
ACTION_OUI_MAX_STR_LEN); ACTION_OUI_MAX_STR_LEN);
qdf_str_lcopy(config->action_oui_str
[ACTION_OUI_DISABLE_AGGRESSIVE_EDCA],
cfg_get(psoc,
CFG_ACTION_OUI_DISABLE_AGGRESSIVE_EDCA),
ACTION_OUI_MAX_STR_LEN);
config->enable_rtt_support = cfg_get(psoc, CFG_ENABLE_RTT_SUPPORT); config->enable_rtt_support = cfg_get(psoc, CFG_ENABLE_RTT_SUPPORT);
config->is_unit_test_framework_enabled = config->is_unit_test_framework_enabled =
cfg_get(psoc, CFG_ENABLE_UNIT_TEST_FRAMEWORK); cfg_get(psoc, CFG_ENABLE_UNIT_TEST_FRAMEWORK);

View File

@@ -1185,6 +1185,7 @@ sch_beacon_edca_process(struct mac_context *mac, tSirMacEdcaParamSetIE *edca,
struct pe_session *session) struct pe_session *session)
{ {
uint8_t i; uint8_t i;
bool follow_ap_edca;
#ifdef FEATURE_WLAN_DIAG_SUPPORT #ifdef FEATURE_WLAN_DIAG_SUPPORT
host_log_qos_edca_pkt_type *log_ptr = NULL; host_log_qos_edca_pkt_type *log_ptr = NULL;
#endif /* FEATURE_WLAN_DIAG_SUPPORT */ #endif /* FEATURE_WLAN_DIAG_SUPPORT */
@@ -1194,6 +1195,8 @@ sch_beacon_edca_process(struct mac_context *mac, tSirMacEdcaParamSetIE *edca,
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
} }
follow_ap_edca = mlme_get_follow_ap_edca_flag(session->vdev);
pe_debug("Updating parameter set count: Old %d ---> new %d", pe_debug("Updating parameter set count: Old %d ---> new %d",
session->gLimEdcaParamSetCount, edca->qosInfo.count); session->gLimEdcaParamSetCount, edca->qosInfo.count);
@@ -1203,7 +1206,7 @@ sch_beacon_edca_process(struct mac_context *mac, tSirMacEdcaParamSetIE *edca,
session->gLimEdcaParams[QCA_WLAN_AC_VI] = edca->acvi; session->gLimEdcaParams[QCA_WLAN_AC_VI] = edca->acvi;
session->gLimEdcaParams[QCA_WLAN_AC_VO] = edca->acvo; session->gLimEdcaParams[QCA_WLAN_AC_VO] = edca->acvo;
if (mac->mlme_cfg->edca_params.enable_edca_params) { if (mac->mlme_cfg->edca_params.enable_edca_params && !follow_ap_edca) {
session->gLimEdcaParams[QCA_WLAN_AC_VO].aci.aifsn = session->gLimEdcaParams[QCA_WLAN_AC_VO].aci.aifsn =
mac->mlme_cfg->edca_params.edca_ac_vo.vo_aifs; mac->mlme_cfg->edca_params.edca_ac_vo.vo_aifs;
session->gLimEdcaParams[QCA_WLAN_AC_VI].aci.aifsn = session->gLimEdcaParams[QCA_WLAN_AC_VI].aci.aifsn =

View File

@@ -15531,6 +15531,8 @@ QDF_STATUS csr_send_join_req_msg(struct mac_context *mac, uint32_t sessionId,
enum csr_akm_type akm; enum csr_akm_type akm;
bool force_max_nss; bool force_max_nss;
uint8_t ap_nss; uint8_t ap_nss;
struct wlan_objmgr_vdev *vdev;
bool follow_ap_edca;
if (!pSession) { if (!pSession) {
sme_err("session %d not found", sessionId); sme_err("session %d not found", sessionId);
@@ -15691,6 +15693,18 @@ QDF_STATUS csr_send_join_req_msg(struct mac_context *mac, uint32_t sessionId,
if (pSession->nss == 1) if (pSession->nss == 1)
pSession->supported_nss_1x1 = true; pSession->supported_nss_1x1 = true;
follow_ap_edca = ucfg_action_oui_search(mac->psoc,
&vendor_ap_search_attr,
ACTION_OUI_DISABLE_AGGRESSIVE_EDCA);
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac->psoc,
sessionId,
WLAN_LEGACY_MAC_ID);
if (vdev) {
mlme_set_follow_ap_edca_flag(vdev, follow_ap_edca);
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
}
is_vendor_ap_present = is_vendor_ap_present =
ucfg_action_oui_search(mac->psoc, ucfg_action_oui_search(mac->psoc,
&vendor_ap_search_attr, &vendor_ap_search_attr,