|
@@ -90,6 +90,7 @@
|
|
|
#include <../../core/src/wlan_cm_roam_i.h>
|
|
|
#include "wlan_cm_roam_api.h"
|
|
|
#include "wlan_mlo_mgr_roam.h"
|
|
|
+#include "lim_mlo.h"
|
|
|
#ifdef FEATURE_WLAN_EXTSCAN
|
|
|
#define WMA_EXTSCAN_CYCLE_WAKE_LOCK_DURATION WAKELOCK_DURATION_RECOMMENDED
|
|
|
|
|
@@ -547,6 +548,77 @@ wma_send_roam_preauth_status(tp_wma_handle wma_handle,
|
|
|
#endif
|
|
|
|
|
|
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
|
|
+#ifdef WLAN_FEATURE_11BE_MLO
|
|
|
+/**
|
|
|
+ * wma_delete_all_peers() - Delete all bss peer/s
|
|
|
+ * @wma: Global WMA Handle
|
|
|
+ * @vdev_id: vdev id
|
|
|
+ * @del_sta_params: parameters required for del sta request
|
|
|
+ *
|
|
|
+ * This function will perform deleting of all the link peers
|
|
|
+ * after self roaming.
|
|
|
+ *
|
|
|
+ * Return: None
|
|
|
+ */
|
|
|
+static QDF_STATUS
|
|
|
+wma_delete_all_peers(tp_wma_handle wma,
|
|
|
+ uint8_t vdev_id)
|
|
|
+{
|
|
|
+ struct wlan_objmgr_vdev *vdev;
|
|
|
+ struct wlan_mlo_dev_context *mlo_dev_ctx;
|
|
|
+ uint8_t i;
|
|
|
+ uint8_t link_vdev_id;
|
|
|
+ tDeleteStaParams *del_sta_params;
|
|
|
+ QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
|
+
|
|
|
+ vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc, vdev_id,
|
|
|
+ WLAN_MLME_OBJMGR_ID);
|
|
|
+ if (!vdev) {
|
|
|
+ mlme_err("vdev object is NULL for vdev %d", vdev_id);
|
|
|
+ return QDF_STATUS_E_NULL_VALUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ mlo_dev_ctx = vdev->mlo_dev_ctx;
|
|
|
+ if (!mlo_dev_ctx) {
|
|
|
+ mlme_err("mlo_dev_ctx object is NULL for vdev %d", vdev_id);
|
|
|
+ status = QDF_STATUS_E_NULL_VALUE;
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
|
|
|
+ if (!mlo_dev_ctx->wlan_vdev_list[i])
|
|
|
+ continue;
|
|
|
+
|
|
|
+ del_sta_params = qdf_mem_malloc(sizeof(*del_sta_params));
|
|
|
+ if (!del_sta_params) {
|
|
|
+ status = QDF_STATUS_E_NOMEM;
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ lim_mlo_roam_peer_disconn_del(mlo_dev_ctx->wlan_vdev_list[i]);
|
|
|
+ qdf_mem_zero(del_sta_params, sizeof(*del_sta_params));
|
|
|
+ link_vdev_id = wlan_vdev_get_id(mlo_dev_ctx->wlan_vdev_list[i]);
|
|
|
+ if (link_vdev_id == WLAN_INVALID_VDEV_ID) {
|
|
|
+ mlme_err("invalid vdev id");
|
|
|
+ status = QDF_STATUS_E_INVAL;
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ del_sta_params->smesessionId = link_vdev_id;
|
|
|
+ wma_delete_sta(wma, del_sta_params);
|
|
|
+ wma_delete_bss(wma, link_vdev_id);
|
|
|
+ }
|
|
|
+
|
|
|
+end:
|
|
|
+ wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
|
|
|
+ return status;
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline QDF_STATUS
|
|
|
+wma_delete_all_peers(tp_wma_handle wma,
|
|
|
+ uint8_t vdev_id)
|
|
|
+{
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+}
|
|
|
+#endif
|
|
|
/**
|
|
|
* wma_roam_update_vdev() - Update the STA and BSS
|
|
|
* @wma: Global WMA Handle
|
|
@@ -569,6 +641,7 @@ wma_roam_update_vdev(tp_wma_handle wma,
|
|
|
int32_t uc_cipher, cipher_cap;
|
|
|
bool is_assoc_peer = false;
|
|
|
struct qdf_mac_addr mac_addr;
|
|
|
+ QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
|
|
|
|
vdev_id = roamed_vdev_id;
|
|
|
wma->interfaces[vdev_id].nss = roam_synch_ind_ptr->nss;
|
|
@@ -584,14 +657,8 @@ wma_roam_update_vdev(tp_wma_handle wma,
|
|
|
wma->interfaces[vdev_id].ch_freq =
|
|
|
roam_synch_ind_ptr->chan_freq;
|
|
|
|
|
|
- del_sta_params = qdf_mem_malloc(sizeof(*del_sta_params));
|
|
|
- if (!del_sta_params) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
add_sta_params = qdf_mem_malloc(sizeof(*add_sta_params));
|
|
|
if (!add_sta_params) {
|
|
|
- qdf_mem_free(del_sta_params);
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -601,14 +668,35 @@ wma_roam_update_vdev(tp_wma_handle wma,
|
|
|
else
|
|
|
mac_addr = roam_synch_ind_ptr->bssid;
|
|
|
|
|
|
- qdf_mem_zero(del_sta_params, sizeof(*del_sta_params));
|
|
|
qdf_mem_zero(add_sta_params, sizeof(*add_sta_params));
|
|
|
|
|
|
- del_sta_params->smesessionId = vdev_id;
|
|
|
+ /* With self roaming on multi link AP, as the same
|
|
|
+ * peer already exists, new peer creation fails
|
|
|
+ * To handle this delete all link peers,
|
|
|
+ * while doing roam sync on first link.
|
|
|
+ */
|
|
|
+ if (is_multi_link_roam(roam_synch_ind_ptr)) {
|
|
|
+ if (wlan_vdev_mlme_get_is_mlo_link(wma->psoc, vdev_id) ||
|
|
|
+ mlo_roam_get_num_of_setup_links(roam_synch_ind_ptr) == 1) {
|
|
|
+ status = wma_delete_all_peers(wma, vdev_id);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status))
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ del_sta_params = qdf_mem_malloc(sizeof(*del_sta_params));
|
|
|
+ if (!del_sta_params)
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ qdf_mem_zero(del_sta_params, sizeof(*del_sta_params));
|
|
|
+ del_sta_params->smesessionId = vdev_id;
|
|
|
+ wma_delete_sta(wma, del_sta_params);
|
|
|
+ wma_delete_bss(wma, vdev_id);
|
|
|
+ }
|
|
|
+
|
|
|
add_sta_params->staType = STA_ENTRY_SELF;
|
|
|
add_sta_params->smesessionId = vdev_id;
|
|
|
qdf_mem_copy(&add_sta_params->bssId, &mac_addr,
|
|
|
- QDF_MAC_ADDR_SIZE);
|
|
|
+ QDF_MAC_ADDR_SIZE);
|
|
|
add_sta_params->assocId = roam_synch_ind_ptr->aid;
|
|
|
|
|
|
bssid = wma_get_vdev_bssid(wma->interfaces[vdev_id].vdev);
|
|
@@ -617,8 +705,6 @@ wma_roam_update_vdev(tp_wma_handle wma,
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- wma_delete_sta(wma, del_sta_params);
|
|
|
- wma_delete_bss(wma, vdev_id);
|
|
|
is_assoc_peer = wlan_vdev_mlme_get_is_mlo_vdev(wma->psoc, vdev_id);
|
|
|
if (is_multi_link_roam(roam_synch_ind_ptr)) {
|
|
|
wma_create_peer(wma, mac_addr.bytes,
|
|
@@ -652,6 +738,7 @@ wma_roam_update_vdev(tp_wma_handle wma,
|
|
|
QDF_MAC_ADDR_SIZE);
|
|
|
lim_fill_roamed_peer_twt_caps(wma->mac_context, vdev_id,
|
|
|
roam_synch_ind_ptr);
|
|
|
+end:
|
|
|
qdf_mem_free(add_sta_params);
|
|
|
}
|
|
|
|