Browse Source

qcacld-3.0: Handle concurrency scenarios in local packet capture

Handle concurrency scenarios in local packet capture.

Change-Id: Ie464f4f2402e7f67f8eb16738dc107f09293a26b
CRs-Fixed: 3415879
Srinivas Girigowda 2 years ago
parent
commit
e41ef343b8

+ 54 - 0
core/hdd/src/wlan_hdd_main.c

@@ -526,6 +526,54 @@ void hdd_start_complete(int ret)
 	complete_all(&wlan_start_comp);
 }
 
+#ifdef WLAN_FEATURE_LOCAL_PKT_CAPTURE
+/**
+ * wlan_hdd_lpc_del_monitor_interface() - Delete monitor interface
+ * @hdd_ctx: hdd_ctx
+ *
+ * This function takes care of deleting monitor interface
+ *
+ * Return: none
+ */
+static void
+wlan_hdd_lpc_del_monitor_interface(struct hdd_context *hdd_ctx)
+{
+	struct hdd_adapter *adapter;
+	void *soc;
+	bool running;
+
+	if (!hdd_ctx)
+		return;
+
+	if (!ucfg_dp_is_local_pkt_capture_enabled(hdd_ctx->psoc))
+		return;
+
+	soc = cds_get_context(QDF_MODULE_ID_SOC);
+	if (!soc)
+		return;
+
+	running = cdp_local_pkt_capture_running(soc, OL_TXRX_PDEV_ID);
+	if (!running)
+		return;
+
+	adapter = hdd_get_adapter(hdd_ctx, QDF_MONITOR_MODE);
+	if (!adapter) {
+		hdd_debug("There is no monitor adapter");
+		return;
+	}
+
+	hdd_debug("lpc: Delete monitor interface");
+	wlan_hdd_release_intf_addr(hdd_ctx, adapter->mac_addr.bytes);
+	hdd_stop_adapter(hdd_ctx, adapter);
+	hdd_close_adapter(hdd_ctx, adapter, true);
+}
+#else
+static inline
+void wlan_hdd_lpc_del_monitor_interface(struct hdd_context *hdd_ctx)
+{
+}
+#endif
+
 #ifdef QCA_HL_NETDEV_FLOW_CONTROL
 void wlan_hdd_mod_fc_timer(struct hdd_adapter *adapter,
 			   enum netif_action_type action)
@@ -13489,6 +13537,10 @@ int hdd_start_station_adapter(struct hdd_adapter *adapter)
 		return qdf_status_to_os_return(QDF_STATUS_SUCCESS);
 	}
 
+	if ((adapter->device_mode == QDF_P2P_DEVICE_MODE) ||
+	    (adapter->device_mode == QDF_NAN_DISC_MODE))
+		wlan_hdd_lpc_del_monitor_interface(adapter->hdd_ctx);
+
 	ret = hdd_vdev_create(adapter);
 	if (ret) {
 		hdd_err("failed to create vdev: %d", ret);
@@ -13542,6 +13594,8 @@ int hdd_start_ap_adapter(struct hdd_adapter *adapter)
 			adapter->deflink->vdev_id);
 		return qdf_status_to_os_return(QDF_STATUS_SUCCESS);
 	}
+
+	wlan_hdd_lpc_del_monitor_interface(hdd_ctx);
 	/*
 	 * In SSR case no need to create new sap context.
 	 * Otherwise create sap context first and then create

+ 2 - 0
os_if/dp/inc/os_if_dp_local_pkt_capture.h

@@ -57,6 +57,7 @@ QDF_STATUS os_if_dp_set_lpc_configure(struct wlan_objmgr_vdev *vdev,
  * Return: 0 for Success and negative value for failure
  */
 QDF_STATUS os_if_dp_local_pkt_capture_stop(struct wlan_objmgr_vdev *vdev);
+
 #else
 static inline
 QDF_STATUS os_if_dp_set_lpc_configure(struct wlan_objmgr_vdev *vdev,
@@ -70,5 +71,6 @@ QDF_STATUS os_if_dp_local_pkt_capture_stop(struct wlan_objmgr_vdev *vdev)
 {
 	return QDF_STATUS_SUCCESS;
 }
+
 #endif /* WLAN_FEATURE_LOCAL_PKT_CAPTURE */
 #endif

+ 23 - 0
os_if/dp/src/os_if_dp_local_pkt_capture.c

@@ -63,6 +63,29 @@ set_monitor_mode_policy[SET_MONITOR_MODE_CONFIG_MAX + 1] = {
 static
 bool os_if_local_pkt_capture_concurrency_allowed(struct wlan_objmgr_psoc *psoc)
 {
+	uint32_t num_connections, sta_count;
+
+	num_connections = policy_mgr_get_connection_count(psoc);
+	osif_debug("Total connections %d", num_connections);
+
+	/*
+	 * No connections, local packet capture is allowed
+	 * Only 1 connection and its STA, then local packet capture is allowed
+	 * 2+ port concurrency, local packet capture is not allowed
+	 */
+	if (!num_connections)
+		return true;
+
+	if (num_connections > 1)
+		return false;
+
+	sta_count = policy_mgr_mode_specific_connection_count(psoc,
+							      PM_STA_MODE,
+							      NULL);
+	osif_debug("sta_count %d", sta_count);
+	if (sta_count == 1)
+		return true;
+
 	return false;
 }