qcacld-3.0: Reject partner link based on security check

For multi link connection there might be the case where
rsnxe of the AP is not present on the link vdev.
This causes the link vdev alone to downgrade to 11ax
mode and assoc vdev is in 11be dot11 mode.
So for vdev with ML peer, the dot11mode is 11ax,
which causes abnormal firmware behavior.

Reject the partner link that doesn’t pass the security
check and validate the next available partner link.
if none of the partner link passes the security check,
proceed connection with single link.

Change-Id: I07239f06e2fa166cb472e1f24d66b44929d58cbf
CRs-Fixed: 3583522
This commit is contained in:
Aravind Kishore Sukla
2023-08-10 22:49:36 +05:30
committed by Rahul Choudhary
parent d2793a1459
commit 30cac76709
4 changed files with 47 additions and 36 deletions

View File

@@ -756,13 +756,15 @@ cm_send_rso_stop(struct wlan_objmgr_vdev *vdev)
#ifdef WLAN_FEATURE_11BE_MLO #ifdef WLAN_FEATURE_11BE_MLO
/** /**
* cm_get_ml_partner_info() - Fill ML partner info from scan entry * cm_get_ml_partner_info() - Fill ML partner info from scan entry
* @pdev: PDEV object
* @scan_entry: Scan entry * @scan_entry: Scan entry
* @partner_info: Partner info to be filled * @partner_info: Partner info to be filled
* *
* Return: QDF_STATUS * Return: QDF_STATUS
*/ */
QDF_STATUS QDF_STATUS
cm_get_ml_partner_info(struct scan_cache_entry *scan_entry, cm_get_ml_partner_info(struct wlan_objmgr_pdev *pdev,
struct scan_cache_entry *scan_entry,
struct mlo_partner_info *partner_info); struct mlo_partner_info *partner_info);
#endif #endif
#endif /* __WLAN_CM_VDEV_API_H__ */ #endif /* __WLAN_CM_VDEV_API_H__ */

View File

@@ -1125,12 +1125,16 @@ QDF_STATUS cm_flush_join_req(struct scheduler_msg *msg)
#ifdef WLAN_FEATURE_11BE_MLO #ifdef WLAN_FEATURE_11BE_MLO
QDF_STATUS QDF_STATUS
cm_get_ml_partner_info(struct scan_cache_entry *scan_entry, cm_get_ml_partner_info(struct wlan_objmgr_pdev *pdev,
struct scan_cache_entry *scan_entry,
struct mlo_partner_info *partner_info) struct mlo_partner_info *partner_info)
{ {
uint8_t i, j = 0; uint8_t i, j = 0;
uint8_t mlo_support_link_num; uint8_t mlo_support_link_num;
struct wlan_objmgr_psoc *psoc; struct wlan_objmgr_psoc *psoc;
struct scan_cache_entry *part_scan_entry = NULL;
bool is_security_allowed;
struct qdf_mac_addr *link_mac;
/* If ML IE is not present then return failure*/ /* If ML IE is not present then return failure*/
if (!scan_entry->ie_list.multi_link_bv) if (!scan_entry->ie_list.multi_link_bv)
@@ -1140,9 +1144,9 @@ cm_get_ml_partner_info(struct scan_cache_entry *scan_entry,
if (!scan_entry->ml_info.num_links) if (!scan_entry->ml_info.num_links)
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
psoc = wlan_objmgr_get_psoc_by_id(0, WLAN_MLME_CM_ID); psoc = wlan_pdev_get_psoc(pdev);
if (!psoc) { if (!psoc) {
mlme_debug("psoc is NULL"); mlme_err("psoc is NULL");
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
@@ -1167,6 +1171,27 @@ cm_get_ml_partner_info(struct scan_cache_entry *scan_entry,
break; break;
if (scan_entry->ml_info.link_info[i].is_valid_link) { if (scan_entry->ml_info.link_info[i].is_valid_link) {
link_mac = &scan_entry->ml_info.link_info[i].link_addr;
part_scan_entry = wlan_scan_get_scan_entry_by_mac_freq(
pdev,
link_mac,
scan_entry->ml_info.link_info[i].freq);
if (!part_scan_entry) {
scm_debug("scan entry not found for link addr: "
QDF_MAC_ADDR_FMT,
QDF_MAC_ADDR_REF(link_mac->bytes));
continue;
}
is_security_allowed =
wlan_cm_is_eht_allowed_for_current_security(
part_scan_entry);
util_scan_free_cache_entry(part_scan_entry);
if (!is_security_allowed) {
mlme_debug("current security is not valid for partner link");
continue;
}
partner_info->partner_link_info[j].link_addr = partner_info->partner_link_info[j].link_addr =
scan_entry->ml_info.link_info[i].link_addr; scan_entry->ml_info.link_info[i].link_addr;
partner_info->partner_link_info[j].link_id = partner_info->partner_link_info[j].link_id =
@@ -1182,7 +1207,6 @@ cm_get_ml_partner_info(struct scan_cache_entry *scan_entry,
partner_info->num_partner_links = j; partner_info->num_partner_links = j;
mlme_debug("sta and ap integrate link num: %d", j); mlme_debug("sta and ap integrate link num: %d", j);
wlan_objmgr_psoc_release_ref(psoc, WLAN_MLME_CM_ID);
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }

View File

@@ -3963,18 +3963,11 @@ lim_check_scan_db_for_join_req_partner_info(struct pe_session *session_entry,
return QDF_STATUS_E_NULL_VALUE; return QDF_STATUS_E_NULL_VALUE;
} }
cache_entry = qdf_mem_malloc(sizeof(struct scan_cache_entry));
if (!cache_entry)
return QDF_STATUS_E_FAILURE;
partner_link = qdf_mem_malloc(sizeof(struct partner_link_info) * partner_link = qdf_mem_malloc(sizeof(struct partner_link_info) *
(MLD_MAX_LINKS - 1)); (MLD_MAX_LINKS - 1));
if (!partner_link) { if (!partner_link)
status = QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
goto free_cache_entry;
}
qdf_mem_copy(&qdf_bssid, qdf_mem_copy(&qdf_bssid,
&(lim_join_req->bssDescription.bssId), &(lim_join_req->bssDescription.bssId),
@@ -3982,12 +3975,11 @@ lim_check_scan_db_for_join_req_partner_info(struct pe_session *session_entry,
join_req_freq = lim_join_req->bssDescription.chan_freq; join_req_freq = lim_join_req->bssDescription.chan_freq;
status = wlan_scan_get_scan_entry_by_mac_freq(pdev, cache_entry = wlan_scan_get_scan_entry_by_mac_freq(pdev,
&qdf_bssid, &qdf_bssid,
join_req_freq, join_req_freq);
cache_entry);
if (!QDF_IS_STATUS_SUCCESS(status)) { if (!cache_entry) {
pe_err("failed to get partner link info by mac addr"); pe_err("failed to get partner link info by mac addr");
status = QDF_STATUS_E_FAILURE; status = QDF_STATUS_E_FAILURE;
goto free_mem; goto free_mem;
@@ -3996,6 +3988,8 @@ lim_check_scan_db_for_join_req_partner_info(struct pe_session *session_entry,
qdf_mem_copy(partner_link, cache_entry->ml_info.link_info, qdf_mem_copy(partner_link, cache_entry->ml_info.link_info,
sizeof(struct partner_link_info) * (MLD_MAX_LINKS - 1)); sizeof(struct partner_link_info) * (MLD_MAX_LINKS - 1));
util_scan_free_cache_entry(cache_entry);
partner_info = &lim_join_req->partner_info; partner_info = &lim_join_req->partner_info;
status = lim_compare_scan_entry_partner_info_with_join_req( status = lim_compare_scan_entry_partner_info_with_join_req(
@@ -4009,8 +4003,6 @@ lim_check_scan_db_for_join_req_partner_info(struct pe_session *session_entry,
free_mem: free_mem:
qdf_mem_free(partner_link); qdf_mem_free(partner_link);
free_cache_entry:
qdf_mem_free(cache_entry);
return status; return status;
} }
@@ -4030,29 +4022,22 @@ QDF_STATUS lim_update_mlo_mgr_info(struct mac_context *mac_ctx,
return QDF_STATUS_E_NULL_VALUE; return QDF_STATUS_E_NULL_VALUE;
} }
cache_entry = qdf_mem_malloc(sizeof(struct scan_cache_entry)); cache_entry = wlan_scan_get_scan_entry_by_mac_freq(pdev, link_addr,
freq);
if (!cache_entry) if (!cache_entry)
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
status = wlan_scan_get_scan_entry_by_mac_freq(pdev, link_addr, freq,
cache_entry);
if (!QDF_IS_STATUS_SUCCESS(status)) {
status = QDF_STATUS_E_FAILURE;
goto free_cache_entry;
}
channel.ch_freq = cache_entry->channel.chan_freq; channel.ch_freq = cache_entry->channel.chan_freq;
channel.ch_ieee = wlan_reg_freq_to_chan(pdev, channel.ch_freq); channel.ch_ieee = wlan_reg_freq_to_chan(pdev, channel.ch_freq);
channel.ch_phymode = cache_entry->phy_mode; channel.ch_phymode = cache_entry->phy_mode;
channel.ch_cfreq1 = cache_entry->channel.cfreq0; channel.ch_cfreq1 = cache_entry->channel.cfreq0;
channel.ch_cfreq2 = cache_entry->channel.cfreq1; channel.ch_cfreq2 = cache_entry->channel.cfreq1;
util_scan_free_cache_entry(cache_entry);
mlo_mgr_update_ap_channel_info(vdev, link_id, (uint8_t *)link_addr, mlo_mgr_update_ap_channel_info(vdev, link_id, (uint8_t *)link_addr,
channel); channel);
free_cache_entry:
qdf_mem_free(cache_entry);
return status; return status;
} }
#else #else

View File

@@ -2107,13 +2107,13 @@ lim_get_bss_11be_mode_allowed(struct mac_context *mac_ctx,
if (!ie_struct->eht_cap.present) if (!ie_struct->eht_cap.present)
return false; return false;
scan_entry = scm_scan_get_entry_by_bssid(mac_ctx->pdev, scan_entry = wlan_scan_get_entry_by_bssid(mac_ctx->pdev,
(struct qdf_mac_addr *) (struct qdf_mac_addr *)
bss_desc->bssId); bss_desc->bssId);
if (scan_entry) { if (scan_entry) {
is_eht_allowed = is_eht_allowed =
cm_is_eht_allowed_for_current_security(scan_entry); wlan_cm_is_eht_allowed_for_current_security(scan_entry);
util_scan_free_cache_entry(scan_entry); util_scan_free_cache_entry(scan_entry);
if (!is_eht_allowed) if (!is_eht_allowed)
return false; return false;