wlan: HDD_VOSS: Restrict creation of multi-port concurrency
Checks are added to restrict the creation of multi-port concurrency.
As of now, only two-port concurrency is supported; if there exists
a 2-port concurrency then the third connection is not allowed.
However, it does not restrict the creation of interface.
For example:
1. STA + P2P (GO/CLI) connection exists and then new
connection establishment is not allowed.
2. STA + SAP connection exists and then new
connection establishment is not allowed.
3. P2P GO + P2P CLI connection exists and then new
connection establishment is not allowed.
4. STA + ADHOC connection exists and then new
connection establishment is not allowed.
In the above example combinations, if any of the existing connection
is disconneted, then next connection is allowed.
CRs-fixed: 669604
Change-Id: Ib9e62953f38b274086115ae6a956ecd7a3973b0b
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index de5bc84..4ad62e6 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -5721,6 +5721,11 @@
return 0;
}
+ if (vos_max_concurrent_connections_reached()) {
+ hddLog(VOS_TRACE_LEVEL_INFO, FL("Reached max concurrent connections"));
+ return -EINVAL;
+ }
+
pConfig->persona = pHostapdAdapter->device_mode;
pSapEventCallback = hdd_hostapd_SAPEventCB;
@@ -5745,6 +5750,7 @@
}
set_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags);
+ wlan_hdd_incr_active_session(pHddCtx, pHostapdAdapter->device_mode);
#ifdef WLAN_FEATURE_P2P_DEBUG
if (pHostapdAdapter->device_mode == WLAN_HDD_P2P_GO)
@@ -5798,6 +5804,11 @@
return status;
}
+ if (vos_max_concurrent_connections_reached()) {
+ hddLog(VOS_TRACE_LEVEL_INFO, FL("Reached max concurrent connections"));
+ return -EINVAL;
+ }
+
if ( (pAdapter->device_mode == WLAN_HDD_SOFTAP)
|| (pAdapter->device_mode == WLAN_HDD_P2P_GO)
)
@@ -6004,6 +6015,8 @@
}
}
clear_bit(SOFTAP_BSS_STARTED, &pAdapter->event_flags);
+ /* BSS stopped, clear the active sessions for this device mode */
+ wlan_hdd_decr_active_session(pHddCtx, pAdapter->device_mode);
}
mutex_unlock(&pHddCtx->sap_lock);
@@ -6312,6 +6325,10 @@
__func__, hdd_device_modetoString(pAdapter->device_mode),
pAdapter->device_mode);
+ if (vos_max_concurrent_connections_reached()) {
+ hddLog(VOS_TRACE_LEVEL_INFO, FL("Reached max concurrent connections"));
+ return -EINVAL;
+ }
pConfig = pHddCtx->cfg_ini;
wdev = ndev->ieee80211_ptr;
@@ -6676,7 +6693,7 @@
#ifdef WLAN_BTAMP_FEATURE
if((NL80211_IFTYPE_STATION == type) && (pHddCtx->concurrency_mode <= 1) &&
- (pHddCtx->no_of_sessions[WLAN_HDD_INFRA_STATION] <=1))
+ (pHddCtx->no_of_open_sessions[WLAN_HDD_INFRA_STATION] <=1))
{
//we are ok to do AMP
pHddCtx->isAmpAllowed = VOS_TRUE;
@@ -10109,9 +10126,8 @@
}
/*
- * FUNCTION: __wlan_hdd_cfg80211_set_privacy
- * This function is used to initialize the security
- * parameters during connect operation.
+ * FUNCTION: __wlan_hdd_cfg80211_connect
+ * This function is used to start the association process
*/
static int __wlan_hdd_cfg80211_connect( struct wiphy *wiphy,
struct net_device *ndev,
@@ -10138,7 +10154,7 @@
{
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"%s: HDD context is null", __func__);
- return VOS_STATUS_E_FAILURE;
+ return -EINVAL;
}
status = wlan_hdd_validate_context(pHddCtx);
@@ -10150,6 +10166,11 @@
return status;
}
+ if (vos_max_concurrent_connections_reached()) {
+ hddLog(VOS_TRACE_LEVEL_INFO, FL("Reached max concurrent connections"));
+ return -ECONNREFUSED;
+ }
+
#ifdef WLAN_BTAMP_FEATURE
//Infra connect not supported when AMP traffic is on.
if( VOS_TRUE == WLANBAP_AmpSessionOn() )
@@ -10163,9 +10184,9 @@
//If Device Mode is Station Concurrent Sessions Exit BMps
//P2P Mode will be taken care in Open/close adapter
if((WLAN_HDD_INFRA_STATION == pAdapter->device_mode) &&
- (vos_concurrent_sessions_running()))
- {
- exitbmpsStatus = hdd_disable_bmps_imps(pHddCtx, WLAN_HDD_INFRA_STATION);
+ (vos_concurrent_open_sessions_running())) {
+ exitbmpsStatus = hdd_disable_bmps_imps(pHddCtx,
+ WLAN_HDD_INFRA_STATION);
}
/*Try disconnecting if already in connected state*/
@@ -10212,8 +10233,7 @@
//ReEnable Bmps and Imps back
hdd_enable_bmps_imps(pHddCtx);
}
-
- hddLog(VOS_TRACE_LEVEL_ERROR, "%s: connect failed", __func__);
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("connect failed"));
return status;
}
pHddCtx->isAmpAllowed = VOS_FALSE;
@@ -10571,6 +10591,11 @@
return -EIO;
}
+ if (vos_max_concurrent_connections_reached()) {
+ hddLog(VOS_TRACE_LEVEL_INFO, FL("Reached max concurrent connections"));
+ return -ECONNREFUSED;
+ }
+
/*Try disconnecting if already in connected state*/
status = wlan_hdd_try_disconnect(pAdapter);
if ( 0 > status)