qcacld-3.0: Restrict three link connection on certain vendor APs

Identify APs which don't support three links and downgrade the
max connection links to two so that connecting to such APs will
not lead to unexpected behavior.

Change-Id: I25d2c0fd09e29b6f0cc2d228e52733bcbceb39fd
CRs-Fixed: 3636112
This commit is contained in:
Vinod Kumar Pirla
2023-10-13 03:47:06 -07:00
کامیت شده توسط Ravindra Konda
والد 2e6d28ea61
کامیت 0b6df7dbe9
5فایلهای تغییر یافته به همراه80 افزوده شده و 11 حذف شده

مشاهده پرونده

@@ -198,6 +198,10 @@ static void action_oui_load_config(struct action_oui_psoc_priv *psoc_priv)
cfg_get(psoc, cfg_get(psoc,
CFG_ACTION_OUI_SEND_SMPS_FRAME_WITH_OMN), CFG_ACTION_OUI_SEND_SMPS_FRAME_WITH_OMN),
ACTION_OUI_MAX_STR_LEN); ACTION_OUI_MAX_STR_LEN);
qdf_str_lcopy(psoc_priv->action_oui_str
[ACTION_OUI_RESTRICT_MAX_MLO_LINKS],
cfg_get(psoc, CFG_ACTION_OUI_RESTRICT_MAX_MLO_LINKS),
ACTION_OUI_MAX_STR_LEN);
qdf_str_lcopy(psoc_priv->action_oui_str qdf_str_lcopy(psoc_priv->action_oui_str
[ACTION_OUI_AUTH_ASSOC_6MBPS_2GHZ], [ACTION_OUI_AUTH_ASSOC_6MBPS_2GHZ],
cfg_get(psoc, CFG_ACTION_OUI_AUTH_ASSOC_6MBPS_2GHZ), cfg_get(psoc, CFG_ACTION_OUI_AUTH_ASSOC_6MBPS_2GHZ),

مشاهده پرونده

@@ -172,8 +172,8 @@ validate_and_convert_data_length(uint8_t *token,
} }
if ((uint32_t)len > ACTION_OUI_MAX_DATA_LENGTH) { if ((uint32_t)len > ACTION_OUI_MAX_DATA_LENGTH) {
action_oui_err("action OUI data len is more than %u", action_oui_err("action OUI data len %d is more than %u",
ACTION_OUI_MAX_DATA_LENGTH); len, ACTION_OUI_MAX_DATA_LENGTH);
return false; return false;
} }

مشاهده پرونده

@@ -844,6 +844,36 @@
"", \ "", \
"Used to send SMPS frame along with OMN for specified APs") "Used to send SMPS frame along with OMN for specified APs")
/*
* <ini>
* gActionOUIRestrictMaxMLOLinks - Used to downgrade 3 link to 2 link ML
* connection for specific AP build version.
*
* Sample OUIs: (All values in Hex)
* OUI 3 : 8CFDF0
* OUI data Len : 13
* OUI Data : 040000494c510302097201cb17000009110000
* OUI data Mask: FFFFE0 - 1111 1111 1111 1111 1110 0000
* Info Mask : 01 - only OUI present in Info mask
*
* gActionOUIRestrictMaxMLOLinks=8CFDF0 13 040000494c510c00203000cb17000009110000 FFFFE0 01
* Refer to gEnableActionOUI for more detail about the format.
*
* Related: gEnableActionOUI
*
* Supported Feature: Action OUIs
*
* Usage: External
*
* </ini>
*/
#define CFG_ACTION_OUI_RESTRICT_MAX_MLO_LINKS CFG_INI_STRING( \
"gActionOUIRestrictMaxMLOLinks", \
0, \
ACTION_OUI_MAX_STR_LEN, \
"8CFDF0 13 040000494c510302097201cb17000009110000 FFFFE0 01", \
"To restrict matching OUI APs to two link connection at max")
#define CFG_ACTION_OUI \ #define CFG_ACTION_OUI \
CFG(CFG_ACTION_OUI_CCKM_1X1) \ CFG(CFG_ACTION_OUI_CCKM_1X1) \
CFG(CFG_ACTION_OUI_CONNECT_1X1) \ CFG(CFG_ACTION_OUI_CONNECT_1X1) \
@@ -861,6 +891,7 @@
CFG(CFG_ACTION_OUI_DISABLE_DYNAMIC_QOS_NULL_TX_RATE) \ CFG(CFG_ACTION_OUI_DISABLE_DYNAMIC_QOS_NULL_TX_RATE) \
CFG(CFG_ACTION_OUI_ENABLE_CTS2SELF) \ CFG(CFG_ACTION_OUI_ENABLE_CTS2SELF) \
CFG(CFG_ACTION_OUI_ENABLE_CTS2SELF_WITH_QOS_NULL) \ CFG(CFG_ACTION_OUI_ENABLE_CTS2SELF_WITH_QOS_NULL) \
CFG(CFG_ACTION_OUI_RESTRICT_MAX_MLO_LINKS) \
CFG(CFG_ACTION_OUI_SEND_SMPS_FRAME_WITH_OMN) \ CFG(CFG_ACTION_OUI_SEND_SMPS_FRAME_WITH_OMN) \
CFG(CFG_ACTION_OUI_AUTH_ASSOC_6MBPS_2GHZ) \ CFG(CFG_ACTION_OUI_AUTH_ASSOC_6MBPS_2GHZ) \
CFG(CFG_ACTION_OUI_DISABLE_BFORMEE) \ CFG(CFG_ACTION_OUI_DISABLE_BFORMEE) \

مشاهده پرونده

@@ -125,6 +125,8 @@
* @ACTION_OUI_DISABLE_BFORMEE: disable SU/MU beam formee capability for * @ACTION_OUI_DISABLE_BFORMEE: disable SU/MU beam formee capability for
* specified AP * specified AP
* @ACTION_OUI_ENABLE_CTS2SELF: enable cts to self for specified AP's * @ACTION_OUI_ENABLE_CTS2SELF: enable cts to self for specified AP's
* @ACTION_OUI_RESTRICT_MAX_MLO_LINKS: Downgrade MLO if particular AP
* build present.
* @ACTION_OUI_MAXIMUM_ID: maximum number of action oui types * @ACTION_OUI_MAXIMUM_ID: maximum number of action oui types
*/ */
enum action_oui_id { enum action_oui_id {
@@ -150,6 +152,7 @@ enum action_oui_id {
ACTION_OUI_DISABLE_BFORMEE, ACTION_OUI_DISABLE_BFORMEE,
ACTION_OUI_DISABLE_AGGRESSIVE_EDCA, ACTION_OUI_DISABLE_AGGRESSIVE_EDCA,
ACTION_OUI_ENABLE_CTS2SELF, ACTION_OUI_ENABLE_CTS2SELF,
ACTION_OUI_RESTRICT_MAX_MLO_LINKS,
ACTION_OUI_MAXIMUM_ID ACTION_OUI_MAXIMUM_ID
}; };

مشاهده پرونده

@@ -38,6 +38,8 @@
#include "wlan_mlo_mgr_roam.h" #include "wlan_mlo_mgr_roam.h"
#include "wlan_mlo_mgr_sta.h" #include "wlan_mlo_mgr_sta.h"
#include "wlan_mlo_mgr_link_switch.h" #include "wlan_mlo_mgr_link_switch.h"
#include <wlan_action_oui_main.h>
#ifdef WLAN_FEATURE_11BE_MLO #ifdef WLAN_FEATURE_11BE_MLO
static inline bool static inline bool
@@ -799,22 +801,51 @@ static void if_mgr_update_candidate(struct wlan_objmgr_psoc *psoc,
struct validate_bss_data *candidate_info) struct validate_bss_data *candidate_info)
{ {
struct scan_cache_entry *scan_entry = candidate_info->scan_entry; struct scan_cache_entry *scan_entry = candidate_info->scan_entry;
struct action_oui_search_attr attr;
int8_t i, allowed_partner_links = 0;
uint8_t mlo_support_link_num;
if (!(scan_entry->ie_list.multi_link_bv || scan_entry->ie_list.ehtcap || if (!(scan_entry->ie_list.multi_link_bv || scan_entry->ie_list.ehtcap ||
scan_entry->ie_list.ehtop)) scan_entry->ie_list.ehtop))
return; return;
if (mlme_get_bss_11be_allowed(psoc, &candidate_info->peer_addr, attr.ie_data = util_scan_entry_ie_data(scan_entry);
util_scan_entry_ie_data(scan_entry), attr.ie_length = util_scan_entry_ie_len(scan_entry);
util_scan_entry_ie_len(scan_entry)) &&
(!wlan_vdev_mlme_get_user_dis_eht_flag(vdev))) if (!mlme_get_bss_11be_allowed(psoc, &candidate_info->peer_addr,
attr.ie_data, attr.ie_length) ||
wlan_vdev_mlme_get_user_dis_eht_flag(vdev)) {
scan_entry->ie_list.multi_link_bv = NULL;
scan_entry->ie_list.ehtcap = NULL;
scan_entry->ie_list.ehtop = NULL;
qdf_mem_zero(&scan_entry->ml_info, sizeof(scan_entry->ml_info));
candidate_info->is_mlo = false;
return;
}
mlo_support_link_num = wlan_mlme_get_sta_mlo_conn_max_num(psoc);
if (mlo_support_link_num <= WLAN_MAX_ML_DEFAULT_LINK)
return; return;
scan_entry->ie_list.multi_link_bv = NULL; if (!wlan_action_oui_search(psoc, &attr,
scan_entry->ie_list.ehtcap = NULL; ACTION_OUI_RESTRICT_MAX_MLO_LINKS))
scan_entry->ie_list.ehtop = NULL; return;
qdf_mem_zero(&scan_entry->ml_info, sizeof(scan_entry->ml_info));
candidate_info->is_mlo = false; for (i = 0; i < scan_entry->ml_info.num_links; i++) {
if (i < WLAN_MAX_ML_DEFAULT_LINK - 1) {
allowed_partner_links++;
continue;
}
scan_entry->ml_info.link_info[i].is_valid_link = false;
}
if (allowed_partner_links != scan_entry->ml_info.num_links)
ifmgr_nofl_debug("Downgrade " QDF_MAC_ADDR_FMT " partner links from %d to %d",
QDF_MAC_ADDR_REF(scan_entry->ml_info.mld_mac_addr.bytes),
scan_entry->ml_info.num_links,
allowed_partner_links);
} }
#else #else
static inline uint32_t static inline uint32_t