Răsfoiți Sursa

qcacld-3.0: Wrapper API to check duplicate session

Introduce new API which checks for duplicate session on all the
valid addresses in the adapter.

The existing sme_check_for_duplicate_session() API is extended
to take list of addresses to check for duplicate entry.
The list argument is expected to be NULL terminated to exit the
loop.

Change-Id: I71629aa89e901041d787de18e2305dbbbca5aa50
CRs-Fixed: 3524015
Vinod Kumar Pirla 2 ani în urmă
părinte
comite
5910af22bd

+ 13 - 0
core/hdd/inc/wlan_hdd_main.h

@@ -3900,6 +3900,19 @@ QDF_STATUS hdd_sme_close_session_callback(uint8_t vdev_id);
 int hdd_register_cb(struct hdd_context *hdd_ctx);
 void hdd_deregister_cb(struct hdd_context *hdd_ctx);
 
+/**
+ * hdd_adapter_check_duplicate_session() - Check for duplicate
+ * session on start adapter.
+ * @adapter: HDD adapter
+ *
+ * The API passes list of addresses contained in @adapter to
+ * sme_check_for_duplicate_session() to check the status
+ * of existing peer with same MAC address.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS hdd_adapter_check_duplicate_session(struct hdd_adapter *adapter);
+
 /**
  * hdd_start_station_adapter()- Start the Station Adapter
  * @adapter: HDD adapter

+ 57 - 7
core/hdd/src/wlan_hdd_main.c

@@ -7224,13 +7224,6 @@ int hdd_vdev_create(struct wlan_hdd_link_info *link_info)
 
 	/* do vdev create via objmgr */
 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
-	status = sme_check_for_duplicate_session(hdd_ctx->mac_handle,
-						 adapter->mac_addr.bytes);
-	if (QDF_IS_STATUS_ERROR(status)) {
-		hdd_err("Duplicate session is existing with same mac address");
-		errno = qdf_status_to_os_return(status);
-		return errno;
-	}
 
 	hdd_populate_vdev_create_params(adapter, &vdev_params);
 
@@ -13938,6 +13931,50 @@ out:
 	hdd_debug("wlm initial mode %u", adapter->latency_level);
 }
 
+#if defined(WLAN_FEATURE_11BE_MLO) && defined(CFG80211_11BE_BASIC)
+QDF_STATUS hdd_adapter_check_duplicate_session(struct hdd_adapter *adapter)
+{
+	int i;
+	QDF_STATUS status;
+	uint8_t *addr_list[WLAN_MAX_MLD + 1] = {0};
+	struct hdd_adapter *link_adapter;
+	struct hdd_mlo_adapter_info *mlo_adapter_info;
+	mac_handle_t mac_handle = hdd_adapter_get_mac_handle(adapter);
+
+	if (hdd_adapter_is_ml_adapter(adapter) &&
+	    adapter->device_mode == QDF_STA_MODE) {
+		addr_list[0] = &adapter->mld_addr.bytes[0];
+		mlo_adapter_info = &adapter->mlo_adapter_info;
+		for (i = 0; i < WLAN_MAX_MLD; i++) {
+			link_adapter = mlo_adapter_info->link_adapter[i];
+			if (!link_adapter)
+				continue;
+			if (hdd_adapter_is_associated_with_ml_adapter(
+							link_adapter)) {
+				addr_list[1] = &link_adapter->mac_addr.bytes[0];
+			}
+		}
+	} else {
+		addr_list[0] = &adapter->mac_addr.bytes[0];
+	}
+
+	status = sme_check_for_duplicate_session(mac_handle, &addr_list[0]);
+	return status;
+}
+#else
+QDF_STATUS hdd_adapter_check_duplicate_session(struct hdd_adapter *adapter)
+{
+	QDF_STATUS status;
+	uint8_t *addr_list[2] = {0};
+	mac_handle_t mac_handle = hdd_adapter_get_mac_handle(adapter);
+
+	addr_list[0] = &adapter->mac_addr.bytes[0];
+	status = sme_check_for_duplicate_session(mac_handle, &addr_list[0]);
+
+	return status;
+}
+#endif
+
 int hdd_start_station_adapter(struct hdd_adapter *adapter)
 {
 	QDF_STATUS status;
@@ -13955,6 +13992,12 @@ int hdd_start_station_adapter(struct hdd_adapter *adapter)
 	    (adapter->device_mode == QDF_NAN_DISC_MODE))
 		wlan_hdd_lpc_del_monitor_interface(adapter->hdd_ctx);
 
+	status = hdd_adapter_check_duplicate_session(adapter);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		hdd_err("Duplicate session is existing with same mac address");
+		return qdf_status_to_os_return(status);
+	}
+
 	hdd_adapter_for_each_active_link_info(adapter, link_info) {
 		ret = hdd_vdev_create(link_info);
 		if (ret) {
@@ -14016,6 +14059,13 @@ int hdd_start_ap_adapter(struct hdd_adapter *adapter)
 	}
 
 	wlan_hdd_lpc_del_monitor_interface(hdd_ctx);
+
+	status = hdd_adapter_check_duplicate_session(adapter);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		hdd_err("Duplicate session is existing with same mac address");
+		return qdf_status_to_os_return(status);
+	}
+
 	/*
 	 * In SSR case no need to create new sap context.
 	 * Otherwise create sap context first and then create

+ 9 - 6
core/hdd/src/wlan_hdd_mlo.c

@@ -315,6 +315,7 @@ int hdd_update_vdev_mac_address(struct hdd_adapter *adapter,
 	struct hdd_mlo_adapter_info *mlo_adapter_info;
 	struct hdd_context *hdd_ctx = adapter->hdd_ctx;
 	struct qdf_mac_addr link_addrs[WLAN_MAX_MLD] = {0};
+	uint8_t *addr_list[WLAN_MAX_MLD + 1] = {0};
 
 	/* This API is only called with is ml adapter set for STA mode adapter.
 	 * For SAP mode, hdd_hostapd_set_mac_address() is the entry point for
@@ -335,18 +336,20 @@ int hdd_update_vdev_mac_address(struct hdd_adapter *adapter,
 	if (QDF_IS_STATUS_ERROR(status))
 		return qdf_status_to_os_return(status);
 
+	for (i = 0; i < WLAN_MAX_MLD; i++)
+		addr_list[i] = &link_addrs[i].bytes[0];
+
+	status = sme_check_for_duplicate_session(hdd_ctx->mac_handle,
+						 &addr_list[0]);
+	if (QDF_IS_STATUS_ERROR(status))
+		return qdf_status_to_os_return(status);
+
 	mlo_adapter_info = &adapter->mlo_adapter_info;
 	for (i = 0; i < WLAN_MAX_MLD; i++) {
 		link_adapter = mlo_adapter_info->link_adapter[i];
 		if (!link_adapter)
 			continue;
 
-		status = sme_check_for_duplicate_session(hdd_ctx->mac_handle,
-							 link_addrs[i].bytes);
-
-		if (QDF_IS_STATUS_ERROR(status))
-			return qdf_status_to_os_return(status);
-
 		if (hdd_adapter_is_associated_with_ml_adapter(link_adapter))
 			update_self_peer = true;
 		else

+ 6 - 0
core/hdd/src/wlan_hdd_nan_datapath.c

@@ -579,6 +579,12 @@ int hdd_init_nan_data_mode(struct hdd_adapter *adapter)
 	struct wlan_objmgr_vdev *vdev;
 	uint16_t rts_profile = 0;
 
+	status = hdd_adapter_check_duplicate_session(adapter);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		hdd_err("Duplicate session is existing with same mac address");
+		return qdf_status_to_os_return(status);
+	}
+
 	ret_val = hdd_vdev_create(adapter->deflink);
 	if (ret_val) {
 		hdd_err("failed to create vdev: %d", ret_val);

+ 3 - 2
core/sme/inc/sme_api.h

@@ -4486,14 +4486,15 @@ QDF_STATUS sme_get_full_roam_scan_period(mac_handle_t mac_handle,
 /**
  * sme_check_for_duplicate_session() - check for duplicate session
  * @mac_handle: Opaque handle to the MAC context
- * @peer_addr: Peer device mac address
+ * @mac_list: List of mac address of peers.
  *
  * Check for duplicate mac address is available on other vdev.
+ * The list pointed by @mac_list has to be NULL terminated.
  *
  * Return: QDF_STATUS
  */
 QDF_STATUS sme_check_for_duplicate_session(mac_handle_t mac_handle,
-					   uint8_t *peer_addr);
+					   uint8_t **mac_list);
 #ifdef FEATURE_ANI_LEVEL_REQUEST
 /*
  * sme_get_ani_level() -

+ 13 - 9
core/sme/src/common/sme_api.c

@@ -16231,25 +16231,29 @@ sme_get_full_roam_scan_period(mac_handle_t mac_handle, uint8_t vdev_id,
 }
 
 QDF_STATUS sme_check_for_duplicate_session(mac_handle_t mac_handle,
-					   uint8_t *peer_addr)
+					   uint8_t **mac_list)
 {
-	QDF_STATUS status = QDF_STATUS_E_INVAL;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	bool peer_exist = false;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 	struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
+	uint8_t **peer_addr = mac_list;
 
 	if (!soc)
 		return QDF_STATUS_E_INVAL;
 
 	if (QDF_STATUS_SUCCESS != sme_acquire_global_lock(&mac_ctx->sme))
-		return status;
+		return QDF_STATUS_E_INVAL;
 
-	peer_exist = cdp_find_peer_exist(soc, OL_TXRX_PDEV_ID, peer_addr);
-	if (peer_exist) {
-		sme_err("Peer exists with same MAC");
-		status = QDF_STATUS_E_EXISTS;
-	} else {
-		status = QDF_STATUS_SUCCESS;
+	while (*peer_addr) {
+		peer_exist = cdp_find_peer_exist(soc, OL_TXRX_PDEV_ID,
+						 *peer_addr);
+		if (peer_exist) {
+			sme_err("Peer exists with same MAC");
+			status = QDF_STATUS_E_EXISTS;
+			break;
+		}
+		peer_addr++;
 	}
 	sme_release_global_lock(&mac_ctx->sme);