summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRavi Joshi <ravij@qca.qualcomm.com>2014-06-26 11:32:37 -0700
committerAkash Patel <c_akashp@qca.qualcomm.com>2014-06-27 23:16:22 -0700
commitf3ada2dcd1cebf15efb4f697b7056ace46e17047 (patch)
tree0447b366ce15f8bae843a2a316f036e8da254f85
parent164e3b96c5be34fc2197356e1f0325294eda0ced (diff)
qcacld_new: Do not attempt TDLS connection in case of concurrency
Currently TDLS is operational only when there is a single active session. Hence, ensure that TDLS sessions are not created during multiple active concurrent sessions. Thus , this commit speaks to not attempt TDLS connection when another concurrent session is trying to get established. This goes with the assumption that before the concurrent session is attempted to form , the supplicant shall issue the scan's which shall ensure that the TDLS sessions on the current active session are deleted / torn down. Change-Id: Ia61b1dd8d3c9859487cbb11183ab3f83ae609dc3 CRs-Fixed: 668297
-rw-r--r--CORE/HDD/inc/wlan_hdd_tdls.h2
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c12
-rw-r--r--CORE/HDD/src/wlan_hdd_early_suspend.c1
-rwxr-xr-xCORE/HDD/src/wlan_hdd_main.c3
-rw-r--r--CORE/HDD/src/wlan_hdd_tdls.c56
5 files changed, 46 insertions, 28 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_tdls.h b/CORE/HDD/inc/wlan_hdd_tdls.h
index 47243a217d31..c443ea0d55a1 100644
--- a/CORE/HDD/inc/wlan_hdd_tdls.h
+++ b/CORE/HDD/inc/wlan_hdd_tdls.h
@@ -219,6 +219,8 @@ typedef struct {
int wlan_hdd_tdls_init(hdd_adapter_t *pAdapter);
+void wlan_hdd_global_tdls_init(hdd_context_t * pHddCtx);
+
void wlan_hdd_tdls_exit(hdd_adapter_t *pAdapter);
void wlan_hdd_tdls_extract_da(struct sk_buff *skb, u8 *mac);
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index f7ef86f0acc3..bbebf157e0b4 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -10738,6 +10738,18 @@ static int wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *d
}
}
+ if (hdd_isConnectionInProgress(pHddCtx)) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("Connection is in progress"
+ " TDLS connection is not allowed"));
+ return -EBUSY;
+ }
+
+ if (vos_max_concurrent_connections_reached()) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("Reached max concurrent connections"));
+ return -EINVAL;
+ }
+
if (WLAN_IS_TDLS_SETUP_ACTION(action_code))
{
if (NULL != wlan_hdd_tdls_is_progress(pHddCtx, peer, TRUE))
diff --git a/CORE/HDD/src/wlan_hdd_early_suspend.c b/CORE/HDD/src/wlan_hdd_early_suspend.c
index dcdb1908b025..813a1f366161 100644
--- a/CORE/HDD/src/wlan_hdd_early_suspend.c
+++ b/CORE/HDD/src/wlan_hdd_early_suspend.c
@@ -2251,6 +2251,7 @@ VOS_STATUS hdd_wlan_re_init(void *hif_sc)
vos_set_logp_in_progress(VOS_MODULE_ID_VOSS, FALSE);
pHddCtx->hdd_mcastbcast_filter_set = FALSE;
hdd_register_mcast_bcast_filter(pHddCtx);
+ wlan_hdd_global_tdls_init(pHddCtx);
hdd_ssr_timer_del();
#ifdef QCA_WIFI_ISOC
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 182ff9edd264..960dc2af1ae4 100755
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -11788,6 +11788,9 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc)
/*SME must send channel update configuration to RIVA*/
sme_UpdateChannelConfig(pHddCtx->hHal);
#endif
+
+ wlan_hdd_global_tdls_init(pHddCtx);
+
sme_Register11dScanDoneCallback(pHddCtx->hHal, hdd_11d_scan_done);
/* Register with platform driver as client for Suspend/Resume */
diff --git a/CORE/HDD/src/wlan_hdd_tdls.c b/CORE/HDD/src/wlan_hdd_tdls.c
index a9f5c687650f..f24d6e13b4a6 100644
--- a/CORE/HDD/src/wlan_hdd_tdls.c
+++ b/CORE/HDD/src/wlan_hdd_tdls.c
@@ -647,13 +647,39 @@ static void wlan_hdd_tdls_schedule_scan(struct work_struct *work)
scan_ctx->scan_request);
}
-
+/* initialize TDLS global context */
+void wlan_hdd_global_tdls_init(hdd_context_t *pHddCtx )
+{
+ v_U8_t staIdx;
+
+ pHddCtx->connected_peer_count = 0;
+ pHddCtx->tdls_scan_ctxt.magic = 0;
+ pHddCtx->tdls_scan_ctxt.attempt = 0;
+ pHddCtx->tdls_scan_ctxt.reject = 0;
+ pHddCtx->tdls_scan_ctxt.scan_request = NULL;
+
+ for (staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++) {
+ pHddCtx->tdlsConnInfo[staIdx].staId = 0;
+ pHddCtx->tdlsConnInfo[staIdx].sessionId = 255;
+ vos_mem_zero(&pHddCtx->tdlsConnInfo[staIdx].peerMac,
+ sizeof(v_MACADDR_t)) ;
+ }
+
+ if (VOS_FALSE == pHddCtx->cfg_ini->fEnableTDLSImplicitTrigger) {
+ pHddCtx->tdls_mode = eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY;
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_DEBUG,
+ FL("TDLS Implicit trigger not enabled!"));
+ } else {
+ pHddCtx->tdls_mode = eTDLS_SUPPORT_ENABLED;
+ }
+}
+
+/* Initialize TDLS */
int wlan_hdd_tdls_init(hdd_adapter_t *pAdapter)
{
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
tdlsCtx_t *pHddTdlsCtx;
int i;
- v_U8_t staIdx;
#ifdef QCA_WIFI_2_0
tdlsInfo_t *tInfo;
eHalStatus halStatus = eHAL_STATUS_FAILURE;
@@ -744,26 +770,9 @@ int wlan_hdd_tdls_init(hdd_adapter_t *pAdapter)
pHddTdlsCtx = pAdapter->sessionCtx.station.pHddTdlsCtx;
- /* initialize TDLS global context */
- pHddCtx->connected_peer_count = 0;
sme_SetTdlsPowerSaveProhibited(WLAN_HDD_GET_HAL_CTX(pAdapter),
pAdapter->sessionId, 0);
- pHddCtx->tdls_scan_ctxt.magic = 0;
- pHddCtx->tdls_scan_ctxt.attempt = 0;
- pHddCtx->tdls_scan_ctxt.reject = 0;
- pHddCtx->tdls_scan_ctxt.scan_request = NULL;
-
- pHddCtx->max_num_tdls_sta = HDD_MAX_NUM_TDLS_STA;
-
- for (staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++)
- {
- pHddCtx->tdlsConnInfo[staIdx].staId = 0;
- pHddCtx->tdlsConnInfo[staIdx].sessionId = 255;
- vos_mem_zero(&pHddCtx->tdlsConnInfo[staIdx].peerMac,
- sizeof(v_MACADDR_t)) ;
- }
-
pHddTdlsCtx->pAdapter = pAdapter;
for (i = 0; i < 256; i++)
@@ -788,15 +797,6 @@ int wlan_hdd_tdls_init(hdd_adapter_t *pAdapter)
pHddTdlsCtx->threshold_config.rssi_delta = pHddCtx->cfg_ini->fTDLSRSSIDelta;
#endif
- if (FALSE == pHddCtx->cfg_ini->fEnableTDLSImplicitTrigger)
- {
- pHddCtx->tdls_mode = eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY;
- hddLog(VOS_TRACE_LEVEL_ERROR, "%s TDLS Implicit trigger not enabled!", __func__);
- }
- else
- {
- pHddCtx->tdls_mode = eTDLS_SUPPORT_ENABLED;
- }
#ifdef CONFIG_TDLS_IMPLICIT
INIT_WORK(&pHddTdlsCtx->implicit_setup, wlan_hdd_tdls_pre_setup);
#endif