qcacld-3.0: Fix wrong bssid and freq after mlo roaming

For mlo AP, bssid in wmi_roam_synch_event_fixed_param of
WMI_ROAM_SYNCH_EVENT is AP MLD addr, when use it as link addr,
failed to register peer and set peer as connected, so all Tx
are not allowed including EAPOL.
Fix it by getting AP link addr and frequency of each link from
setup_links_param array of WMI_ROAM_SYNCH_EVENT.

Copy link info from roam sync event to connect response before notify
os_if roam complete, os_if will send link info from connect response
to wpa_supplicant, supplicant will use it to add MLO Link KDE(s) into
EAPOL-Key 2/4.

Change-Id: I87833784a4e0b9240725223069c55fb0db3bc88f
CRs-Fixed: 3277878
This commit is contained in:
Jianmin Zhu
2022-08-26 17:51:46 +08:00
committed by Madan Koyyalamudi
parent 183254d030
commit 2a7d4c1cee
2 changed files with 55 additions and 3 deletions

View File

@@ -411,6 +411,42 @@ cm_fils_update_erp_seq_num(struct wlan_objmgr_vdev *vdev,
{}
#endif
#ifdef WLAN_FEATURE_11BE_MLO
static QDF_STATUS
cm_fill_bssid_freq_info(uint8_t vdev_id,
struct roam_offload_synch_ind *roam_synch_data,
struct cm_vdev_join_rsp *rsp)
{
uint8_t i;
struct ml_setup_link_param *ml_link;
for (i = 0; i < roam_synch_data->num_setup_links; i++) {
ml_link = &roam_synch_data->ml_link[i];
if (vdev_id == ml_link->vdev_id) {
qdf_copy_macaddr(&rsp->connect_rsp.bssid,
&ml_link->link_addr);
rsp->connect_rsp.freq = ml_link->channel.mhz;
return QDF_STATUS_SUCCESS;
}
}
mlme_err("Failed to get vdev %u mlo link info");
return QDF_STATUS_E_FAILURE;
}
#else
static QDF_STATUS
cm_fill_bssid_freq_info(uint8_t vdev_id,
struct roam_offload_synch_ind *roam_synch_data,
struct cm_vdev_join_rsp *rsp)
{
qdf_copy_macaddr(&rsp->connect_rsp.bssid, &roam_synch_data->bssid);
rsp->connect_rsp.freq = roam_synch_data->chan_freq;
return QDF_STATUS_SUCCESS;
}
#endif
static QDF_STATUS
cm_fill_roam_info(struct wlan_objmgr_vdev *vdev,
struct roam_offload_synch_ind *roam_synch_data,
@@ -423,7 +459,13 @@ cm_fill_roam_info(struct wlan_objmgr_vdev *vdev,
if (!rsp->connect_rsp.roaming_info)
return QDF_STATUS_E_NOMEM;
rsp->connect_rsp.vdev_id = wlan_vdev_get_id(vdev);
qdf_copy_macaddr(&rsp->connect_rsp.bssid, &roam_synch_data->bssid);
status = cm_fill_bssid_freq_info(wlan_vdev_get_id(vdev),
roam_synch_data, rsp);
if (QDF_IS_STATUS_ERROR(status)) {
mlme_err(CM_PREFIX_FMT "Failed to get bssid and freq",
CM_PREFIX_REF(rsp->connect_rsp.vdev_id, cm_id));
return QDF_STATUS_E_FAILURE;
}
if (!util_scan_is_null_ssid(&roam_synch_data->ssid))
wlan_vdev_mlme_set_ssid(vdev,
@@ -442,7 +484,6 @@ cm_fill_roam_info(struct wlan_objmgr_vdev *vdev,
rsp->connect_rsp.is_reassoc = true;
rsp->connect_rsp.connect_status = QDF_STATUS_SUCCESS;
rsp->connect_rsp.cm_id = cm_id;
rsp->connect_rsp.freq = roam_synch_data->chan_freq;
rsp->nss = roam_synch_data->nss;
if (roam_synch_data->ric_data_len) {
@@ -843,6 +884,7 @@ cm_fw_roam_sync_propagation(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
if (wlan_vdev_mlme_is_mlo_vdev(vdev))
policy_mgr_move_vdev_from_disabled_to_connection_tbl(psoc,
vdev_id);
mlo_roam_copy_partner_info(connect_rsp, roam_synch_data);
mlme_cm_osif_connect_complete(vdev, connect_rsp);
/**
@@ -867,7 +909,6 @@ cm_fw_roam_sync_propagation(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
}
wlan_cm_tgt_send_roam_sync_complete_cmd(psoc, vdev_id);
mlo_roam_copy_partner_info(connect_rsp, roam_synch_data);
mlo_roam_update_connected_links(vdev, connect_rsp);
mlo_set_single_link_ml_roaming(psoc, vdev_id,
roam_synch_data, false);

View File

@@ -416,11 +416,22 @@ mlo_roam_copy_partner_info(struct wlan_cm_connect_resp *connect_rsp,
for (i = 0; i < sync_ind->num_setup_links; i++) {
partner_info->partner_link_info[i].link_id =
sync_ind->ml_link[i].link_id;
partner_info->partner_link_info[i].vdev_id =
sync_ind->ml_link[i].vdev_id;
qdf_copy_macaddr(
&partner_info->partner_link_info[i].link_addr,
&sync_ind->ml_link[i].link_addr);
partner_info->partner_link_info[i].chan_freq =
sync_ind->ml_link[i].channel.mhz;
mlo_debug("vdev_id %d link_id %d freq %d bssid" QDF_MAC_ADDR_FMT,
sync_ind->ml_link[i].vdev_id,
sync_ind->ml_link[i].link_id,
sync_ind->ml_link[i].channel.mhz,
QDF_MAC_ADDR_REF(sync_ind->ml_link[i].link_addr.bytes));
}
partner_info->num_partner_links = sync_ind->num_setup_links;
mlo_debug("num_setup_links %d", sync_ind->num_setup_links);
}
void