blob: 6b2db1238961f98134c7211f5a4a7dbd04eb9bb0 [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
Agarwal Ashish4b87f922014-06-18 03:03:21 +0530647/* initialize TDLS global context */
648void wlan_hdd_tdls_init(hdd_context_t *pHddCtx )
649{
650 v_U8_t staIdx;
Sameer Thalappilbee426e2013-10-30 10:30:30 -0700651
Agarwal Ashish4b87f922014-06-18 03:03:21 +0530652 pHddCtx->connected_peer_count = 0;
653
654 pHddCtx->tdls_scan_ctxt.magic = 0;
655 pHddCtx->tdls_scan_ctxt.attempt = 0;
656 pHddCtx->tdls_scan_ctxt.reject = 0;
657 pHddCtx->tdls_scan_ctxt.scan_request = NULL;
658
659 for (staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++)
660 {
661 pHddCtx->tdlsConnInfo[staIdx].staId = 0;
662 pHddCtx->tdlsConnInfo[staIdx].sessionId = 255;
663 vos_mem_zero(&pHddCtx->tdlsConnInfo[staIdx].peerMac,
664 sizeof(v_MACADDR_t)) ;
665 }
666
667 if (FALSE == pHddCtx->cfg_ini->fEnableTDLSImplicitTrigger)
668 {
669 pHddCtx->tdls_mode = eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY;
670 hddLog(VOS_TRACE_LEVEL_ERROR, "%s TDLS Implicit trigger not enabled!", __func__);
671 }
672 else
673 {
674 pHddCtx->tdls_mode = eTDLS_SUPPORT_ENABLED;
675 }
676}
677
678int wlan_hdd_sta_tdls_init(hdd_adapter_t *pAdapter)
Chilam Ng01120412013-02-19 18:32:21 -0800679{
Chilam Ng01120412013-02-19 18:32:21 -0800680 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
Hoonki Lee27511902013-03-14 18:19:06 -0700681 tdlsCtx_t *pHddTdlsCtx;
Chilam Ng01120412013-02-19 18:32:21 -0800682 int i;
683
Sunil Dutt66485cb2013-12-19 19:05:03 +0530684 if (NULL == pHddCtx)
685 return -1;
686
Rajesh Chauhana34c6e62014-03-25 16:37:58 +0530687 mutex_lock(&pHddCtx->tdls_lock);
Sunil Dutt66485cb2013-12-19 19:05:03 +0530688
Hoonki Lee27511902013-03-14 18:19:06 -0700689 if ((FALSE == pHddCtx->cfg_ini->fEnableTDLSSupport) ||
690 (FALSE == sme_IsFeatureSupportedByFW(TDLS)))
691 {
692 pHddCtx->tdls_mode = eTDLS_SUPPORT_NOT_ENABLED;
693 pAdapter->sessionCtx.station.pHddTdlsCtx = NULL;
694 hddLog(VOS_TRACE_LEVEL_ERROR, "%s TDLS not enabled (%d) or FW doesn't support (%d)!",
695 __func__, pHddCtx->cfg_ini->fEnableTDLSSupport,
696 sme_IsFeatureSupportedByFW(TDLS));
Sunil Dutt66485cb2013-12-19 19:05:03 +0530697 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee27511902013-03-14 18:19:06 -0700698 return 0;
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800699 }
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +0530700 /* TDLS is supported only in STA / P2P Client modes,
701 * hence the check for TDLS support in a specific Device mode.
702 * Do not return a failure rather do not continue further
703 * with the initialization as tdls_init would be called
704 * during the open adapter for a p2p interface at which point
705 * the device mode would be a P2P_DEVICE. The point here is to
706 * continue initialization for STA / P2P Client modes.
707 * TDLS exit also check for the device mode for clean up hence
708 * there is no issue even if success is returned.
709 */
710 if (0 == WLAN_HDD_IS_TDLS_SUPPORTED_ADAPTER(pAdapter))
711 {
Sunil Dutt66485cb2013-12-19 19:05:03 +0530712 mutex_unlock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +0530713 return 0;
714 }
715 /* Check for the valid pHddTdlsCtx. If valid do not further
716 * allocate the memory, rather continue with the initialization.
717 * If tdls_initialization would get reinvoked without tdls_exit
718 * getting invoked (SSR) there is no point to further proceed
719 * with the memory allocations.
720 */
721 if (NULL == pAdapter->sessionCtx.station.pHddTdlsCtx)
722 {
723 pHddTdlsCtx = vos_mem_malloc(sizeof(tdlsCtx_t));
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800724
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +0530725 if (NULL == pHddTdlsCtx) {
726 hddLog(VOS_TRACE_LEVEL_ERROR, "%s malloc failed!", __func__);
727 pAdapter->sessionCtx.station.pHddTdlsCtx = NULL;
Sunil Dutt66485cb2013-12-19 19:05:03 +0530728 mutex_unlock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +0530729 return -1;
730 }
731 /* initialize TDLS pAdater context */
732 vos_mem_zero(pHddTdlsCtx, sizeof(tdlsCtx_t));
733#ifdef TDLS_USE_SEPARATE_DISCOVERY_TIMER
734 vos_timer_init(&pHddTdlsCtx->peerDiscoverTimer,
735 VOS_TIMER_TYPE_SW,
736 wlan_hdd_tdls_discover_peer_cb,
737 pHddTdlsCtx);
738#endif
Hoonki Lee27511902013-03-14 18:19:06 -0700739
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +0530740 vos_timer_init(&pHddTdlsCtx->peerUpdateTimer,
741 VOS_TIMER_TYPE_SW,
742 wlan_hdd_tdls_update_peer_cb,
743 pHddTdlsCtx);
744 vos_timer_init(&pHddTdlsCtx->peerDiscoveryTimeoutTimer,
745 VOS_TIMER_TYPE_SW,
746 wlan_hdd_tdls_discovery_timeout_peer_cb,
747 pHddTdlsCtx);
748
749 pAdapter->sessionCtx.station.pHddTdlsCtx = pHddTdlsCtx;
Hoonki Lee27511902013-03-14 18:19:06 -0700750 }
751
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +0530752 pHddTdlsCtx = pAdapter->sessionCtx.station.pHddTdlsCtx;
Hoonki Lee27511902013-03-14 18:19:06 -0700753
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700754 sme_SetTdlsPowerSaveProhibited(WLAN_HDD_GET_HAL_CTX(pAdapter), 0);
Hoonki Lee27511902013-03-14 18:19:06 -0700755
Hoonki Lee27511902013-03-14 18:19:06 -0700756 pHddTdlsCtx->pAdapter = pAdapter;
757
758 for (i = 0; i < 256; i++)
759 {
760 INIT_LIST_HEAD(&pHddTdlsCtx->peer_list[i]);
761 }
762
Hoonki Leed37cbb32013-04-20 00:31:14 -0700763 pHddTdlsCtx->curr_candidate = NULL;
764 pHddTdlsCtx->magic = 0;
765
Hoonki Lee27511902013-03-14 18:19:06 -0700766 /* remember configuration even if it is not used right now. it could be used later */
767 pHddTdlsCtx->threshold_config.tx_period_t = pHddCtx->cfg_ini->fTDLSTxStatsPeriod;
768 pHddTdlsCtx->threshold_config.tx_packet_n = pHddCtx->cfg_ini->fTDLSTxPacketThreshold;
769 pHddTdlsCtx->threshold_config.discovery_period_t = pHddCtx->cfg_ini->fTDLSDiscoveryPeriod;
770 pHddTdlsCtx->threshold_config.discovery_tries_n = pHddCtx->cfg_ini->fTDLSMaxDiscoveryAttempt;
771 pHddTdlsCtx->threshold_config.idle_timeout_t = pHddCtx->cfg_ini->fTDLSIdleTimeout;
772 pHddTdlsCtx->threshold_config.idle_packet_n = pHddCtx->cfg_ini->fTDLSIdlePacketThreshold;
773 pHddTdlsCtx->threshold_config.rssi_hysteresis = pHddCtx->cfg_ini->fTDLSRSSIHysteresis;
774 pHddTdlsCtx->threshold_config.rssi_trigger_threshold = pHddCtx->cfg_ini->fTDLSRSSITriggerThreshold;
775 pHddTdlsCtx->threshold_config.rssi_teardown_threshold = pHddCtx->cfg_ini->fTDLSRSSITeardownThreshold;
Chilam NG571c65a2013-01-19 12:27:36 +0530776
Sameer Thalappilbee426e2013-10-30 10:30:30 -0700777 INIT_WORK(&pHddTdlsCtx->implicit_setup, wlan_hdd_tdls_pre_setup);
778 INIT_DELAYED_WORK(&pHddCtx->tdls_scan_ctxt.tdls_scan_work, wlan_hdd_tdls_schedule_scan);
Sunil Dutt66485cb2013-12-19 19:05:03 +0530779 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee27511902013-03-14 18:19:06 -0700780
781 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +0530782}
783
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800784void wlan_hdd_tdls_exit(hdd_adapter_t *pAdapter)
Chilam NG571c65a2013-01-19 12:27:36 +0530785{
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800786 tdlsCtx_t *pHddTdlsCtx;
Hoonki Lee93e67ff2013-03-19 15:49:25 -0700787 hdd_context_t *pHddCtx;
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800788
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +0530789 /*
790 * NOTE: The Callers of this function should ensure to acquire the
791 * tdls_lock to avoid any concurrent access to the Adapter.
792 */
793
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530794 pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
Agarwal Ashish9ffa5b92014-11-18 21:07:02 +0530795
796 if (NULL == pHddCtx || NULL == pHddCtx->cfg_ini)
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530797 {
Agarwal Ashish9ffa5b92014-11-18 21:07:02 +0530798 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
799 "%s: HDD context is Null", __func__);
800 return ;
801 }
802
803 if (pHddCtx->isLogpInProgress)
804 {
805 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
806 "%s: LOGP in Progress. Ignore!!!", __func__);
807 return ;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530808 }
809
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800810 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800811 if (NULL == pHddTdlsCtx)
812 {
c_hpothu7f63e882013-10-02 19:13:35 +0530813 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
814 FL("pHddTdlsCtx is NULL"));
Hoonki Leebfee0342013-01-21 16:43:45 -0800815 return;
816 }
Sameer Thalappilbee426e2013-10-30 10:30:30 -0700817#ifdef WLAN_OPEN_SOURCE
818 cancel_work_sync(&pHddTdlsCtx->implicit_setup);
819 cancel_delayed_work_sync(&pHddCtx->tdls_scan_ctxt.tdls_scan_work);
820#endif
Hoonki Leebfee0342013-01-21 16:43:45 -0800821
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800822 /* must stop timer here before freeing peer list, because peerIdleTimer is
823 part of peer list structure. */
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800824 wlan_hdd_tdls_timers_destroy(pHddTdlsCtx);
825 wlan_hdd_tdls_free_list(pHddTdlsCtx);
Chilam Nga75d8b62013-01-29 01:35:59 -0800826
Hoonki Lee93e67ff2013-03-19 15:49:25 -0700827 wlan_hdd_tdls_free_scan_request(&pHddCtx->tdls_scan_ctxt);
Sushant Kaushik15c4c522014-08-14 12:24:49 +0530828 pHddTdlsCtx->magic = 0;
829 pHddTdlsCtx->pAdapter = NULL;
Chilam Nga75d8b62013-01-29 01:35:59 -0800830 vos_mem_free(pHddTdlsCtx);
Pradeep Reddy POTTETI59c90d62014-03-24 19:45:47 +0530831 pAdapter->sessionCtx.station.pHddTdlsCtx = NULL;
Chilam Nga75d8b62013-01-29 01:35:59 -0800832 pHddTdlsCtx = NULL;
Chilam NG571c65a2013-01-19 12:27:36 +0530833}
834
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +0530835/* stop all monitoring timers per Adapter */
836static void wlan_hdd_tdls_monitor_timers_stop(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800837{
Hoonki Leed37cbb32013-04-20 00:31:14 -0700838#ifdef TDLS_USE_SEPARATE_DISCOVERY_TIMER
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800839 vos_timer_stop(&pHddTdlsCtx->peerDiscoverTimer);
Hoonki Leed37cbb32013-04-20 00:31:14 -0700840#endif
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800841 vos_timer_stop(&pHddTdlsCtx->peerUpdateTimer);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700842 vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +0530843}
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800844
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +0530845/* stop all per peer timers */
846static void wlan_hdd_tdls_peer_timers_stop(tdlsCtx_t *pHddTdlsCtx)
847{
848 int i;
849 struct list_head *head;
850 struct list_head *pos;
851 hddTdlsPeer_t *curr_peer;
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800852 for (i = 0; i < 256; i++)
853 {
854 head = &pHddTdlsCtx->peer_list[i];
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800855 list_for_each (pos, head) {
856 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800857 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Chilam Ng01120412013-02-19 18:32:21 -0800858 "%s: " MAC_ADDRESS_STR " -> stop idle timer",
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800859 __func__,
Chilam Ng01120412013-02-19 18:32:21 -0800860 MAC_ADDR_ARRAY(curr_peer->peerMac));
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800861 vos_timer_stop ( &curr_peer->peerIdleTimer );
Hoonki Lee14621352013-04-16 17:51:19 -0700862 vos_timer_stop( &curr_peer->initiatorWaitTimeoutTimer );
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800863 }
864 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800865}
866
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +0530867/* stop all the tdls timers running */
868static void wlan_hdd_tdls_timers_stop(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800869{
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +0530870 wlan_hdd_tdls_monitor_timers_stop(pHddTdlsCtx);
871 wlan_hdd_tdls_peer_timers_stop(pHddTdlsCtx);
872}
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800873
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +0530874static void wlan_hdd_tdls_monitor_timers_destroy(tdlsCtx_t *pHddTdlsCtx)
875{
Hoonki Leed37cbb32013-04-20 00:31:14 -0700876#ifdef TDLS_USE_SEPARATE_DISCOVERY_TIMER
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800877 vos_timer_stop(&pHddTdlsCtx->peerDiscoverTimer);
878 vos_timer_destroy(&pHddTdlsCtx->peerDiscoverTimer);
Hoonki Leed37cbb32013-04-20 00:31:14 -0700879#endif
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800880 vos_timer_stop(&pHddTdlsCtx->peerUpdateTimer);
881 vos_timer_destroy(&pHddTdlsCtx->peerUpdateTimer);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700882 vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
883 vos_timer_destroy(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +0530884}
885/*Free all the timers related to the TDLS peer */
886static void wlan_hdd_tdls_peer_timers_destroy(tdlsCtx_t *pHddTdlsCtx)
887{
888 int i;
889 struct list_head *head;
890 struct list_head *pos;
891 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800892 for (i = 0; i < 256; i++)
893 {
894 head = &pHddTdlsCtx->peer_list[i];
895
896 list_for_each (pos, head) {
897 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
898
899 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Chilam Ng01120412013-02-19 18:32:21 -0800900 "%s: " MAC_ADDRESS_STR " -> destroy idle timer",
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800901 __func__,
Chilam Ng01120412013-02-19 18:32:21 -0800902 MAC_ADDR_ARRAY(curr_peer->peerMac));
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800903 vos_timer_stop ( &curr_peer->peerIdleTimer );
904 vos_timer_destroy ( &curr_peer->peerIdleTimer );
Hoonki Lee14621352013-04-16 17:51:19 -0700905 vos_timer_stop(&curr_peer->initiatorWaitTimeoutTimer);
906 vos_timer_destroy(&curr_peer->initiatorWaitTimeoutTimer);
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800907 }
908 }
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +0530909
910}
911
912/* destroy all the tdls timers running */
913static void wlan_hdd_tdls_timers_destroy(tdlsCtx_t *pHddTdlsCtx)
914{
915 wlan_hdd_tdls_monitor_timers_destroy(pHddTdlsCtx);
916 wlan_hdd_tdls_peer_timers_destroy(pHddTdlsCtx);
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800917}
918
Hoonki Lee387663d2013-02-05 18:08:43 -0800919/* if mac address exist, return pointer
920 if mac address doesn't exist, create a list and add, return pointer
921 return NULL if fails to get new mac address
922*/
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800923hddTdlsPeer_t *wlan_hdd_tdls_get_peer(hdd_adapter_t *pAdapter, u8 *mac)
Chilam NG571c65a2013-01-19 12:27:36 +0530924{
Hoonki Lee387663d2013-02-05 18:08:43 -0800925 struct list_head *head;
926 hddTdlsPeer_t *peer;
927 u8 key;
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -0700928 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530929 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
930
c_hpothu7f63e882013-10-02 19:13:35 +0530931 if(0 != (wlan_hdd_validate_context(pHddCtx)))
932 {
933 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
934 FL("pHddCtx is not valid"));
935 return 0;
936 }
Hoonki Leebfee0342013-01-21 16:43:45 -0800937
Hoonki Lee387663d2013-02-05 18:08:43 -0800938 /* if already there, just update */
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +0530939 peer = wlan_hdd_tdls_find_peer(pAdapter, mac, TRUE);
Hoonki Lee387663d2013-02-05 18:08:43 -0800940 if (peer != NULL)
941 {
942 return peer;
Chilam NG571c65a2013-01-19 12:27:36 +0530943 }
944
Hoonki Lee387663d2013-02-05 18:08:43 -0800945 /* not found, allocate and add the list */
946 peer = vos_mem_malloc(sizeof(hddTdlsPeer_t));
947 if (NULL == peer) {
948 hddLog(VOS_TRACE_LEVEL_ERROR, "%s peer malloc failed!", __func__);
949 return NULL;
950 }
Chilam NG571c65a2013-01-19 12:27:36 +0530951
Rajesh Chauhana34c6e62014-03-25 16:37:58 +0530952 mutex_lock(&pHddCtx->tdls_lock);
953
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -0700954 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
955
956 if (NULL == pHddTdlsCtx)
957 {
c_hpothue21931b2014-09-08 14:02:14 +0530958 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
c_hpothu7f63e882013-10-02 19:13:35 +0530959 FL("pHddTdlsCtx is NULL"));
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -0700960 vos_mem_free(peer);
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530961 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -0700962 return NULL;
963 }
964
965 key = wlan_hdd_tdls_hash_key(mac);
966 head = &pHddTdlsCtx->peer_list[key];
Chilam NG571c65a2013-01-19 12:27:36 +0530967
Hoonki Lee387663d2013-02-05 18:08:43 -0800968 vos_mem_zero(peer, sizeof(hddTdlsPeer_t));
969 vos_mem_copy(peer->peerMac, mac, sizeof(peer->peerMac));
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800970 peer->pHddTdlsCtx = pHddTdlsCtx;
Hoonki Lee387663d2013-02-05 18:08:43 -0800971
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800972 vos_timer_init(&peer->peerIdleTimer,
973 VOS_TIMER_TYPE_SW,
974 wlan_hdd_tdls_idle_cb,
975 peer);
976
Hoonki Lee14621352013-04-16 17:51:19 -0700977 vos_timer_init(&peer->initiatorWaitTimeoutTimer,
978 VOS_TIMER_TYPE_SW,
979 wlan_hdd_tdls_initiator_wait_cb,
980 peer);
981
Hoonki Lee387663d2013-02-05 18:08:43 -0800982 list_add_tail(&peer->node, head);
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530983 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -0800984
985 return peer;
986}
987
Gopichand Nakkala34d1b062013-03-19 15:28:33 -0700988int wlan_hdd_tdls_set_cap(hdd_adapter_t *pAdapter,
Hoonki Lee27511902013-03-14 18:19:06 -0700989 u8* mac,
990 tTDLSCapType cap)
991{
992 hddTdlsPeer_t *curr_peer;
993
Gopichand Nakkala34d1b062013-03-19 15:28:33 -0700994 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee27511902013-03-14 18:19:06 -0700995 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +0530996 {
997 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
998 "%s: curr_peer is NULL", __func__);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -0700999 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301000 }
Hoonki Lee27511902013-03-14 18:19:06 -07001001
1002 curr_peer->tdls_support = cap;
1003
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001004 return 0;
Hoonki Lee27511902013-03-14 18:19:06 -07001005}
1006
Atul Mittal115287b2014-07-08 13:26:33 +05301007void wlan_hdd_tdls_set_peer_link_status(hddTdlsPeer_t *curr_peer,
1008 tTDLSLinkStatus status,
1009 tTDLSLinkReason reason)
Hoonki Lee387663d2013-02-05 18:08:43 -08001010{
Atul Mittal115287b2014-07-08 13:26:33 +05301011 /*EXT TDLS*/
1012 tANI_S32 state = 0;
1013 tANI_S32 res = 0;
1014 /*EXT TDLS*/
Hoonki Lee387663d2013-02-05 18:08:43 -08001015 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301016 {
1017 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1018 "%s: curr_peer is NULL", __func__);
Hoonki Lee387663d2013-02-05 18:08:43 -08001019 return;
c_hpothu7f63e882013-10-02 19:13:35 +05301020 }
Hoonki Lee387663d2013-02-05 18:08:43 -08001021
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001022 hddLog(VOS_TRACE_LEVEL_WARN, "tdls set peer " MAC_ADDRESS_STR " link status to %u",
Chilam Ng01120412013-02-19 18:32:21 -08001023 MAC_ADDR_ARRAY(curr_peer->peerMac), status);
Chilam NG571c65a2013-01-19 12:27:36 +05301024
1025 curr_peer->link_status = status;
1026
Atul Mittal115287b2014-07-08 13:26:33 +05301027 /*EXT TDLS*/
1028 if (curr_peer->isForcedPeer && curr_peer->state_change_notification)
1029 {
1030 /*save the reason for any further query*/
1031 curr_peer->reason = reason;
1032 wlan_hdd_tdls_get_wifi_hal_state(curr_peer, &state, &res);
1033
1034 (curr_peer->state_change_notification)(
1035 curr_peer->peerMac,
1036 state,
1037 res,
1038 curr_peer->pHddTdlsCtx->pAdapter);
1039
1040 }
1041 /*EXT TDLS*/
1042
Chilam NG571c65a2013-01-19 12:27:36 +05301043}
1044
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001045void wlan_hdd_tdls_set_link_status(hdd_adapter_t *pAdapter,
1046 u8* mac,
Atul Mittal115287b2014-07-08 13:26:33 +05301047 tTDLSLinkStatus linkStatus,
1048 tTDLSLinkReason reason)
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001049{
Atul Mittal115287b2014-07-08 13:26:33 +05301050
1051 /*EXT TDLS*/
1052 tANI_S32 state = 0;
1053 tANI_S32 res = 0;
1054 /*EXT TDLS*/
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001055 hddTdlsPeer_t *curr_peer;
1056
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301057 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, TRUE);
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001058 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301059 {
1060 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1061 "%s: curr_peer is NULL", __func__);
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001062 return;
c_hpothu7f63e882013-10-02 19:13:35 +05301063 }
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001064
1065 curr_peer->link_status= linkStatus;
1066
Atul Mittal115287b2014-07-08 13:26:33 +05301067 /*EXT TDLS*/
1068
1069 if (curr_peer->isForcedPeer && curr_peer->state_change_notification)
1070 {
1071 /*save the reason for any further query*/
1072 curr_peer->reason = reason;
1073 wlan_hdd_tdls_get_wifi_hal_state(curr_peer, &state, &res);
1074
1075 (*curr_peer->state_change_notification)(mac,
1076 state,
1077 res,
1078 curr_peer->pHddTdlsCtx->pAdapter);
1079
1080 }
1081 /*EXT TDLS*/
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001082 return;
1083}
1084
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001085int wlan_hdd_tdls_recv_discovery_resp(hdd_adapter_t *pAdapter, u8 *mac)
Chilam NG571c65a2013-01-19 12:27:36 +05301086{
1087 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001088 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301089 hdd_context_t *pHddCtx;
1090
1091 if ( NULL == pHddTdlsCtx )
c_hpothu7f63e882013-10-02 19:13:35 +05301092 {
1093 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1094 FL("pHddTdlsCtx is NULL"));
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301095 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301096 }
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301097
1098 pHddCtx = WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter);
1099
c_hpothu7f63e882013-10-02 19:13:35 +05301100 if(0 != (wlan_hdd_validate_context(pHddCtx)))
1101 {
1102 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1103 FL("pHddCtx is not valid"));
1104 return 0;
1105 }
Chilam NG571c65a2013-01-19 12:27:36 +05301106
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001107 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001108
1109 if (NULL == curr_peer)
c_hpothu7f63e882013-10-02 19:13:35 +05301110 {
1111 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1112 FL("curr_peer is NULL"));
Hoonki Lee387663d2013-02-05 18:08:43 -08001113 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301114 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001115
1116 if (pHddTdlsCtx->discovery_sent_cnt)
1117 pHddTdlsCtx->discovery_sent_cnt--;
1118
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05301119 mutex_lock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301120
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001121 wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301122
1123 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001124 if (0 == pHddTdlsCtx->discovery_sent_cnt)
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001125 {
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001126 vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001127 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001128
Gopichand Nakkala901e8922013-03-04 23:45:58 -08001129 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001130 "Discovery(%u) Response from " MAC_ADDRESS_STR " link_status %d",
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001131 pHddTdlsCtx->discovery_sent_cnt, MAC_ADDR_ARRAY(curr_peer->peerMac),
1132 curr_peer->link_status);
1133
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001134 if (eTDLS_LINK_DISCOVERING == curr_peer->link_status)
Gopichand Nakkala901e8922013-03-04 23:45:58 -08001135 {
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001136 /* Since we are here, it means Throughput threshold is alredy met. Make sure RSSI
1137 threshold is also met before setting up TDLS link*/
1138 if ((tANI_S32) curr_peer->rssi > (tANI_S32) pHddTdlsCtx->threshold_config.rssi_trigger_threshold)
1139 {
Atul Mittal115287b2014-07-08 13:26:33 +05301140 wlan_hdd_tdls_set_peer_link_status(curr_peer,
1141 eTDLS_LINK_DISCOVERED,
1142 eTDLS_LINK_SUCCESS);
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001143 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
1144 "Rssi Threshold met: "MAC_ADDRESS_STR" rssi = %d threshold= %d" ,
1145 MAC_ADDR_ARRAY(curr_peer->peerMac), curr_peer->rssi,
1146 pHddTdlsCtx->threshold_config.rssi_trigger_threshold);
1147 cfg80211_tdls_oper_request(pAdapter->dev, curr_peer->peerMac, NL80211_TDLS_SETUP, FALSE, GFP_KERNEL);
1148 }
1149 else
1150 {
1151 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
1152 "Rssi Threshold not met: "MAC_ADDRESS_STR" rssi = %d threshold = %d ",
1153 MAC_ADDR_ARRAY(curr_peer->peerMac), curr_peer->rssi,
1154 pHddTdlsCtx->threshold_config.rssi_trigger_threshold);
Sunil Duttb0d39242014-09-10 23:54:51 +05301155
1156 /* if RSSI threshold is not met then allow further discovery
1157 * attempts by decrementing count for the last attempt
1158 */
1159 if (curr_peer->discovery_attempt)
1160 curr_peer->discovery_attempt--;
1161
Atul Mittal115287b2014-07-08 13:26:33 +05301162 wlan_hdd_tdls_set_peer_link_status(curr_peer,
1163 eTDLS_LINK_IDLE,
1164 eTDLS_LINK_UNSPECIFIED);
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001165 }
Gopichand Nakkala901e8922013-03-04 23:45:58 -08001166 }
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001167 else
1168 {
1169 wlan_hdd_tdls_check_bmps(pAdapter);
1170 }
Chilam NG571c65a2013-01-19 12:27:36 +05301171
Gopichand Nakkala901e8922013-03-04 23:45:58 -08001172 curr_peer->tdls_support = eTDLS_CAP_SUPPORTED;
Hoonki Lee387663d2013-02-05 18:08:43 -08001173 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +05301174}
1175
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301176int wlan_hdd_tdls_set_peer_caps(hdd_adapter_t *pAdapter,
1177 u8 *mac,
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301178 tCsrStaParams *StaParams,
1179 tANI_BOOLEAN isBufSta,
1180 tANI_BOOLEAN isOffChannelSupported)
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301181{
1182 hddTdlsPeer_t *curr_peer;
1183
1184 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
1185 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301186 {
1187 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1188 "%s: curr_peer is NULL", __func__);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301189 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301190 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301191
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301192 curr_peer->uapsdQueues = StaParams->uapsd_queues;
1193 curr_peer->maxSp = StaParams->max_sp;
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301194 curr_peer->isBufSta = isBufSta;
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301195 curr_peer->isOffChannelSupported = isOffChannelSupported;
1196
1197 vos_mem_copy(curr_peer->supported_channels,
1198 StaParams->supported_channels,
1199 StaParams->supported_channels_len);
1200
1201 curr_peer->supported_channels_len =
1202 StaParams->supported_channels_len;
1203
1204 vos_mem_copy(curr_peer->supported_oper_classes,
1205 StaParams->supported_oper_classes,
1206 StaParams->supported_oper_classes_len);
1207
1208 curr_peer->supported_oper_classes_len =
1209 StaParams->supported_oper_classes_len;
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301210 return 0;
1211}
1212
1213int wlan_hdd_tdls_get_link_establish_params(hdd_adapter_t *pAdapter, u8 *mac,
1214 tCsrTdlsLinkEstablishParams* tdlsLinkEstablishParams)
1215{
1216 hddTdlsPeer_t *curr_peer;
1217
1218 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
1219 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301220 {
1221 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1222 "%s: curr_peer is NULL", __func__);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301223 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301224 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301225
1226 tdlsLinkEstablishParams->isResponder = curr_peer->is_responder;
1227 tdlsLinkEstablishParams->uapsdQueues = curr_peer->uapsdQueues;
1228 tdlsLinkEstablishParams->maxSp = curr_peer->maxSp;
1229 tdlsLinkEstablishParams->isBufSta = curr_peer->isBufSta;
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301230 tdlsLinkEstablishParams->isOffChannelSupported =
1231 curr_peer->isOffChannelSupported;
1232
1233 vos_mem_copy(tdlsLinkEstablishParams->supportedChannels,
1234 curr_peer->supported_channels,
1235 curr_peer->supported_channels_len);
1236
1237 tdlsLinkEstablishParams->supportedChannelsLen =
1238 curr_peer->supported_channels_len;
1239
1240 vos_mem_copy(tdlsLinkEstablishParams->supportedOperClasses,
1241 curr_peer->supported_oper_classes,
1242 curr_peer->supported_oper_classes_len);
1243
1244 tdlsLinkEstablishParams->supportedOperClassesLen =
1245 curr_peer->supported_oper_classes_len;
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301246 return 0;
1247}
1248
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001249int wlan_hdd_tdls_set_rssi(hdd_adapter_t *pAdapter, u8 *mac, tANI_S8 rxRssi)
Chilam NG571c65a2013-01-19 12:27:36 +05301250{
1251 hddTdlsPeer_t *curr_peer;
Chilam NG571c65a2013-01-19 12:27:36 +05301252
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301253 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, TRUE);
Hoonki Lee387663d2013-02-05 18:08:43 -08001254 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301255 {
1256 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1257 "%s: curr_peer is NULL", __func__);
Hoonki Lee387663d2013-02-05 18:08:43 -08001258 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301259 }
Chilam NG571c65a2013-01-19 12:27:36 +05301260
1261 curr_peer->rssi = rxRssi;
1262
Hoonki Lee387663d2013-02-05 18:08:43 -08001263 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +05301264}
1265
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001266int wlan_hdd_tdls_set_responder(hdd_adapter_t *pAdapter, u8 *mac, tANI_U8 responder)
Hoonki Leea34dd892013-02-05 22:56:02 -08001267{
1268 hddTdlsPeer_t *curr_peer;
1269
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001270 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001271 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301272 {
1273 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1274 "%s: curr_peer is NULL", __func__);
Hoonki Leea34dd892013-02-05 22:56:02 -08001275 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301276 }
Hoonki Leea34dd892013-02-05 22:56:02 -08001277
1278 curr_peer->is_responder = responder;
1279
1280 return 0;
1281}
1282
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001283int wlan_hdd_tdls_get_responder(hdd_adapter_t *pAdapter, u8 *mac)
Hoonki Leea34dd892013-02-05 22:56:02 -08001284{
1285 hddTdlsPeer_t *curr_peer;
1286
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301287 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, TRUE);
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001288 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301289 {
1290 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1291 "%s: curr_peer is NULL", __func__);
Hoonki Leea34dd892013-02-05 22:56:02 -08001292 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301293 }
Hoonki Leea34dd892013-02-05 22:56:02 -08001294
1295 return (curr_peer->is_responder);
1296}
1297
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001298int wlan_hdd_tdls_set_signature(hdd_adapter_t *pAdapter, u8 *mac, tANI_U8 uSignature)
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001299{
1300 hddTdlsPeer_t *curr_peer;
1301
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001302 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001303 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301304 {
1305 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1306 "%s: curr_peer is NULL", __func__);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001307 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301308 }
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001309
1310 curr_peer->signature = uSignature;
1311
1312 return 0;
1313}
1314
Hoonki Leea34dd892013-02-05 22:56:02 -08001315
Hoonki Lee387663d2013-02-05 18:08:43 -08001316void wlan_hdd_tdls_extract_da(struct sk_buff *skb, u8 *mac)
Chilam NG571c65a2013-01-19 12:27:36 +05301317{
Chilam NG571c65a2013-01-19 12:27:36 +05301318 memcpy(mac, skb->data, 6);
Chilam NG571c65a2013-01-19 12:27:36 +05301319}
1320
Hoonki Lee387663d2013-02-05 18:08:43 -08001321void wlan_hdd_tdls_extract_sa(struct sk_buff *skb, u8 *mac)
Chilam Ng1279e232013-01-25 15:06:52 -08001322{
Chilam Ng1279e232013-01-25 15:06:52 -08001323 memcpy(mac, skb->data+6, 6);
Chilam Ng1279e232013-01-25 15:06:52 -08001324}
1325
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001326int wlan_hdd_tdls_increment_pkt_count(hdd_adapter_t *pAdapter, u8 *mac, u8 tx)
Chilam NG571c65a2013-01-19 12:27:36 +05301327{
Hoonki Lee387663d2013-02-05 18:08:43 -08001328 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001329 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Chilam NG571c65a2013-01-19 12:27:36 +05301330
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001331 if (eTDLS_SUPPORT_ENABLED != pHddCtx->tdls_mode)
1332 return -1;
Hoonki Leebfee0342013-01-21 16:43:45 -08001333
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001334 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08001335 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301336 {
c_hpothue21931b2014-09-08 14:02:14 +05301337 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1338 FL("curr_peer is NULL"));
Chilam NG571c65a2013-01-19 12:27:36 +05301339 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301340 }
Chilam NG571c65a2013-01-19 12:27:36 +05301341
Chilam Ng1279e232013-01-25 15:06:52 -08001342 if (tx)
1343 curr_peer->tx_pkt++;
1344 else
1345 curr_peer->rx_pkt++;
Chilam NG571c65a2013-01-19 12:27:36 +05301346
Chilam NG571c65a2013-01-19 12:27:36 +05301347 return 0;
1348}
1349
Hoonki Lee27511902013-03-14 18:19:06 -07001350static int wlan_hdd_tdls_check_config(tdls_config_params_t *config)
1351{
1352 if (config->tdls > 2)
1353 {
1354 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 1st argument %d. <0...2>", __func__, config->tdls);
1355 return -1;
1356 }
1357 if (config->tx_period_t < CFG_TDLS_TX_STATS_PERIOD_MIN ||
1358 config->tx_period_t > CFG_TDLS_TX_STATS_PERIOD_MAX)
1359 {
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001360 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 2nd argument %d. <%d...%ld>", __func__, config->tx_period_t,
Hoonki Lee27511902013-03-14 18:19:06 -07001361 CFG_TDLS_TX_STATS_PERIOD_MIN, CFG_TDLS_TX_STATS_PERIOD_MAX);
1362 return -1;
1363 }
1364 if (config->tx_packet_n < CFG_TDLS_TX_PACKET_THRESHOLD_MIN ||
1365 config->tx_packet_n > CFG_TDLS_TX_PACKET_THRESHOLD_MAX)
1366 {
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001367 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 3rd argument %d. <%d...%ld>", __func__, config->tx_packet_n,
Hoonki Lee27511902013-03-14 18:19:06 -07001368 CFG_TDLS_TX_PACKET_THRESHOLD_MIN, CFG_TDLS_TX_PACKET_THRESHOLD_MAX);
1369 return -1;
1370 }
1371 if (config->discovery_period_t < CFG_TDLS_DISCOVERY_PERIOD_MIN ||
1372 config->discovery_period_t > CFG_TDLS_DISCOVERY_PERIOD_MAX)
1373 {
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001374 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 4th argument %d. <%d...%ld>", __func__, config->discovery_period_t,
Hoonki Lee27511902013-03-14 18:19:06 -07001375 CFG_TDLS_DISCOVERY_PERIOD_MIN, CFG_TDLS_DISCOVERY_PERIOD_MAX);
1376 return -1;
1377 }
1378 if (config->discovery_tries_n < CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MIN ||
1379 config->discovery_tries_n > CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MAX)
1380 {
1381 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 5th argument %d. <%d...%d>", __func__, config->discovery_tries_n,
1382 CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MIN, CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MAX);
1383 return -1;
1384 }
1385 if (config->idle_timeout_t < CFG_TDLS_IDLE_TIMEOUT_MIN ||
1386 config->idle_timeout_t > CFG_TDLS_IDLE_TIMEOUT_MAX)
1387 {
1388 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 6th argument %d. <%d...%d>", __func__, config->idle_timeout_t,
1389 CFG_TDLS_IDLE_TIMEOUT_MIN, CFG_TDLS_IDLE_TIMEOUT_MAX);
1390 return -1;
1391 }
1392 if (config->idle_packet_n < CFG_TDLS_IDLE_PACKET_THRESHOLD_MIN ||
1393 config->idle_packet_n > CFG_TDLS_IDLE_PACKET_THRESHOLD_MAX)
1394 {
1395 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 7th argument %d. <%d...%d>", __func__, config->idle_packet_n,
1396 CFG_TDLS_IDLE_PACKET_THRESHOLD_MIN, CFG_TDLS_IDLE_PACKET_THRESHOLD_MAX);
1397 return -1;
1398 }
1399 if (config->rssi_hysteresis < CFG_TDLS_RSSI_HYSTERESIS_MIN ||
1400 config->rssi_hysteresis > CFG_TDLS_RSSI_HYSTERESIS_MAX)
1401 {
1402 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 8th argument %d. <%d...%d>", __func__, config->rssi_hysteresis,
1403 CFG_TDLS_RSSI_HYSTERESIS_MIN, CFG_TDLS_RSSI_HYSTERESIS_MAX);
1404 return -1;
1405 }
1406 if (config->rssi_trigger_threshold < CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MIN ||
1407 config->rssi_trigger_threshold > CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MAX)
1408 {
1409 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 9th argument %d. <%d...%d>", __func__, config->rssi_trigger_threshold,
1410 CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MIN, CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MAX);
1411 return -1;
1412 }
1413 if (config->rssi_teardown_threshold < CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MIN ||
1414 config->rssi_teardown_threshold > CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MAX)
1415 {
1416 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 10th argument %d. <%d...%d>", __func__, config->rssi_teardown_threshold,
1417 CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MIN, CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MAX);
1418 return -1;
1419 }
1420 return 0;
1421}
1422
Chilam Ng01120412013-02-19 18:32:21 -08001423int wlan_hdd_tdls_set_params(struct net_device *dev, tdls_config_params_t *config)
Chilam NG571c65a2013-01-19 12:27:36 +05301424{
Chilam Ng01120412013-02-19 18:32:21 -08001425 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
1426 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001427 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Hoonki Lee27511902013-03-14 18:19:06 -07001428 eTDLSSupportMode req_tdls_mode;
Hoonki Leebfee0342013-01-21 16:43:45 -08001429
Hoonki Lee27511902013-03-14 18:19:06 -07001430 if (NULL == pHddTdlsCtx)
1431 {
c_hpothu7f63e882013-10-02 19:13:35 +05301432 hddLog(VOS_TRACE_LEVEL_ERROR, FL("TDLS not enabled!"));
Hoonki Lee27511902013-03-14 18:19:06 -07001433 return -1;
Chilam Ng01120412013-02-19 18:32:21 -08001434 }
Chilam NG571c65a2013-01-19 12:27:36 +05301435
Hoonki Lee27511902013-03-14 18:19:06 -07001436 if (wlan_hdd_tdls_check_config(config) != 0)
1437 {
1438 return -1;
1439 }
1440
1441 /* config->tdls is mapped to 0->1, 1->2, 2->3 */
1442 req_tdls_mode = config->tdls + 1;
1443 if (pHddCtx->tdls_mode == req_tdls_mode)
1444 {
1445 hddLog(VOS_TRACE_LEVEL_ERROR, "%s already in mode %d", __func__, config->tdls);
1446 return -1;
1447 }
1448
1449 /* copy the configuration only when given tdls mode is implicit trigger enable */
1450 if (eTDLS_SUPPORT_ENABLED == req_tdls_mode)
1451 {
Chilam Ng01120412013-02-19 18:32:21 -08001452 memcpy(&pHddTdlsCtx->threshold_config, config, sizeof(tdls_config_params_t));
1453 }
Chilam NG571c65a2013-01-19 12:27:36 +05301454
Chilam Ng01120412013-02-19 18:32:21 -08001455 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1456 "iw set tdls params: %d %d %d %d %d %d %d %d %d %d",
1457 config->tdls,
1458 config->tx_period_t,
1459 config->tx_packet_n,
1460 config->discovery_period_t,
1461 config->discovery_tries_n,
1462 config->idle_timeout_t,
1463 config->idle_packet_n,
1464 config->rssi_hysteresis,
1465 config->rssi_trigger_threshold,
1466 config->rssi_teardown_threshold);
Chilam NG571c65a2013-01-19 12:27:36 +05301467
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07001468 wlan_hdd_tdls_set_mode(pHddCtx, req_tdls_mode, TRUE);
Chilam Ng01120412013-02-19 18:32:21 -08001469
Chilam NG571c65a2013-01-19 12:27:36 +05301470 return 0;
1471}
1472
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001473int wlan_hdd_tdls_set_sta_id(hdd_adapter_t *pAdapter, u8 *mac, u8 staId)
Kiran V1ccee932012-12-12 14:49:46 -08001474{
Hoonki Lee387663d2013-02-05 18:08:43 -08001475 hddTdlsPeer_t *curr_peer;
Kiran V1ccee932012-12-12 14:49:46 -08001476
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001477 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08001478 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301479 {
1480 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1481 "%s: curr_peer is NULL", __func__);
Chilam NG571c65a2013-01-19 12:27:36 +05301482 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301483 }
Chilam NG571c65a2013-01-19 12:27:36 +05301484
Hoonki Lee387663d2013-02-05 18:08:43 -08001485 curr_peer->staId = staId;
Chilam NG571c65a2013-01-19 12:27:36 +05301486
1487 return 0;
Kiran V1ccee932012-12-12 14:49:46 -08001488}
1489
Naresh Jayaram937abdf2013-11-26 19:50:25 +05301490int wlan_hdd_tdls_set_force_peer(hdd_adapter_t *pAdapter, u8 *mac,
1491 tANI_BOOLEAN forcePeer)
Sunil Dutt41de4e22013-11-14 18:09:02 +05301492{
Naresh Jayaram937abdf2013-11-26 19:50:25 +05301493 hddTdlsPeer_t *curr_peer;
Sunil Dutt41de4e22013-11-14 18:09:02 +05301494 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1495
1496 if ((NULL == pHddCtx)) return -1;
1497
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05301498 mutex_lock(&pHddCtx->tdls_lock);
1499
Naresh Jayaram937abdf2013-11-26 19:50:25 +05301500 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
1501 if (curr_peer == NULL)
Sunil Dutt41de4e22013-11-14 18:09:02 +05301502 goto error;
Naresh Jayaram937abdf2013-11-26 19:50:25 +05301503 curr_peer->isForcedPeer = forcePeer;
Naresh Jayaramca7bc3a2014-02-04 23:03:04 +05301504
1505 mutex_unlock(&pHddCtx->tdls_lock);
1506 return 0;
Sunil Dutt41de4e22013-11-14 18:09:02 +05301507error:
1508 mutex_unlock(&pHddCtx->tdls_lock);
1509 return -1;
1510}
1511
Hoonki Lee387663d2013-02-05 18:08:43 -08001512/* if peerMac is found, then it returns pointer to hddTdlsPeer_t
1513 otherwise, it returns NULL
1514*/
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301515hddTdlsPeer_t *wlan_hdd_tdls_find_peer(hdd_adapter_t *pAdapter, u8 *mac,
1516 tANI_BOOLEAN mutexLock)
Kiran V1ccee932012-12-12 14:49:46 -08001517{
Hoonki Lee387663d2013-02-05 18:08:43 -08001518 u8 key;
1519 struct list_head *pos;
1520 struct list_head *head;
1521 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001522 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301523 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee387663d2013-02-05 18:08:43 -08001524
c_hpothu7f63e882013-10-02 19:13:35 +05301525 if(0 != (wlan_hdd_validate_context(pHddCtx)))
1526 {
1527 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1528 FL("pHddCtx is not valid"));
1529 return 0;
1530 }
Hoonki Lee387663d2013-02-05 18:08:43 -08001531
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301532 if ( mutexLock )
Hoonki Lee387663d2013-02-05 18:08:43 -08001533 {
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05301534 mutex_lock(&pHddCtx->tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -08001535 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001536 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001537 if (NULL == pHddTdlsCtx)
1538 {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301539 if ( mutexLock )
1540 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001541 return NULL;
1542 }
1543
1544 key = wlan_hdd_tdls_hash_key(mac);
1545
1546 head = &pHddTdlsCtx->peer_list[key];
Hoonki Lee387663d2013-02-05 18:08:43 -08001547
1548 list_for_each(pos, head) {
1549 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
1550 if (!memcmp(mac, curr_peer->peerMac, 6)) {
1551 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1552 "findTdlsPeer: found staId %d", curr_peer->staId);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301553 if ( mutexLock )
1554 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -08001555 return curr_peer;
1556 }
1557 }
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301558 if ( mutexLock )
1559 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -08001560 return NULL;
1561}
1562
Hoonki Leea6d49be2013-04-05 09:43:25 -07001563hddTdlsPeer_t *wlan_hdd_tdls_find_all_peer(hdd_context_t *pHddCtx, u8 *mac)
1564{
1565 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
1566 hdd_adapter_t *pAdapter = NULL;
1567 tdlsCtx_t *pHddTdlsCtx = NULL;
1568 hddTdlsPeer_t *curr_peer= NULL;
1569 VOS_STATUS status = 0;
1570
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05301571 mutex_lock(&pHddCtx->tdls_lock);
Hoonki Leea6d49be2013-04-05 09:43:25 -07001572 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
1573 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
1574 {
1575 pAdapter = pAdapterNode->pAdapter;
1576
1577 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
1578 if (NULL != pHddTdlsCtx)
1579 {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301580 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Hoonki Leea6d49be2013-04-05 09:43:25 -07001581 if (curr_peer)
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301582 {
1583 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leea6d49be2013-04-05 09:43:25 -07001584 return curr_peer;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301585 }
Hoonki Leea6d49be2013-04-05 09:43:25 -07001586 }
1587 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
1588 pAdapterNode = pNext;
1589 }
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301590 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leea6d49be2013-04-05 09:43:25 -07001591 return curr_peer;
1592}
1593
1594
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001595int wlan_hdd_tdls_reset_peer(hdd_adapter_t *pAdapter, u8 *mac)
Hoonki Lee387663d2013-02-05 18:08:43 -08001596{
Chilam Ng01120412013-02-19 18:32:21 -08001597 hdd_context_t *pHddCtx;
Chilam NG571c65a2013-01-19 12:27:36 +05301598 hddTdlsPeer_t *curr_peer;
Kiran V1ccee932012-12-12 14:49:46 -08001599
Chilam Ng01120412013-02-19 18:32:21 -08001600 pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
1601
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001602 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08001603 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301604 {
1605 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1606 "%s: curr_peer is NULL", __func__);
Hoonki Lee387663d2013-02-05 18:08:43 -08001607 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301608 }
Chilam NG571c65a2013-01-19 12:27:36 +05301609
Atul Mittal115287b2014-07-08 13:26:33 +05301610 wlan_hdd_tdls_set_peer_link_status(curr_peer,
1611 eTDLS_LINK_IDLE,
1612 eTDLS_LINK_UNSPECIFIED);
Hoonki Leecdd8e962013-01-20 00:45:46 -08001613 curr_peer->staId = 0;
Hoonki Lee387663d2013-02-05 18:08:43 -08001614
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05301615 /* Throughput Monitor shall disable the split scan when
1616 * TDLS scan coexistance is disabled.At this point of time
1617 * since TDLS scan coexistance is not meeting the criteria
1618 * to be operational, explicitly make it false to enable
1619 * throughput monitor takes the control of split scan.
1620 */
1621 if (pHddCtx->isTdlsScanCoexistence == TRUE)
1622 {
1623 pHddCtx->isTdlsScanCoexistence = FALSE;
1624 }
1625
Chilam Ng01120412013-02-19 18:32:21 -08001626 if(eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode) {
Chilam Nga75d8b62013-01-29 01:35:59 -08001627 vos_timer_stop( &curr_peer->peerIdleTimer );
Chilam Nga75d8b62013-01-29 01:35:59 -08001628 }
Hoonki Lee387663d2013-02-05 18:08:43 -08001629 return 0;
Hoonki Leecdd8e962013-01-20 00:45:46 -08001630}
1631
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07001632/* Caller has to take the lock before calling this function */
Hoonki Lee27511902013-03-14 18:19:06 -07001633static void wlan_tdd_tdls_reset_tx_rx(tdlsCtx_t *pHddTdlsCtx)
1634{
1635 int i;
1636 struct list_head *head;
1637 hddTdlsPeer_t *tmp;
1638 struct list_head *pos, *q;
1639
Hoonki Lee27511902013-03-14 18:19:06 -07001640 for (i = 0; i < 256; i++) {
1641 head = &pHddTdlsCtx->peer_list[i];
1642 list_for_each_safe (pos, q, head) {
1643 tmp = list_entry(pos, hddTdlsPeer_t, node);
1644 tmp->tx_pkt = 0;
1645 tmp->rx_pkt = 0;
1646 }
1647 }
Hoonki Lee27511902013-03-14 18:19:06 -07001648
1649 return ;
1650}
1651
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07001652/* Caller has to take the lock before calling this function */
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001653static tANI_S32 wlan_hdd_tdls_peer_reset_discovery_processed(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001654{
1655 int i;
1656 struct list_head *head;
1657 hddTdlsPeer_t *tmp;
1658 struct list_head *pos, *q;
1659
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001660 pHddTdlsCtx->discovery_peer_cnt = 0;
1661
1662 for (i = 0; i < 256; i++) {
1663 head = &pHddTdlsCtx->peer_list[i];
1664 list_for_each_safe (pos, q, head) {
1665 tmp = list_entry(pos, hddTdlsPeer_t, node);
1666 tmp->discovery_processed = 0;
1667 }
1668 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001669
1670 return 0;
1671}
1672
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001673static tANI_S32 wlan_hdd_get_tdls_discovery_peer_cnt(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001674{
1675 int i;
1676 struct list_head *head;
1677 struct list_head *pos, *q;
1678 int discovery_peer_cnt=0;
1679 hddTdlsPeer_t *tmp;
1680
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001681 /*
1682 * This function expects the callers to acquire the Mutex.
1683 */
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001684
1685 for (i = 0; i < 256; i++) {
1686 head = &pHddTdlsCtx->peer_list[i];
1687 list_for_each_safe (pos, q, head) {
1688 tmp = list_entry(pos, hddTdlsPeer_t, node);
1689 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Chilam Ng01120412013-02-19 18:32:21 -08001690 "%s, %d, " MAC_ADDRESS_STR, __func__, i,
1691 MAC_ADDR_ARRAY(tmp->peerMac));
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001692 discovery_peer_cnt++;
1693 }
1694 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001695 return discovery_peer_cnt;
1696}
1697
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001698tANI_U16 wlan_hdd_tdlsConnectedPeers(hdd_adapter_t *pAdapter)
Lee Hoonkic1262f22013-01-24 21:59:00 -08001699{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001700 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1701
c_hpothu7f63e882013-10-02 19:13:35 +05301702 if(0 != (wlan_hdd_validate_context(pHddCtx)))
1703 {
1704 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1705 FL("pHddCtx is not valid"));
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001706 return 0;
c_hpothu7f63e882013-10-02 19:13:35 +05301707 }
Lee Hoonkic1262f22013-01-24 21:59:00 -08001708
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001709 return pHddCtx->connected_peer_count;
Lee Hoonkic1262f22013-01-24 21:59:00 -08001710}
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001711
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05301712hddTdlsPeer_t *wlan_hdd_tdls_get_first_connected_peer(hdd_adapter_t *pAdapter)
1713{
1714 int i;
1715 struct list_head *head;
1716 struct list_head *pos;
1717 hddTdlsPeer_t *curr_peer = NULL;
1718 tdlsCtx_t *pHddTdlsCtx;
1719 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1720
1721 if(0 != (wlan_hdd_validate_context(pHddCtx)))
1722 {
1723 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1724 FL("pHddCtx is not valid"));
1725 return NULL;
1726 }
1727
1728 mutex_lock(&pHddCtx->tdls_lock);
1729 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
1730 if (NULL == pHddTdlsCtx) {
1731 mutex_unlock(&pHddCtx->tdls_lock);
1732 return NULL;
1733 }
1734 for (i = 0; i < 256; i++) {
1735 head = &pHddTdlsCtx->peer_list[i];
1736
1737 list_for_each(pos, head) {
1738 curr_peer= list_entry (pos, hddTdlsPeer_t, node);
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05301739 if (curr_peer && (curr_peer->link_status == eTDLS_LINK_CONNECTED))
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05301740 {
1741 mutex_unlock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05301742 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
1743 "%s: " MAC_ADDRESS_STR " eTDLS_LINK_CONNECTED",
1744 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05301745 return curr_peer;
1746 }
1747 }
1748 }
1749 mutex_unlock(&pHddCtx->tdls_lock);
1750 return NULL;
1751}
1752
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001753int wlan_hdd_tdls_get_all_peers(hdd_adapter_t *pAdapter, char *buf, int buflen)
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001754{
1755 int i;
1756 int len, init_len;
Hoonki Lee387663d2013-02-05 18:08:43 -08001757 struct list_head *head;
1758 struct list_head *pos;
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001759 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001760 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301761 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1762
c_hpothu7f63e882013-10-02 19:13:35 +05301763 if(0 != (wlan_hdd_validate_context(pHddCtx)))
1764 {
1765 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1766 FL("pHddCtx is not valid"));
1767 return 0;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301768 }
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001769
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001770 init_len = buflen;
Sameer Thalappilb0a30232013-09-27 15:37:48 -07001771 len = scnprintf(buf, buflen, "\n%-18s%-3s%-4s%-3s%-5s\n",
1772 "MAC", "Id", "cap", "up", "RSSI");
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001773 buf += len;
1774 buflen -= len;
1775 /* 1234567890123456789012345678901234567 */
Sameer Thalappilb0a30232013-09-27 15:37:48 -07001776 len = scnprintf(buf, buflen, "---------------------------------\n");
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001777 buf += len;
1778 buflen -= len;
1779
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05301780 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001781 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001782 if (NULL == pHddTdlsCtx) {
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301783 mutex_unlock(&pHddCtx->tdls_lock);
Sameer Thalappilb0a30232013-09-27 15:37:48 -07001784 len = scnprintf(buf, buflen, "TDLS not enabled\n");
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001785 return len;
1786 }
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001787 for (i = 0; i < 256; i++) {
Hoonki Lee387663d2013-02-05 18:08:43 -08001788 head = &pHddTdlsCtx->peer_list[i];
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001789
Hoonki Lee387663d2013-02-05 18:08:43 -08001790 list_for_each(pos, head) {
1791 curr_peer= list_entry (pos, hddTdlsPeer_t, node);
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001792
Hoonki Lee387663d2013-02-05 18:08:43 -08001793 if (buflen < 32+1)
1794 break;
Sameer Thalappilb0a30232013-09-27 15:37:48 -07001795 len = scnprintf(buf, buflen,
Chilam Ng01120412013-02-19 18:32:21 -08001796 MAC_ADDRESS_STR"%3d%4s%3s%5d\n",
1797 MAC_ADDR_ARRAY(curr_peer->peerMac),
Hoonki Lee387663d2013-02-05 18:08:43 -08001798 curr_peer->staId,
1799 (curr_peer->tdls_support == eTDLS_CAP_SUPPORTED) ? "Y":"N",
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07001800 TDLS_IS_CONNECTED(curr_peer) ? "Y":"N",
Hoonki Lee387663d2013-02-05 18:08:43 -08001801 curr_peer->rssi);
1802 buf += len;
1803 buflen -= len;
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001804 }
1805 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301806 mutex_unlock(&pHddCtx->tdls_lock);
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001807 return init_len-buflen;
1808}
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001809
1810void wlan_hdd_tdls_connection_callback(hdd_adapter_t *pAdapter)
1811{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001812 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301813 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08001814
c_hpothu7f63e882013-10-02 19:13:35 +05301815 if ((NULL == pHddCtx) || (NULL == pHddTdlsCtx))
1816 {
Agarwal Ashishbf98caf2014-03-25 13:29:11 +05301817 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
1818 FL("pHddCtx or pHddTdlsCtx points to NULL"));
c_hpothu7f63e882013-10-02 19:13:35 +05301819 return;
1820 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301821
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05301822 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07001823
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001824 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
1825 "%s, update %d discover %d", __func__,
1826 pHddTdlsCtx->threshold_config.tx_period_t,
1827 pHddTdlsCtx->threshold_config.discovery_period_t);
1828
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08001829 if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode)
1830 {
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001831 wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001832 pHddTdlsCtx->discovery_sent_cnt = 0;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001833 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001834
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001835#ifdef FEATURE_WLAN_TDLS_INTERNAL
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07001836 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
1837 &pHddTdlsCtx->peerDiscoverTimer,
1838 pHddTdlsCtx->threshold_config.discovery_period_t);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001839#endif
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07001840 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
1841 &pHddTdlsCtx->peerUpdateTimer,
1842 pHddTdlsCtx->threshold_config.tx_period_t);
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08001843 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301844 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001845
1846}
1847
1848void wlan_hdd_tdls_disconnection_callback(hdd_adapter_t *pAdapter)
1849{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001850 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301851 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1852
Deepthi Gowribfd17132014-11-14 17:59:04 +05301853 if (NULL == pHddCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05301854 {
1855 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Deepthi Gowribfd17132014-11-14 17:59:04 +05301856 FL(" pHddCtx points to NULL"));
c_hpothu7f63e882013-10-02 19:13:35 +05301857 return;
1858 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001859
1860 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,"%s", __func__);
1861
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05301862 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001863 if (NULL == pHddTdlsCtx)
1864 {
c_hpothu7f63e882013-10-02 19:13:35 +05301865 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1866 FL("pHddTdlsCtx is NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301867 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001868 return;
1869 }
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001870 pHddTdlsCtx->discovery_sent_cnt = 0;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001871 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001872
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301873 wlan_hdd_tdls_monitor_timers_stop(pHddTdlsCtx);
1874 wlan_hdd_tdls_peer_timers_destroy(pHddTdlsCtx);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001875 wlan_hdd_tdls_free_list(pHddTdlsCtx);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001876
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301877 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001878}
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001879
1880void wlan_hdd_tdls_mgmt_completion_callback(hdd_adapter_t *pAdapter, tANI_U32 statusCode)
1881{
1882 pAdapter->mgmtTxCompletionStatus = statusCode;
1883 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,"%s: Mgmt TX Completion %d",
1884 __func__, statusCode);
1885 complete(&pAdapter->tdls_mgmt_comp);
1886}
1887
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001888void wlan_hdd_tdls_increment_peer_count(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001889{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001890 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001891
c_hpothu7f63e882013-10-02 19:13:35 +05301892 if(0 != (wlan_hdd_validate_context(pHddCtx)))
1893 {
1894 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1895 FL("pHddCtx is not valid"));
1896 return;
1897 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001898
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05301899 mutex_lock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301900
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001901 pHddCtx->connected_peer_count++;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001902 wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001903
1904 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL, "%s: %d",
1905 __func__, pHddCtx->connected_peer_count);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301906
1907 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001908}
1909
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001910void wlan_hdd_tdls_decrement_peer_count(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001911{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001912 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001913
c_hpothu7f63e882013-10-02 19:13:35 +05301914 if(0 != (wlan_hdd_validate_context(pHddCtx)))
1915 {
1916 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1917 FL("pHddCtx is not valid"));
1918 return;
1919 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001920
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05301921 mutex_lock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301922
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001923 if (pHddCtx->connected_peer_count)
1924 pHddCtx->connected_peer_count--;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001925 wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001926
1927 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL, "%s: %d",
1928 __func__, pHddCtx->connected_peer_count);
1929
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301930 mutex_unlock(&pHddCtx->tdls_lock);
1931
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001932}
1933
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001934void wlan_hdd_tdls_check_bmps(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001935{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001936 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001937 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Hoonki Lee14621352013-04-16 17:51:19 -07001938 hddTdlsPeer_t *curr_peer;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001939
c_hpothu7f63e882013-10-02 19:13:35 +05301940 if ((NULL == pHddCtx) || (NULL == pHddTdlsCtx))
1941 {
1942 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1943 FL(" pHddCtx or pHddTdlsCtx points to NULL"));
1944 return;
1945 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001946
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301947 curr_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0);
Hoonki Lee14621352013-04-16 17:51:19 -07001948 if (NULL != curr_peer)
1949 {
1950 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
1951 "%s: tdls in progress. Dont check for BMPS " MAC_ADDRESS_STR,
1952 __func__, MAC_ADDR_ARRAY (curr_peer->peerMac));
1953 return;
1954 }
1955
Hoonki Lee93e67ff2013-03-19 15:49:25 -07001956 if ((TDLS_CTX_MAGIC != pHddCtx->tdls_scan_ctxt.magic) &&
1957 (0 == pHddCtx->connected_peer_count) &&
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001958 (0 == pHddTdlsCtx->discovery_sent_cnt))
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001959 {
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001960 if (FALSE == sme_IsPmcBmps(WLAN_HDD_GET_HAL_CTX(pAdapter)))
1961 {
1962 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001963 "%s: No TDLS peer connected/discovery sent. Enable BMPS",
1964 __func__);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001965 hdd_enable_bmps_imps(pHddCtx);
1966 }
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001967 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001968 else
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001969 {
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001970 if (TRUE == sme_IsPmcBmps(WLAN_HDD_GET_HAL_CTX(pAdapter)))
1971 {
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001972 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
1973 "%s: TDLS peer connected. Disable BMPS", __func__);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001974 hdd_disable_bmps_imps(pHddCtx, WLAN_HDD_INFRA_STATION);
1975 }
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001976 }
1977 return;
1978}
1979
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001980u8 wlan_hdd_tdls_is_peer_progress(hdd_adapter_t *pAdapter, u8 *mac)
1981{
1982 hddTdlsPeer_t *curr_peer;
1983
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301984 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, TRUE);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001985 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301986 {
1987 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1988 "%s: curr_peer is NULL", __func__);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001989 return 0;
c_hpothu7f63e882013-10-02 19:13:35 +05301990 }
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001991
1992 return (eTDLS_LINK_CONNECTING == curr_peer->link_status);
1993}
1994
Hoonki Leefb8df672013-04-10 18:20:34 -07001995/* return pointer to hddTdlsPeer_t if TDLS is ongoing. Otherwise return NULL.
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001996 * mac - if NULL check for all the peer list, otherwise, skip this mac when skip_self is TRUE
1997 * skip_self - if TRUE, skip this mac. otherwise, check all the peer list. if
1998 mac is NULL, this argument is ignored, and check for all the peer list.
1999 */
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302000static hddTdlsPeer_t *wlan_hdd_tdls_find_progress_peer(hdd_adapter_t *pAdapter, u8 *mac, u8 skip_self)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002001{
2002 int i;
2003 struct list_head *head;
2004 hddTdlsPeer_t *curr_peer;
2005 struct list_head *pos;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302006 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302007
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302008 if (NULL == pHddTdlsCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302009 {
2010 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2011 FL("pHddTdlsCtx is NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302012 return NULL;
c_hpothu7f63e882013-10-02 19:13:35 +05302013 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302014
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002015 for (i = 0; i < 256; i++) {
2016 head = &pHddTdlsCtx->peer_list[i];
2017 list_for_each(pos, head) {
2018 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
2019 if (skip_self && mac && !memcmp(mac, curr_peer->peerMac, 6)) {
2020 continue;
2021 }
2022 else
2023 {
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08002024 if (eTDLS_LINK_CONNECTING == curr_peer->link_status)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002025 {
Gopichand Nakkalac87400e2013-03-13 18:51:00 -07002026 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002027 "%s:" MAC_ADDRESS_STR " eTDLS_LINK_CONNECTING",
Gopichand Nakkalac87400e2013-03-13 18:51:00 -07002028 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
Hoonki Leefb8df672013-04-10 18:20:34 -07002029 return curr_peer;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002030 }
2031 }
2032 }
2033 }
Hoonki Leefb8df672013-04-10 18:20:34 -07002034 return NULL;
2035}
2036
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302037hddTdlsPeer_t *wlan_hdd_tdls_is_progress(hdd_context_t *pHddCtx, u8 *mac, u8 skip_self)
Hoonki Leefb8df672013-04-10 18:20:34 -07002038{
2039 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2040 hdd_adapter_t *pAdapter = NULL;
2041 tdlsCtx_t *pHddTdlsCtx = NULL;
2042 hddTdlsPeer_t *curr_peer= NULL;
2043 VOS_STATUS status = 0;
2044
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302045 mutex_lock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302046
Hoonki Leefb8df672013-04-10 18:20:34 -07002047 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2048 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2049 {
2050 pAdapter = pAdapterNode->pAdapter;
2051
2052 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2053 if (NULL != pHddTdlsCtx)
2054 {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302055 curr_peer = wlan_hdd_tdls_find_progress_peer(pAdapter, mac, skip_self);
Hoonki Leefb8df672013-04-10 18:20:34 -07002056 if (curr_peer)
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302057 {
2058 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leefb8df672013-04-10 18:20:34 -07002059 return curr_peer;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302060 }
Hoonki Leefb8df672013-04-10 18:20:34 -07002061 }
2062 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2063 pAdapterNode = pNext;
2064 }
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302065 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leefb8df672013-04-10 18:20:34 -07002066 return NULL;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002067}
Hoonki Lee27511902013-03-14 18:19:06 -07002068
2069static void wlan_hdd_tdls_implicit_disable(tdlsCtx_t *pHddTdlsCtx)
2070{
Hoonki Lee27511902013-03-14 18:19:06 -07002071 wlan_hdd_tdls_timers_stop(pHddTdlsCtx);
Hoonki Lee27511902013-03-14 18:19:06 -07002072}
2073
2074static void wlan_hdd_tdls_implicit_enable(tdlsCtx_t *pHddTdlsCtx)
2075{
2076 wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002077 pHddTdlsCtx->discovery_sent_cnt = 0;
Hoonki Lee27511902013-03-14 18:19:06 -07002078 wlan_tdd_tdls_reset_tx_rx(pHddTdlsCtx);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002079 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002080
Hoonki Lee27511902013-03-14 18:19:06 -07002081
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002082#ifdef FEATURE_WLAN_TDLS_INTERNAL
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002083 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
2084 &pHddTdlsCtx->peerDiscoverTimer,
2085 pHddTdlsCtx->threshold_config.discovery_period_t);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002086#endif
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002087 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
2088 &pHddTdlsCtx->peerUpdateTimer,
2089 pHddTdlsCtx->threshold_config.tx_period_t);
Hoonki Lee27511902013-03-14 18:19:06 -07002090}
2091
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002092void wlan_hdd_tdls_set_mode(hdd_context_t *pHddCtx,
2093 eTDLSSupportMode tdls_mode,
2094 v_BOOL_t bUpdateLast)
Hoonki Lee27511902013-03-14 18:19:06 -07002095{
2096 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2097 VOS_STATUS status;
2098 hdd_adapter_t *pAdapter;
2099 tdlsCtx_t *pHddTdlsCtx;
2100
2101 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,"%s mode %d", __func__, (int)tdls_mode);
c_hpothu7f63e882013-10-02 19:13:35 +05302102
2103 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2104 {
2105 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2106 FL("pHddCtx is not valid"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302107 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302108 }
Hoonki Lee27511902013-03-14 18:19:06 -07002109
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302110 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07002111
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002112 if (pHddCtx->tdls_mode == tdls_mode)
2113 {
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -07002114 hddLog(TDLS_LOG_LEVEL, "%s already in mode %d", __func__, (int)tdls_mode);
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302115 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002116 return;
2117 }
2118
Hoonki Lee27511902013-03-14 18:19:06 -07002119 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2120
2121 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2122 {
2123 pAdapter = pAdapterNode->pAdapter;
Hoonki Leea6d49be2013-04-05 09:43:25 -07002124 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2125 if (NULL != pHddTdlsCtx)
Hoonki Lee27511902013-03-14 18:19:06 -07002126 {
Hoonki Leea6d49be2013-04-05 09:43:25 -07002127 if(eTDLS_SUPPORT_ENABLED == tdls_mode)
2128 wlan_hdd_tdls_implicit_enable(pHddTdlsCtx);
2129 else if((eTDLS_SUPPORT_DISABLED == tdls_mode) ||
2130 (eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == tdls_mode))
2131 wlan_hdd_tdls_implicit_disable(pHddTdlsCtx);
Hoonki Lee27511902013-03-14 18:19:06 -07002132 }
2133 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2134 pAdapterNode = pNext;
2135 }
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002136 if(bUpdateLast)
2137 {
2138 pHddCtx->tdls_mode_last = tdls_mode;
2139 }
2140 else
2141 {
2142 pHddCtx->tdls_mode_last = pHddCtx->tdls_mode;
2143 }
Hoonki Lee27511902013-03-14 18:19:06 -07002144 pHddCtx->tdls_mode = tdls_mode;
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002145
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302146 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee27511902013-03-14 18:19:06 -07002147}
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002148
Mahesh A Saptasagar8b231b32014-08-11 11:58:15 +05302149static void __wlan_hdd_tdls_pre_setup(struct work_struct *work)
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002150{
Hoonki Leed37cbb32013-04-20 00:31:14 -07002151 tdlsCtx_t *pHddTdlsCtx =
2152 container_of(work, tdlsCtx_t, implicit_setup);
2153 hdd_context_t *pHddCtx;
2154 hddTdlsPeer_t *curr_peer;
Hoonki Leefb8df672013-04-10 18:20:34 -07002155 hddTdlsPeer_t *temp_peer;
Hoonki Leed37cbb32013-04-20 00:31:14 -07002156 int status;
2157
2158 if (NULL == pHddTdlsCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302159 {
2160 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2161 FL("pHddTdlsCtx is NULL"));
Hoonki Leed37cbb32013-04-20 00:31:14 -07002162 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302163 }
Hoonki Leed37cbb32013-04-20 00:31:14 -07002164
2165 if (unlikely(TDLS_CTX_MAGIC != pHddTdlsCtx->magic))
c_hpothu7f63e882013-10-02 19:13:35 +05302166 {
2167 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2168 "%s: tdls magic no missmatch %u", __func__, pHddTdlsCtx->magic);
Hoonki Leed37cbb32013-04-20 00:31:14 -07002169 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302170 }
Hoonki Leed37cbb32013-04-20 00:31:14 -07002171
2172 pHddCtx = WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter);
Hoonki Leefb8df672013-04-10 18:20:34 -07002173
c_hpothu7f63e882013-10-02 19:13:35 +05302174 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2175 {
2176 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2177 FL("pHddCtx is not valid"));
Hoonki Leefb8df672013-04-10 18:20:34 -07002178 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302179 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002180
Hoonki Leed37cbb32013-04-20 00:31:14 -07002181 curr_peer = pHddTdlsCtx->curr_candidate;
2182
2183 if (NULL == curr_peer)
c_hpothu7f63e882013-10-02 19:13:35 +05302184 {
2185 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2186 FL("curr_peer is NULL"));
2187
Hoonki Leed37cbb32013-04-20 00:31:14 -07002188 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302189 }
Hoonki Leed37cbb32013-04-20 00:31:14 -07002190
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002191 if (TRUE == sme_IsPmcBmps(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter)))
2192 {
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002193 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,"%s: Disable BMPS", __func__);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002194 hdd_disable_bmps_imps(pHddCtx, WLAN_HDD_INFRA_STATION);
2195 }
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002196
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302197 temp_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0);
Hoonki Leefb8df672013-04-10 18:20:34 -07002198 if (NULL != temp_peer)
2199 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08002200 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL, "%s: " MAC_ADDRESS_STR " ongoing. pre_setup ignored",
Hoonki Leefb8df672013-04-10 18:20:34 -07002201 __func__, MAC_ADDR_ARRAY(temp_peer->peerMac));
Hoonki Leed37cbb32013-04-20 00:31:14 -07002202 goto done;
Hoonki Leefb8df672013-04-10 18:20:34 -07002203 }
2204
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002205 if (eTDLS_CAP_UNKNOWN != curr_peer->tdls_support)
Atul Mittal115287b2014-07-08 13:26:33 +05302206 wlan_hdd_tdls_set_peer_link_status(curr_peer,
2207 eTDLS_LINK_DISCOVERING,
2208 eTDLS_LINK_SUCCESS);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002209
Hoonki Leed37cbb32013-04-20 00:31:14 -07002210 status = wlan_hdd_cfg80211_send_tdls_discover_req(pHddTdlsCtx->pAdapter->wdev.wiphy,
2211 pHddTdlsCtx->pAdapter->dev,
2212 curr_peer->peerMac);
2213
2214 if (0 != status)
2215 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08002216 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL, "%s: " MAC_ADDRESS_STR " discovery could not sent",
Hoonki Leed37cbb32013-04-20 00:31:14 -07002217 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
2218 if (eTDLS_CAP_UNKNOWN != curr_peer->tdls_support)
Atul Mittal115287b2014-07-08 13:26:33 +05302219 wlan_hdd_tdls_set_peer_link_status(curr_peer,
2220 eTDLS_LINK_IDLE,
2221 eTDLS_LINK_UNSPECIFIED);
Hoonki Leed37cbb32013-04-20 00:31:14 -07002222 goto done;
2223 }
2224
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002225 pHddTdlsCtx->discovery_sent_cnt++;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302226
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302227 mutex_lock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302228
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002229 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302230
Pradeep Reddy POTTETI219ced32014-11-14 16:33:57 +05302231 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
2232 &pHddTdlsCtx->peerDiscoveryTimeoutTimer,
2233 pHddTdlsCtx->threshold_config.tx_period_t - TDLS_DISCOVERY_TIMEOUT_BEFORE_UPDATE);
2234
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302235 mutex_unlock(&pHddCtx->tdls_lock);
Jeff Johnson0299d0a2013-10-30 12:37:43 -07002236 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL, "%s: discovery count %u timeout %u msec",
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002237 __func__, pHddTdlsCtx->discovery_sent_cnt,
2238 pHddTdlsCtx->threshold_config.tx_period_t - TDLS_DISCOVERY_TIMEOUT_BEFORE_UPDATE);
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002239
Hoonki Leed37cbb32013-04-20 00:31:14 -07002240done:
2241 pHddTdlsCtx->curr_candidate = NULL;
2242 pHddTdlsCtx->magic = 0;
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002243 return;
2244}
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002245
Mahesh A Saptasagar8b231b32014-08-11 11:58:15 +05302246
2247static void wlan_hdd_tdls_pre_setup(struct work_struct *work)
2248{
2249 vos_ssr_protect(__func__);
2250 __wlan_hdd_tdls_pre_setup(work);
2251 vos_ssr_unprotect(__func__);
2252
2253 return;
2254}
2255
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002256tANI_U32 wlan_hdd_tdls_discovery_sent_cnt(hdd_context_t *pHddCtx)
2257{
2258 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2259 hdd_adapter_t *pAdapter = NULL;
2260 tdlsCtx_t *pHddTdlsCtx = NULL;
2261 VOS_STATUS status = 0;
2262 tANI_U32 count = 0;
2263
2264 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2265 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2266 {
2267 pAdapter = pAdapterNode->pAdapter;
2268
Hoonki Leea6d49be2013-04-05 09:43:25 -07002269 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2270 if (NULL != pHddTdlsCtx)
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002271 {
Hoonki Leea6d49be2013-04-05 09:43:25 -07002272 count = count + pHddTdlsCtx->discovery_sent_cnt;
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002273 }
2274 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2275 pAdapterNode = pNext;
2276 }
2277 return count;
2278}
2279
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002280void wlan_hdd_tdls_check_power_save_prohibited(hdd_adapter_t *pAdapter)
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002281{
2282 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2283 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2284
2285 if ((NULL == pHddTdlsCtx) || (NULL == pHddCtx))
c_hpothu7f63e882013-10-02 19:13:35 +05302286 {
2287 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2288 FL(" pHddCtx or pHddTdlsCtx points to NULL"));
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002289 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302290 }
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002291
2292 if ((0 == pHddCtx->connected_peer_count) &&
2293 (0 == wlan_hdd_tdls_discovery_sent_cnt(pHddCtx)))
2294 {
2295 sme_SetTdlsPowerSaveProhibited(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter), 0);
2296 return;
2297 }
2298 sme_SetTdlsPowerSaveProhibited(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter), 1);
2299 return;
2300}
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002301
2302void wlan_hdd_tdls_free_scan_request (tdls_scan_context_t *tdls_scan_ctx)
2303{
2304 if (NULL == tdls_scan_ctx)
c_hpothu7f63e882013-10-02 19:13:35 +05302305 {
2306 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2307 FL("tdls_scan_ctx is NULL"));
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002308 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302309 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002310
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002311 tdls_scan_ctx->attempt = 0;
Hoonki Leefb8df672013-04-10 18:20:34 -07002312 tdls_scan_ctx->reject = 0;
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002313 tdls_scan_ctx->magic = 0;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002314 tdls_scan_ctx->scan_request = NULL;
2315 return;
2316}
2317
2318int wlan_hdd_tdls_copy_scan_context(hdd_context_t *pHddCtx,
2319 struct wiphy *wiphy,
2320#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
2321 struct net_device *dev,
2322#endif
2323 struct cfg80211_scan_request *request)
2324{
2325 tdls_scan_context_t *scan_ctx;
2326
c_hpothu7f63e882013-10-02 19:13:35 +05302327 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2328 {
2329 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2330 FL("pHddCtx is not valid"));
2331 return 0;
2332 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002333
2334 scan_ctx = &pHddCtx->tdls_scan_ctxt;
2335
2336 scan_ctx->wiphy = wiphy;
2337#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
2338 scan_ctx->dev = dev;
2339#endif
2340
2341 scan_ctx->scan_request = request;
2342 return 0;
2343}
2344
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002345static void wlan_hdd_tdls_scan_init_work(hdd_context_t *pHddCtx,
2346 struct wiphy *wiphy,
2347#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
2348 struct net_device *dev,
2349#endif
2350 struct cfg80211_scan_request *request,
2351 unsigned long delay)
2352{
2353 if (TDLS_CTX_MAGIC != pHddCtx->tdls_scan_ctxt.magic)
2354 {
2355#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
2356 wlan_hdd_tdls_copy_scan_context(pHddCtx, wiphy, dev, request);
2357#else
2358 wlan_hdd_tdls_copy_scan_context(pHddCtx, wiphy, request);
2359#endif
2360 pHddCtx->tdls_scan_ctxt.attempt = 0;
2361 pHddCtx->tdls_scan_ctxt.magic = TDLS_CTX_MAGIC;
2362 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002363 schedule_delayed_work(&pHddCtx->tdls_scan_ctxt.tdls_scan_work, delay);
2364}
2365
2366/* return negative = caller should stop and return error code immediately
2367 return 0 = caller should stop and return success immediately
2368 return 1 = caller can continue to scan
2369 */
2370int wlan_hdd_tdls_scan_callback (hdd_adapter_t *pAdapter,
2371 struct wiphy *wiphy,
2372#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
2373 struct net_device *dev,
2374#endif
2375 struct cfg80211_scan_request *request)
2376{
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002377 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2378 u16 connectedTdlsPeers;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302379 hddTdlsPeer_t *curr_peer, *connected_peer;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002380 unsigned long delay;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302381 hdd_config_t *cfg_param = pHddCtx->cfg_ini;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002382
c_hpothu7f63e882013-10-02 19:13:35 +05302383 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2384 {
2385 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2386 FL("pHddCtx is not valid"));
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002387 return 0;
c_hpothu7f63e882013-10-02 19:13:35 +05302388 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002389
2390 /* if tdls is not enabled, then continue scan */
2391 if (eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode)
2392 return 1;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302393 curr_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0);
Hoonki Leefb8df672013-04-10 18:20:34 -07002394 if (NULL != curr_peer)
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002395 {
Hoonki Leefb8df672013-04-10 18:20:34 -07002396 if (pHddCtx->tdls_scan_ctxt.reject++ >= TDLS_MAX_SCAN_REJECT)
2397 {
2398 pHddCtx->tdls_scan_ctxt.reject = 0;
2399 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2400 "%s: " MAC_ADDRESS_STR ". scan rejected %d. force it to idle",
2401 __func__, MAC_ADDR_ARRAY (curr_peer->peerMac), pHddCtx->tdls_scan_ctxt.reject);
2402
Atul Mittal115287b2014-07-08 13:26:33 +05302403 wlan_hdd_tdls_set_peer_link_status (curr_peer,
2404 eTDLS_LINK_IDLE,
2405 eTDLS_LINK_UNSPECIFIED);
Hoonki Leefb8df672013-04-10 18:20:34 -07002406 return 1;
2407 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002408 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Hoonki Leefb8df672013-04-10 18:20:34 -07002409 "%s: tdls in progress. scan rejected %d",
2410 __func__, pHddCtx->tdls_scan_ctxt.reject);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002411 return -EBUSY;
2412 }
2413
2414 /* tdls teardown is ongoing */
2415 if (eTDLS_SUPPORT_DISABLED == pHddCtx->tdls_mode)
2416 {
2417 connectedTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
2418 if (connectedTdlsPeers && (pHddCtx->tdls_scan_ctxt.attempt < TDLS_MAX_SCAN_SCHEDULE))
2419 {
2420 delay = (unsigned long)(TDLS_DELAY_SCAN_PER_CONNECTION*connectedTdlsPeers);
2421 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2422 "%s: tdls disabled, but still connected_peers %d attempt %d. schedule scan %lu msec",
2423 __func__, connectedTdlsPeers, pHddCtx->tdls_scan_ctxt.attempt, delay);
2424
2425 wlan_hdd_tdls_scan_init_work (pHddCtx, wiphy,
2426#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
2427 dev,
2428#endif
2429 request,
2430 msecs_to_jiffies(delay));
2431 /* scan should not continue */
2432 return 0;
2433 }
2434 /* no connected peer or max retry reached, scan continue */
2435 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2436 "%s: tdls disabled. connected_peers %d attempt %d. scan allowed",
2437 __func__, connectedTdlsPeers, pHddCtx->tdls_scan_ctxt.attempt);
2438 return 1;
2439 }
2440 /* while tdls is up, first time scan */
2441 else if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode ||
2442 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode)
2443 {
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002444 connectedTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302445
2446 /* check the TDLS link and Scan coexistance Capability */
2447 if ( (TRUE == pHddCtx->cfg_ini->fEnableTDLSScanCoexSupport) &&
2448 (TRUE == sme_IsFeatureSupportedByFW(TDLS_SCAN_COEXISTENCE)) &&
2449 (connectedTdlsPeers == 1) )
2450 {
2451 /* get connected peer information */
2452 connected_peer = wlan_hdd_tdls_get_first_connected_peer(pAdapter);
2453 if (NULL == connected_peer) {
2454 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
2455 "%s: Invalid connected_peer, Continue Scanning", __func__);
2456 /* scan should continue */
2457 return 1;
2458 }
2459 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2460 ("%s: TDLS Scan Co-exist supported connectedTdlsPeers =%d buffersta =%d"),
2461 __func__,connectedTdlsPeers,connected_peer->isBufSta);
2462
2463 if (connected_peer->isBufSta)
2464 {
2465 pHddCtx->isTdlsScanCoexistence = TRUE;
2466 if ((cfg_param->dynSplitscan) && (!pHddCtx->issplitscan_enabled))
2467 {
2468 pHddCtx->issplitscan_enabled = TRUE;
2469 sme_enable_disable_split_scan(
2470 WLAN_HDD_GET_HAL_CTX(pAdapter),
2471 cfg_param->nNumStaChanCombinedConc,
2472 cfg_param->nNumP2PChanCombinedConc);
2473 }
2474 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2475 ("%s:%d TDLS Scan Co-exist supported splitscan_enabled =%d "),
2476 __func__, __LINE__, pHddCtx->issplitscan_enabled);
2477 return 1;
2478 }
2479
2480 }
2481 else
2482 {
2483 /* Throughput Monitor shall disable the split scan when
2484 * TDLS scan coexistance is disabled.At this point of time
2485 * since TDLS scan coexistance is not meeting the criteria
2486 * to be operational, explicitly make it false to enable
2487 * throughput monitor takes the control of split scan.
2488 */
2489 pHddCtx->isTdlsScanCoexistence = FALSE;
2490 }
2491 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2492 ("%s: TDLS Scan Co-exist not supported connectedTdlsPeers =%d"
2493 " TDLSScanCoexSupport param =%d TDLS_SCAN_COEXISTENCE =%d"),
2494 __func__, connectedTdlsPeers,
2495 pHddCtx->cfg_ini->fEnableTDLSScanCoexSupport,
2496 sme_IsFeatureSupportedByFW(TDLS_SCAN_COEXISTENCE));
2497
Atul Mittal5803b342014-09-04 15:31:19 +05302498 /* disable implicit trigger logic & tdls operatoin */
2499 wlan_hdd_tdls_set_mode(pHddCtx, eTDLS_SUPPORT_DISABLED, FALSE);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302500 /* fall back to the implementation of teardown the peers on the scan
2501 * when the number of connected peers are more than one. TDLS Scan
2502 * coexistance feature is exercised only when a single peer is
2503 * connected and the DUT shall not advertize the Buffer Sta capability,
2504 * so that the peer shall not go to the TDLS power save
2505 */
2506
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002507 if (connectedTdlsPeers)
2508 {
2509 tANI_U8 staIdx;
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07002510 hddTdlsPeer_t *curr_peer;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002511
2512 for (staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++)
2513 {
2514 if (pHddCtx->tdlsConnInfo[staIdx].staId)
2515 {
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -07002516 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002517 ("%s: indicate TDLS teadown (staId %d)"), __func__, pHddCtx->tdlsConnInfo[staIdx].staId) ;
2518
2519#ifdef CONFIG_TDLS_IMPLICIT
Hoonki Leea6d49be2013-04-05 09:43:25 -07002520 curr_peer = wlan_hdd_tdls_find_all_peer(pHddCtx, pHddCtx->tdlsConnInfo[staIdx].peerMac.bytes);
2521 if(curr_peer)
2522 wlan_hdd_tdls_indicate_teardown(curr_peer->pHddTdlsCtx->pAdapter, curr_peer, eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002523#endif
2524 }
2525 }
2526 /* schedule scan */
2527 delay = (unsigned long)(TDLS_DELAY_SCAN_PER_CONNECTION*connectedTdlsPeers);
2528
2529 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2530 "%s: tdls enabled (mode %d), connected_peers %d. schedule scan %lu msec",
2531 __func__, pHddCtx->tdls_mode, wlan_hdd_tdlsConnectedPeers(pAdapter),
2532 delay);
2533
2534 wlan_hdd_tdls_scan_init_work (pHddCtx, wiphy,
2535#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
2536 dev,
2537#endif
2538 request,
2539 msecs_to_jiffies(delay));
2540 /* scan should not continue */
2541 return 0;
2542 }
2543 /* no connected peer, scan continue */
2544 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
2545 "%s: tdls_mode %d, and no tdls connection. scan allowed",
2546 __func__, pHddCtx->tdls_mode);
2547 }
2548 return 1;
2549}
2550
2551void wlan_hdd_tdls_scan_done_callback(hdd_adapter_t *pAdapter)
2552{
2553 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002554
c_hpothu7f63e882013-10-02 19:13:35 +05302555 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2556 {
2557 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2558 FL("pHddCtx is not valid"));
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002559 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302560 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002561
Sunil Dutt41de4e22013-11-14 18:09:02 +05302562
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002563 /* free allocated memory at scan time */
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002564 wlan_hdd_tdls_free_scan_request (&pHddCtx->tdls_scan_ctxt);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002565
2566 /* if tdls was enabled before scan, re-enable tdls mode */
2567 if(eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode_last ||
2568 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode_last)
2569 {
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -07002570 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002571 ("%s: revert tdls mode %d"), __func__, pHddCtx->tdls_mode_last);
2572
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002573 wlan_hdd_tdls_set_mode(pHddCtx, pHddCtx->tdls_mode_last, FALSE);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002574 }
2575 wlan_hdd_tdls_check_bmps(pAdapter);
2576}
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002577
2578void wlan_hdd_tdls_timer_restart(hdd_adapter_t *pAdapter,
2579 vos_timer_t *timer,
2580 v_U32_t expirationTime)
2581{
2582 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
2583
2584 if (NULL == pHddStaCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302585 {
2586 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2587 FL("pHddStaCtx is NULL"));
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002588 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302589 }
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002590
2591 /* Check whether driver load unload is in progress */
2592 if(vos_is_load_unload_in_progress( VOS_MODULE_ID_VOSS, NULL))
2593 {
2594 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2595 "%s: Driver load/unload is in progress.", __func__);
2596 return;
2597 }
2598
2599 if (hdd_connIsConnected(pHddStaCtx))
2600 {
2601 vos_timer_stop(timer);
2602 vos_timer_start(timer, expirationTime);
2603 }
2604}
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07002605void wlan_hdd_tdls_indicate_teardown(hdd_adapter_t *pAdapter,
2606 hddTdlsPeer_t *curr_peer,
2607 tANI_U16 reason)
2608{
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05302609 hdd_context_t *pHddCtx;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302610
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07002611 if (NULL == pAdapter || NULL == curr_peer)
c_hpothu7f63e882013-10-02 19:13:35 +05302612 {
2613 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2614 FL("parameters passed are invalid"));
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07002615 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302616 }
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07002617
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05302618 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2619
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07002620 if (eTDLS_LINK_CONNECTED != curr_peer->link_status)
2621 return;
2622
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302623 /* Throughput Monitor shall disable the split scan when
2624 * TDLS scan coexistance is disabled.At this point of time
2625 * since TDLS scan coexistance is not meeting the criteria
2626 * to be operational, explicitly make it false to enable
2627 * throughput monitor takes the control of split scan.
2628 */
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05302629 if (pHddCtx && (pHddCtx->isTdlsScanCoexistence == TRUE))
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302630 {
2631 pHddCtx->isTdlsScanCoexistence = FALSE;
2632 }
2633
Atul Mittal115287b2014-07-08 13:26:33 +05302634 wlan_hdd_tdls_set_peer_link_status(curr_peer,
2635 eTDLS_LINK_TEARING,
Atul Mittal271a7652014-09-12 13:18:22 +05302636 eTDLS_LINK_UNSPECIFIED);
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07002637 cfg80211_tdls_oper_request(pAdapter->dev,
2638 curr_peer->peerMac,
2639 NL80211_TDLS_TEARDOWN,
2640 reason,
2641 GFP_KERNEL);
2642}
Atul Mittal115287b2014-07-08 13:26:33 +05302643
2644
2645/*EXT TDLS*/
2646int wlan_hdd_set_callback(hddTdlsPeer_t *curr_peer,
2647 cfg80211_exttdls_callback callback)
2648{
2649
2650 hdd_context_t *pHddCtx;
2651 hdd_adapter_t *pAdapter;
2652
2653 if (!curr_peer) return -1;
2654
2655 pAdapter = curr_peer->pHddTdlsCtx->pAdapter;
2656 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2657 if ((NULL == pHddCtx)) return -1;
2658
2659 mutex_lock(&pHddCtx->tdls_lock);
2660
2661 curr_peer->state_change_notification = callback;
2662
2663 mutex_unlock(&pHddCtx->tdls_lock);
2664 return 0;
2665
2666
2667}
2668
2669void wlan_hdd_tdls_get_wifi_hal_state(hddTdlsPeer_t *curr_peer,
2670 tANI_S32 *state,
2671 tANI_S32 *reason)
2672{
2673 *reason = curr_peer->reason;
2674
2675 switch(curr_peer->link_status)
2676 {
2677 case eTDLS_LINK_IDLE:
Atul Mittal115287b2014-07-08 13:26:33 +05302678 case eTDLS_LINK_DISCOVERED:
2679 *state = WIFI_TDLS_ENABLED;
2680 break;
Atul Mittalad630e42014-10-07 19:19:14 +05302681 case eTDLS_LINK_DISCOVERING:
Atul Mittal115287b2014-07-08 13:26:33 +05302682 case eTDLS_LINK_CONNECTING:
2683 *state = WIFI_TDLS_TRYING;
2684 break;
2685 case eTDLS_LINK_CONNECTED:
2686 *state = WIFI_TDLS_ESTABLISHED;
2687 break;
2688 case eTDLS_LINK_TEARING:
2689 *state = WIFI_TDLS_DROPPED;
2690 break;
2691 }
2692
2693}
2694
2695int wlan_hdd_tdls_get_status(hdd_adapter_t *pAdapter,
2696 tANI_U8* mac,
2697 tANI_S32 *state,
2698 tANI_S32 *reason)
2699{
2700
2701 hddTdlsPeer_t *curr_peer;
Atul Mittala75fced2014-10-06 13:59:07 +05302702 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Atul Mittal115287b2014-07-08 13:26:33 +05302703 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, TRUE);
2704 if (curr_peer == NULL)
2705 {
Atul Mittala75fced2014-10-06 13:59:07 +05302706 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Atul Mittal115287b2014-07-08 13:26:33 +05302707 FL("curr_peer is NULL"));
Atul Mittal115287b2014-07-08 13:26:33 +05302708
Atul Mittala75fced2014-10-06 13:59:07 +05302709 *state = WIFI_TDLS_DISABLED;
2710 *reason = eTDLS_LINK_UNSPECIFIED;
2711 }
2712 else
2713 {
2714 if (pHddCtx->cfg_ini->fTDLSExternalControl &&
2715 (FALSE == curr_peer->isForcedPeer))
2716 {
2717 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2718 FL("curr_peer is not Forced"));
2719 *state = WIFI_TDLS_DISABLED;
2720 *reason = eTDLS_LINK_UNSPECIFIED;
2721 }
2722 else
2723 {
2724 wlan_hdd_tdls_get_wifi_hal_state(curr_peer, state, reason);
2725 }
2726 }
Atul Mittal115287b2014-07-08 13:26:33 +05302727 return (0);
2728}
2729
2730/*EXT TDLS*/
2731