|
@@ -212,6 +212,7 @@ mlo_roam_abort_req(struct wlan_objmgr_psoc *psoc,
|
|
|
#endif
|
|
|
|
|
|
static void mlo_roam_update_vdev_macaddr(struct wlan_objmgr_psoc *psoc,
|
|
|
+ struct roam_offload_synch_ind *sync_ind,
|
|
|
uint8_t vdev_id,
|
|
|
bool is_non_ml_connection)
|
|
|
{
|
|
@@ -231,8 +232,25 @@ static void mlo_roam_update_vdev_macaddr(struct wlan_objmgr_psoc *psoc,
|
|
|
if (!qdf_is_macaddr_zero(mld_mac))
|
|
|
wlan_vdev_mlme_set_macaddr(vdev, mld_mac->bytes);
|
|
|
} else {
|
|
|
+ struct qdf_mac_addr *vdev_link_addr;
|
|
|
+ uint8_t i;
|
|
|
+
|
|
|
wlan_vdev_mlme_set_macaddr(vdev,
|
|
|
wlan_vdev_mlme_get_linkaddr(vdev));
|
|
|
+ /* Update the link address received from fw to assoc vdev */
|
|
|
+ for (i = 0; i < sync_ind->num_setup_links; i++) {
|
|
|
+ if (vdev_id != sync_ind->ml_link[i].vdev_id)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ vdev_link_addr = &sync_ind->ml_link[i].self_link_addr;
|
|
|
+ if (qdf_is_macaddr_zero(vdev_link_addr) ||
|
|
|
+ qdf_is_macaddr_broadcast(vdev_link_addr))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ wlan_vdev_mlme_set_macaddr(vdev, vdev_link_addr->bytes);
|
|
|
+ wlan_vdev_mlme_set_linkaddr(vdev,
|
|
|
+ vdev_link_addr->bytes);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
mlme_debug("vdev_id %d self mac " QDF_MAC_ADDR_FMT,
|
|
@@ -271,7 +289,7 @@ QDF_STATUS mlo_fw_roam_sync_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
|
|
|
mlo_set_single_link_ml_roaming(psoc, vdev_id, false);
|
|
|
}
|
|
|
|
|
|
- mlo_roam_update_vdev_macaddr(psoc, vdev_id, is_non_mlo_ap);
|
|
|
+ mlo_roam_update_vdev_macaddr(psoc, sync_ind, vdev_id, is_non_mlo_ap);
|
|
|
ml_nlink_conn_change_notify(
|
|
|
psoc, vdev_id, ml_nlink_roam_sync_start_evt, NULL);
|
|
|
|
|
@@ -284,6 +302,41 @@ QDF_STATUS mlo_fw_roam_sync_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
|
|
|
}
|
|
|
|
|
|
#ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
|
|
|
+void mlo_mgr_roam_update_ap_link_info(struct wlan_objmgr_vdev *vdev,
|
|
|
+ struct ml_setup_link_param *src_link_info,
|
|
|
+ struct wlan_channel *channel)
|
|
|
+{
|
|
|
+ struct mlo_link_info *link_info;
|
|
|
+ uint8_t iter, link_id;
|
|
|
+
|
|
|
+ if (!vdev || !vdev->mlo_dev_ctx || !vdev->mlo_dev_ctx->link_ctx ||
|
|
|
+ !src_link_info)
|
|
|
+ return;
|
|
|
+
|
|
|
+ link_id = src_link_info->link_id;
|
|
|
+ for (iter = 0; iter < WLAN_MAX_ML_BSS_LINKS; iter++) {
|
|
|
+ link_info = &vdev->mlo_dev_ctx->link_ctx->links_info[iter];
|
|
|
+ if (link_id == link_info->link_id)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (iter == WLAN_MAX_ML_BSS_LINKS)
|
|
|
+ return;
|
|
|
+
|
|
|
+ qdf_mem_copy(&link_info->ap_link_addr,
|
|
|
+ src_link_info->link_addr.bytes,
|
|
|
+ QDF_MAC_ADDR_SIZE);
|
|
|
+ qdf_mem_copy(&link_info->link_addr, src_link_info->self_link_addr.bytes,
|
|
|
+ QDF_MAC_ADDR_SIZE);
|
|
|
+ qdf_mem_copy(link_info->link_chan_info, channel, sizeof(*channel));
|
|
|
+
|
|
|
+ mlo_debug("link_id: %d, vdev_id:%d freq:%d ap_link_addr:" QDF_MAC_ADDR_FMT " self_link_addr:" QDF_MAC_ADDR_FMT,
|
|
|
+ link_info->link_id, link_info->vdev_id,
|
|
|
+ link_info->link_chan_info->ch_freq,
|
|
|
+ QDF_MAC_ADDR_REF(link_info->ap_link_addr.bytes),
|
|
|
+ QDF_MAC_ADDR_REF(link_info->link_addr.bytes));
|
|
|
+}
|
|
|
+
|
|
|
QDF_STATUS mlo_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev,
|
|
|
void *event, uint32_t event_data_len)
|
|
|
{
|
|
@@ -335,8 +388,19 @@ QDF_STATUS mlo_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev,
|
|
|
}
|
|
|
|
|
|
if (mlo_check_connect_req_bmap(link_vdev)) {
|
|
|
+ struct qdf_mac_addr *vdev_link_addr;
|
|
|
+
|
|
|
mlo_update_connect_req_links(link_vdev, false);
|
|
|
|
|
|
+ vdev_link_addr = &sync_ind->ml_link[i].self_link_addr;
|
|
|
+ if (!qdf_is_macaddr_zero(vdev_link_addr) &&
|
|
|
+ !qdf_is_macaddr_broadcast(vdev_link_addr)) {
|
|
|
+ wlan_vdev_mlme_set_macaddr(link_vdev,
|
|
|
+ vdev_link_addr->bytes);
|
|
|
+ wlan_vdev_mlme_set_linkaddr(link_vdev,
|
|
|
+ vdev_link_addr->bytes);
|
|
|
+ }
|
|
|
+
|
|
|
status = cm_fw_roam_sync_req(psoc,
|
|
|
sync_ind->ml_link[i].vdev_id,
|
|
|
event, event_data_len);
|