blob: fafae28082523e7f5b9a7d30ce561f45aed61320 [file] [log] [blame]
Kiran V1ccee932012-12-12 14:49:46 -08001/*
Atul Mittal115287b2014-07-08 13:26:33 +05302 * Copyright (c) 2012-2014 The Linux Foundation. All rights reserved.
Kiet Lam842dad02014-02-18 18:44:02 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
Gopichand Nakkala0c1331e2013-01-07 22:49:07 -080020 */
Kiet Lam842dad02014-02-18 18:44:02 -080021
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
Kiran V1ccee932012-12-12 14:49:46 -080028/**========================================================================
29
30 \file wlan_hdd_tdls.c
31
Chilam NG571c65a2013-01-19 12:27:36 +053032 \brief WLAN Host Device Driver implementation for TDLS
Kiran V1ccee932012-12-12 14:49:46 -080033
Kiran V1ccee932012-12-12 14:49:46 -080034 ========================================================================*/
35
36#include <wlan_hdd_includes.h>
37#include <wlan_hdd_hostapd.h>
38#include <net/cfg80211.h>
39#include <linux/netdevice.h>
40#include <linux/skbuff.h>
Chilam NG571c65a2013-01-19 12:27:36 +053041#include <linux/list.h>
Kiran V1ccee932012-12-12 14:49:46 -080042#include <linux/etherdevice.h>
43#include <net/ieee80211_radiotap.h>
44#include "wlan_hdd_tdls.h"
Chilam NG571c65a2013-01-19 12:27:36 +053045#include "wlan_hdd_cfg80211.h"
Mahesh A Saptasagar8b231b32014-08-11 11:58:15 +053046#include "vos_sched.h"
Chilam NG571c65a2013-01-19 12:27:36 +053047
Gopichand Nakkala4327a152013-03-04 23:22:42 -080048static tANI_S32 wlan_hdd_get_tdls_discovery_peer_cnt(tdlsCtx_t *pHddTdlsCtx);
49static tANI_S32 wlan_hdd_tdls_peer_reset_discovery_processed(tdlsCtx_t *pHddTdlsCtx);
50static void wlan_hdd_tdls_timers_destroy(tdlsCtx_t *pHddTdlsCtx);
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +053051static void wlan_hdd_tdls_peer_timers_destroy(tdlsCtx_t *pHddTdlsCtx);
Sunil Dutt41de4e22013-11-14 18:09:02 +053052int wpa_tdls_is_allowed_force_peer(tdlsCtx_t *pHddTdlsCtx, u8 *mac);
Hoonki Leed37cbb32013-04-20 00:31:14 -070053#ifdef CONFIG_TDLS_IMPLICIT
54static void wlan_hdd_tdls_pre_setup(struct work_struct *work);
55#endif
Chilam NG571c65a2013-01-19 12:27:36 +053056
Hoonki Lee5a4b2172013-01-29 01:45:53 -080057#ifndef WLAN_FEATURE_TDLS_DEBUG
58#define TDLS_LOG_LEVEL VOS_TRACE_LEVEL_INFO
59#else
60#define TDLS_LOG_LEVEL VOS_TRACE_LEVEL_WARN
61#endif
62
Hoonki Lee387663d2013-02-05 18:08:43 -080063static u8 wlan_hdd_tdls_hash_key (u8 *mac)
Hoonki Leef63df0d2013-01-16 19:29:14 -080064{
65 int i;
Hoonki Lee387663d2013-02-05 18:08:43 -080066 u8 key = 0;
67
68 for (i = 0; i < 6; i++)
69 key ^= mac[i];
70
71 return key;
72}
73
Hoonki Leed37cbb32013-04-20 00:31:14 -070074#ifdef CONFIG_TDLS_IMPLICIT
75static void wlan_hdd_tdls_pre_setup_init_work(tdlsCtx_t * pHddTdlsCtx,
76 hddTdlsPeer_t *curr_candidate)
77{
78 if (TDLS_CTX_MAGIC != pHddTdlsCtx->magic)
79 {
80 pHddTdlsCtx->curr_candidate = curr_candidate;
81 pHddTdlsCtx->magic = TDLS_CTX_MAGIC;
82
Hoonki Leed37cbb32013-04-20 00:31:14 -070083 schedule_work(&pHddTdlsCtx->implicit_setup);
84 }
85}
86#endif
87
Gopichand Nakkala4327a152013-03-04 23:22:42 -080088static v_VOID_t wlan_hdd_tdls_start_peer_discover_timer(tdlsCtx_t *pHddTdlsCtx,
89 tANI_BOOLEAN mutexLock,
90 v_U32_t discoveryExpiry)
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -080091{
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -080092 hdd_station_ctx_t *pHddStaCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +053093 hdd_context_t *pHddCtx;
94
c_hpothu7f63e882013-10-02 19:13:35 +053095 if ((NULL == pHddTdlsCtx) || (NULL == pHddTdlsCtx->pAdapter) )
96 {
97 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
98 FL(" pHddTdlsCtx or pAdapter points to NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +053099 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530100 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530101
102 pHddCtx = WLAN_HDD_GET_CTX( pHddTdlsCtx->pAdapter );
103
c_hpothu7f63e882013-10-02 19:13:35 +0530104 if(0 != (wlan_hdd_validate_context(pHddCtx)))
105 {
106 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
107 FL("pHddCtx is not valid"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530108 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530109 }
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800110
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800111 if ( mutexLock )
112 {
Rajesh Chauhana34c6e62014-03-25 16:37:58 +0530113 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800114 }
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800115
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800116 pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pHddTdlsCtx->pAdapter);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700117#ifdef FEATURE_WLAN_TDLS_INTERNAL
Gopichand Nakkala3046fc92013-03-23 13:56:43 -0700118 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
119 &pHddTdlsCtx->peerDiscoverTimer,
120 discoveryExpiry);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700121#endif
Gopichand Nakkala3046fc92013-03-23 13:56:43 -0700122 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "beacon rssi: %d",
123 pHddTdlsCtx->ap_rssi);
124
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800125 if ( mutexLock )
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530126 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800127
128 return;
129}
130
Hoonki Leed37cbb32013-04-20 00:31:14 -0700131#ifdef TDLS_USE_SEPARATE_DISCOVERY_TIMER
Hoonki Lee387663d2013-02-05 18:08:43 -0800132static v_VOID_t wlan_hdd_tdls_discover_peer_cb( v_PVOID_t userData )
133{
134 int i;
135 struct list_head *head;
136 struct list_head *pos;
Chilam NG571c65a2013-01-19 12:27:36 +0530137 hddTdlsPeer_t *curr_peer;
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800138 hdd_station_ctx_t *pHddStaCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530139 hdd_context_t *pHddCtx;
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800140 tdlsCtx_t *pHddTdlsCtx = (tdlsCtx_t *)userData;
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800141 int discover_req_sent = 0;
142 v_U32_t discover_expiry = TDLS_SUB_DISCOVERY_PERIOD;
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800143 tANI_BOOLEAN doMutexLock = eANI_BOOLEAN_TRUE;
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800144
c_hpothu7f63e882013-10-02 19:13:35 +0530145 if ((NULL == pHddTdlsCtx) || (NULL == pHddTdlsCtx->pAdapter) )
146 {
147 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
148 FL(" pHddTdlsCtx or pAdapter points to NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530149 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530150 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530151
Sushant Kaushik15c4c522014-08-14 12:24:49 +0530152 if (WLAN_HDD_ADAPTER_MAGIC != pHddTdlsCtx->pAdapter->magic)
153 {
154 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
155 FL("pAdapter has invalid magic"));
156 return;
157 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530158 pHddCtx = WLAN_HDD_GET_CTX( pHddTdlsCtx->pAdapter );
159
c_hpothu7f63e882013-10-02 19:13:35 +0530160 if(0 != (wlan_hdd_validate_context(pHddCtx)))
161 {
162 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
163 FL("pHddCtx is not valid"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530164 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530165 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530166
Rajesh Chauhana34c6e62014-03-25 16:37:58 +0530167 mutex_lock(&pHddCtx->tdls_lock);
Hoonki Leebfee0342013-01-21 16:43:45 -0800168
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800169 pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pHddTdlsCtx->pAdapter);
Hoonki Leef63df0d2013-01-16 19:29:14 -0800170
Hoonki Lee387663d2013-02-05 18:08:43 -0800171 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: ", __func__);
172
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800173 if (0 == pHddTdlsCtx->discovery_peer_cnt)
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800174 pHddTdlsCtx->discovery_peer_cnt = wlan_hdd_get_tdls_discovery_peer_cnt(pHddTdlsCtx);
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800175
Chilam NG571c65a2013-01-19 12:27:36 +0530176 for (i = 0; i < 256; i++) {
Hoonki Lee387663d2013-02-05 18:08:43 -0800177 head = &pHddTdlsCtx->peer_list[i];
Chilam NG571c65a2013-01-19 12:27:36 +0530178
Hoonki Lee387663d2013-02-05 18:08:43 -0800179 list_for_each (pos, head) {
180 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
Chilam NG571c65a2013-01-19 12:27:36 +0530181
Gopichand Nakkala2a0a1572013-02-10 21:39:16 -0800182 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Chilam Ng01120412013-02-19 18:32:21 -0800183 "%d " MAC_ADDRESS_STR " %d %d, %d %d %d %d", i,
184 MAC_ADDR_ARRAY(curr_peer->peerMac),
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800185 curr_peer->discovery_processed,
186 discover_req_sent,
Gopichand Nakkala2a0a1572013-02-10 21:39:16 -0800187 curr_peer->tdls_support,
188 curr_peer->link_status,
189 curr_peer->discovery_attempt,
190 pHddTdlsCtx->threshold_config.discovery_tries_n);
Hoonki Lee387663d2013-02-05 18:08:43 -0800191
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800192 if (discover_req_sent < TDLS_MAX_DISCOVER_REQS_PER_TIMER) {
193 if (!curr_peer->discovery_processed) {
Chilam NG571c65a2013-01-19 12:27:36 +0530194
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800195 curr_peer->discovery_processed = 1;
196 discover_req_sent++;
197 pHddTdlsCtx->discovery_peer_cnt--;
198
199 if ((eTDLS_CAP_UNKNOWN == curr_peer->tdls_support) &&
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800200 (eTDLS_LINK_IDLE == curr_peer->link_status) &&
Gopichand Nakkalab88f6772013-02-27 18:12:56 -0800201 (curr_peer->tx_pkt >=
202 pHddTdlsCtx->threshold_config.tx_packet_n)) {
Gopichand Nakkala273d5a02013-02-19 15:15:09 -0800203
204 if (curr_peer->discovery_attempt <
205 pHddTdlsCtx->threshold_config.discovery_tries_n) {
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800206 sme_SendTdlsMgmtFrame(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter),
207 pHddTdlsCtx->pAdapter->sessionId,
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800208 curr_peer->peerMac,
209 WLAN_TDLS_DISCOVERY_REQUEST,
Pradeep Reddy POTTETIca171f82014-03-21 14:17:35 +0530210 1, 0, 0, NULL, 0, 0);
Gopichand Nakkala273d5a02013-02-19 15:15:09 -0800211 curr_peer->discovery_attempt++;
212 }
213 else
214 {
215 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
216 "%s: Maximum Discovery retries reached", __func__);
217 curr_peer->tdls_support = eTDLS_CAP_NOT_SUPPORTED;
218 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800219
220 }
221 }
Chilam NG571c65a2013-01-19 12:27:36 +0530222 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800223 else
224 goto exit_loop;
Hoonki Lee387663d2013-02-05 18:08:43 -0800225 }
Hoonki Leef63df0d2013-01-16 19:29:14 -0800226 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800227exit_loop:
Hoonki Leef63df0d2013-01-16 19:29:14 -0800228
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800229 if (0 != pHddTdlsCtx->discovery_peer_cnt) {
230 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
231 "discovery_peer_cnt is %d , Starting SUB_DISCOVERY_TIMER",
232 pHddTdlsCtx->discovery_peer_cnt);
233 discover_expiry = TDLS_SUB_DISCOVERY_PERIOD;
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800234 doMutexLock = eANI_BOOLEAN_FALSE;
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800235 goto done;
236 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800237 discover_expiry = pHddTdlsCtx->threshold_config.discovery_period_t;
238
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800239 wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
Chilam NG571c65a2013-01-19 12:27:36 +0530240
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530241 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala638ebc72013-03-21 18:04:02 -0700242
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800243 /* Commenting out the following function as it was introducing
244 * a race condition when pHddTdlsCtx is deleted. Also , this
245 * function is consuming more time in the timer callback.
246 * RSSI based trigger needs to revisit this part of the code.
247 */
248
249 /*
250 * wlan_hdd_get_rssi(pAdapter, &pHddTdlsCtx->ap_rssi);
251 */
Chilam NG571c65a2013-01-19 12:27:36 +0530252
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800253done:
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800254 wlan_hdd_tdls_start_peer_discover_timer(pHddTdlsCtx, doMutexLock, discover_expiry);
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800255
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800256 if ( !doMutexLock )
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530257 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800258 return;
Hoonki Leef63df0d2013-01-16 19:29:14 -0800259}
Hoonki Leed37cbb32013-04-20 00:31:14 -0700260#endif
Chilam NG571c65a2013-01-19 12:27:36 +0530261
Hoonki Lee387663d2013-02-05 18:08:43 -0800262static v_VOID_t wlan_hdd_tdls_update_peer_cb( v_PVOID_t userData )
Chilam NG571c65a2013-01-19 12:27:36 +0530263{
264 int i;
Hoonki Lee387663d2013-02-05 18:08:43 -0800265 struct list_head *head;
266 struct list_head *pos;
Chilam NG571c65a2013-01-19 12:27:36 +0530267 hddTdlsPeer_t *curr_peer;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530268 tdlsCtx_t *pHddTdlsCtx = (tdlsCtx_t *)userData;
269 hdd_context_t *pHddCtx;
Hoonki Leebfee0342013-01-21 16:43:45 -0800270
c_hpothu7f63e882013-10-02 19:13:35 +0530271 if ((NULL == pHddTdlsCtx) || (NULL == pHddTdlsCtx->pAdapter) )
272 {
273 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
274 FL(" pHddTdlsCtx or pAdapter points to NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530275 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530276 }
Sushant Kaushik15c4c522014-08-14 12:24:49 +0530277 if (WLAN_HDD_ADAPTER_MAGIC != pHddTdlsCtx->pAdapter->magic)
278 {
279 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
280 FL("pAdapter has invalid magic"));
281 return;
282 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530283 pHddCtx = WLAN_HDD_GET_CTX( pHddTdlsCtx->pAdapter );
284
c_hpothu7f63e882013-10-02 19:13:35 +0530285 if(0 != (wlan_hdd_validate_context(pHddCtx)))
286 {
287 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
288 FL("pHddCtx is not valid"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530289 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530290 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530291
Rajesh Chauhana34c6e62014-03-25 16:37:58 +0530292 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800293
Chilam NG571c65a2013-01-19 12:27:36 +0530294 for (i = 0; i < 256; i++) {
Hoonki Lee387663d2013-02-05 18:08:43 -0800295 head = &pHddTdlsCtx->peer_list[i];
Chilam NG571c65a2013-01-19 12:27:36 +0530296
Hoonki Lee387663d2013-02-05 18:08:43 -0800297 list_for_each (pos, head) {
298 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
Chilam NG571c65a2013-01-19 12:27:36 +0530299
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800300 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Hoonki Lee66b75f32013-04-16 18:30:07 -0700301 "%s: " MAC_ADDRESS_STR " link_status %d"
302 " tdls_support %d", __func__, MAC_ADDR_ARRAY(curr_peer->peerMac),
Gopichand Nakkala34d1b062013-03-19 15:28:33 -0700303 curr_peer->link_status, curr_peer->tdls_support);
Hoonki Lee387663d2013-02-05 18:08:43 -0800304
Chilam NG571c65a2013-01-19 12:27:36 +0530305 if (eTDLS_CAP_SUPPORTED == curr_peer->tdls_support) {
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800306 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Hoonki Lee66b75f32013-04-16 18:30:07 -0700307 "tx %d, rx %d (thr.pkt %d/idle %d), rssi %d (thr.trig %d/hys %d/tear %d)",
308 curr_peer->tx_pkt, curr_peer->rx_pkt,
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800309 pHddTdlsCtx->threshold_config.tx_packet_n,
Hoonki Lee66b75f32013-04-16 18:30:07 -0700310 pHddTdlsCtx->threshold_config.idle_packet_n,
311 curr_peer->rssi,
312 pHddTdlsCtx->threshold_config.rssi_trigger_threshold,
313 pHddTdlsCtx->threshold_config.rssi_hysteresis,
314 pHddTdlsCtx->threshold_config.rssi_teardown_threshold);
Chilam Ng01120412013-02-19 18:32:21 -0800315
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800316 if ((eTDLS_LINK_IDLE == curr_peer->link_status) ||
317 (eTDLS_LINK_DISCOVERING == curr_peer->link_status)){
Sunil Dutt961ecbd2013-11-28 20:04:07 +0530318
319 if (pHddCtx->cfg_ini->fTDLSExternalControl &&
320 (FALSE == curr_peer->isForcedPeer)) {
321 continue;
322 }
323
Chilam NG571c65a2013-01-19 12:27:36 +0530324 if (curr_peer->tx_pkt >=
325 pHddTdlsCtx->threshold_config.tx_packet_n) {
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800326
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800327 if (HDD_MAX_NUM_TDLS_STA > wlan_hdd_tdlsConnectedPeers(pHddTdlsCtx->pAdapter))
Gopichand Nakkalab977a972013-02-18 19:15:09 -0800328 {
329
Gopichand Nakkala34d1b062013-03-19 15:28:33 -0700330 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL, "Tput trigger TDLS pre-setup");
Chilam NG571c65a2013-01-19 12:27:36 +0530331#ifdef CONFIG_TDLS_IMPLICIT
Hoonki Leed37cbb32013-04-20 00:31:14 -0700332 wlan_hdd_tdls_pre_setup_init_work(pHddTdlsCtx, curr_peer);
Chilam NG571c65a2013-01-19 12:27:36 +0530333#endif
Gopichand Nakkalab977a972013-02-18 19:15:09 -0800334 }
335 else
336 {
337 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800338 "%s: Maximum peer connected already! %d",
339 __func__, wlan_hdd_tdlsConnectedPeers(pHddTdlsCtx->pAdapter) );
Gopichand Nakkalab977a972013-02-18 19:15:09 -0800340 }
Hoonki Leecdd8e962013-01-20 00:45:46 -0800341 goto next_peer;
Chilam NG571c65a2013-01-19 12:27:36 +0530342 }
Hoonki Leefb8df672013-04-10 18:20:34 -0700343 }
344 else if (eTDLS_LINK_CONNECTED == curr_peer->link_status) {
Chilam Ng01120412013-02-19 18:32:21 -0800345 if ((tANI_S32)curr_peer->rssi <
346 (tANI_S32)pHddTdlsCtx->threshold_config.rssi_teardown_threshold) {
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800347
Chilam Ng01120412013-02-19 18:32:21 -0800348 VOS_TRACE( VOS_MODULE_ID_HDD,
349 VOS_TRACE_LEVEL_WARN,
350 "Tear down - low RSSI: " MAC_ADDRESS_STR "!",
351 MAC_ADDR_ARRAY(curr_peer->peerMac));
352#ifdef CONFIG_TDLS_IMPLICIT
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -0700353 wlan_hdd_tdls_indicate_teardown(pHddTdlsCtx->pAdapter,
354 curr_peer,
355 eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON);
Chilam Ng01120412013-02-19 18:32:21 -0800356#endif
Hoonki Leecdd8e962013-01-20 00:45:46 -0800357 goto next_peer;
Chilam NG571c65a2013-01-19 12:27:36 +0530358 }
Chilam Ng01120412013-02-19 18:32:21 -0800359
Naresh Jayaramdb4514b2013-11-25 18:08:10 +0530360 /* Only teardown based on non zero idle packet threshold, to address a use
361 * case where this threshold does not get consider for TEAR DOWN.
362 */
363
364 if (( 0 != pHddTdlsCtx->threshold_config.idle_packet_n ) &&
365 ((curr_peer->tx_pkt <
Chilam Ng01120412013-02-19 18:32:21 -0800366 pHddTdlsCtx->threshold_config.idle_packet_n) &&
367 (curr_peer->rx_pkt <
Naresh Jayaramdb4514b2013-11-25 18:08:10 +0530368 pHddTdlsCtx->threshold_config.idle_packet_n))) {
Chilam Ng01120412013-02-19 18:32:21 -0800369 if (VOS_TIMER_STATE_RUNNING !=
370 vos_timer_getCurrentState(&curr_peer->peerIdleTimer)) {
371 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
372 "Tx/Rx Idle timer start: " MAC_ADDRESS_STR "!",
373 MAC_ADDR_ARRAY(curr_peer->peerMac));
Gopichand Nakkala3046fc92013-03-23 13:56:43 -0700374 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
375 &curr_peer->peerIdleTimer,
376 pHddTdlsCtx->threshold_config.idle_timeout_t);
Chilam Ng01120412013-02-19 18:32:21 -0800377 }
378 } else {
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800379 if (VOS_TIMER_STATE_RUNNING ==
380 vos_timer_getCurrentState(&curr_peer->peerIdleTimer)) {
Chilam Ng01120412013-02-19 18:32:21 -0800381 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
382 "Tx/Rx Idle timer stop: " MAC_ADDRESS_STR "!",
383 MAC_ADDR_ARRAY(curr_peer->peerMac));
384 vos_timer_stop( &curr_peer->peerIdleTimer);
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800385 }
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800386 }
Chilam Ng01120412013-02-19 18:32:21 -0800387
Hoonki Leecdd8e962013-01-20 00:45:46 -0800388// if (curr_peer->rssi <
389// (pHddTdlsCtx->threshold_config.rssi_hysteresis +
390// pHddTdlsCtx->ap_rssi)) {
391//
392//#ifdef CONFIG_TDLS_IMPLICIT
393// cfg80211_tdls_oper_request(pHddTdlsCtx->dev,
394// curr_peer->peerMac,
395// NL80211_TDLS_TEARDOWN, FALSE,
396// GFP_KERNEL);
397//#endif
398// }
Chilam NG571c65a2013-01-19 12:27:36 +0530399 }
Chilam Ng01120412013-02-19 18:32:21 -0800400 } else if (eTDLS_CAP_UNKNOWN == curr_peer->tdls_support) {
Sunil Dutt961ecbd2013-11-28 20:04:07 +0530401
402 if (pHddCtx->cfg_ini->fTDLSExternalControl &&
403 (FALSE == curr_peer->isForcedPeer)) {
404 continue;
405 }
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -0700406 if (!TDLS_IS_CONNECTED(curr_peer)) {
Chilam Ng01120412013-02-19 18:32:21 -0800407 if (curr_peer->tx_pkt >=
408 pHddTdlsCtx->threshold_config.tx_packet_n) {
Chilam Ng01120412013-02-19 18:32:21 -0800409
Sunil Duttb0d39242014-09-10 23:54:51 +0530410 /* Ignore discovery attempt if External Control is enabled, that
411 * is, peer is forced. In that case, continue discovery attempt
412 * regardless attempt count
413 */
414 if (curr_peer->isForcedPeer || curr_peer->discovery_attempt++ <
Chilam Ng01120412013-02-19 18:32:21 -0800415 pHddTdlsCtx->threshold_config.discovery_tries_n) {
Gopichand Nakkala34d1b062013-03-19 15:28:33 -0700416 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL, "TDLS UNKNOWN discover ");
Hoonki Leed37cbb32013-04-20 00:31:14 -0700417#ifdef CONFIG_TDLS_IMPLICIT
418 wlan_hdd_tdls_pre_setup_init_work(pHddTdlsCtx, curr_peer);
419#endif
Chilam Ng01120412013-02-19 18:32:21 -0800420 }
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800421 else
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800422 {
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800423 curr_peer->tdls_support = eTDLS_CAP_NOT_SUPPORTED;
Atul Mittal115287b2014-07-08 13:26:33 +0530424 wlan_hdd_tdls_set_peer_link_status(
425 curr_peer,
426 eTDLS_LINK_IDLE,
427 eTDLS_LINK_NOT_SUPPORTED);
428
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800429 }
Chilam Ng01120412013-02-19 18:32:21 -0800430 }
431 }
Chilam NG571c65a2013-01-19 12:27:36 +0530432 }
433
Hoonki Leecdd8e962013-01-20 00:45:46 -0800434next_peer:
Chilam NG571c65a2013-01-19 12:27:36 +0530435 curr_peer->tx_pkt = 0;
Chilam Ng1279e232013-01-25 15:06:52 -0800436 curr_peer->rx_pkt = 0;
Hoonki Lee387663d2013-02-05 18:08:43 -0800437 }
Chilam NG571c65a2013-01-19 12:27:36 +0530438 }
439
Gopichand Nakkala3046fc92013-03-23 13:56:43 -0700440 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
441 &pHddTdlsCtx->peerUpdateTimer,
442 pHddTdlsCtx->threshold_config.tx_period_t);
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530443 mutex_unlock(&pHddCtx->tdls_lock);
Chilam NG571c65a2013-01-19 12:27:36 +0530444}
445
Chilam Ng1279e232013-01-25 15:06:52 -0800446static v_VOID_t wlan_hdd_tdls_idle_cb( v_PVOID_t userData )
447{
Lee Hoonkic1262f22013-01-24 21:59:00 -0800448#ifdef CONFIG_TDLS_IMPLICIT
Chilam Ng1279e232013-01-25 15:06:52 -0800449 hddTdlsPeer_t *curr_peer = (hddTdlsPeer_t *)userData;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530450 tdlsCtx_t *pHddTdlsCtx;
451 hdd_context_t *pHddCtx;
Chilam Ng1279e232013-01-25 15:06:52 -0800452
Rajesh Chauhan1ace6002013-04-18 18:08:21 -0700453 if (NULL == curr_peer)
454 {
455 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
c_hpothu7f63e882013-10-02 19:13:35 +0530456 FL("Invalid tdls idle timer expired"));
Rajesh Chauhan1ace6002013-04-18 18:08:21 -0700457 return;
458 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530459 pHddTdlsCtx = curr_peer->pHddTdlsCtx;
460
461 if ((NULL == pHddTdlsCtx) || (NULL == pHddTdlsCtx->pAdapter) )
c_hpothu7f63e882013-10-02 19:13:35 +0530462 {
463 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
464 FL(" pHddTdlsCtx or pAdapter points to NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530465 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530466 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530467
468 pHddCtx = WLAN_HDD_GET_CTX( pHddTdlsCtx->pAdapter );
469
c_hpothu7f63e882013-10-02 19:13:35 +0530470 if(0 != (wlan_hdd_validate_context(pHddCtx)))
471 {
472 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
473 FL("pHddCtx is not valid"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530474 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530475 }
Rajesh Chauhan1ace6002013-04-18 18:08:21 -0700476
477 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Arif Hussain6d2a3322013-11-17 19:50:10 -0800478 "%s: Tx/Rx Idle " MAC_ADDRESS_STR " tx_pkt: %d, rx_pkt: %d, idle_packet_n: %d",
Rajesh Chauhan1ace6002013-04-18 18:08:21 -0700479 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac),
480 curr_peer->tx_pkt,
481 curr_peer->rx_pkt,
482 curr_peer->pHddTdlsCtx->threshold_config.idle_packet_n);
483
Rajesh Chauhana34c6e62014-03-25 16:37:58 +0530484 mutex_lock(&pHddCtx->tdls_lock);
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800485
Rajesh Chauhan1ace6002013-04-18 18:08:21 -0700486 /* Check tx/rx statistics on this tdls link for recent activities and
487 * then decide whether to tear down the link or keep it.
488 */
489 if ((curr_peer->tx_pkt >= curr_peer->pHddTdlsCtx->threshold_config.idle_packet_n) || (curr_peer->rx_pkt >= curr_peer->pHddTdlsCtx->threshold_config.idle_packet_n))
490 {
491 /* this tdls link got back to normal, so keep it */
492 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
493 "%s: tdls link to " MAC_ADDRESS_STR " back to normal, will stay",
494 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
495 }
496 else
497 {
498 /* this tdls link needs to get torn down */
499 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
500 "%s: trigger tdls link to " MAC_ADDRESS_STR " down",
501 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
502
503 wlan_hdd_tdls_indicate_teardown(curr_peer->pHddTdlsCtx->pAdapter,
504 curr_peer,
505 eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON);
506 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530507 mutex_unlock(&pHddCtx->tdls_lock);
Chilam Ng1279e232013-01-25 15:06:52 -0800508#endif
509}
510
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700511static v_VOID_t wlan_hdd_tdls_discovery_timeout_peer_cb(v_PVOID_t userData)
512{
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700513 int i;
514 struct list_head *head;
515 hddTdlsPeer_t *tmp;
516 struct list_head *pos, *q;
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700517 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530518 hdd_context_t *pHddCtx;
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700519
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530520 pHddTdlsCtx = (tdlsCtx_t *)userData;
521
522 if ((NULL == pHddTdlsCtx) || (NULL == pHddTdlsCtx->pAdapter) )
c_hpothu7f63e882013-10-02 19:13:35 +0530523 {
524 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
525 FL(" pHddTdlsCtx or pAdapter points to NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530526 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530527 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530528
Sushant Kaushik15c4c522014-08-14 12:24:49 +0530529 if (WLAN_HDD_ADAPTER_MAGIC != pHddTdlsCtx->pAdapter->magic)
530 {
531 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
532 FL("pAdapter has invalid magic"));
533 return;
534 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530535 pHddCtx = WLAN_HDD_GET_CTX( pHddTdlsCtx->pAdapter );
536
c_hpothu7f63e882013-10-02 19:13:35 +0530537 if(0 != (wlan_hdd_validate_context(pHddCtx)))
538 {
539 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
540 FL("pHddCtx is not valid"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530541 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530542 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530543
Rajesh Chauhana34c6e62014-03-25 16:37:58 +0530544 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700545
546 for (i = 0; i < 256; i++) {
547 head = &pHddTdlsCtx->peer_list[i];
548 list_for_each_safe (pos, q, head) {
549 tmp = list_entry(pos, hddTdlsPeer_t, node);
550 if (eTDLS_LINK_DISCOVERING == tmp->link_status)
551 {
552 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
553 "%s: " MAC_ADDRESS_STR " to idle state", __func__,
554 MAC_ADDR_ARRAY(tmp->peerMac));
Atul Mittal115287b2014-07-08 13:26:33 +0530555 wlan_hdd_tdls_set_peer_link_status(
556 tmp,
557 eTDLS_LINK_IDLE,
Atul Mittalad630e42014-10-07 19:19:14 +0530558 eTDLS_LINK_NOT_SUPPORTED);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700559 }
560 }
561 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700562
563 pHddTdlsCtx->discovery_sent_cnt = 0;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -0700564 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700565
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530566 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700567
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700568 wlan_hdd_tdls_check_bmps(pHddTdlsCtx->pAdapter);
569
570 return;
571}
572
Hoonki Lee14621352013-04-16 17:51:19 -0700573static v_VOID_t wlan_hdd_tdls_initiator_wait_cb( v_PVOID_t userData )
574{
575 hddTdlsPeer_t *curr_peer = (hddTdlsPeer_t *)userData;
576 tdlsCtx_t *pHddTdlsCtx;
577
578 if ( NULL == curr_peer )
c_hpothu7f63e882013-10-02 19:13:35 +0530579 {
580 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
581 FL("curr_peer is NULL"));
Hoonki Lee14621352013-04-16 17:51:19 -0700582 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530583 }
Hoonki Lee14621352013-04-16 17:51:19 -0700584
585 pHddTdlsCtx = curr_peer->pHddTdlsCtx;
586
587 if ( NULL == pHddTdlsCtx )
c_hpothu7f63e882013-10-02 19:13:35 +0530588 {
589 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
590 FL("pHddTdlsCtx is NULL"));
Hoonki Lee14621352013-04-16 17:51:19 -0700591 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530592 }
Hoonki Lee14621352013-04-16 17:51:19 -0700593
594 WLANTL_ResumeDataTx( (WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter))->pvosContext,
595 (v_U8_t *)&curr_peer->staId);
596}
597
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800598static void wlan_hdd_tdls_free_list(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800599{
600 int i;
601 struct list_head *head;
602 hddTdlsPeer_t *tmp;
603 struct list_head *pos, *q;
604
c_hpothu7f63e882013-10-02 19:13:35 +0530605 if (NULL == pHddTdlsCtx)
606 {
607 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
608 FL("pHddTdlsCtx is NULL"));
609 return;
610 }
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800611
612 for (i = 0; i < 256; i++) {
613 head = &pHddTdlsCtx->peer_list[i];
614 list_for_each_safe (pos, q, head) {
615 tmp = list_entry(pos, hddTdlsPeer_t, node);
616 list_del(pos);
617 vos_mem_free(tmp);
Srinivas Girigowda8d2348f2013-12-12 12:14:15 -0800618 tmp = NULL;
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800619 }
620 }
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800621}
622
Sameer Thalappilbee426e2013-10-30 10:30:30 -0700623static void wlan_hdd_tdls_schedule_scan(struct work_struct *work)
624{
625 tdls_scan_context_t *scan_ctx =
626 container_of(work, tdls_scan_context_t, tdls_scan_work.work);
627
628 if (NULL == scan_ctx)
c_hpothu7f63e882013-10-02 19:13:35 +0530629 {
630 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
631 FL("scan_ctx is NULL"));
Sameer Thalappilbee426e2013-10-30 10:30:30 -0700632 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530633 }
Sameer Thalappilbee426e2013-10-30 10:30:30 -0700634
635 if (unlikely(TDLS_CTX_MAGIC != scan_ctx->magic))
636 return;
637
638 scan_ctx->attempt++;
639
640 wlan_hdd_cfg80211_scan(scan_ctx->wiphy,
641#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
642 scan_ctx->dev,
643#endif
644 scan_ctx->scan_request);
645}
646
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530647void wlan_hdd_tdls_btCoex_cb(void *data, int indType)
648{
649 hdd_adapter_t *pAdapter;
650 hdd_context_t *pHddCtx;
651 u16 connectedTdlsPeers;
652 tdlsCtx_t *pHddTdlsCtx;
653 hddTdlsPeer_t *currPeer;
654 hdd_scaninfo_t *pScanInfo;
655
656 if ((NULL == data) || (indType < 0))
657 {
658 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
659 FL("Invalid arguments"));
660 return;
661 }
662
663 pHddCtx = (hdd_context_t *)data;
664 if (0 != (wlan_hdd_validate_context(pHddCtx)))
665 {
666 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
667 FL("pHddCtx is not valid"));
668 return;
669 }
670
671 /* if tdls is not enabled, then continue btCoex */
672 if (eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode)
673 {
674 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
675 FL("tdls is not enabled"));
676 return;
677 }
678
679 /* get pAdapter context, do we need WLAN_HDD_P2P_CLIENT */
680 pAdapter = hdd_get_adapter(pHddCtx, WLAN_HDD_INFRA_STATION);
681 if (NULL == pAdapter)
682 {
683 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
684 FL("pAdapter is not valid"));
685 return;
686 }
687
688 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
689 if (NULL == pHddTdlsCtx)
690 {
691 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
692 FL("pHddTdlsCtx is not valid"));
693 return;
694 }
695
696 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
697 "%s: BtCoex notification type %d", __func__, indType);
698 /* BtCoex notification type enabled, Disable TDLS */
699 if (indType == SIR_COEX_IND_TYPE_TDLS_DISABLE)
700 {
701 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
702 FL("BtCoex notification, Disable TDLS"));
703
704 pScanInfo = &pHddCtx->scan_info;
705 // Lets do abort scan if scan is pending
706 if ((pScanInfo != NULL) && pScanInfo->mScanPending)
707 {
708 hdd_abort_mac_scan(pHddCtx, pScanInfo->sessionId,
709 eCSR_SCAN_ABORT_DEFAULT);
710 }
711
712 /* tdls is in progress */
713 currPeer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0);
714 if (NULL != currPeer)
715 {
716 wlan_hdd_tdls_set_peer_link_status (currPeer,
717 eTDLS_LINK_IDLE,
718 eTDLS_LINK_UNSPECIFIED);
719 }
720
721 /* while tdls is up */
722 if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode ||
723 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode)
724 {
725 connectedTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
726 /* disable implicit trigger logic & tdls operatoin */
727 wlan_hdd_tdls_set_mode(pHddCtx, eTDLS_SUPPORT_DISABLED, FALSE);
728 pHddCtx->is_tdls_btc_enabled = FALSE;
729
730 /* teardown the peers on the btcoex */
731 if (connectedTdlsPeers)
732 {
733 tANI_U8 staIdx;
734 hddTdlsPeer_t *curr_peer;
735
736 for (staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++)
737 {
738 if (pHddCtx->tdlsConnInfo[staIdx].staId)
739 {
740 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
741 ("%s: indicate TDLS teadown (staId %d)"),
742 __func__,pHddCtx->tdlsConnInfo[staIdx].staId);
743
744 #ifdef CONFIG_TDLS_IMPLICIT
745 curr_peer = wlan_hdd_tdls_find_all_peer(pHddCtx,
746 pHddCtx->tdlsConnInfo[staIdx].peerMac.bytes);
747 if(curr_peer) {
748 wlan_hdd_tdls_indicate_teardown(
749 curr_peer->pHddTdlsCtx->pAdapter, curr_peer,
750 eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON);
751 }
752 #endif
753 }
754 }
755 }
756 }
757 }
758 /* BtCoex notification type enabled, Enable TDLS */
759 else if (indType == SIR_COEX_IND_TYPE_TDLS_ENABLE)
760 {
761 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
762 FL("BtCoex notification, Enable TDLS"));
763 /* if tdls was enabled before btCoex, re-enable tdls mode */
764 if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode_last ||
765 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode_last)
766 {
767 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
768 ("%s: revert tdls mode %d"), __func__,
769 pHddCtx->tdls_mode_last);
770 pHddCtx->is_tdls_btc_enabled = TRUE;
771 wlan_hdd_tdls_set_mode(pHddCtx, pHddCtx->tdls_mode_last, FALSE);
772 }
773 }
774 return;
775}
776
Agarwal Ashish4b87f922014-06-18 03:03:21 +0530777/* initialize TDLS global context */
778void wlan_hdd_tdls_init(hdd_context_t *pHddCtx )
779{
780 v_U8_t staIdx;
Sameer Thalappilbee426e2013-10-30 10:30:30 -0700781
Agarwal Ashish4b87f922014-06-18 03:03:21 +0530782 pHddCtx->connected_peer_count = 0;
783
784 pHddCtx->tdls_scan_ctxt.magic = 0;
785 pHddCtx->tdls_scan_ctxt.attempt = 0;
786 pHddCtx->tdls_scan_ctxt.reject = 0;
787 pHddCtx->tdls_scan_ctxt.scan_request = NULL;
788
789 for (staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++)
790 {
791 pHddCtx->tdlsConnInfo[staIdx].staId = 0;
792 pHddCtx->tdlsConnInfo[staIdx].sessionId = 255;
793 vos_mem_zero(&pHddCtx->tdlsConnInfo[staIdx].peerMac,
794 sizeof(v_MACADDR_t)) ;
795 }
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530796 pHddCtx->is_tdls_btc_enabled = TRUE;
797 sme_RegisterBtCoexTDLSCallback(pHddCtx->hHal, wlan_hdd_tdls_btCoex_cb);
Agarwal Ashish4b87f922014-06-18 03:03:21 +0530798
799 if (FALSE == pHddCtx->cfg_ini->fEnableTDLSImplicitTrigger)
800 {
801 pHddCtx->tdls_mode = eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY;
802 hddLog(VOS_TRACE_LEVEL_ERROR, "%s TDLS Implicit trigger not enabled!", __func__);
803 }
804 else
805 {
806 pHddCtx->tdls_mode = eTDLS_SUPPORT_ENABLED;
807 }
808}
809
810int wlan_hdd_sta_tdls_init(hdd_adapter_t *pAdapter)
Chilam Ng01120412013-02-19 18:32:21 -0800811{
Chilam Ng01120412013-02-19 18:32:21 -0800812 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
Hoonki Lee27511902013-03-14 18:19:06 -0700813 tdlsCtx_t *pHddTdlsCtx;
Chilam Ng01120412013-02-19 18:32:21 -0800814 int i;
Sunil Dutt66485cb2013-12-19 19:05:03 +0530815 if (NULL == pHddCtx)
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +0530816 {
817 hddLog(VOS_TRACE_LEVEL_ERROR, "%s pHddCtx is NULL", __func__);
Sunil Dutt66485cb2013-12-19 19:05:03 +0530818 return -1;
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +0530819 }
Sunil Dutt66485cb2013-12-19 19:05:03 +0530820
Sunil Dutt66485cb2013-12-19 19:05:03 +0530821
Hoonki Lee27511902013-03-14 18:19:06 -0700822 if ((FALSE == pHddCtx->cfg_ini->fEnableTDLSSupport) ||
823 (FALSE == sme_IsFeatureSupportedByFW(TDLS)))
824 {
825 pHddCtx->tdls_mode = eTDLS_SUPPORT_NOT_ENABLED;
826 pAdapter->sessionCtx.station.pHddTdlsCtx = NULL;
827 hddLog(VOS_TRACE_LEVEL_ERROR, "%s TDLS not enabled (%d) or FW doesn't support (%d)!",
828 __func__, pHddCtx->cfg_ini->fEnableTDLSSupport,
829 sme_IsFeatureSupportedByFW(TDLS));
830 return 0;
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800831 }
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +0530832 /* TDLS is supported only in STA / P2P Client modes,
833 * hence the check for TDLS support in a specific Device mode.
834 * Do not return a failure rather do not continue further
835 * with the initialization as tdls_init would be called
836 * during the open adapter for a p2p interface at which point
837 * the device mode would be a P2P_DEVICE. The point here is to
838 * continue initialization for STA / P2P Client modes.
839 * TDLS exit also check for the device mode for clean up hence
840 * there is no issue even if success is returned.
841 */
842 if (0 == WLAN_HDD_IS_TDLS_SUPPORTED_ADAPTER(pAdapter))
843 {
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +0530844 hddLog(VOS_TRACE_LEVEL_ERROR, "%s TDLS is not supported in mode : %d", __func__, pAdapter->device_mode);
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +0530845 return 0;
846 }
847 /* Check for the valid pHddTdlsCtx. If valid do not further
848 * allocate the memory, rather continue with the initialization.
849 * If tdls_initialization would get reinvoked without tdls_exit
850 * getting invoked (SSR) there is no point to further proceed
851 * with the memory allocations.
852 */
853 if (NULL == pAdapter->sessionCtx.station.pHddTdlsCtx)
854 {
855 pHddTdlsCtx = vos_mem_malloc(sizeof(tdlsCtx_t));
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800856
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +0530857 if (NULL == pHddTdlsCtx) {
858 hddLog(VOS_TRACE_LEVEL_ERROR, "%s malloc failed!", __func__);
859 pAdapter->sessionCtx.station.pHddTdlsCtx = NULL;
Sunil Dutt66485cb2013-12-19 19:05:03 +0530860 mutex_unlock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +0530861 return -1;
862 }
863 /* initialize TDLS pAdater context */
864 vos_mem_zero(pHddTdlsCtx, sizeof(tdlsCtx_t));
865#ifdef TDLS_USE_SEPARATE_DISCOVERY_TIMER
866 vos_timer_init(&pHddTdlsCtx->peerDiscoverTimer,
867 VOS_TIMER_TYPE_SW,
868 wlan_hdd_tdls_discover_peer_cb,
869 pHddTdlsCtx);
870#endif
Hoonki Lee27511902013-03-14 18:19:06 -0700871
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +0530872 vos_timer_init(&pHddTdlsCtx->peerUpdateTimer,
873 VOS_TIMER_TYPE_SW,
874 wlan_hdd_tdls_update_peer_cb,
875 pHddTdlsCtx);
876 vos_timer_init(&pHddTdlsCtx->peerDiscoveryTimeoutTimer,
877 VOS_TIMER_TYPE_SW,
878 wlan_hdd_tdls_discovery_timeout_peer_cb,
879 pHddTdlsCtx);
880
881 pAdapter->sessionCtx.station.pHddTdlsCtx = pHddTdlsCtx;
Hoonki Lee27511902013-03-14 18:19:06 -0700882 }
883
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +0530884 pHddTdlsCtx = pAdapter->sessionCtx.station.pHddTdlsCtx;
Hoonki Lee27511902013-03-14 18:19:06 -0700885
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700886 sme_SetTdlsPowerSaveProhibited(WLAN_HDD_GET_HAL_CTX(pAdapter), 0);
Hoonki Lee27511902013-03-14 18:19:06 -0700887
Hoonki Lee27511902013-03-14 18:19:06 -0700888 pHddTdlsCtx->pAdapter = pAdapter;
889
890 for (i = 0; i < 256; i++)
891 {
892 INIT_LIST_HEAD(&pHddTdlsCtx->peer_list[i]);
893 }
894
Hoonki Leed37cbb32013-04-20 00:31:14 -0700895 pHddTdlsCtx->curr_candidate = NULL;
896 pHddTdlsCtx->magic = 0;
897
Hoonki Lee27511902013-03-14 18:19:06 -0700898 /* remember configuration even if it is not used right now. it could be used later */
899 pHddTdlsCtx->threshold_config.tx_period_t = pHddCtx->cfg_ini->fTDLSTxStatsPeriod;
900 pHddTdlsCtx->threshold_config.tx_packet_n = pHddCtx->cfg_ini->fTDLSTxPacketThreshold;
901 pHddTdlsCtx->threshold_config.discovery_period_t = pHddCtx->cfg_ini->fTDLSDiscoveryPeriod;
902 pHddTdlsCtx->threshold_config.discovery_tries_n = pHddCtx->cfg_ini->fTDLSMaxDiscoveryAttempt;
903 pHddTdlsCtx->threshold_config.idle_timeout_t = pHddCtx->cfg_ini->fTDLSIdleTimeout;
904 pHddTdlsCtx->threshold_config.idle_packet_n = pHddCtx->cfg_ini->fTDLSIdlePacketThreshold;
905 pHddTdlsCtx->threshold_config.rssi_hysteresis = pHddCtx->cfg_ini->fTDLSRSSIHysteresis;
906 pHddTdlsCtx->threshold_config.rssi_trigger_threshold = pHddCtx->cfg_ini->fTDLSRSSITriggerThreshold;
907 pHddTdlsCtx->threshold_config.rssi_teardown_threshold = pHddCtx->cfg_ini->fTDLSRSSITeardownThreshold;
Chilam NG571c65a2013-01-19 12:27:36 +0530908
Sameer Thalappilbee426e2013-10-30 10:30:30 -0700909 INIT_WORK(&pHddTdlsCtx->implicit_setup, wlan_hdd_tdls_pre_setup);
910 INIT_DELAYED_WORK(&pHddCtx->tdls_scan_ctxt.tdls_scan_work, wlan_hdd_tdls_schedule_scan);
Hoonki Lee27511902013-03-14 18:19:06 -0700911
912 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +0530913}
914
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800915void wlan_hdd_tdls_exit(hdd_adapter_t *pAdapter)
Chilam NG571c65a2013-01-19 12:27:36 +0530916{
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800917 tdlsCtx_t *pHddTdlsCtx;
Hoonki Lee93e67ff2013-03-19 15:49:25 -0700918 hdd_context_t *pHddCtx;
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800919
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +0530920 /*
921 * NOTE: The Callers of this function should ensure to acquire the
922 * tdls_lock to avoid any concurrent access to the Adapter.
923 */
924
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530925 pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
Agarwal Ashish9ffa5b92014-11-18 21:07:02 +0530926
927 if (NULL == pHddCtx || NULL == pHddCtx->cfg_ini)
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530928 {
Agarwal Ashish9ffa5b92014-11-18 21:07:02 +0530929 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
930 "%s: HDD context is Null", __func__);
931 return ;
932 }
933
934 if (pHddCtx->isLogpInProgress)
935 {
936 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
937 "%s: LOGP in Progress. Ignore!!!", __func__);
938 return ;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530939 }
940
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800941 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800942 if (NULL == pHddTdlsCtx)
943 {
c_hpothu7f63e882013-10-02 19:13:35 +0530944 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
945 FL("pHddTdlsCtx is NULL"));
Hoonki Leebfee0342013-01-21 16:43:45 -0800946 return;
947 }
Sameer Thalappilbee426e2013-10-30 10:30:30 -0700948#ifdef WLAN_OPEN_SOURCE
949 cancel_work_sync(&pHddTdlsCtx->implicit_setup);
950 cancel_delayed_work_sync(&pHddCtx->tdls_scan_ctxt.tdls_scan_work);
951#endif
Hoonki Leebfee0342013-01-21 16:43:45 -0800952
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800953 /* must stop timer here before freeing peer list, because peerIdleTimer is
954 part of peer list structure. */
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800955 wlan_hdd_tdls_timers_destroy(pHddTdlsCtx);
956 wlan_hdd_tdls_free_list(pHddTdlsCtx);
Chilam Nga75d8b62013-01-29 01:35:59 -0800957
Hoonki Lee93e67ff2013-03-19 15:49:25 -0700958 wlan_hdd_tdls_free_scan_request(&pHddCtx->tdls_scan_ctxt);
Sushant Kaushik15c4c522014-08-14 12:24:49 +0530959 pHddTdlsCtx->magic = 0;
960 pHddTdlsCtx->pAdapter = NULL;
Chilam Nga75d8b62013-01-29 01:35:59 -0800961 vos_mem_free(pHddTdlsCtx);
Pradeep Reddy POTTETI59c90d62014-03-24 19:45:47 +0530962 pAdapter->sessionCtx.station.pHddTdlsCtx = NULL;
Chilam Nga75d8b62013-01-29 01:35:59 -0800963 pHddTdlsCtx = NULL;
Chilam NG571c65a2013-01-19 12:27:36 +0530964}
965
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +0530966/* stop all monitoring timers per Adapter */
967static void wlan_hdd_tdls_monitor_timers_stop(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800968{
Hoonki Leed37cbb32013-04-20 00:31:14 -0700969#ifdef TDLS_USE_SEPARATE_DISCOVERY_TIMER
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800970 vos_timer_stop(&pHddTdlsCtx->peerDiscoverTimer);
Hoonki Leed37cbb32013-04-20 00:31:14 -0700971#endif
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800972 vos_timer_stop(&pHddTdlsCtx->peerUpdateTimer);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700973 vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +0530974}
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800975
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +0530976/* stop all per peer timers */
977static void wlan_hdd_tdls_peer_timers_stop(tdlsCtx_t *pHddTdlsCtx)
978{
979 int i;
980 struct list_head *head;
981 struct list_head *pos;
982 hddTdlsPeer_t *curr_peer;
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800983 for (i = 0; i < 256; i++)
984 {
985 head = &pHddTdlsCtx->peer_list[i];
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800986 list_for_each (pos, head) {
987 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800988 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Chilam Ng01120412013-02-19 18:32:21 -0800989 "%s: " MAC_ADDRESS_STR " -> stop idle timer",
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800990 __func__,
Chilam Ng01120412013-02-19 18:32:21 -0800991 MAC_ADDR_ARRAY(curr_peer->peerMac));
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800992 vos_timer_stop ( &curr_peer->peerIdleTimer );
Hoonki Lee14621352013-04-16 17:51:19 -0700993 vos_timer_stop( &curr_peer->initiatorWaitTimeoutTimer );
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800994 }
995 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800996}
997
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +0530998/* stop all the tdls timers running */
999static void wlan_hdd_tdls_timers_stop(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001000{
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301001 wlan_hdd_tdls_monitor_timers_stop(pHddTdlsCtx);
1002 wlan_hdd_tdls_peer_timers_stop(pHddTdlsCtx);
1003}
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001004
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301005static void wlan_hdd_tdls_monitor_timers_destroy(tdlsCtx_t *pHddTdlsCtx)
1006{
Hoonki Leed37cbb32013-04-20 00:31:14 -07001007#ifdef TDLS_USE_SEPARATE_DISCOVERY_TIMER
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001008 vos_timer_stop(&pHddTdlsCtx->peerDiscoverTimer);
1009 vos_timer_destroy(&pHddTdlsCtx->peerDiscoverTimer);
Hoonki Leed37cbb32013-04-20 00:31:14 -07001010#endif
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001011 vos_timer_stop(&pHddTdlsCtx->peerUpdateTimer);
1012 vos_timer_destroy(&pHddTdlsCtx->peerUpdateTimer);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001013 vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
1014 vos_timer_destroy(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301015}
1016/*Free all the timers related to the TDLS peer */
1017static void wlan_hdd_tdls_peer_timers_destroy(tdlsCtx_t *pHddTdlsCtx)
1018{
1019 int i;
1020 struct list_head *head;
1021 struct list_head *pos;
1022 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001023 for (i = 0; i < 256; i++)
1024 {
1025 head = &pHddTdlsCtx->peer_list[i];
1026
1027 list_for_each (pos, head) {
1028 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
1029
1030 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Chilam Ng01120412013-02-19 18:32:21 -08001031 "%s: " MAC_ADDRESS_STR " -> destroy idle timer",
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001032 __func__,
Chilam Ng01120412013-02-19 18:32:21 -08001033 MAC_ADDR_ARRAY(curr_peer->peerMac));
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001034 vos_timer_stop ( &curr_peer->peerIdleTimer );
1035 vos_timer_destroy ( &curr_peer->peerIdleTimer );
Hoonki Lee14621352013-04-16 17:51:19 -07001036 vos_timer_stop(&curr_peer->initiatorWaitTimeoutTimer);
1037 vos_timer_destroy(&curr_peer->initiatorWaitTimeoutTimer);
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001038 }
1039 }
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301040
1041}
1042
1043/* destroy all the tdls timers running */
1044static void wlan_hdd_tdls_timers_destroy(tdlsCtx_t *pHddTdlsCtx)
1045{
1046 wlan_hdd_tdls_monitor_timers_destroy(pHddTdlsCtx);
1047 wlan_hdd_tdls_peer_timers_destroy(pHddTdlsCtx);
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001048}
1049
Hoonki Lee387663d2013-02-05 18:08:43 -08001050/* if mac address exist, return pointer
1051 if mac address doesn't exist, create a list and add, return pointer
1052 return NULL if fails to get new mac address
1053*/
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001054hddTdlsPeer_t *wlan_hdd_tdls_get_peer(hdd_adapter_t *pAdapter, u8 *mac)
Chilam NG571c65a2013-01-19 12:27:36 +05301055{
Hoonki Lee387663d2013-02-05 18:08:43 -08001056 struct list_head *head;
1057 hddTdlsPeer_t *peer;
1058 u8 key;
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -07001059 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301060 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1061
c_hpothu7f63e882013-10-02 19:13:35 +05301062 if(0 != (wlan_hdd_validate_context(pHddCtx)))
1063 {
1064 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1065 FL("pHddCtx is not valid"));
1066 return 0;
1067 }
Hoonki Leebfee0342013-01-21 16:43:45 -08001068
Hoonki Lee387663d2013-02-05 18:08:43 -08001069 /* if already there, just update */
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301070 peer = wlan_hdd_tdls_find_peer(pAdapter, mac, TRUE);
Hoonki Lee387663d2013-02-05 18:08:43 -08001071 if (peer != NULL)
1072 {
1073 return peer;
Chilam NG571c65a2013-01-19 12:27:36 +05301074 }
1075
Hoonki Lee387663d2013-02-05 18:08:43 -08001076 /* not found, allocate and add the list */
1077 peer = vos_mem_malloc(sizeof(hddTdlsPeer_t));
1078 if (NULL == peer) {
1079 hddLog(VOS_TRACE_LEVEL_ERROR, "%s peer malloc failed!", __func__);
1080 return NULL;
1081 }
Chilam NG571c65a2013-01-19 12:27:36 +05301082
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05301083 mutex_lock(&pHddCtx->tdls_lock);
1084
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -07001085 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
1086
1087 if (NULL == pHddTdlsCtx)
1088 {
c_hpothue21931b2014-09-08 14:02:14 +05301089 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
c_hpothu7f63e882013-10-02 19:13:35 +05301090 FL("pHddTdlsCtx is NULL"));
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -07001091 vos_mem_free(peer);
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301092 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -07001093 return NULL;
1094 }
1095
1096 key = wlan_hdd_tdls_hash_key(mac);
1097 head = &pHddTdlsCtx->peer_list[key];
Chilam NG571c65a2013-01-19 12:27:36 +05301098
Hoonki Lee387663d2013-02-05 18:08:43 -08001099 vos_mem_zero(peer, sizeof(hddTdlsPeer_t));
1100 vos_mem_copy(peer->peerMac, mac, sizeof(peer->peerMac));
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001101 peer->pHddTdlsCtx = pHddTdlsCtx;
Hoonki Lee387663d2013-02-05 18:08:43 -08001102
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001103 vos_timer_init(&peer->peerIdleTimer,
1104 VOS_TIMER_TYPE_SW,
1105 wlan_hdd_tdls_idle_cb,
1106 peer);
1107
Hoonki Lee14621352013-04-16 17:51:19 -07001108 vos_timer_init(&peer->initiatorWaitTimeoutTimer,
1109 VOS_TIMER_TYPE_SW,
1110 wlan_hdd_tdls_initiator_wait_cb,
1111 peer);
1112
Hoonki Lee387663d2013-02-05 18:08:43 -08001113 list_add_tail(&peer->node, head);
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301114 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -08001115
1116 return peer;
1117}
1118
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001119int wlan_hdd_tdls_set_cap(hdd_adapter_t *pAdapter,
Hoonki Lee27511902013-03-14 18:19:06 -07001120 u8* mac,
1121 tTDLSCapType cap)
1122{
1123 hddTdlsPeer_t *curr_peer;
1124
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001125 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee27511902013-03-14 18:19:06 -07001126 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301127 {
1128 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1129 "%s: curr_peer is NULL", __func__);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001130 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301131 }
Hoonki Lee27511902013-03-14 18:19:06 -07001132
1133 curr_peer->tdls_support = cap;
1134
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001135 return 0;
Hoonki Lee27511902013-03-14 18:19:06 -07001136}
1137
Atul Mittal115287b2014-07-08 13:26:33 +05301138void wlan_hdd_tdls_set_peer_link_status(hddTdlsPeer_t *curr_peer,
1139 tTDLSLinkStatus status,
1140 tTDLSLinkReason reason)
Hoonki Lee387663d2013-02-05 18:08:43 -08001141{
Atul Mittal115287b2014-07-08 13:26:33 +05301142 /*EXT TDLS*/
1143 tANI_S32 state = 0;
1144 tANI_S32 res = 0;
1145 /*EXT TDLS*/
Hoonki Lee387663d2013-02-05 18:08:43 -08001146 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301147 {
1148 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1149 "%s: curr_peer is NULL", __func__);
Hoonki Lee387663d2013-02-05 18:08:43 -08001150 return;
c_hpothu7f63e882013-10-02 19:13:35 +05301151 }
Hoonki Lee387663d2013-02-05 18:08:43 -08001152
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001153 hddLog(VOS_TRACE_LEVEL_WARN, "tdls set peer " MAC_ADDRESS_STR " link status to %u",
Chilam Ng01120412013-02-19 18:32:21 -08001154 MAC_ADDR_ARRAY(curr_peer->peerMac), status);
Chilam NG571c65a2013-01-19 12:27:36 +05301155
1156 curr_peer->link_status = status;
1157
Atul Mittal115287b2014-07-08 13:26:33 +05301158 /*EXT TDLS*/
1159 if (curr_peer->isForcedPeer && curr_peer->state_change_notification)
1160 {
1161 /*save the reason for any further query*/
1162 curr_peer->reason = reason;
1163 wlan_hdd_tdls_get_wifi_hal_state(curr_peer, &state, &res);
1164
1165 (curr_peer->state_change_notification)(
1166 curr_peer->peerMac,
1167 state,
1168 res,
1169 curr_peer->pHddTdlsCtx->pAdapter);
1170
1171 }
1172 /*EXT TDLS*/
1173
Chilam NG571c65a2013-01-19 12:27:36 +05301174}
1175
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001176void wlan_hdd_tdls_set_link_status(hdd_adapter_t *pAdapter,
1177 u8* mac,
Atul Mittal115287b2014-07-08 13:26:33 +05301178 tTDLSLinkStatus linkStatus,
1179 tTDLSLinkReason reason)
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001180{
Atul Mittal115287b2014-07-08 13:26:33 +05301181
1182 /*EXT TDLS*/
1183 tANI_S32 state = 0;
1184 tANI_S32 res = 0;
1185 /*EXT TDLS*/
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001186 hddTdlsPeer_t *curr_peer;
1187
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301188 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, TRUE);
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001189 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301190 {
1191 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1192 "%s: curr_peer is NULL", __func__);
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001193 return;
c_hpothu7f63e882013-10-02 19:13:35 +05301194 }
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001195
1196 curr_peer->link_status= linkStatus;
1197
Atul Mittal115287b2014-07-08 13:26:33 +05301198 /*EXT TDLS*/
1199
1200 if (curr_peer->isForcedPeer && curr_peer->state_change_notification)
1201 {
1202 /*save the reason for any further query*/
1203 curr_peer->reason = reason;
1204 wlan_hdd_tdls_get_wifi_hal_state(curr_peer, &state, &res);
1205
1206 (*curr_peer->state_change_notification)(mac,
1207 state,
1208 res,
1209 curr_peer->pHddTdlsCtx->pAdapter);
1210
1211 }
1212 /*EXT TDLS*/
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001213 return;
1214}
1215
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001216int wlan_hdd_tdls_recv_discovery_resp(hdd_adapter_t *pAdapter, u8 *mac)
Chilam NG571c65a2013-01-19 12:27:36 +05301217{
1218 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001219 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301220 hdd_context_t *pHddCtx;
1221
1222 if ( NULL == pHddTdlsCtx )
c_hpothu7f63e882013-10-02 19:13:35 +05301223 {
1224 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05301225 FL("pHddTdlsCtx is NULL device mode = %d"), pAdapter->device_mode);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301226 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301227 }
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301228
1229 pHddCtx = WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter);
1230
c_hpothu7f63e882013-10-02 19:13:35 +05301231 if(0 != (wlan_hdd_validate_context(pHddCtx)))
1232 {
1233 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1234 FL("pHddCtx is not valid"));
1235 return 0;
1236 }
Chilam NG571c65a2013-01-19 12:27:36 +05301237
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001238 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001239
1240 if (NULL == curr_peer)
c_hpothu7f63e882013-10-02 19:13:35 +05301241 {
1242 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1243 FL("curr_peer is NULL"));
Hoonki Lee387663d2013-02-05 18:08:43 -08001244 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301245 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001246
1247 if (pHddTdlsCtx->discovery_sent_cnt)
1248 pHddTdlsCtx->discovery_sent_cnt--;
1249
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05301250 mutex_lock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301251
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001252 wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301253
1254 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001255 if (0 == pHddTdlsCtx->discovery_sent_cnt)
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001256 {
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001257 vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001258 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001259
Gopichand Nakkala901e8922013-03-04 23:45:58 -08001260 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001261 "Discovery(%u) Response from " MAC_ADDRESS_STR " link_status %d",
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001262 pHddTdlsCtx->discovery_sent_cnt, MAC_ADDR_ARRAY(curr_peer->peerMac),
1263 curr_peer->link_status);
1264
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001265 if (eTDLS_LINK_DISCOVERING == curr_peer->link_status)
Gopichand Nakkala901e8922013-03-04 23:45:58 -08001266 {
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001267 /* Since we are here, it means Throughput threshold is alredy met. Make sure RSSI
1268 threshold is also met before setting up TDLS link*/
1269 if ((tANI_S32) curr_peer->rssi > (tANI_S32) pHddTdlsCtx->threshold_config.rssi_trigger_threshold)
1270 {
Atul Mittal115287b2014-07-08 13:26:33 +05301271 wlan_hdd_tdls_set_peer_link_status(curr_peer,
1272 eTDLS_LINK_DISCOVERED,
1273 eTDLS_LINK_SUCCESS);
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001274 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
1275 "Rssi Threshold met: "MAC_ADDRESS_STR" rssi = %d threshold= %d" ,
1276 MAC_ADDR_ARRAY(curr_peer->peerMac), curr_peer->rssi,
1277 pHddTdlsCtx->threshold_config.rssi_trigger_threshold);
1278 cfg80211_tdls_oper_request(pAdapter->dev, curr_peer->peerMac, NL80211_TDLS_SETUP, FALSE, GFP_KERNEL);
1279 }
1280 else
1281 {
1282 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
1283 "Rssi Threshold not met: "MAC_ADDRESS_STR" rssi = %d threshold = %d ",
1284 MAC_ADDR_ARRAY(curr_peer->peerMac), curr_peer->rssi,
1285 pHddTdlsCtx->threshold_config.rssi_trigger_threshold);
Sunil Duttb0d39242014-09-10 23:54:51 +05301286
1287 /* if RSSI threshold is not met then allow further discovery
1288 * attempts by decrementing count for the last attempt
1289 */
1290 if (curr_peer->discovery_attempt)
1291 curr_peer->discovery_attempt--;
1292
Atul Mittal115287b2014-07-08 13:26:33 +05301293 wlan_hdd_tdls_set_peer_link_status(curr_peer,
1294 eTDLS_LINK_IDLE,
1295 eTDLS_LINK_UNSPECIFIED);
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001296 }
Gopichand Nakkala901e8922013-03-04 23:45:58 -08001297 }
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001298 else
1299 {
1300 wlan_hdd_tdls_check_bmps(pAdapter);
1301 }
Chilam NG571c65a2013-01-19 12:27:36 +05301302
Gopichand Nakkala901e8922013-03-04 23:45:58 -08001303 curr_peer->tdls_support = eTDLS_CAP_SUPPORTED;
Hoonki Lee387663d2013-02-05 18:08:43 -08001304 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +05301305}
1306
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301307int wlan_hdd_tdls_set_peer_caps(hdd_adapter_t *pAdapter,
1308 u8 *mac,
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301309 tCsrStaParams *StaParams,
1310 tANI_BOOLEAN isBufSta,
1311 tANI_BOOLEAN isOffChannelSupported)
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301312{
1313 hddTdlsPeer_t *curr_peer;
1314
1315 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
1316 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301317 {
1318 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1319 "%s: curr_peer is NULL", __func__);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301320 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301321 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301322
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301323 curr_peer->uapsdQueues = StaParams->uapsd_queues;
1324 curr_peer->maxSp = StaParams->max_sp;
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301325 curr_peer->isBufSta = isBufSta;
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301326 curr_peer->isOffChannelSupported = isOffChannelSupported;
1327
1328 vos_mem_copy(curr_peer->supported_channels,
1329 StaParams->supported_channels,
1330 StaParams->supported_channels_len);
1331
1332 curr_peer->supported_channels_len =
1333 StaParams->supported_channels_len;
1334
1335 vos_mem_copy(curr_peer->supported_oper_classes,
1336 StaParams->supported_oper_classes,
1337 StaParams->supported_oper_classes_len);
1338
1339 curr_peer->supported_oper_classes_len =
1340 StaParams->supported_oper_classes_len;
Agarwal Ashish16020c42014-12-29 22:01:11 +05301341 curr_peer->qos = StaParams->capability & CAPABILITIES_QOS_OFFSET;
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301342 return 0;
1343}
1344
1345int wlan_hdd_tdls_get_link_establish_params(hdd_adapter_t *pAdapter, u8 *mac,
1346 tCsrTdlsLinkEstablishParams* tdlsLinkEstablishParams)
1347{
1348 hddTdlsPeer_t *curr_peer;
1349
1350 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
1351 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301352 {
1353 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1354 "%s: curr_peer is NULL", __func__);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301355 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301356 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301357
1358 tdlsLinkEstablishParams->isResponder = curr_peer->is_responder;
1359 tdlsLinkEstablishParams->uapsdQueues = curr_peer->uapsdQueues;
1360 tdlsLinkEstablishParams->maxSp = curr_peer->maxSp;
1361 tdlsLinkEstablishParams->isBufSta = curr_peer->isBufSta;
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301362 tdlsLinkEstablishParams->isOffChannelSupported =
1363 curr_peer->isOffChannelSupported;
1364
1365 vos_mem_copy(tdlsLinkEstablishParams->supportedChannels,
1366 curr_peer->supported_channels,
1367 curr_peer->supported_channels_len);
1368
1369 tdlsLinkEstablishParams->supportedChannelsLen =
1370 curr_peer->supported_channels_len;
1371
1372 vos_mem_copy(tdlsLinkEstablishParams->supportedOperClasses,
1373 curr_peer->supported_oper_classes,
1374 curr_peer->supported_oper_classes_len);
1375
1376 tdlsLinkEstablishParams->supportedOperClassesLen =
1377 curr_peer->supported_oper_classes_len;
Agarwal Ashish16020c42014-12-29 22:01:11 +05301378 tdlsLinkEstablishParams->qos = curr_peer->qos;
1379
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301380 return 0;
1381}
1382
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001383int wlan_hdd_tdls_set_rssi(hdd_adapter_t *pAdapter, u8 *mac, tANI_S8 rxRssi)
Chilam NG571c65a2013-01-19 12:27:36 +05301384{
1385 hddTdlsPeer_t *curr_peer;
Chilam NG571c65a2013-01-19 12:27:36 +05301386
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301387 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, TRUE);
Hoonki Lee387663d2013-02-05 18:08:43 -08001388 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301389 {
1390 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1391 "%s: curr_peer is NULL", __func__);
Hoonki Lee387663d2013-02-05 18:08:43 -08001392 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301393 }
Chilam NG571c65a2013-01-19 12:27:36 +05301394
1395 curr_peer->rssi = rxRssi;
1396
Hoonki Lee387663d2013-02-05 18:08:43 -08001397 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +05301398}
1399
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001400int wlan_hdd_tdls_set_responder(hdd_adapter_t *pAdapter, u8 *mac, tANI_U8 responder)
Hoonki Leea34dd892013-02-05 22:56:02 -08001401{
1402 hddTdlsPeer_t *curr_peer;
1403
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001404 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001405 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301406 {
1407 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1408 "%s: curr_peer is NULL", __func__);
Hoonki Leea34dd892013-02-05 22:56:02 -08001409 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301410 }
Hoonki Leea34dd892013-02-05 22:56:02 -08001411
1412 curr_peer->is_responder = responder;
1413
1414 return 0;
1415}
1416
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001417int wlan_hdd_tdls_get_responder(hdd_adapter_t *pAdapter, u8 *mac)
Hoonki Leea34dd892013-02-05 22:56:02 -08001418{
1419 hddTdlsPeer_t *curr_peer;
1420
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301421 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, TRUE);
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001422 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301423 {
1424 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1425 "%s: curr_peer is NULL", __func__);
Hoonki Leea34dd892013-02-05 22:56:02 -08001426 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301427 }
Hoonki Leea34dd892013-02-05 22:56:02 -08001428
1429 return (curr_peer->is_responder);
1430}
1431
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001432int wlan_hdd_tdls_set_signature(hdd_adapter_t *pAdapter, u8 *mac, tANI_U8 uSignature)
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001433{
1434 hddTdlsPeer_t *curr_peer;
1435
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001436 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001437 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301438 {
1439 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1440 "%s: curr_peer is NULL", __func__);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001441 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301442 }
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001443
1444 curr_peer->signature = uSignature;
1445
1446 return 0;
1447}
1448
Hoonki Leea34dd892013-02-05 22:56:02 -08001449
Hoonki Lee387663d2013-02-05 18:08:43 -08001450void wlan_hdd_tdls_extract_da(struct sk_buff *skb, u8 *mac)
Chilam NG571c65a2013-01-19 12:27:36 +05301451{
Chilam NG571c65a2013-01-19 12:27:36 +05301452 memcpy(mac, skb->data, 6);
Chilam NG571c65a2013-01-19 12:27:36 +05301453}
1454
Hoonki Lee387663d2013-02-05 18:08:43 -08001455void wlan_hdd_tdls_extract_sa(struct sk_buff *skb, u8 *mac)
Chilam Ng1279e232013-01-25 15:06:52 -08001456{
Chilam Ng1279e232013-01-25 15:06:52 -08001457 memcpy(mac, skb->data+6, 6);
Chilam Ng1279e232013-01-25 15:06:52 -08001458}
1459
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001460int wlan_hdd_tdls_increment_pkt_count(hdd_adapter_t *pAdapter, u8 *mac, u8 tx)
Chilam NG571c65a2013-01-19 12:27:36 +05301461{
Hoonki Lee387663d2013-02-05 18:08:43 -08001462 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001463 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Chilam NG571c65a2013-01-19 12:27:36 +05301464
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001465 if (eTDLS_SUPPORT_ENABLED != pHddCtx->tdls_mode)
1466 return -1;
Hoonki Leebfee0342013-01-21 16:43:45 -08001467
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001468 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08001469 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301470 {
c_hpothue21931b2014-09-08 14:02:14 +05301471 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1472 FL("curr_peer is NULL"));
Chilam NG571c65a2013-01-19 12:27:36 +05301473 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301474 }
Chilam NG571c65a2013-01-19 12:27:36 +05301475
Chilam Ng1279e232013-01-25 15:06:52 -08001476 if (tx)
1477 curr_peer->tx_pkt++;
1478 else
1479 curr_peer->rx_pkt++;
Chilam NG571c65a2013-01-19 12:27:36 +05301480
Chilam NG571c65a2013-01-19 12:27:36 +05301481 return 0;
1482}
1483
Hoonki Lee27511902013-03-14 18:19:06 -07001484static int wlan_hdd_tdls_check_config(tdls_config_params_t *config)
1485{
1486 if (config->tdls > 2)
1487 {
1488 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 1st argument %d. <0...2>", __func__, config->tdls);
1489 return -1;
1490 }
1491 if (config->tx_period_t < CFG_TDLS_TX_STATS_PERIOD_MIN ||
1492 config->tx_period_t > CFG_TDLS_TX_STATS_PERIOD_MAX)
1493 {
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001494 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 2nd argument %d. <%d...%ld>", __func__, config->tx_period_t,
Hoonki Lee27511902013-03-14 18:19:06 -07001495 CFG_TDLS_TX_STATS_PERIOD_MIN, CFG_TDLS_TX_STATS_PERIOD_MAX);
1496 return -1;
1497 }
1498 if (config->tx_packet_n < CFG_TDLS_TX_PACKET_THRESHOLD_MIN ||
1499 config->tx_packet_n > CFG_TDLS_TX_PACKET_THRESHOLD_MAX)
1500 {
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001501 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 3rd argument %d. <%d...%ld>", __func__, config->tx_packet_n,
Hoonki Lee27511902013-03-14 18:19:06 -07001502 CFG_TDLS_TX_PACKET_THRESHOLD_MIN, CFG_TDLS_TX_PACKET_THRESHOLD_MAX);
1503 return -1;
1504 }
1505 if (config->discovery_period_t < CFG_TDLS_DISCOVERY_PERIOD_MIN ||
1506 config->discovery_period_t > CFG_TDLS_DISCOVERY_PERIOD_MAX)
1507 {
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001508 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 4th argument %d. <%d...%ld>", __func__, config->discovery_period_t,
Hoonki Lee27511902013-03-14 18:19:06 -07001509 CFG_TDLS_DISCOVERY_PERIOD_MIN, CFG_TDLS_DISCOVERY_PERIOD_MAX);
1510 return -1;
1511 }
1512 if (config->discovery_tries_n < CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MIN ||
1513 config->discovery_tries_n > CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MAX)
1514 {
1515 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 5th argument %d. <%d...%d>", __func__, config->discovery_tries_n,
1516 CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MIN, CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MAX);
1517 return -1;
1518 }
1519 if (config->idle_timeout_t < CFG_TDLS_IDLE_TIMEOUT_MIN ||
1520 config->idle_timeout_t > CFG_TDLS_IDLE_TIMEOUT_MAX)
1521 {
1522 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 6th argument %d. <%d...%d>", __func__, config->idle_timeout_t,
1523 CFG_TDLS_IDLE_TIMEOUT_MIN, CFG_TDLS_IDLE_TIMEOUT_MAX);
1524 return -1;
1525 }
1526 if (config->idle_packet_n < CFG_TDLS_IDLE_PACKET_THRESHOLD_MIN ||
1527 config->idle_packet_n > CFG_TDLS_IDLE_PACKET_THRESHOLD_MAX)
1528 {
1529 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 7th argument %d. <%d...%d>", __func__, config->idle_packet_n,
1530 CFG_TDLS_IDLE_PACKET_THRESHOLD_MIN, CFG_TDLS_IDLE_PACKET_THRESHOLD_MAX);
1531 return -1;
1532 }
1533 if (config->rssi_hysteresis < CFG_TDLS_RSSI_HYSTERESIS_MIN ||
1534 config->rssi_hysteresis > CFG_TDLS_RSSI_HYSTERESIS_MAX)
1535 {
1536 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 8th argument %d. <%d...%d>", __func__, config->rssi_hysteresis,
1537 CFG_TDLS_RSSI_HYSTERESIS_MIN, CFG_TDLS_RSSI_HYSTERESIS_MAX);
1538 return -1;
1539 }
1540 if (config->rssi_trigger_threshold < CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MIN ||
1541 config->rssi_trigger_threshold > CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MAX)
1542 {
1543 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 9th argument %d. <%d...%d>", __func__, config->rssi_trigger_threshold,
1544 CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MIN, CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MAX);
1545 return -1;
1546 }
1547 if (config->rssi_teardown_threshold < CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MIN ||
1548 config->rssi_teardown_threshold > CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MAX)
1549 {
1550 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 10th argument %d. <%d...%d>", __func__, config->rssi_teardown_threshold,
1551 CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MIN, CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MAX);
1552 return -1;
1553 }
1554 return 0;
1555}
1556
Chilam Ng01120412013-02-19 18:32:21 -08001557int wlan_hdd_tdls_set_params(struct net_device *dev, tdls_config_params_t *config)
Chilam NG571c65a2013-01-19 12:27:36 +05301558{
Chilam Ng01120412013-02-19 18:32:21 -08001559 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
1560 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001561 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Hoonki Lee27511902013-03-14 18:19:06 -07001562 eTDLSSupportMode req_tdls_mode;
Hoonki Leebfee0342013-01-21 16:43:45 -08001563
Hoonki Lee27511902013-03-14 18:19:06 -07001564 if (NULL == pHddTdlsCtx)
1565 {
c_hpothu7f63e882013-10-02 19:13:35 +05301566 hddLog(VOS_TRACE_LEVEL_ERROR, FL("TDLS not enabled!"));
Hoonki Lee27511902013-03-14 18:19:06 -07001567 return -1;
Chilam Ng01120412013-02-19 18:32:21 -08001568 }
Chilam NG571c65a2013-01-19 12:27:36 +05301569
Hoonki Lee27511902013-03-14 18:19:06 -07001570 if (wlan_hdd_tdls_check_config(config) != 0)
1571 {
1572 return -1;
1573 }
1574
1575 /* config->tdls is mapped to 0->1, 1->2, 2->3 */
1576 req_tdls_mode = config->tdls + 1;
1577 if (pHddCtx->tdls_mode == req_tdls_mode)
1578 {
1579 hddLog(VOS_TRACE_LEVEL_ERROR, "%s already in mode %d", __func__, config->tdls);
1580 return -1;
1581 }
1582
1583 /* copy the configuration only when given tdls mode is implicit trigger enable */
1584 if (eTDLS_SUPPORT_ENABLED == req_tdls_mode)
1585 {
Chilam Ng01120412013-02-19 18:32:21 -08001586 memcpy(&pHddTdlsCtx->threshold_config, config, sizeof(tdls_config_params_t));
1587 }
Chilam NG571c65a2013-01-19 12:27:36 +05301588
Chilam Ng01120412013-02-19 18:32:21 -08001589 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1590 "iw set tdls params: %d %d %d %d %d %d %d %d %d %d",
1591 config->tdls,
1592 config->tx_period_t,
1593 config->tx_packet_n,
1594 config->discovery_period_t,
1595 config->discovery_tries_n,
1596 config->idle_timeout_t,
1597 config->idle_packet_n,
1598 config->rssi_hysteresis,
1599 config->rssi_trigger_threshold,
1600 config->rssi_teardown_threshold);
Chilam NG571c65a2013-01-19 12:27:36 +05301601
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07001602 wlan_hdd_tdls_set_mode(pHddCtx, req_tdls_mode, TRUE);
Chilam Ng01120412013-02-19 18:32:21 -08001603
Chilam NG571c65a2013-01-19 12:27:36 +05301604 return 0;
1605}
1606
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001607int wlan_hdd_tdls_set_sta_id(hdd_adapter_t *pAdapter, u8 *mac, u8 staId)
Kiran V1ccee932012-12-12 14:49:46 -08001608{
Hoonki Lee387663d2013-02-05 18:08:43 -08001609 hddTdlsPeer_t *curr_peer;
Kiran V1ccee932012-12-12 14:49:46 -08001610
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001611 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08001612 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301613 {
1614 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1615 "%s: curr_peer is NULL", __func__);
Chilam NG571c65a2013-01-19 12:27:36 +05301616 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301617 }
Chilam NG571c65a2013-01-19 12:27:36 +05301618
Hoonki Lee387663d2013-02-05 18:08:43 -08001619 curr_peer->staId = staId;
Chilam NG571c65a2013-01-19 12:27:36 +05301620
1621 return 0;
Kiran V1ccee932012-12-12 14:49:46 -08001622}
1623
Naresh Jayaram937abdf2013-11-26 19:50:25 +05301624int wlan_hdd_tdls_set_force_peer(hdd_adapter_t *pAdapter, u8 *mac,
1625 tANI_BOOLEAN forcePeer)
Sunil Dutt41de4e22013-11-14 18:09:02 +05301626{
Naresh Jayaram937abdf2013-11-26 19:50:25 +05301627 hddTdlsPeer_t *curr_peer;
Sunil Dutt41de4e22013-11-14 18:09:02 +05301628 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1629
1630 if ((NULL == pHddCtx)) return -1;
1631
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05301632 mutex_lock(&pHddCtx->tdls_lock);
1633
Naresh Jayaram937abdf2013-11-26 19:50:25 +05301634 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
1635 if (curr_peer == NULL)
Sunil Dutt41de4e22013-11-14 18:09:02 +05301636 goto error;
Naresh Jayaram937abdf2013-11-26 19:50:25 +05301637 curr_peer->isForcedPeer = forcePeer;
Naresh Jayaramca7bc3a2014-02-04 23:03:04 +05301638
1639 mutex_unlock(&pHddCtx->tdls_lock);
1640 return 0;
Sunil Dutt41de4e22013-11-14 18:09:02 +05301641error:
1642 mutex_unlock(&pHddCtx->tdls_lock);
1643 return -1;
1644}
1645
Hoonki Lee387663d2013-02-05 18:08:43 -08001646/* if peerMac is found, then it returns pointer to hddTdlsPeer_t
1647 otherwise, it returns NULL
1648*/
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301649hddTdlsPeer_t *wlan_hdd_tdls_find_peer(hdd_adapter_t *pAdapter, u8 *mac,
1650 tANI_BOOLEAN mutexLock)
Kiran V1ccee932012-12-12 14:49:46 -08001651{
Hoonki Lee387663d2013-02-05 18:08:43 -08001652 u8 key;
1653 struct list_head *pos;
1654 struct list_head *head;
1655 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001656 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301657 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee387663d2013-02-05 18:08:43 -08001658
c_hpothu7f63e882013-10-02 19:13:35 +05301659 if(0 != (wlan_hdd_validate_context(pHddCtx)))
1660 {
1661 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1662 FL("pHddCtx is not valid"));
1663 return 0;
1664 }
Hoonki Lee387663d2013-02-05 18:08:43 -08001665
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301666 if ( mutexLock )
Hoonki Lee387663d2013-02-05 18:08:43 -08001667 {
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05301668 mutex_lock(&pHddCtx->tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -08001669 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001670 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001671 if (NULL == pHddTdlsCtx)
1672 {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301673 if ( mutexLock )
1674 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001675 return NULL;
1676 }
1677
1678 key = wlan_hdd_tdls_hash_key(mac);
1679
1680 head = &pHddTdlsCtx->peer_list[key];
Hoonki Lee387663d2013-02-05 18:08:43 -08001681
1682 list_for_each(pos, head) {
1683 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
1684 if (!memcmp(mac, curr_peer->peerMac, 6)) {
1685 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1686 "findTdlsPeer: found staId %d", curr_peer->staId);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301687 if ( mutexLock )
1688 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -08001689 return curr_peer;
1690 }
1691 }
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301692 if ( mutexLock )
1693 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -08001694 return NULL;
1695}
1696
Hoonki Leea6d49be2013-04-05 09:43:25 -07001697hddTdlsPeer_t *wlan_hdd_tdls_find_all_peer(hdd_context_t *pHddCtx, u8 *mac)
1698{
1699 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
1700 hdd_adapter_t *pAdapter = NULL;
1701 tdlsCtx_t *pHddTdlsCtx = NULL;
1702 hddTdlsPeer_t *curr_peer= NULL;
1703 VOS_STATUS status = 0;
1704
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05301705 mutex_lock(&pHddCtx->tdls_lock);
Hoonki Leea6d49be2013-04-05 09:43:25 -07001706 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
1707 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
1708 {
1709 pAdapter = pAdapterNode->pAdapter;
1710
1711 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
1712 if (NULL != pHddTdlsCtx)
1713 {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301714 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Hoonki Leea6d49be2013-04-05 09:43:25 -07001715 if (curr_peer)
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301716 {
1717 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leea6d49be2013-04-05 09:43:25 -07001718 return curr_peer;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301719 }
Hoonki Leea6d49be2013-04-05 09:43:25 -07001720 }
1721 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
1722 pAdapterNode = pNext;
1723 }
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301724 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leea6d49be2013-04-05 09:43:25 -07001725 return curr_peer;
1726}
1727
1728
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001729int wlan_hdd_tdls_reset_peer(hdd_adapter_t *pAdapter, u8 *mac)
Hoonki Lee387663d2013-02-05 18:08:43 -08001730{
Chilam Ng01120412013-02-19 18:32:21 -08001731 hdd_context_t *pHddCtx;
Chilam NG571c65a2013-01-19 12:27:36 +05301732 hddTdlsPeer_t *curr_peer;
Kiran V1ccee932012-12-12 14:49:46 -08001733
Chilam Ng01120412013-02-19 18:32:21 -08001734 pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
1735
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001736 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08001737 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301738 {
1739 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1740 "%s: curr_peer is NULL", __func__);
Hoonki Lee387663d2013-02-05 18:08:43 -08001741 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301742 }
Chilam NG571c65a2013-01-19 12:27:36 +05301743
Atul Mittal115287b2014-07-08 13:26:33 +05301744 wlan_hdd_tdls_set_peer_link_status(curr_peer,
1745 eTDLS_LINK_IDLE,
1746 eTDLS_LINK_UNSPECIFIED);
Hoonki Leecdd8e962013-01-20 00:45:46 -08001747 curr_peer->staId = 0;
Hoonki Lee387663d2013-02-05 18:08:43 -08001748
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05301749 /* Throughput Monitor shall disable the split scan when
1750 * TDLS scan coexistance is disabled.At this point of time
1751 * since TDLS scan coexistance is not meeting the criteria
1752 * to be operational, explicitly make it false to enable
1753 * throughput monitor takes the control of split scan.
1754 */
1755 if (pHddCtx->isTdlsScanCoexistence == TRUE)
1756 {
1757 pHddCtx->isTdlsScanCoexistence = FALSE;
1758 }
1759
Chilam Ng01120412013-02-19 18:32:21 -08001760 if(eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode) {
Chilam Nga75d8b62013-01-29 01:35:59 -08001761 vos_timer_stop( &curr_peer->peerIdleTimer );
Chilam Nga75d8b62013-01-29 01:35:59 -08001762 }
Hoonki Lee387663d2013-02-05 18:08:43 -08001763 return 0;
Hoonki Leecdd8e962013-01-20 00:45:46 -08001764}
1765
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07001766/* Caller has to take the lock before calling this function */
Hoonki Lee27511902013-03-14 18:19:06 -07001767static void wlan_tdd_tdls_reset_tx_rx(tdlsCtx_t *pHddTdlsCtx)
1768{
1769 int i;
1770 struct list_head *head;
1771 hddTdlsPeer_t *tmp;
1772 struct list_head *pos, *q;
1773
Hoonki Lee27511902013-03-14 18:19:06 -07001774 for (i = 0; i < 256; i++) {
1775 head = &pHddTdlsCtx->peer_list[i];
1776 list_for_each_safe (pos, q, head) {
1777 tmp = list_entry(pos, hddTdlsPeer_t, node);
1778 tmp->tx_pkt = 0;
1779 tmp->rx_pkt = 0;
1780 }
1781 }
Hoonki Lee27511902013-03-14 18:19:06 -07001782
1783 return ;
1784}
1785
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07001786/* Caller has to take the lock before calling this function */
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001787static tANI_S32 wlan_hdd_tdls_peer_reset_discovery_processed(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001788{
1789 int i;
1790 struct list_head *head;
1791 hddTdlsPeer_t *tmp;
1792 struct list_head *pos, *q;
1793
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001794 pHddTdlsCtx->discovery_peer_cnt = 0;
1795
1796 for (i = 0; i < 256; i++) {
1797 head = &pHddTdlsCtx->peer_list[i];
1798 list_for_each_safe (pos, q, head) {
1799 tmp = list_entry(pos, hddTdlsPeer_t, node);
1800 tmp->discovery_processed = 0;
1801 }
1802 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001803
1804 return 0;
1805}
1806
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001807static tANI_S32 wlan_hdd_get_tdls_discovery_peer_cnt(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001808{
1809 int i;
1810 struct list_head *head;
1811 struct list_head *pos, *q;
1812 int discovery_peer_cnt=0;
1813 hddTdlsPeer_t *tmp;
1814
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001815 /*
1816 * This function expects the callers to acquire the Mutex.
1817 */
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001818
1819 for (i = 0; i < 256; i++) {
1820 head = &pHddTdlsCtx->peer_list[i];
1821 list_for_each_safe (pos, q, head) {
1822 tmp = list_entry(pos, hddTdlsPeer_t, node);
1823 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Chilam Ng01120412013-02-19 18:32:21 -08001824 "%s, %d, " MAC_ADDRESS_STR, __func__, i,
1825 MAC_ADDR_ARRAY(tmp->peerMac));
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001826 discovery_peer_cnt++;
1827 }
1828 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001829 return discovery_peer_cnt;
1830}
1831
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001832tANI_U16 wlan_hdd_tdlsConnectedPeers(hdd_adapter_t *pAdapter)
Lee Hoonkic1262f22013-01-24 21:59:00 -08001833{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001834 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1835
c_hpothu7f63e882013-10-02 19:13:35 +05301836 if(0 != (wlan_hdd_validate_context(pHddCtx)))
1837 {
1838 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1839 FL("pHddCtx is not valid"));
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001840 return 0;
c_hpothu7f63e882013-10-02 19:13:35 +05301841 }
Lee Hoonkic1262f22013-01-24 21:59:00 -08001842
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001843 return pHddCtx->connected_peer_count;
Lee Hoonkic1262f22013-01-24 21:59:00 -08001844}
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001845
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05301846hddTdlsPeer_t *wlan_hdd_tdls_get_first_connected_peer(hdd_adapter_t *pAdapter)
1847{
1848 int i;
1849 struct list_head *head;
1850 struct list_head *pos;
1851 hddTdlsPeer_t *curr_peer = NULL;
1852 tdlsCtx_t *pHddTdlsCtx;
1853 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1854
1855 if(0 != (wlan_hdd_validate_context(pHddCtx)))
1856 {
1857 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1858 FL("pHddCtx is not valid"));
1859 return NULL;
1860 }
1861
1862 mutex_lock(&pHddCtx->tdls_lock);
1863 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
1864 if (NULL == pHddTdlsCtx) {
1865 mutex_unlock(&pHddCtx->tdls_lock);
1866 return NULL;
1867 }
1868 for (i = 0; i < 256; i++) {
1869 head = &pHddTdlsCtx->peer_list[i];
1870
1871 list_for_each(pos, head) {
1872 curr_peer= list_entry (pos, hddTdlsPeer_t, node);
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05301873 if (curr_peer && (curr_peer->link_status == eTDLS_LINK_CONNECTED))
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05301874 {
1875 mutex_unlock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05301876 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
1877 "%s: " MAC_ADDRESS_STR " eTDLS_LINK_CONNECTED",
1878 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05301879 return curr_peer;
1880 }
1881 }
1882 }
1883 mutex_unlock(&pHddCtx->tdls_lock);
1884 return NULL;
1885}
1886
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001887int wlan_hdd_tdls_get_all_peers(hdd_adapter_t *pAdapter, char *buf, int buflen)
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001888{
1889 int i;
1890 int len, init_len;
Hoonki Lee387663d2013-02-05 18:08:43 -08001891 struct list_head *head;
1892 struct list_head *pos;
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001893 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001894 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301895 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1896
c_hpothu7f63e882013-10-02 19:13:35 +05301897 if(0 != (wlan_hdd_validate_context(pHddCtx)))
1898 {
1899 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1900 FL("pHddCtx is not valid"));
1901 return 0;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301902 }
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001903
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001904 init_len = buflen;
Sameer Thalappilb0a30232013-09-27 15:37:48 -07001905 len = scnprintf(buf, buflen, "\n%-18s%-3s%-4s%-3s%-5s\n",
1906 "MAC", "Id", "cap", "up", "RSSI");
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001907 buf += len;
1908 buflen -= len;
1909 /* 1234567890123456789012345678901234567 */
Sameer Thalappilb0a30232013-09-27 15:37:48 -07001910 len = scnprintf(buf, buflen, "---------------------------------\n");
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001911 buf += len;
1912 buflen -= len;
1913
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05301914 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001915 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001916 if (NULL == pHddTdlsCtx) {
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301917 mutex_unlock(&pHddCtx->tdls_lock);
Sameer Thalappilb0a30232013-09-27 15:37:48 -07001918 len = scnprintf(buf, buflen, "TDLS not enabled\n");
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001919 return len;
1920 }
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001921 for (i = 0; i < 256; i++) {
Hoonki Lee387663d2013-02-05 18:08:43 -08001922 head = &pHddTdlsCtx->peer_list[i];
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001923
Hoonki Lee387663d2013-02-05 18:08:43 -08001924 list_for_each(pos, head) {
1925 curr_peer= list_entry (pos, hddTdlsPeer_t, node);
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001926
Hoonki Lee387663d2013-02-05 18:08:43 -08001927 if (buflen < 32+1)
1928 break;
Sameer Thalappilb0a30232013-09-27 15:37:48 -07001929 len = scnprintf(buf, buflen,
Chilam Ng01120412013-02-19 18:32:21 -08001930 MAC_ADDRESS_STR"%3d%4s%3s%5d\n",
1931 MAC_ADDR_ARRAY(curr_peer->peerMac),
Hoonki Lee387663d2013-02-05 18:08:43 -08001932 curr_peer->staId,
1933 (curr_peer->tdls_support == eTDLS_CAP_SUPPORTED) ? "Y":"N",
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07001934 TDLS_IS_CONNECTED(curr_peer) ? "Y":"N",
Hoonki Lee387663d2013-02-05 18:08:43 -08001935 curr_peer->rssi);
1936 buf += len;
1937 buflen -= len;
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001938 }
1939 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301940 mutex_unlock(&pHddCtx->tdls_lock);
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001941 return init_len-buflen;
1942}
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001943
1944void wlan_hdd_tdls_connection_callback(hdd_adapter_t *pAdapter)
1945{
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05301946 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301947 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08001948
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05301949 if ((NULL == pHddCtx))
c_hpothu7f63e882013-10-02 19:13:35 +05301950 {
Agarwal Ashishbf98caf2014-03-25 13:29:11 +05301951 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
1952 FL("pHddCtx or pHddTdlsCtx points to NULL"));
c_hpothu7f63e882013-10-02 19:13:35 +05301953 return;
1954 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301955
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05301956 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07001957
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05301958 if (0 != wlan_hdd_sta_tdls_init(pAdapter))
1959 {
1960 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: wlan_hdd_sta_tdls_init failed",__func__);
1961 mutex_unlock(&pHddCtx->tdls_lock);
1962 return;
1963 }
1964 set_bit(TDLS_INIT_DONE, &pAdapter->event_flags);
1965
1966 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
1967 if ((NULL == pHddTdlsCtx))
1968 {
1969 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
1970 FL("pHddCtx or pHddTdlsCtx points to NULL device mode = %d"), pAdapter->device_mode);
1971 mutex_unlock(&pHddCtx->tdls_lock);
1972 return;
1973 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001974 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
1975 "%s, update %d discover %d", __func__,
1976 pHddTdlsCtx->threshold_config.tx_period_t,
1977 pHddTdlsCtx->threshold_config.discovery_period_t);
1978
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08001979 if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode)
1980 {
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001981 wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001982 pHddTdlsCtx->discovery_sent_cnt = 0;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001983 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001984
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001985#ifdef FEATURE_WLAN_TDLS_INTERNAL
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07001986 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
1987 &pHddTdlsCtx->peerDiscoverTimer,
1988 pHddTdlsCtx->threshold_config.discovery_period_t);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001989#endif
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07001990 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
1991 &pHddTdlsCtx->peerUpdateTimer,
1992 pHddTdlsCtx->threshold_config.tx_period_t);
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08001993 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301994 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001995
1996}
1997
1998void wlan_hdd_tdls_disconnection_callback(hdd_adapter_t *pAdapter)
1999{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002000 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302001 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2002
Deepthi Gowribfd17132014-11-14 17:59:04 +05302003 if (NULL == pHddCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302004 {
2005 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Deepthi Gowribfd17132014-11-14 17:59:04 +05302006 FL(" pHddCtx points to NULL"));
c_hpothu7f63e882013-10-02 19:13:35 +05302007 return;
2008 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002009
2010 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,"%s", __func__);
2011
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302012 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002013 if (NULL == pHddTdlsCtx)
2014 {
c_hpothu7f63e882013-10-02 19:13:35 +05302015 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2016 FL("pHddTdlsCtx is NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302017 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002018 return;
2019 }
Masti, Narayanraddide96b992015-01-08 13:00:58 +05302020
2021#ifdef WLAN_OPEN_SOURCE
2022 cancel_work_sync(&pHddTdlsCtx->implicit_setup);
2023#endif
2024
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002025 pHddTdlsCtx->discovery_sent_cnt = 0;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002026 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002027
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302028 if(test_bit(TDLS_INIT_DONE, &pAdapter->event_flags))
2029 {
2030 wlan_hdd_tdls_exit(pAdapter);
2031 clear_bit(TDLS_INIT_DONE, &pAdapter->event_flags);
2032 }
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002033
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302034 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002035}
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002036
2037void wlan_hdd_tdls_mgmt_completion_callback(hdd_adapter_t *pAdapter, tANI_U32 statusCode)
2038{
2039 pAdapter->mgmtTxCompletionStatus = statusCode;
2040 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,"%s: Mgmt TX Completion %d",
2041 __func__, statusCode);
2042 complete(&pAdapter->tdls_mgmt_comp);
2043}
2044
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002045void wlan_hdd_tdls_increment_peer_count(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002046{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002047 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002048
c_hpothu7f63e882013-10-02 19:13:35 +05302049 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2050 {
2051 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2052 FL("pHddCtx is not valid"));
2053 return;
2054 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002055
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302056 mutex_lock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302057
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002058 pHddCtx->connected_peer_count++;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002059 wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002060
2061 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL, "%s: %d",
2062 __func__, pHddCtx->connected_peer_count);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302063
2064 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002065}
2066
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002067void wlan_hdd_tdls_decrement_peer_count(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002068{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002069 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002070
c_hpothu7f63e882013-10-02 19:13:35 +05302071 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2072 {
2073 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2074 FL("pHddCtx is not valid"));
2075 return;
2076 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002077
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302078 mutex_lock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302079
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002080 if (pHddCtx->connected_peer_count)
2081 pHddCtx->connected_peer_count--;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002082 wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002083
2084 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL, "%s: %d",
2085 __func__, pHddCtx->connected_peer_count);
2086
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302087 mutex_unlock(&pHddCtx->tdls_lock);
2088
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002089}
2090
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002091void wlan_hdd_tdls_check_bmps(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002092{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002093 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002094 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Hoonki Lee14621352013-04-16 17:51:19 -07002095 hddTdlsPeer_t *curr_peer;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002096
c_hpothu7f63e882013-10-02 19:13:35 +05302097 if ((NULL == pHddCtx) || (NULL == pHddTdlsCtx))
2098 {
Sushant Kaushik125ae692014-11-25 17:38:48 +05302099 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
c_hpothu7f63e882013-10-02 19:13:35 +05302100 FL(" pHddCtx or pHddTdlsCtx points to NULL"));
2101 return;
2102 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002103
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302104 curr_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0);
Hoonki Lee14621352013-04-16 17:51:19 -07002105 if (NULL != curr_peer)
2106 {
2107 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2108 "%s: tdls in progress. Dont check for BMPS " MAC_ADDRESS_STR,
2109 __func__, MAC_ADDR_ARRAY (curr_peer->peerMac));
2110 return;
2111 }
2112
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002113 if ((TDLS_CTX_MAGIC != pHddCtx->tdls_scan_ctxt.magic) &&
2114 (0 == pHddCtx->connected_peer_count) &&
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002115 (0 == pHddTdlsCtx->discovery_sent_cnt))
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002116 {
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002117 if (FALSE == sme_IsPmcBmps(WLAN_HDD_GET_HAL_CTX(pAdapter)))
2118 {
2119 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002120 "%s: No TDLS peer connected/discovery sent. Enable BMPS",
2121 __func__);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002122 hdd_enable_bmps_imps(pHddCtx);
2123 }
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002124 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002125 else
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002126 {
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002127 if (TRUE == sme_IsPmcBmps(WLAN_HDD_GET_HAL_CTX(pAdapter)))
2128 {
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002129 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2130 "%s: TDLS peer connected. Disable BMPS", __func__);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002131 hdd_disable_bmps_imps(pHddCtx, WLAN_HDD_INFRA_STATION);
2132 }
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002133 }
2134 return;
2135}
2136
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002137u8 wlan_hdd_tdls_is_peer_progress(hdd_adapter_t *pAdapter, u8 *mac)
2138{
2139 hddTdlsPeer_t *curr_peer;
2140
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302141 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, TRUE);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002142 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05302143 {
2144 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2145 "%s: curr_peer is NULL", __func__);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002146 return 0;
c_hpothu7f63e882013-10-02 19:13:35 +05302147 }
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002148
2149 return (eTDLS_LINK_CONNECTING == curr_peer->link_status);
2150}
2151
Hoonki Leefb8df672013-04-10 18:20:34 -07002152/* return pointer to hddTdlsPeer_t if TDLS is ongoing. Otherwise return NULL.
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002153 * mac - if NULL check for all the peer list, otherwise, skip this mac when skip_self is TRUE
2154 * skip_self - if TRUE, skip this mac. otherwise, check all the peer list. if
2155 mac is NULL, this argument is ignored, and check for all the peer list.
2156 */
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302157static hddTdlsPeer_t *wlan_hdd_tdls_find_progress_peer(hdd_adapter_t *pAdapter, u8 *mac, u8 skip_self)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002158{
2159 int i;
2160 struct list_head *head;
2161 hddTdlsPeer_t *curr_peer;
2162 struct list_head *pos;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302163 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302164
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302165 if (NULL == pHddTdlsCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302166 {
2167 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2168 FL("pHddTdlsCtx is NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302169 return NULL;
c_hpothu7f63e882013-10-02 19:13:35 +05302170 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302171
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002172 for (i = 0; i < 256; i++) {
2173 head = &pHddTdlsCtx->peer_list[i];
2174 list_for_each(pos, head) {
2175 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
2176 if (skip_self && mac && !memcmp(mac, curr_peer->peerMac, 6)) {
2177 continue;
2178 }
2179 else
2180 {
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08002181 if (eTDLS_LINK_CONNECTING == curr_peer->link_status)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002182 {
Gopichand Nakkalac87400e2013-03-13 18:51:00 -07002183 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002184 "%s:" MAC_ADDRESS_STR " eTDLS_LINK_CONNECTING",
Gopichand Nakkalac87400e2013-03-13 18:51:00 -07002185 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
Hoonki Leefb8df672013-04-10 18:20:34 -07002186 return curr_peer;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002187 }
2188 }
2189 }
2190 }
Hoonki Leefb8df672013-04-10 18:20:34 -07002191 return NULL;
2192}
2193
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302194hddTdlsPeer_t *wlan_hdd_tdls_is_progress(hdd_context_t *pHddCtx, u8 *mac, u8 skip_self)
Hoonki Leefb8df672013-04-10 18:20:34 -07002195{
2196 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2197 hdd_adapter_t *pAdapter = NULL;
2198 tdlsCtx_t *pHddTdlsCtx = NULL;
2199 hddTdlsPeer_t *curr_peer= NULL;
2200 VOS_STATUS status = 0;
2201
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302202 mutex_lock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302203
Hoonki Leefb8df672013-04-10 18:20:34 -07002204 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2205 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2206 {
2207 pAdapter = pAdapterNode->pAdapter;
2208
2209 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2210 if (NULL != pHddTdlsCtx)
2211 {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302212 curr_peer = wlan_hdd_tdls_find_progress_peer(pAdapter, mac, skip_self);
Hoonki Leefb8df672013-04-10 18:20:34 -07002213 if (curr_peer)
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302214 {
2215 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leefb8df672013-04-10 18:20:34 -07002216 return curr_peer;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302217 }
Hoonki Leefb8df672013-04-10 18:20:34 -07002218 }
2219 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2220 pAdapterNode = pNext;
2221 }
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302222 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leefb8df672013-04-10 18:20:34 -07002223 return NULL;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002224}
Hoonki Lee27511902013-03-14 18:19:06 -07002225
2226static void wlan_hdd_tdls_implicit_disable(tdlsCtx_t *pHddTdlsCtx)
2227{
Hoonki Lee27511902013-03-14 18:19:06 -07002228 wlan_hdd_tdls_timers_stop(pHddTdlsCtx);
Hoonki Lee27511902013-03-14 18:19:06 -07002229}
2230
2231static void wlan_hdd_tdls_implicit_enable(tdlsCtx_t *pHddTdlsCtx)
2232{
2233 wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002234 pHddTdlsCtx->discovery_sent_cnt = 0;
Hoonki Lee27511902013-03-14 18:19:06 -07002235 wlan_tdd_tdls_reset_tx_rx(pHddTdlsCtx);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002236 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002237
Hoonki Lee27511902013-03-14 18:19:06 -07002238
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002239#ifdef FEATURE_WLAN_TDLS_INTERNAL
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002240 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
2241 &pHddTdlsCtx->peerDiscoverTimer,
2242 pHddTdlsCtx->threshold_config.discovery_period_t);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002243#endif
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002244 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
2245 &pHddTdlsCtx->peerUpdateTimer,
2246 pHddTdlsCtx->threshold_config.tx_period_t);
Hoonki Lee27511902013-03-14 18:19:06 -07002247}
2248
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002249void wlan_hdd_tdls_set_mode(hdd_context_t *pHddCtx,
2250 eTDLSSupportMode tdls_mode,
2251 v_BOOL_t bUpdateLast)
Hoonki Lee27511902013-03-14 18:19:06 -07002252{
2253 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2254 VOS_STATUS status;
2255 hdd_adapter_t *pAdapter;
2256 tdlsCtx_t *pHddTdlsCtx;
2257
2258 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,"%s mode %d", __func__, (int)tdls_mode);
c_hpothu7f63e882013-10-02 19:13:35 +05302259
2260 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2261 {
2262 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2263 FL("pHddCtx is not valid"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302264 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302265 }
Hoonki Lee27511902013-03-14 18:19:06 -07002266
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302267 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07002268
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002269 if (pHddCtx->tdls_mode == tdls_mode)
2270 {
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -07002271 hddLog(TDLS_LOG_LEVEL, "%s already in mode %d", __func__, (int)tdls_mode);
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302272 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002273 return;
2274 }
2275
Hoonki Lee27511902013-03-14 18:19:06 -07002276 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2277
2278 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2279 {
2280 pAdapter = pAdapterNode->pAdapter;
Hoonki Leea6d49be2013-04-05 09:43:25 -07002281 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2282 if (NULL != pHddTdlsCtx)
Hoonki Lee27511902013-03-14 18:19:06 -07002283 {
Hoonki Leea6d49be2013-04-05 09:43:25 -07002284 if(eTDLS_SUPPORT_ENABLED == tdls_mode)
2285 wlan_hdd_tdls_implicit_enable(pHddTdlsCtx);
2286 else if((eTDLS_SUPPORT_DISABLED == tdls_mode) ||
2287 (eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == tdls_mode))
2288 wlan_hdd_tdls_implicit_disable(pHddTdlsCtx);
Hoonki Lee27511902013-03-14 18:19:06 -07002289 }
2290 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2291 pAdapterNode = pNext;
2292 }
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002293 if(bUpdateLast)
2294 {
2295 pHddCtx->tdls_mode_last = tdls_mode;
2296 }
2297 else
2298 {
2299 pHddCtx->tdls_mode_last = pHddCtx->tdls_mode;
2300 }
Hoonki Lee27511902013-03-14 18:19:06 -07002301 pHddCtx->tdls_mode = tdls_mode;
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002302
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302303 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee27511902013-03-14 18:19:06 -07002304}
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002305
Mahesh A Saptasagar8b231b32014-08-11 11:58:15 +05302306static void __wlan_hdd_tdls_pre_setup(struct work_struct *work)
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002307{
Hoonki Leed37cbb32013-04-20 00:31:14 -07002308 tdlsCtx_t *pHddTdlsCtx =
2309 container_of(work, tdlsCtx_t, implicit_setup);
2310 hdd_context_t *pHddCtx;
2311 hddTdlsPeer_t *curr_peer;
Hoonki Leefb8df672013-04-10 18:20:34 -07002312 hddTdlsPeer_t *temp_peer;
Hoonki Leed37cbb32013-04-20 00:31:14 -07002313 int status;
2314
2315 if (NULL == pHddTdlsCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302316 {
2317 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2318 FL("pHddTdlsCtx is NULL"));
Hoonki Leed37cbb32013-04-20 00:31:14 -07002319 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302320 }
Hoonki Leed37cbb32013-04-20 00:31:14 -07002321
2322 if (unlikely(TDLS_CTX_MAGIC != pHddTdlsCtx->magic))
c_hpothu7f63e882013-10-02 19:13:35 +05302323 {
2324 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2325 "%s: tdls magic no missmatch %u", __func__, pHddTdlsCtx->magic);
Hoonki Leed37cbb32013-04-20 00:31:14 -07002326 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302327 }
Hoonki Leed37cbb32013-04-20 00:31:14 -07002328
2329 pHddCtx = WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter);
Hoonki Leefb8df672013-04-10 18:20:34 -07002330
c_hpothu7f63e882013-10-02 19:13:35 +05302331 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2332 {
2333 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2334 FL("pHddCtx is not valid"));
Hoonki Leefb8df672013-04-10 18:20:34 -07002335 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302336 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002337
Hoonki Leed37cbb32013-04-20 00:31:14 -07002338 curr_peer = pHddTdlsCtx->curr_candidate;
2339
2340 if (NULL == curr_peer)
c_hpothu7f63e882013-10-02 19:13:35 +05302341 {
2342 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2343 FL("curr_peer is NULL"));
2344
Hoonki Leed37cbb32013-04-20 00:31:14 -07002345 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302346 }
Hoonki Leed37cbb32013-04-20 00:31:14 -07002347
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002348 if (TRUE == sme_IsPmcBmps(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter)))
2349 {
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002350 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,"%s: Disable BMPS", __func__);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002351 hdd_disable_bmps_imps(pHddCtx, WLAN_HDD_INFRA_STATION);
2352 }
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002353
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302354 temp_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0);
Hoonki Leefb8df672013-04-10 18:20:34 -07002355 if (NULL != temp_peer)
2356 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08002357 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL, "%s: " MAC_ADDRESS_STR " ongoing. pre_setup ignored",
Hoonki Leefb8df672013-04-10 18:20:34 -07002358 __func__, MAC_ADDR_ARRAY(temp_peer->peerMac));
Hoonki Leed37cbb32013-04-20 00:31:14 -07002359 goto done;
Hoonki Leefb8df672013-04-10 18:20:34 -07002360 }
2361
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002362 if (eTDLS_CAP_UNKNOWN != curr_peer->tdls_support)
Atul Mittal115287b2014-07-08 13:26:33 +05302363 wlan_hdd_tdls_set_peer_link_status(curr_peer,
2364 eTDLS_LINK_DISCOVERING,
2365 eTDLS_LINK_SUCCESS);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002366
Hoonki Leed37cbb32013-04-20 00:31:14 -07002367 status = wlan_hdd_cfg80211_send_tdls_discover_req(pHddTdlsCtx->pAdapter->wdev.wiphy,
2368 pHddTdlsCtx->pAdapter->dev,
2369 curr_peer->peerMac);
2370
2371 if (0 != status)
2372 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08002373 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL, "%s: " MAC_ADDRESS_STR " discovery could not sent",
Hoonki Leed37cbb32013-04-20 00:31:14 -07002374 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
2375 if (eTDLS_CAP_UNKNOWN != curr_peer->tdls_support)
Atul Mittal115287b2014-07-08 13:26:33 +05302376 wlan_hdd_tdls_set_peer_link_status(curr_peer,
2377 eTDLS_LINK_IDLE,
2378 eTDLS_LINK_UNSPECIFIED);
Hoonki Leed37cbb32013-04-20 00:31:14 -07002379 goto done;
2380 }
2381
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002382 pHddTdlsCtx->discovery_sent_cnt++;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302383
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302384 mutex_lock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302385
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002386 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302387
Pradeep Reddy POTTETI219ced32014-11-14 16:33:57 +05302388 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
2389 &pHddTdlsCtx->peerDiscoveryTimeoutTimer,
2390 pHddTdlsCtx->threshold_config.tx_period_t - TDLS_DISCOVERY_TIMEOUT_BEFORE_UPDATE);
2391
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302392 mutex_unlock(&pHddCtx->tdls_lock);
Jeff Johnson0299d0a2013-10-30 12:37:43 -07002393 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL, "%s: discovery count %u timeout %u msec",
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002394 __func__, pHddTdlsCtx->discovery_sent_cnt,
2395 pHddTdlsCtx->threshold_config.tx_period_t - TDLS_DISCOVERY_TIMEOUT_BEFORE_UPDATE);
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002396
Hoonki Leed37cbb32013-04-20 00:31:14 -07002397done:
2398 pHddTdlsCtx->curr_candidate = NULL;
2399 pHddTdlsCtx->magic = 0;
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002400 return;
2401}
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002402
Mahesh A Saptasagar8b231b32014-08-11 11:58:15 +05302403
2404static void wlan_hdd_tdls_pre_setup(struct work_struct *work)
2405{
2406 vos_ssr_protect(__func__);
2407 __wlan_hdd_tdls_pre_setup(work);
2408 vos_ssr_unprotect(__func__);
2409
2410 return;
2411}
2412
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002413tANI_U32 wlan_hdd_tdls_discovery_sent_cnt(hdd_context_t *pHddCtx)
2414{
2415 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2416 hdd_adapter_t *pAdapter = NULL;
2417 tdlsCtx_t *pHddTdlsCtx = NULL;
2418 VOS_STATUS status = 0;
2419 tANI_U32 count = 0;
2420
2421 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2422 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2423 {
2424 pAdapter = pAdapterNode->pAdapter;
2425
Hoonki Leea6d49be2013-04-05 09:43:25 -07002426 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2427 if (NULL != pHddTdlsCtx)
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002428 {
Hoonki Leea6d49be2013-04-05 09:43:25 -07002429 count = count + pHddTdlsCtx->discovery_sent_cnt;
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002430 }
2431 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2432 pAdapterNode = pNext;
2433 }
2434 return count;
2435}
2436
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002437void wlan_hdd_tdls_check_power_save_prohibited(hdd_adapter_t *pAdapter)
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002438{
2439 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2440 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2441
2442 if ((NULL == pHddTdlsCtx) || (NULL == pHddCtx))
c_hpothu7f63e882013-10-02 19:13:35 +05302443 {
2444 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2445 FL(" pHddCtx or pHddTdlsCtx points to NULL"));
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002446 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302447 }
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002448
2449 if ((0 == pHddCtx->connected_peer_count) &&
2450 (0 == wlan_hdd_tdls_discovery_sent_cnt(pHddCtx)))
2451 {
2452 sme_SetTdlsPowerSaveProhibited(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter), 0);
2453 return;
2454 }
2455 sme_SetTdlsPowerSaveProhibited(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter), 1);
2456 return;
2457}
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002458
2459void wlan_hdd_tdls_free_scan_request (tdls_scan_context_t *tdls_scan_ctx)
2460{
2461 if (NULL == tdls_scan_ctx)
c_hpothu7f63e882013-10-02 19:13:35 +05302462 {
2463 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2464 FL("tdls_scan_ctx is NULL"));
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002465 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302466 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002467
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002468 tdls_scan_ctx->attempt = 0;
Hoonki Leefb8df672013-04-10 18:20:34 -07002469 tdls_scan_ctx->reject = 0;
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002470 tdls_scan_ctx->magic = 0;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002471 tdls_scan_ctx->scan_request = NULL;
2472 return;
2473}
2474
2475int wlan_hdd_tdls_copy_scan_context(hdd_context_t *pHddCtx,
2476 struct wiphy *wiphy,
2477#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
2478 struct net_device *dev,
2479#endif
2480 struct cfg80211_scan_request *request)
2481{
2482 tdls_scan_context_t *scan_ctx;
2483
c_hpothu7f63e882013-10-02 19:13:35 +05302484 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2485 {
2486 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2487 FL("pHddCtx is not valid"));
2488 return 0;
2489 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002490
2491 scan_ctx = &pHddCtx->tdls_scan_ctxt;
2492
2493 scan_ctx->wiphy = wiphy;
2494#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
2495 scan_ctx->dev = dev;
2496#endif
2497
2498 scan_ctx->scan_request = request;
2499 return 0;
2500}
2501
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002502static void wlan_hdd_tdls_scan_init_work(hdd_context_t *pHddCtx,
2503 struct wiphy *wiphy,
2504#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
2505 struct net_device *dev,
2506#endif
2507 struct cfg80211_scan_request *request,
2508 unsigned long delay)
2509{
2510 if (TDLS_CTX_MAGIC != pHddCtx->tdls_scan_ctxt.magic)
2511 {
2512#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
2513 wlan_hdd_tdls_copy_scan_context(pHddCtx, wiphy, dev, request);
2514#else
2515 wlan_hdd_tdls_copy_scan_context(pHddCtx, wiphy, request);
2516#endif
2517 pHddCtx->tdls_scan_ctxt.attempt = 0;
2518 pHddCtx->tdls_scan_ctxt.magic = TDLS_CTX_MAGIC;
2519 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002520 schedule_delayed_work(&pHddCtx->tdls_scan_ctxt.tdls_scan_work, delay);
2521}
2522
2523/* return negative = caller should stop and return error code immediately
2524 return 0 = caller should stop and return success immediately
2525 return 1 = caller can continue to scan
2526 */
2527int wlan_hdd_tdls_scan_callback (hdd_adapter_t *pAdapter,
2528 struct wiphy *wiphy,
2529#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
2530 struct net_device *dev,
2531#endif
2532 struct cfg80211_scan_request *request)
2533{
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002534 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2535 u16 connectedTdlsPeers;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302536 hddTdlsPeer_t *curr_peer, *connected_peer;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002537 unsigned long delay;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302538 hdd_config_t *cfg_param = pHddCtx->cfg_ini;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002539
c_hpothu7f63e882013-10-02 19:13:35 +05302540 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2541 {
2542 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2543 FL("pHddCtx is not valid"));
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002544 return 0;
c_hpothu7f63e882013-10-02 19:13:35 +05302545 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002546
2547 /* if tdls is not enabled, then continue scan */
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +05302548 if ((eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode) ||
2549 (pHddCtx->is_tdls_btc_enabled == FALSE))
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002550 return 1;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302551 curr_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0);
Hoonki Leefb8df672013-04-10 18:20:34 -07002552 if (NULL != curr_peer)
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002553 {
Hoonki Leefb8df672013-04-10 18:20:34 -07002554 if (pHddCtx->tdls_scan_ctxt.reject++ >= TDLS_MAX_SCAN_REJECT)
2555 {
2556 pHddCtx->tdls_scan_ctxt.reject = 0;
2557 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2558 "%s: " MAC_ADDRESS_STR ". scan rejected %d. force it to idle",
2559 __func__, MAC_ADDR_ARRAY (curr_peer->peerMac), pHddCtx->tdls_scan_ctxt.reject);
2560
Atul Mittal115287b2014-07-08 13:26:33 +05302561 wlan_hdd_tdls_set_peer_link_status (curr_peer,
2562 eTDLS_LINK_IDLE,
2563 eTDLS_LINK_UNSPECIFIED);
Hoonki Leefb8df672013-04-10 18:20:34 -07002564 return 1;
2565 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002566 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Hoonki Leefb8df672013-04-10 18:20:34 -07002567 "%s: tdls in progress. scan rejected %d",
2568 __func__, pHddCtx->tdls_scan_ctxt.reject);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002569 return -EBUSY;
2570 }
2571
2572 /* tdls teardown is ongoing */
2573 if (eTDLS_SUPPORT_DISABLED == pHddCtx->tdls_mode)
2574 {
2575 connectedTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
2576 if (connectedTdlsPeers && (pHddCtx->tdls_scan_ctxt.attempt < TDLS_MAX_SCAN_SCHEDULE))
2577 {
2578 delay = (unsigned long)(TDLS_DELAY_SCAN_PER_CONNECTION*connectedTdlsPeers);
2579 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2580 "%s: tdls disabled, but still connected_peers %d attempt %d. schedule scan %lu msec",
2581 __func__, connectedTdlsPeers, pHddCtx->tdls_scan_ctxt.attempt, delay);
2582
2583 wlan_hdd_tdls_scan_init_work (pHddCtx, wiphy,
2584#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
2585 dev,
2586#endif
2587 request,
2588 msecs_to_jiffies(delay));
2589 /* scan should not continue */
2590 return 0;
2591 }
2592 /* no connected peer or max retry reached, scan continue */
2593 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2594 "%s: tdls disabled. connected_peers %d attempt %d. scan allowed",
2595 __func__, connectedTdlsPeers, pHddCtx->tdls_scan_ctxt.attempt);
2596 return 1;
2597 }
Agarwal Ashishef54a182014-12-16 15:07:31 +05302598
2599 /* if fEnableTDLSScan flag is 1 ; driverwill allow scan even if
2600 * peer station is not buffer STA capable
2601 *
2602 * RX: If there is any RX activity, device will lose RX packets,
2603 * as peer will not be aware that device is off channel.
2604 * TX: TX is stopped whenever device initiate scan.
2605 */
2606 if (pHddCtx->cfg_ini->fEnableTDLSScan == 1)
2607 {
2608 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2609 FL("Allow SCAN in all TDLS cases"));
2610 return 1;
2611 }
2612
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002613 /* while tdls is up, first time scan */
2614 else if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode ||
2615 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode)
2616 {
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002617 connectedTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302618
2619 /* check the TDLS link and Scan coexistance Capability */
2620 if ( (TRUE == pHddCtx->cfg_ini->fEnableTDLSScanCoexSupport) &&
2621 (TRUE == sme_IsFeatureSupportedByFW(TDLS_SCAN_COEXISTENCE)) &&
2622 (connectedTdlsPeers == 1) )
2623 {
2624 /* get connected peer information */
2625 connected_peer = wlan_hdd_tdls_get_first_connected_peer(pAdapter);
2626 if (NULL == connected_peer) {
2627 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
2628 "%s: Invalid connected_peer, Continue Scanning", __func__);
2629 /* scan should continue */
2630 return 1;
2631 }
2632 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2633 ("%s: TDLS Scan Co-exist supported connectedTdlsPeers =%d buffersta =%d"),
2634 __func__,connectedTdlsPeers,connected_peer->isBufSta);
2635
2636 if (connected_peer->isBufSta)
2637 {
2638 pHddCtx->isTdlsScanCoexistence = TRUE;
2639 if ((cfg_param->dynSplitscan) && (!pHddCtx->issplitscan_enabled))
2640 {
2641 pHddCtx->issplitscan_enabled = TRUE;
2642 sme_enable_disable_split_scan(
2643 WLAN_HDD_GET_HAL_CTX(pAdapter),
2644 cfg_param->nNumStaChanCombinedConc,
2645 cfg_param->nNumP2PChanCombinedConc);
2646 }
2647 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2648 ("%s:%d TDLS Scan Co-exist supported splitscan_enabled =%d "),
2649 __func__, __LINE__, pHddCtx->issplitscan_enabled);
2650 return 1;
2651 }
2652
2653 }
2654 else
2655 {
2656 /* Throughput Monitor shall disable the split scan when
2657 * TDLS scan coexistance is disabled.At this point of time
2658 * since TDLS scan coexistance is not meeting the criteria
2659 * to be operational, explicitly make it false to enable
2660 * throughput monitor takes the control of split scan.
2661 */
2662 pHddCtx->isTdlsScanCoexistence = FALSE;
2663 }
2664 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2665 ("%s: TDLS Scan Co-exist not supported connectedTdlsPeers =%d"
2666 " TDLSScanCoexSupport param =%d TDLS_SCAN_COEXISTENCE =%d"),
2667 __func__, connectedTdlsPeers,
2668 pHddCtx->cfg_ini->fEnableTDLSScanCoexSupport,
2669 sme_IsFeatureSupportedByFW(TDLS_SCAN_COEXISTENCE));
2670
Atul Mittal5803b342014-09-04 15:31:19 +05302671 /* disable implicit trigger logic & tdls operatoin */
2672 wlan_hdd_tdls_set_mode(pHddCtx, eTDLS_SUPPORT_DISABLED, FALSE);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302673 /* fall back to the implementation of teardown the peers on the scan
2674 * when the number of connected peers are more than one. TDLS Scan
2675 * coexistance feature is exercised only when a single peer is
2676 * connected and the DUT shall not advertize the Buffer Sta capability,
2677 * so that the peer shall not go to the TDLS power save
2678 */
2679
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002680 if (connectedTdlsPeers)
2681 {
2682 tANI_U8 staIdx;
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07002683 hddTdlsPeer_t *curr_peer;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002684
2685 for (staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++)
2686 {
2687 if (pHddCtx->tdlsConnInfo[staIdx].staId)
2688 {
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -07002689 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002690 ("%s: indicate TDLS teadown (staId %d)"), __func__, pHddCtx->tdlsConnInfo[staIdx].staId) ;
2691
2692#ifdef CONFIG_TDLS_IMPLICIT
Hoonki Leea6d49be2013-04-05 09:43:25 -07002693 curr_peer = wlan_hdd_tdls_find_all_peer(pHddCtx, pHddCtx->tdlsConnInfo[staIdx].peerMac.bytes);
2694 if(curr_peer)
2695 wlan_hdd_tdls_indicate_teardown(curr_peer->pHddTdlsCtx->pAdapter, curr_peer, eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002696#endif
2697 }
2698 }
2699 /* schedule scan */
2700 delay = (unsigned long)(TDLS_DELAY_SCAN_PER_CONNECTION*connectedTdlsPeers);
2701
2702 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2703 "%s: tdls enabled (mode %d), connected_peers %d. schedule scan %lu msec",
2704 __func__, pHddCtx->tdls_mode, wlan_hdd_tdlsConnectedPeers(pAdapter),
2705 delay);
2706
2707 wlan_hdd_tdls_scan_init_work (pHddCtx, wiphy,
2708#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
2709 dev,
2710#endif
2711 request,
2712 msecs_to_jiffies(delay));
2713 /* scan should not continue */
2714 return 0;
2715 }
2716 /* no connected peer, scan continue */
2717 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2718 "%s: tdls_mode %d, and no tdls connection. scan allowed",
2719 __func__, pHddCtx->tdls_mode);
2720 }
2721 return 1;
2722}
2723
2724void wlan_hdd_tdls_scan_done_callback(hdd_adapter_t *pAdapter)
2725{
2726 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002727
c_hpothu7f63e882013-10-02 19:13:35 +05302728 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2729 {
2730 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2731 FL("pHddCtx is not valid"));
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002732 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302733 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002734
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +05302735 if (pHddCtx->is_tdls_btc_enabled == FALSE)
2736 return;
Sunil Dutt41de4e22013-11-14 18:09:02 +05302737
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002738 /* free allocated memory at scan time */
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002739 wlan_hdd_tdls_free_scan_request (&pHddCtx->tdls_scan_ctxt);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002740
2741 /* if tdls was enabled before scan, re-enable tdls mode */
2742 if(eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode_last ||
2743 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode_last)
2744 {
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -07002745 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002746 ("%s: revert tdls mode %d"), __func__, pHddCtx->tdls_mode_last);
2747
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002748 wlan_hdd_tdls_set_mode(pHddCtx, pHddCtx->tdls_mode_last, FALSE);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002749 }
2750 wlan_hdd_tdls_check_bmps(pAdapter);
2751}
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002752
2753void wlan_hdd_tdls_timer_restart(hdd_adapter_t *pAdapter,
2754 vos_timer_t *timer,
2755 v_U32_t expirationTime)
2756{
2757 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
2758
2759 if (NULL == pHddStaCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302760 {
2761 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2762 FL("pHddStaCtx is NULL"));
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002763 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302764 }
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002765
2766 /* Check whether driver load unload is in progress */
2767 if(vos_is_load_unload_in_progress( VOS_MODULE_ID_VOSS, NULL))
2768 {
2769 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2770 "%s: Driver load/unload is in progress.", __func__);
2771 return;
2772 }
2773
2774 if (hdd_connIsConnected(pHddStaCtx))
2775 {
2776 vos_timer_stop(timer);
2777 vos_timer_start(timer, expirationTime);
2778 }
2779}
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07002780void wlan_hdd_tdls_indicate_teardown(hdd_adapter_t *pAdapter,
2781 hddTdlsPeer_t *curr_peer,
2782 tANI_U16 reason)
2783{
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05302784 hdd_context_t *pHddCtx;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302785
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07002786 if (NULL == pAdapter || NULL == curr_peer)
c_hpothu7f63e882013-10-02 19:13:35 +05302787 {
2788 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2789 FL("parameters passed are invalid"));
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07002790 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302791 }
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07002792
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05302793 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2794
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07002795 if (eTDLS_LINK_CONNECTED != curr_peer->link_status)
2796 return;
2797
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302798 /* Throughput Monitor shall disable the split scan when
2799 * TDLS scan coexistance is disabled.At this point of time
2800 * since TDLS scan coexistance is not meeting the criteria
2801 * to be operational, explicitly make it false to enable
2802 * throughput monitor takes the control of split scan.
2803 */
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05302804 if (pHddCtx && (pHddCtx->isTdlsScanCoexistence == TRUE))
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302805 {
2806 pHddCtx->isTdlsScanCoexistence = FALSE;
2807 }
2808
Atul Mittal115287b2014-07-08 13:26:33 +05302809 wlan_hdd_tdls_set_peer_link_status(curr_peer,
2810 eTDLS_LINK_TEARING,
Atul Mittal271a7652014-09-12 13:18:22 +05302811 eTDLS_LINK_UNSPECIFIED);
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07002812 cfg80211_tdls_oper_request(pAdapter->dev,
2813 curr_peer->peerMac,
2814 NL80211_TDLS_TEARDOWN,
2815 reason,
2816 GFP_KERNEL);
2817}
Atul Mittal115287b2014-07-08 13:26:33 +05302818
2819
2820/*EXT TDLS*/
2821int wlan_hdd_set_callback(hddTdlsPeer_t *curr_peer,
2822 cfg80211_exttdls_callback callback)
2823{
2824
2825 hdd_context_t *pHddCtx;
2826 hdd_adapter_t *pAdapter;
2827
2828 if (!curr_peer) return -1;
2829
2830 pAdapter = curr_peer->pHddTdlsCtx->pAdapter;
2831 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2832 if ((NULL == pHddCtx)) return -1;
2833
2834 mutex_lock(&pHddCtx->tdls_lock);
2835
2836 curr_peer->state_change_notification = callback;
2837
2838 mutex_unlock(&pHddCtx->tdls_lock);
2839 return 0;
2840
2841
2842}
2843
2844void wlan_hdd_tdls_get_wifi_hal_state(hddTdlsPeer_t *curr_peer,
2845 tANI_S32 *state,
2846 tANI_S32 *reason)
2847{
2848 *reason = curr_peer->reason;
2849
2850 switch(curr_peer->link_status)
2851 {
2852 case eTDLS_LINK_IDLE:
Atul Mittal115287b2014-07-08 13:26:33 +05302853 case eTDLS_LINK_DISCOVERED:
2854 *state = WIFI_TDLS_ENABLED;
2855 break;
Atul Mittalad630e42014-10-07 19:19:14 +05302856 case eTDLS_LINK_DISCOVERING:
Atul Mittal115287b2014-07-08 13:26:33 +05302857 case eTDLS_LINK_CONNECTING:
2858 *state = WIFI_TDLS_TRYING;
2859 break;
2860 case eTDLS_LINK_CONNECTED:
2861 *state = WIFI_TDLS_ESTABLISHED;
2862 break;
2863 case eTDLS_LINK_TEARING:
2864 *state = WIFI_TDLS_DROPPED;
2865 break;
2866 }
2867
2868}
2869
2870int wlan_hdd_tdls_get_status(hdd_adapter_t *pAdapter,
2871 tANI_U8* mac,
2872 tANI_S32 *state,
2873 tANI_S32 *reason)
2874{
2875
2876 hddTdlsPeer_t *curr_peer;
Atul Mittala75fced2014-10-06 13:59:07 +05302877 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Atul Mittal115287b2014-07-08 13:26:33 +05302878 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, TRUE);
2879 if (curr_peer == NULL)
2880 {
Atul Mittala75fced2014-10-06 13:59:07 +05302881 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Atul Mittal115287b2014-07-08 13:26:33 +05302882 FL("curr_peer is NULL"));
Atul Mittal115287b2014-07-08 13:26:33 +05302883
Atul Mittala75fced2014-10-06 13:59:07 +05302884 *state = WIFI_TDLS_DISABLED;
2885 *reason = eTDLS_LINK_UNSPECIFIED;
2886 }
2887 else
2888 {
2889 if (pHddCtx->cfg_ini->fTDLSExternalControl &&
2890 (FALSE == curr_peer->isForcedPeer))
2891 {
2892 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2893 FL("curr_peer is not Forced"));
2894 *state = WIFI_TDLS_DISABLED;
2895 *reason = eTDLS_LINK_UNSPECIFIED;
2896 }
2897 else
2898 {
2899 wlan_hdd_tdls_get_wifi_hal_state(curr_peer, state, reason);
2900 }
2901 }
Atul Mittal115287b2014-07-08 13:26:33 +05302902 return (0);
2903}
2904
Agarwal Ashishef54a182014-12-16 15:07:31 +05302905int hdd_set_tdls_scan_type(hdd_adapter_t *pAdapter,
2906 tANI_U8 *ptr)
2907{
2908 int tdls_scan_type;
Hema Aparna Medicharla26b98042015-01-21 15:02:01 +05302909 hdd_context_t *pHddCtx;
Agarwal Ashishef54a182014-12-16 15:07:31 +05302910 if (NULL == pAdapter)
2911 {
2912 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2913 "%s: pAdapter is NULL", __func__);
2914 return -EINVAL;
2915 }
Hema Aparna Medicharla26b98042015-01-21 15:02:01 +05302916 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Agarwal Ashishef54a182014-12-16 15:07:31 +05302917 tdls_scan_type = ptr[9] - '0';
2918
2919 if (tdls_scan_type <= 2)
2920 {
2921 pHddCtx->cfg_ini->fEnableTDLSScan = tdls_scan_type;
2922 return 0;
2923 }
2924 else
2925 {
2926 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2927 " Wrong value is given for tdls_scan_type "
2928 " Making fEnableTDLSScan as 0 ");
2929 pHddCtx->cfg_ini->fEnableTDLSScan = 0;
2930 return -EINVAL;
2931 }
2932}
2933
Atul Mittal115287b2014-07-08 13:26:33 +05302934/*EXT TDLS*/
2935