From 6bb2ad7c5b537de8c6b5d96ac0300756e14757d4 Mon Sep 17 00:00:00 2001 From: Bapiraju Alla Date: Thu, 27 Jan 2022 10:09:50 -0800 Subject: [PATCH] qcacmn: Get partner vdev using vdev ID instead of link ID While notifying the ML connection status to the supplicant, partner vdev information will be filled in the connect response. This partner vdev info is populated using partner link IDs. This may cause issues since it is not guaranteed that link id information in the partner vdev is valid while notifying the connection status to the supplicant. To address this, get partner vdev information using vdev ID instead of link ID. Change-Id: I5e45b038b1fe5b6ab9c6bbb514eefb0ad4c39e66 CRs-Fixed: 3117702 --- os_if/linux/mlme/src/osif_cm_connect_rsp.c | 27 ++++++++++++++--- .../mlo_mgr/inc/wlan_mlo_mgr_public_structs.h | 2 ++ umac/mlo_mgr/src/wlan_mlo_mgr_sta.c | 30 ++++++++++--------- 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/os_if/linux/mlme/src/osif_cm_connect_rsp.c b/os_if/linux/mlme/src/osif_cm_connect_rsp.c index f1f768f18c..6a6d3da17e 100644 --- a/os_if/linux/mlme/src/osif_cm_connect_rsp.c +++ b/os_if/linux/mlme/src/osif_cm_connect_rsp.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2012-2015, 2020-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -380,6 +380,24 @@ osif_populate_fils_params(struct cfg80211_connect_resp_params *rsp_params, #endif #if defined(CFG80211_IFTYPE_MLO_LINK_SUPPORT) && defined(WLAN_FEATURE_11BE_MLO) +#ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE +static struct wlan_objmgr_vdev *osif_get_partner_vdev( + struct wlan_objmgr_vdev *vdev, + struct mlo_link_info rsp_partner_info) +{ + return wlan_objmgr_get_vdev_by_id_from_pdev( + vdev->vdev_objmgr.wlan_pdev, + rsp_partner_info.vdev_id, + WLAN_MLO_MGR_ID); +} +#else +static struct wlan_objmgr_vdev *osif_get_partner_vdev( + struct wlan_objmgr_vdev *vdev, + struct mlo_link_info rsp_partner_info) +{ + return mlo_get_vdev_by_link_id(vdev, rsp_partner_info.link_id); +} +#endif static void osif_fill_connect_resp_mlo_params( struct wlan_objmgr_vdev *vdev, struct wlan_cm_connect_resp *rsp, @@ -431,15 +449,16 @@ static void osif_fill_connect_resp_mlo_params( if (i == rsp->ml_parnter_info.num_partner_links) break; - ml_vdev = mlo_get_vdev_by_link_id( - ml_vdev, rsp_partner_info[i].link_id); + ml_vdev = osif_get_partner_vdev(vdev, + rsp_partner_info[i]); if (ml_vdev) { osif_priv = wlan_vdev_get_ospriv(ml_vdev); wlan_objmgr_vdev_release_ref(ml_vdev, WLAN_MLO_MGR_ID); } else { - osif_err("Partner vdev not found"); + osif_err("Partner vdev not found with vdev_id:%d", + rsp_partner_info[i].vdev_id); goto end; } } diff --git a/umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h b/umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h index 9b0d9d0ac6..f7499a7ab9 100644 --- a/umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h +++ b/umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h @@ -421,6 +421,7 @@ struct wlan_mlo_peer_context { * @link_id: link index * @chan_freq: Operating channel frequency * @nawds_config: peer's NAWDS configurarion + * @vdev_id: VDEV ID */ struct mlo_link_info { struct qdf_mac_addr link_addr; @@ -429,6 +430,7 @@ struct mlo_link_info { #ifdef UMAC_SUPPORT_MLNAWDS struct mlnawds_config nawds_config; #endif + uint8_t vdev_id; }; /* diff --git a/umac/mlo_mgr/src/wlan_mlo_mgr_sta.c b/umac/mlo_mgr/src/wlan_mlo_mgr_sta.c index 6b014f4e24..4f290b03da 100644 --- a/umac/mlo_mgr/src/wlan_mlo_mgr_sta.c +++ b/umac/mlo_mgr/src/wlan_mlo_mgr_sta.c @@ -507,7 +507,7 @@ static void mlo_send_link_connect(struct wlan_objmgr_vdev *vdev, struct wlan_mlo_dev_context *mlo_dev_ctx, struct element_info *assoc_rsp, - struct mlo_partner_info ml_parnter_info) + struct mlo_partner_info *ml_parnter_info) { /* Create the secondary interface, Send keys if the last link */ uint8_t i, partner_idx = 0; @@ -518,7 +518,7 @@ mlo_send_link_connect(struct wlan_objmgr_vdev *vdev, vdev, ssid.ssid, &ssid.length); - if (!ml_parnter_info.num_partner_links) { + if (!ml_parnter_info->num_partner_links) { mlo_err("No patner info in connect resp"); return; } @@ -535,12 +535,14 @@ mlo_send_link_connect(struct wlan_objmgr_vdev *vdev, wlan_vdev_mlme_feat_ext2_cap_set(mlo_dev_ctx->wlan_vdev_list[i], WLAN_VDEV_FEXT2_MLO_STA_LINK); wlan_vdev_set_link_id( - mlo_dev_ctx->wlan_vdev_list[i], - ml_parnter_info.partner_link_info[partner_idx].link_id); + mlo_dev_ctx->wlan_vdev_list[i], + ml_parnter_info->partner_link_info[partner_idx].link_id); + ml_parnter_info->partner_link_info[partner_idx].vdev_id = + wlan_vdev_get_id(mlo_dev_ctx->wlan_vdev_list[i]); mlo_prepare_and_send_connect( mlo_dev_ctx->wlan_vdev_list[i], - ml_parnter_info, - ml_parnter_info.partner_link_info[partner_idx], + *ml_parnter_info, + ml_parnter_info->partner_link_info[partner_idx], ssid); partner_idx++; } @@ -550,13 +552,13 @@ static void mlo_send_link_connect(struct wlan_objmgr_vdev *vdev, struct wlan_mlo_dev_context *mlo_dev_ctx, struct element_info *assoc_rsp, - struct mlo_partner_info ml_parnter_info) + struct mlo_partner_info *ml_parnter_info) { struct wlan_ssid ssid = {0}; uint8_t i = 0; uint8_t j = 0; - if (!ml_parnter_info.num_partner_links) { + if (!ml_parnter_info->num_partner_links) { mlo_err("No patner info in connect resp"); return; } @@ -573,19 +575,19 @@ mlo_send_link_connect(struct wlan_objmgr_vdev *vdev, if (qdf_test_bit(i, mlo_dev_ctx->sta_ctx->wlan_connected_links)) { if (wlan_cm_is_vdev_disconnected( mlo_dev_ctx->wlan_vdev_list[i])) { - for (j = 0; j < ml_parnter_info.num_partner_links; j++) { + for (j = 0; j < ml_parnter_info->num_partner_links; j++) { if (mlo_dev_ctx->wlan_vdev_list[i]->vdev_mlme.mlo_link_id == - ml_parnter_info.partner_link_info[j].link_id) + ml_parnter_info->partner_link_info[j].link_id) break; } - if (j < ml_parnter_info.num_partner_links) { + if (j < ml_parnter_info->num_partner_links) { wlan_vdev_mlme_get_ssid( vdev, ssid.ssid, &ssid.length); mlo_prepare_and_send_connect( mlo_dev_ctx->wlan_vdev_list[i], - ml_parnter_info, - ml_parnter_info.partner_link_info[j], + *ml_parnter_info, + ml_parnter_info->partner_link_info[j], ssid); } mlo_dev_lock_release(mlo_dev_ctx); @@ -773,7 +775,7 @@ void mlo_sta_link_connect_notify(struct wlan_objmgr_vdev *vdev, } mlo_send_link_connect(vdev, mlo_dev_ctx, &rsp->connect_ies.assoc_rsp, - rsp->ml_parnter_info); + &rsp->ml_parnter_info); } }