Forráskód Böngészése

qcacld-3.0: Dont issue disconnect on STA while start/stop SAP

Currently, our host logic is "If an STA connection is in
progress in another adapter, driver disconnects the STA and
completes the SAP operation (start BSS or stop BSS)". This
is due to below reasons:

In the old kernel version and for STA+SAP concurrency support
from GUI, the first STA connection gets triggered and while it
is in progress, SAP start/stop also comes up. Once STA association
is successful, the STA connect event is sent to the kernel which
gets queued in the kernel workqueue and the supplicant won't
process M1 received from AP and send M2 until this NL80211_CONNECT
event is received. Workqueue is not scheduled as RTNL lock is
already taken by hostapd thread which has issued start_bss/stop_bss
command to the driver. The driver cannot complete start_bss/stop_bss
as the pending command at the head of the SME command pending list
is hw_mode_update for STA session which cannot be processed as SME
is in WAITforKey state for STA interface. The start_bss/stop_bss
command for SAP interface is queued behind the hw_mode_update
command and so it cannot be processed until hw_mode_update command
is processed. This is causing a deadlock so disconnect the STA
interface first if a connection or key exchange is in progress and
then start or stop the SAP interface.

As part of connection mgr changes, removed dependency on WAITforKey
state in serialization, and h/w mode also is not sent immediately
after the STA connection, So no possibility of the above deadlock
scenario.

The fix is to avoid disconnection on the STA interface during the
start or stop of the SAP interface.

Change-Id: Iad3ada091e505007cc6901a461be3b88fc051f4e
CRs-Fixed: 3339784
abhinav kumar 2 éve
szülő
commit
c8f63c006b
2 módosított fájl, 2 hozzáadás és 38 törlés
  1. 2 13
      core/hdd/src/wlan_hdd_assoc.c
  2. 0 25
      core/hdd/src/wlan_hdd_hostapd.c

+ 2 - 13
core/hdd/src/wlan_hdd_assoc.c

@@ -176,7 +176,7 @@ uint8_t ccp_wapi_oui02[HDD_WAPI_OUI_SIZE] = { 0x00, 0x14, 0x72, 0x02 };
 
 #define HDD_PEER_AUTHORIZE_WAIT 10
 
-/**
+/*
  * beacon_filter_table - table of IEs used for beacon filtering
  */
 static const int beacon_filter_table[] = {
@@ -200,7 +200,7 @@ static const int beacon_filter_table[] = {
 #endif
 };
 
-/**
+/*
  * beacon_filter_extn_table - table of extn IEs used for beacon filtering
  */
 static const int beacon_filter_extn_table[] = {
@@ -454,17 +454,6 @@ struct hdd_adapter *hdd_get_sta_connection_in_progress(
 					hdd_adapter_dev_put_debug(next_adapter,
 								  dbgid);
 				return adapter;
-			} else if (hdd_cm_is_vdev_associated(adapter) &&
-				   sme_is_sta_key_exchange_in_progress(
-							hdd_ctx->mac_handle,
-							adapter->vdev_id)) {
-				hdd_debug("vdev_id %d: Key exchange is in progress",
-					  adapter->vdev_id);
-				hdd_adapter_dev_put_debug(adapter, dbgid);
-				if (next_adapter)
-					hdd_adapter_dev_put_debug(next_adapter,
-								  dbgid);
-				return adapter;
 			}
 		}
 		hdd_adapter_dev_put_debug(adapter, dbgid);

+ 0 - 25
core/hdd/src/wlan_hdd_hostapd.c

@@ -6145,24 +6145,6 @@ int wlan_hdd_cfg80211_start_bss(struct hdd_adapter *adapter,
 			goto deliver_start_err;
 		}
 	}
-	/*
-	 * For STA+SAP concurrency support from GUI, first STA connection gets
-	 * triggered and while it is in progress, SAP start also comes up.
-	 * Once STA association is successful, STA connect event is sent to
-	 * kernel which gets queued in kernel workqueue and supplicant won't
-	 * process M1 received from AP and send M2 until this NL80211_CONNECT
-	 * event is received. Workqueue is not scheduled as RTNL lock is already
-	 * taken by hostapd thread which has issued start_bss command to driver.
-	 * Driver cannot complete start_bss as the pending command at the head
-	 * of the SME command pending list is hw_mode_update for STA session
-	 * which cannot be processed as SME is in WAITforKey state for STA
-	 * interface. The start_bss command for SAP interface is queued behind
-	 * the hw_mode_update command and so it cannot be processed until
-	 * hw_mode_update command is processed. This is causing a deadlock so
-	 * disconnect the STA interface first if connection or key exchange is
-	 * in progress and then start SAP interface.
-	 */
-	hdd_abort_ongoing_sta_connection(hdd_ctx);
 
 	mac_handle = hdd_ctx->mac_handle;
 
@@ -6930,13 +6912,6 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy,
 		  adapter->event_flags, (adapter->dev)->name,
 		  qdf_opmode_str(adapter->device_mode), adapter->device_mode);
 
-	/*
-	 * If a STA connection is in progress in another adapter, disconnect
-	 * the STA and complete the SAP operation. STA will reconnect
-	 * after SAP stop is done.
-	 */
-	hdd_abort_ongoing_sta_connection(hdd_ctx);
-
 	if (adapter->device_mode == QDF_SAP_MODE) {
 		wlan_hdd_del_station(adapter, NULL);
 		mac_handle = hdd_ctx->mac_handle;