blob: 5d10da0577e87c985610f264339d8e362acc3e06 [file] [log] [blame]
Kiran V1ccee932012-12-12 14:49:46 -08001/*
Masti, Narayanraddi44b0db02015-12-22 11:54:35 +05302 * Copyright (c) 2012-2016 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"
Masti, Narayanraddi1fb32a92015-06-29 13:14:06 +053046#include "wlan_hdd_assoc.h"
47#include "sme_Api.h"
Mahesh A Saptasagar8b231b32014-08-11 11:58:15 +053048#include "vos_sched.h"
Chilam NG571c65a2013-01-19 12:27:36 +053049
Gopichand Nakkala4327a152013-03-04 23:22:42 -080050static tANI_S32 wlan_hdd_get_tdls_discovery_peer_cnt(tdlsCtx_t *pHddTdlsCtx);
51static tANI_S32 wlan_hdd_tdls_peer_reset_discovery_processed(tdlsCtx_t *pHddTdlsCtx);
52static void wlan_hdd_tdls_timers_destroy(tdlsCtx_t *pHddTdlsCtx);
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +053053static void wlan_hdd_tdls_peer_timers_destroy(tdlsCtx_t *pHddTdlsCtx);
Sunil Dutt41de4e22013-11-14 18:09:02 +053054int wpa_tdls_is_allowed_force_peer(tdlsCtx_t *pHddTdlsCtx, u8 *mac);
Hoonki Leed37cbb32013-04-20 00:31:14 -070055#ifdef CONFIG_TDLS_IMPLICIT
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +053056static void wlan_hdd_tdls_implicit_send_discovery_request(tdlsCtx_t *pHddTdlsCtx);
Hoonki Leed37cbb32013-04-20 00:31:14 -070057#endif
Chilam NG571c65a2013-01-19 12:27:36 +053058
Masti, Narayanraddi63d62352015-10-01 12:52:50 +053059static u8 wlan_hdd_tdls_hash_key (const u8 *mac)
Hoonki Leef63df0d2013-01-16 19:29:14 -080060{
61 int i;
Hoonki Lee387663d2013-02-05 18:08:43 -080062 u8 key = 0;
63
64 for (i = 0; i < 6; i++)
65 key ^= mac[i];
66
67 return key;
68}
69
Abhishek Singh96568922016-01-05 15:28:12 +053070#ifdef FEATURE_WLAN_DIAG_SUPPORT
71/**
72 * hdd_send_wlan_tdls_teardown_event()- send TDLS teardown event
73 *
74 * @reason: reason for tear down.
75 * @peer_mac: peer mac
76 *
77 * This Function send TDLS teardown diag event
78 *
79 * Return: void.
80 */
81void hdd_send_wlan_tdls_teardown_event(uint32_t reason,
82 uint8_t *peer_mac)
83{
84 WLAN_VOS_DIAG_EVENT_DEF(tdls_tear_down,
85 struct vos_event_tdls_teardown);
86 vos_mem_zero(&tdls_tear_down,
87 sizeof(tdls_tear_down));
88
89 tdls_tear_down.reason = reason;
90 vos_mem_copy(tdls_tear_down.peer_mac,
91 peer_mac, HDD_MAC_ADDR_LEN);
92 WLAN_VOS_DIAG_EVENT_REPORT(&tdls_tear_down,
93 EVENT_WLAN_TDLS_TEARDOWN);
94}
Abhishek Singh5f544022016-01-05 15:57:19 +053095
96/**
97 * hdd_wlan_tdls_enable_link_event()- send TDLS enable link event
98 *
99 * @peer_mac: peer mac
100 * @is_off_chan_supported: Does peer supports off chan
101 * @is_off_chan_configured: If off channel is configured
102 * @is_off_chan_established: If off chan is established
103 *
104 * This Function send TDLS enable link diag event
105 *
106 * Return: void.
107 */
108
109void hdd_wlan_tdls_enable_link_event(const uint8_t *peer_mac,
110 uint8_t is_off_chan_supported,
111 uint8_t is_off_chan_configured,
112 uint8_t is_off_chan_established)
113{
114 WLAN_VOS_DIAG_EVENT_DEF(tdls_event,
115 struct vos_event_tdls_enable_link);
116 vos_mem_zero(&tdls_event,
117 sizeof(tdls_event));
118
119 vos_mem_copy(tdls_event.peer_mac,
120 peer_mac, HDD_MAC_ADDR_LEN);
121
122 tdls_event.is_off_chan_supported =
123 is_off_chan_supported;
124 tdls_event.is_off_chan_configured =
125 is_off_chan_configured;
126 tdls_event.is_off_chan_established =
127 is_off_chan_established;
128
129 WLAN_VOS_DIAG_EVENT_REPORT(&tdls_event,
130 EVENT_WLAN_TDLS_ENABLE_LINK);
131}
Abhishek Singh48e043d2016-01-05 18:27:29 +0530132
133/**
134 * hdd_wlan_block_scan_by_tdls()- send event
135 * if scan is blocked by tdls
136 *
137 * This Function send send diag event if scan is
138 * blocked by tdls
139 *
140 * Return: void.
141 */
142
143void hdd_wlan_block_scan_by_tdls(void)
144{
145 WLAN_VOS_DIAG_EVENT_DEF(tdls_scan_block_status,
146 struct vos_event_tdls_scan_rejected);
147
148 vos_mem_zero(&tdls_scan_block_status,
149 sizeof(tdls_scan_block_status));
150
151 tdls_scan_block_status.status = true;
152 WLAN_VOS_DIAG_EVENT_REPORT(&tdls_scan_block_status,
153 EVENT_TDLS_SCAN_BLOCK);
154}
155
Abhishek Singh96568922016-01-05 15:28:12 +0530156#endif
157
Abhishek Singh5f544022016-01-05 15:57:19 +0530158
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +0530159/**
160 * wlan_hdd_tdls_disable_offchan_and_teardown_links - Disable offchannel
161 * and teardown TDLS links
162 * @hddCtx : pointer to hdd context
163 *
164 * Return: None
165 */
166void wlan_hdd_tdls_disable_offchan_and_teardown_links(hdd_context_t *hddctx)
167{
168 u16 connected_tdls_peers = 0;
Masti, Narayanraddi1fb32a92015-06-29 13:14:06 +0530169 u8 staIdx;
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530170 hddTdlsPeer_t *curr_peer = NULL;
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +0530171 hdd_adapter_t *adapter = NULL;
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +0530172 bool tdls_unlock = FALSE;
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +0530173
174 if (eTDLS_SUPPORT_NOT_ENABLED == hddctx->tdls_mode) {
175 hddLog(LOG1, FL("TDLS mode is disabled OR not enabled in FW"));
176 return ;
177 }
178
179 adapter = hdd_get_adapter(hddctx, WLAN_HDD_INFRA_STATION);
180
181 if (adapter == NULL) {
182 hddLog(LOGE, FL("Station Adapter Not Found"));
Masti, Narayanraddi70e5b472015-08-04 12:54:16 +0530183 goto done;
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +0530184 }
185
186 connected_tdls_peers = wlan_hdd_tdlsConnectedPeers(adapter);
Masti, Narayanraddi1fb32a92015-06-29 13:14:06 +0530187 if (!connected_tdls_peers) {
Masti, Narayanraddi70e5b472015-08-04 12:54:16 +0530188 hddLog(LOG1, FL("No TDLS connected peers to delete TDLS peers"));
189 goto done;
Masti, Narayanraddi1fb32a92015-06-29 13:14:06 +0530190 }
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +0530191
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530192 /* TDLS is not supported in case of concurrency
193 * Disable TDLS Offchannel to avoid more than two concurrent channels.
194 */
195 if (connected_tdls_peers == 1) {
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +0530196 tSirMacAddr peer_mac;
197 int32_t channel;
198
199 mutex_lock(&hddctx->tdls_lock);
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530200 curr_peer = wlan_hdd_tdls_get_connected_peer(adapter);
201 if (curr_peer && (curr_peer->isOffChannelConfigured == TRUE)) {
202 hddLog(LOG1, FL("%s: Concurrency detected, Disable "
203 "TDLS channel switch"), __func__);
204 curr_peer->isOffChannelEstablished = FALSE;
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +0530205 channel = curr_peer->peerParams.channel;
206 vos_mem_copy(peer_mac, curr_peer->peerMac, sizeof(tSirMacAddr));
207 mutex_unlock(&hddctx->tdls_lock);
208
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530209 sme_SendTdlsChanSwitchReq(WLAN_HDD_GET_HAL_CTX(adapter),
210 adapter->sessionId,
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +0530211 peer_mac,
212 channel,
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530213 TDLS_OFF_CHANNEL_BW_OFFSET,
214 TDLS_CHANNEL_SWITCH_DISABLE);
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +0530215 tdls_unlock = TRUE;
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +0530216 }
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +0530217 if (tdls_unlock == FALSE)
218 mutex_unlock(&hddctx->tdls_lock);
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +0530219 }
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530220
221 /* Send Msg to PE for sending deauth and deleting all the TDLS peers */
222 sme_DeleteAllTDLSPeers(hddctx->hHal, adapter->sessionId);
223
224 /* As mentioned above TDLS is not supported in case of concurrency
225 * Find the connected peer and generate TDLS teardown indication to
226 * supplicant.
227 */
228 for (staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++) {
229 if (!hddctx->tdlsConnInfo[staIdx].staId)
230 continue;
231
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530232 mutex_lock(&hddctx->tdls_lock);
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530233 curr_peer = wlan_hdd_tdls_find_all_peer(hddctx,
234 hddctx->tdlsConnInfo[staIdx].peerMac.bytes);
235
236 if (!curr_peer)
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530237 {
238 mutex_unlock(&hddctx->tdls_lock);
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530239 continue;
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530240 }
241
242 wlan_hdd_tdls_reset_peer(adapter, curr_peer->peerMac);
243
244 hddLog(LOG1, FL("indicate TDLS teardown (staId %d)"),
245 curr_peer->staId);
246
247 /* Indicate teardown to supplicant */
248 wlan_hdd_tdls_indicate_teardown(
249 curr_peer->pHddTdlsCtx->pAdapter,
250 curr_peer,
251 eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON);
Abhishek Singh96568922016-01-05 15:28:12 +0530252 hdd_send_wlan_tdls_teardown_event(eTDLS_TEARDOWN_CONCURRENCY,
253 curr_peer->peerMac);
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530254 mutex_unlock(&hddctx->tdls_lock);
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530255
256 /* Del Sta happened already as part of sme_DeleteAllTDLSPeers
257 * Hence clear hdd data structure.
258 */
259 hdd_roamDeregisterTDLSSTA(adapter,
260 hddctx->tdlsConnInfo[staIdx].staId);
261 wlan_hdd_tdls_decrement_peer_count(adapter);
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530262
263 hddctx->tdlsConnInfo[staIdx].staId = 0 ;
264 hddctx->tdlsConnInfo[staIdx].sessionId = 255;
265 vos_mem_zero(&hddctx->tdlsConnInfo[staIdx].peerMac,
266 sizeof(v_MACADDR_t)) ;
267 wlan_hdd_tdls_check_bmps(adapter);
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530268 }
269
Masti, Narayanraddi70e5b472015-08-04 12:54:16 +0530270done:
Masti, Narayanraddi20494af2015-12-17 20:56:42 +0530271 wlan_hdd_tdls_set_mode(hddctx, eTDLS_SUPPORT_DISABLED, FALSE,
272 HDD_SET_TDLS_MODE_SOURCE_P2P);
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +0530273 hddLog(LOG1, FL("TDLS Support Disabled"));
274}
275
276/**
277 * hdd_tdls_notify_mode_change - Notify mode change
278 * @adapter: pointer to hdd adapter
279 * @hddCtx : pointer to hdd context
280 *
281 * Return: None
282 */
283void hdd_tdls_notify_mode_change(hdd_adapter_t *adapter, hdd_context_t *hddctx)
284{
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +0530285 wlan_hdd_tdls_disable_offchan_and_teardown_links(hddctx);
286}
287
Hoonki Leed37cbb32013-04-20 00:31:14 -0700288#ifdef TDLS_USE_SEPARATE_DISCOVERY_TIMER
Hoonki Lee387663d2013-02-05 18:08:43 -0800289static v_VOID_t wlan_hdd_tdls_discover_peer_cb( v_PVOID_t userData )
290{
291 int i;
292 struct list_head *head;
293 struct list_head *pos;
Chilam NG571c65a2013-01-19 12:27:36 +0530294 hddTdlsPeer_t *curr_peer;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530295 hdd_context_t *pHddCtx;
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530296 tdlsCtx_t *pHddTdlsCtx;
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800297 int discover_req_sent = 0;
298 v_U32_t discover_expiry = TDLS_SUB_DISCOVERY_PERIOD;
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530299 v_CONTEXT_t pVosContext;
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800300
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +0530301 ENTER();
302
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530303 pVosContext = vos_get_global_context(VOS_MODULE_ID_HDD, NULL);
304 if (NULL == pVosContext)
c_hpothu7f63e882013-10-02 19:13:35 +0530305 {
306 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530307 FL("pVosContext points to NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530308 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530309 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530310
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530311 pHddCtx = vos_get_context(VOS_MODULE_ID_HDD, pVosContext);
312 if (0 != (wlan_hdd_validate_context(pHddCtx)))
Sushant Kaushik15c4c522014-08-14 12:24:49 +0530313 {
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530314 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530315 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530316
Rajesh Chauhana34c6e62014-03-25 16:37:58 +0530317 mutex_lock(&pHddCtx->tdls_lock);
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530318 pHddTdlsCtx = (tdlsCtx_t *)userData;
319 if (0 != (wlan_hdd_validate_tdls_context(pHddCtx, pHddTdlsCtx)))
320 {
321 mutex_unlock(&pHddCtx->tdls_lock);
322 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
323 FL("Invalid pHddTdlsCtx context"));
324 return;
325 }
Hoonki Leebfee0342013-01-21 16:43:45 -0800326
Hoonki Lee387663d2013-02-05 18:08:43 -0800327 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: ", __func__);
328
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800329 if (0 == pHddTdlsCtx->discovery_peer_cnt)
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800330 pHddTdlsCtx->discovery_peer_cnt = wlan_hdd_get_tdls_discovery_peer_cnt(pHddTdlsCtx);
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800331
Chilam NG571c65a2013-01-19 12:27:36 +0530332 for (i = 0; i < 256; i++) {
Hoonki Lee387663d2013-02-05 18:08:43 -0800333 head = &pHddTdlsCtx->peer_list[i];
Chilam NG571c65a2013-01-19 12:27:36 +0530334
Hoonki Lee387663d2013-02-05 18:08:43 -0800335 list_for_each (pos, head) {
336 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
Chilam NG571c65a2013-01-19 12:27:36 +0530337
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530338 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Chilam Ng01120412013-02-19 18:32:21 -0800339 "%d " MAC_ADDRESS_STR " %d %d, %d %d %d %d", i,
340 MAC_ADDR_ARRAY(curr_peer->peerMac),
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800341 curr_peer->discovery_processed,
342 discover_req_sent,
Gopichand Nakkala2a0a1572013-02-10 21:39:16 -0800343 curr_peer->tdls_support,
344 curr_peer->link_status,
345 curr_peer->discovery_attempt,
346 pHddTdlsCtx->threshold_config.discovery_tries_n);
Hoonki Lee387663d2013-02-05 18:08:43 -0800347
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800348 if (discover_req_sent < TDLS_MAX_DISCOVER_REQS_PER_TIMER) {
349 if (!curr_peer->discovery_processed) {
Chilam NG571c65a2013-01-19 12:27:36 +0530350
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800351 curr_peer->discovery_processed = 1;
352 discover_req_sent++;
353 pHddTdlsCtx->discovery_peer_cnt--;
354
355 if ((eTDLS_CAP_UNKNOWN == curr_peer->tdls_support) &&
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800356 (eTDLS_LINK_IDLE == curr_peer->link_status) &&
Gopichand Nakkalab88f6772013-02-27 18:12:56 -0800357 (curr_peer->tx_pkt >=
358 pHddTdlsCtx->threshold_config.tx_packet_n)) {
Gopichand Nakkala273d5a02013-02-19 15:15:09 -0800359
360 if (curr_peer->discovery_attempt <
361 pHddTdlsCtx->threshold_config.discovery_tries_n) {
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +0530362 cfg80211_tdls_oper_request(
363 pHddTdlsCtx->pAdapter->dev,
364 curr_peer->peerMac,
365 NL80211_TDLS_DISCOVERY_REQ,
366 FALSE,
367 GFP_KERNEL);
Gopichand Nakkala273d5a02013-02-19 15:15:09 -0800368 curr_peer->discovery_attempt++;
369 }
370 else
371 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530372 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
Gopichand Nakkala273d5a02013-02-19 15:15:09 -0800373 "%s: Maximum Discovery retries reached", __func__);
374 curr_peer->tdls_support = eTDLS_CAP_NOT_SUPPORTED;
375 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800376
377 }
378 }
Chilam NG571c65a2013-01-19 12:27:36 +0530379 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800380 else
381 goto exit_loop;
Hoonki Lee387663d2013-02-05 18:08:43 -0800382 }
Hoonki Leef63df0d2013-01-16 19:29:14 -0800383 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800384exit_loop:
Hoonki Leef63df0d2013-01-16 19:29:14 -0800385
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800386 if (0 != pHddTdlsCtx->discovery_peer_cnt) {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530387 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800388 "discovery_peer_cnt is %d , Starting SUB_DISCOVERY_TIMER",
389 pHddTdlsCtx->discovery_peer_cnt);
390 discover_expiry = TDLS_SUB_DISCOVERY_PERIOD;
391 goto done;
392 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800393 discover_expiry = pHddTdlsCtx->threshold_config.discovery_period_t;
394
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800395 wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
Chilam NG571c65a2013-01-19 12:27:36 +0530396
Gopichand Nakkala638ebc72013-03-21 18:04:02 -0700397
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800398 /* Commenting out the following function as it was introducing
399 * a race condition when pHddTdlsCtx is deleted. Also , this
400 * function is consuming more time in the timer callback.
401 * RSSI based trigger needs to revisit this part of the code.
402 */
403
404 /*
405 * wlan_hdd_get_rssi(pAdapter, &pHddTdlsCtx->ap_rssi);
406 */
Chilam NG571c65a2013-01-19 12:27:36 +0530407
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800408done:
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +0530409 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +0530410 EXIT();
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800411 return;
Hoonki Leef63df0d2013-01-16 19:29:14 -0800412}
Hoonki Leed37cbb32013-04-20 00:31:14 -0700413#endif
Chilam NG571c65a2013-01-19 12:27:36 +0530414
Masti, Narayanraddie8e14622015-10-17 16:10:54 +0530415static v_VOID_t wlan_hdd_tdls_idle_cb( v_PVOID_t userData )
416{
417#ifdef CONFIG_TDLS_IMPLICIT
418 tdlsConnInfo_t *tdlsInfo = (tdlsConnInfo_t *) userData;
419 hddTdlsPeer_t *curr_peer;
420 tdlsCtx_t *pHddTdlsCtx;
421 hdd_context_t *pHddCtx;
422 v_CONTEXT_t pVosContext;
423 hdd_adapter_t *pAdapter = NULL;
424
425 ENTER();
426
427 if (!tdlsInfo->staId)
428 {
429 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
430 FL("peer (staidx %u) doesn't exists"), tdlsInfo->staId);
431 return;
432 }
433
434 pVosContext = vos_get_global_context(VOS_MODULE_ID_HDD, NULL);
435 if (NULL == pVosContext)
436 {
437 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
438 FL("pVosContext points to NULL"));
439 return;
440 }
441
442 pHddCtx = vos_get_context(VOS_MODULE_ID_HDD, pVosContext);
443 if (0 != (wlan_hdd_validate_context(pHddCtx)))
444 {
445 return;
446 }
447
448 pAdapter = hdd_get_adapter_by_sme_session_id(pHddCtx, tdlsInfo->sessionId);
449
450 if (!pAdapter)
451 {
452 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
453 FL("pAdapter is NULL"));
454 return;
455 }
456
457 mutex_lock(&pHddCtx->tdls_lock);
458
459 curr_peer = wlan_hdd_tdls_find_peer(pAdapter,
460 (u8 *) &tdlsInfo->peerMac.bytes[0], FALSE);
461
462 if (NULL == curr_peer)
463 {
464 mutex_unlock(&pHddCtx->tdls_lock);
465 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
466 FL("Invalid tdls idle timer expired"));
467 return;
468 }
469
470 pHddTdlsCtx = curr_peer->pHddTdlsCtx;
471 if (0 != (wlan_hdd_validate_tdls_context(pHddCtx, pHddTdlsCtx)))
472 {
473 mutex_unlock(&pHddCtx->tdls_lock);
474 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
475 FL("Invalid pHddTdlsCtx context"));
476 return;
477 }
478
479 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
480 "%s: Tx/Rx Idle " MAC_ADDRESS_STR " tx_pkt: %d, rx_pkt: %d, idle_packet_n: %d",
481 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac),
482 curr_peer->tx_pkt,
483 curr_peer->rx_pkt,
484 curr_peer->pHddTdlsCtx->threshold_config.idle_packet_n);
485
486 /* 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, VOS_TRACE_LEVEL_INFO,
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, VOS_TRACE_LEVEL_INFO,
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);
Abhishek Singh96568922016-01-05 15:28:12 +0530506 hdd_send_wlan_tdls_teardown_event(eTDLS_TEARDOWN_TXRX_THRESHOLD,
507 curr_peer->peerMac);
508
Masti, Narayanraddie8e14622015-10-17 16:10:54 +0530509 }
510 mutex_unlock(&pHddCtx->tdls_lock);
511 EXIT();
512#endif
513}
514
Hoonki Lee387663d2013-02-05 18:08:43 -0800515static v_VOID_t wlan_hdd_tdls_update_peer_cb( v_PVOID_t userData )
Chilam NG571c65a2013-01-19 12:27:36 +0530516{
517 int i;
Hoonki Lee387663d2013-02-05 18:08:43 -0800518 struct list_head *head;
519 struct list_head *pos;
Chilam NG571c65a2013-01-19 12:27:36 +0530520 hddTdlsPeer_t *curr_peer;
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530521 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530522 hdd_context_t *pHddCtx;
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530523 v_CONTEXT_t pVosContext;
Hoonki Leebfee0342013-01-21 16:43:45 -0800524
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +0530525 ENTER();
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530526 pVosContext = vos_get_global_context(VOS_MODULE_ID_HDD, NULL);
527 if (NULL == pVosContext)
c_hpothu7f63e882013-10-02 19:13:35 +0530528 {
529 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530530 FL("pVosContext points to NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530531 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530532 }
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530533 pHddCtx = vos_get_context(VOS_MODULE_ID_HDD, pVosContext);
534 if (0 != (wlan_hdd_validate_context(pHddCtx)))
Sushant Kaushik15c4c522014-08-14 12:24:49 +0530535 {
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530536 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530537 }
Rajesh Chauhana34c6e62014-03-25 16:37:58 +0530538 mutex_lock(&pHddCtx->tdls_lock);
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530539 pHddTdlsCtx = (tdlsCtx_t *)userData;
540 if (0 != (wlan_hdd_validate_tdls_context(pHddCtx, pHddTdlsCtx)))
541 {
542 mutex_unlock(&pHddCtx->tdls_lock);
543 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
544 FL("Invalid pHddTdlsCtx context"));
545 return;
546 }
Chilam NG571c65a2013-01-19 12:27:36 +0530547 for (i = 0; i < 256; i++) {
Hoonki Lee387663d2013-02-05 18:08:43 -0800548 head = &pHddTdlsCtx->peer_list[i];
Chilam NG571c65a2013-01-19 12:27:36 +0530549
Hoonki Lee387663d2013-02-05 18:08:43 -0800550 list_for_each (pos, head) {
551 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
Chilam NG571c65a2013-01-19 12:27:36 +0530552
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530553 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee66b75f32013-04-16 18:30:07 -0700554 "%s: " MAC_ADDRESS_STR " link_status %d"
555 " tdls_support %d", __func__, MAC_ADDR_ARRAY(curr_peer->peerMac),
Gopichand Nakkala34d1b062013-03-19 15:28:33 -0700556 curr_peer->link_status, curr_peer->tdls_support);
Hoonki Lee387663d2013-02-05 18:08:43 -0800557
Ganesh Kondabattinid01c4ee2016-01-04 16:13:06 +0530558 if ((pHddCtx->tdls_mode == eTDLS_SUPPORT_DISABLED) &&
559 (eTDLS_LINK_DISCOVERING == curr_peer->link_status)) {
560 curr_peer->tdls_support = eTDLS_CAP_UNKNOWN;
561 wlan_hdd_tdls_set_peer_link_status(
562 curr_peer,
563 eTDLS_LINK_IDLE,
564 eTDLS_LINK_UNSPECIFIED);
565
566 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
567 "%s: TDLS is disabled. Resetting link_status of peer "
568 MAC_ADDRESS_STR " to %d, tdls_support %d", __func__,
569 MAC_ADDR_ARRAY(curr_peer->peerMac),
570 curr_peer->link_status, curr_peer->tdls_support);
571
572 goto next_peer;
573 }
574
Chilam NG571c65a2013-01-19 12:27:36 +0530575 if (eTDLS_CAP_SUPPORTED == curr_peer->tdls_support) {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530576 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee66b75f32013-04-16 18:30:07 -0700577 "tx %d, rx %d (thr.pkt %d/idle %d), rssi %d (thr.trig %d/hys %d/tear %d)",
578 curr_peer->tx_pkt, curr_peer->rx_pkt,
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800579 pHddTdlsCtx->threshold_config.tx_packet_n,
Hoonki Lee66b75f32013-04-16 18:30:07 -0700580 pHddTdlsCtx->threshold_config.idle_packet_n,
581 curr_peer->rssi,
582 pHddTdlsCtx->threshold_config.rssi_trigger_threshold,
583 pHddTdlsCtx->threshold_config.rssi_hysteresis,
584 pHddTdlsCtx->threshold_config.rssi_teardown_threshold);
Chilam Ng01120412013-02-19 18:32:21 -0800585
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800586 if ((eTDLS_LINK_IDLE == curr_peer->link_status) ||
587 (eTDLS_LINK_DISCOVERING == curr_peer->link_status)){
Sunil Dutt961ecbd2013-11-28 20:04:07 +0530588
589 if (pHddCtx->cfg_ini->fTDLSExternalControl &&
590 (FALSE == curr_peer->isForcedPeer)) {
Ganesh Kondabattini2d7b6a42015-09-01 18:45:18 +0530591 goto next_peer;
Sunil Dutt961ecbd2013-11-28 20:04:07 +0530592 }
593
Chilam NG571c65a2013-01-19 12:27:36 +0530594 if (curr_peer->tx_pkt >=
595 pHddTdlsCtx->threshold_config.tx_packet_n) {
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800596
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800597 if (HDD_MAX_NUM_TDLS_STA > wlan_hdd_tdlsConnectedPeers(pHddTdlsCtx->pAdapter))
Gopichand Nakkalab977a972013-02-18 19:15:09 -0800598 {
599
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530600 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
601 "Tput trigger TDLS pre-setup");
Chilam NG571c65a2013-01-19 12:27:36 +0530602#ifdef CONFIG_TDLS_IMPLICIT
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +0530603 pHddTdlsCtx->curr_candidate = curr_peer;
604 wlan_hdd_tdls_implicit_send_discovery_request(pHddTdlsCtx);
Chilam NG571c65a2013-01-19 12:27:36 +0530605#endif
Gopichand Nakkalab977a972013-02-18 19:15:09 -0800606 }
607 else
608 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530609 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800610 "%s: Maximum peer connected already! %d",
611 __func__, wlan_hdd_tdlsConnectedPeers(pHddTdlsCtx->pAdapter) );
Gopichand Nakkalab977a972013-02-18 19:15:09 -0800612 }
Hoonki Leecdd8e962013-01-20 00:45:46 -0800613 goto next_peer;
Chilam NG571c65a2013-01-19 12:27:36 +0530614 }
Hoonki Leefb8df672013-04-10 18:20:34 -0700615 }
616 else if (eTDLS_LINK_CONNECTED == curr_peer->link_status) {
Chilam Ng01120412013-02-19 18:32:21 -0800617 if ((tANI_S32)curr_peer->rssi <
618 (tANI_S32)pHddTdlsCtx->threshold_config.rssi_teardown_threshold) {
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800619
Chilam Ng01120412013-02-19 18:32:21 -0800620 VOS_TRACE( VOS_MODULE_ID_HDD,
621 VOS_TRACE_LEVEL_WARN,
622 "Tear down - low RSSI: " MAC_ADDRESS_STR "!",
623 MAC_ADDR_ARRAY(curr_peer->peerMac));
624#ifdef CONFIG_TDLS_IMPLICIT
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -0700625 wlan_hdd_tdls_indicate_teardown(pHddTdlsCtx->pAdapter,
626 curr_peer,
627 eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON);
Abhishek Singh96568922016-01-05 15:28:12 +0530628 hdd_send_wlan_tdls_teardown_event(
629 eTDLS_TEARDOWN_RSSI_THRESHOLD,
630 curr_peer->peerMac);
631
Chilam Ng01120412013-02-19 18:32:21 -0800632#endif
Hoonki Leecdd8e962013-01-20 00:45:46 -0800633 goto next_peer;
Chilam NG571c65a2013-01-19 12:27:36 +0530634 }
Chilam Ng01120412013-02-19 18:32:21 -0800635
Naresh Jayaramdb4514b2013-11-25 18:08:10 +0530636 /* Only teardown based on non zero idle packet threshold, to address a use
637 * case where this threshold does not get consider for TEAR DOWN.
638 */
639
640 if (( 0 != pHddTdlsCtx->threshold_config.idle_packet_n ) &&
641 ((curr_peer->tx_pkt <
Chilam Ng01120412013-02-19 18:32:21 -0800642 pHddTdlsCtx->threshold_config.idle_packet_n) &&
643 (curr_peer->rx_pkt <
Naresh Jayaramdb4514b2013-11-25 18:08:10 +0530644 pHddTdlsCtx->threshold_config.idle_packet_n))) {
Masti, Narayanraddie8e14622015-10-17 16:10:54 +0530645 if (!vos_timer_is_initialized(&curr_peer->peerIdleTimer))
646 {
647 v_U8_t staId = (v_U8_t)curr_peer->staId;
648 tdlsConnInfo_t *tdlsInfo;
649
650 tdlsInfo = wlan_hdd_get_conn_info(pHddCtx, staId);
651 vos_timer_init(&curr_peer->peerIdleTimer,
652 VOS_TIMER_TYPE_SW,
653 wlan_hdd_tdls_idle_cb,
654 tdlsInfo);
655 }
Chilam Ng01120412013-02-19 18:32:21 -0800656 if (VOS_TIMER_STATE_RUNNING !=
657 vos_timer_getCurrentState(&curr_peer->peerIdleTimer)) {
658 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
659 "Tx/Rx Idle timer start: " MAC_ADDRESS_STR "!",
660 MAC_ADDR_ARRAY(curr_peer->peerMac));
Gopichand Nakkala3046fc92013-03-23 13:56:43 -0700661 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
662 &curr_peer->peerIdleTimer,
663 pHddTdlsCtx->threshold_config.idle_timeout_t);
Chilam Ng01120412013-02-19 18:32:21 -0800664 }
665 } else {
Masti, Narayanraddi3c762122015-11-24 18:07:11 +0530666 if (vos_timer_is_initialized(
667 &curr_peer->peerIdleTimer) &&
668 VOS_TIMER_STATE_RUNNING ==
669 vos_timer_getCurrentState(
670 &curr_peer->peerIdleTimer)) {
Chilam Ng01120412013-02-19 18:32:21 -0800671 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
672 "Tx/Rx Idle timer stop: " MAC_ADDRESS_STR "!",
673 MAC_ADDR_ARRAY(curr_peer->peerMac));
674 vos_timer_stop( &curr_peer->peerIdleTimer);
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800675 }
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800676 }
Chilam Ng01120412013-02-19 18:32:21 -0800677
Hoonki Leecdd8e962013-01-20 00:45:46 -0800678// if (curr_peer->rssi <
679// (pHddTdlsCtx->threshold_config.rssi_hysteresis +
680// pHddTdlsCtx->ap_rssi)) {
681//
682//#ifdef CONFIG_TDLS_IMPLICIT
683// cfg80211_tdls_oper_request(pHddTdlsCtx->dev,
684// curr_peer->peerMac,
685// NL80211_TDLS_TEARDOWN, FALSE,
686// GFP_KERNEL);
687//#endif
688// }
Chilam NG571c65a2013-01-19 12:27:36 +0530689 }
Chilam Ng01120412013-02-19 18:32:21 -0800690 } else if (eTDLS_CAP_UNKNOWN == curr_peer->tdls_support) {
Sunil Dutt961ecbd2013-11-28 20:04:07 +0530691
692 if (pHddCtx->cfg_ini->fTDLSExternalControl &&
693 (FALSE == curr_peer->isForcedPeer)) {
Ganesh Kondabattini2d7b6a42015-09-01 18:45:18 +0530694 goto next_peer;
Sunil Dutt961ecbd2013-11-28 20:04:07 +0530695 }
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -0700696 if (!TDLS_IS_CONNECTED(curr_peer)) {
Chilam Ng01120412013-02-19 18:32:21 -0800697 if (curr_peer->tx_pkt >=
698 pHddTdlsCtx->threshold_config.tx_packet_n) {
Chilam Ng01120412013-02-19 18:32:21 -0800699
Sunil Duttb0d39242014-09-10 23:54:51 +0530700 /* Ignore discovery attempt if External Control is enabled, that
701 * is, peer is forced. In that case, continue discovery attempt
702 * regardless attempt count
703 */
704 if (curr_peer->isForcedPeer || curr_peer->discovery_attempt++ <
Chilam Ng01120412013-02-19 18:32:21 -0800705 pHddTdlsCtx->threshold_config.discovery_tries_n) {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530706 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
707 "TDLS UNKNOWN discover ");
Hoonki Leed37cbb32013-04-20 00:31:14 -0700708#ifdef CONFIG_TDLS_IMPLICIT
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +0530709 pHddTdlsCtx->curr_candidate = curr_peer;
710 wlan_hdd_tdls_implicit_send_discovery_request(pHddTdlsCtx);
Hoonki Leed37cbb32013-04-20 00:31:14 -0700711#endif
Chilam Ng01120412013-02-19 18:32:21 -0800712 }
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800713 else
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800714 {
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800715 curr_peer->tdls_support = eTDLS_CAP_NOT_SUPPORTED;
Atul Mittal115287b2014-07-08 13:26:33 +0530716 wlan_hdd_tdls_set_peer_link_status(
717 curr_peer,
718 eTDLS_LINK_IDLE,
719 eTDLS_LINK_NOT_SUPPORTED);
720
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800721 }
Chilam Ng01120412013-02-19 18:32:21 -0800722 }
723 }
Chilam NG571c65a2013-01-19 12:27:36 +0530724 }
725
Hoonki Leecdd8e962013-01-20 00:45:46 -0800726next_peer:
Chilam NG571c65a2013-01-19 12:27:36 +0530727 curr_peer->tx_pkt = 0;
Chilam Ng1279e232013-01-25 15:06:52 -0800728 curr_peer->rx_pkt = 0;
Hoonki Lee387663d2013-02-05 18:08:43 -0800729 }
Chilam NG571c65a2013-01-19 12:27:36 +0530730 }
731
Gopichand Nakkala3046fc92013-03-23 13:56:43 -0700732 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
733 &pHddTdlsCtx->peerUpdateTimer,
734 pHddTdlsCtx->threshold_config.tx_period_t);
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530735 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +0530736 EXIT();
Chilam NG571c65a2013-01-19 12:27:36 +0530737}
738
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700739static v_VOID_t wlan_hdd_tdls_discovery_timeout_peer_cb(v_PVOID_t userData)
740{
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700741 int i;
742 struct list_head *head;
743 hddTdlsPeer_t *tmp;
744 struct list_head *pos, *q;
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700745 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530746 hdd_context_t *pHddCtx;
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530747 v_CONTEXT_t pVosContext;
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700748
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +0530749 ENTER();
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530750 pVosContext = vos_get_global_context(VOS_MODULE_ID_HDD, NULL);
751 if (NULL == pVosContext)
c_hpothu7f63e882013-10-02 19:13:35 +0530752 {
753 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530754 FL("pVosContext points to NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530755 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530756 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530757
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530758 pHddCtx = vos_get_context(VOS_MODULE_ID_HDD, pVosContext);
759 if (0 != (wlan_hdd_validate_context(pHddCtx)))
Sushant Kaushik15c4c522014-08-14 12:24:49 +0530760 {
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530761 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530762 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530763
Rajesh Chauhana34c6e62014-03-25 16:37:58 +0530764 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700765
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530766 pHddTdlsCtx = (tdlsCtx_t *)userData;
767 if (0 != (wlan_hdd_validate_tdls_context(pHddCtx, pHddTdlsCtx)))
768 {
769 mutex_unlock(&pHddCtx->tdls_lock);
770 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
771 FL("Invalid pHddTdlsCtx context"));
772 return;
773 }
774
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700775 for (i = 0; i < 256; i++) {
776 head = &pHddTdlsCtx->peer_list[i];
777 list_for_each_safe (pos, q, head) {
778 tmp = list_entry(pos, hddTdlsPeer_t, node);
779 if (eTDLS_LINK_DISCOVERING == tmp->link_status)
780 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530781 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700782 "%s: " MAC_ADDRESS_STR " to idle state", __func__,
783 MAC_ADDR_ARRAY(tmp->peerMac));
Atul Mittal115287b2014-07-08 13:26:33 +0530784 wlan_hdd_tdls_set_peer_link_status(
785 tmp,
786 eTDLS_LINK_IDLE,
Atul Mittalad630e42014-10-07 19:19:14 +0530787 eTDLS_LINK_NOT_SUPPORTED);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700788 }
789 }
790 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700791
792 pHddTdlsCtx->discovery_sent_cnt = 0;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -0700793 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700794
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530795 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700796
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700797 wlan_hdd_tdls_check_bmps(pHddTdlsCtx->pAdapter);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +0530798 EXIT();
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700799 return;
800}
801
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +0530802v_VOID_t wlan_hdd_tdls_initiator_wait_cb( v_PVOID_t userData )
Hoonki Lee14621352013-04-16 17:51:19 -0700803{
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +0530804 tdlsConnInfo_t *tdlsInfo = (tdlsConnInfo_t *) userData;
Hoonki Lee14621352013-04-16 17:51:19 -0700805 tdlsCtx_t *pHddTdlsCtx;
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +0530806 hdd_context_t *pHddCtx = NULL;
807 hdd_adapter_t *pAdapter = NULL;
808 v_CONTEXT_t pVosContext = vos_get_global_context(VOS_MODULE_ID_HDD, NULL);
809 hddTdlsPeer_t *curr_peer = NULL;
Hoonki Lee14621352013-04-16 17:51:19 -0700810
Mahesh A Saptasagar4534e2b2015-03-05 20:45:41 +0530811 ENTER();
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +0530812
813 if (!tdlsInfo->staId)
c_hpothu7f63e882013-10-02 19:13:35 +0530814 {
815 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +0530816 FL("peer (staidx %u) doesn't exists"), tdlsInfo->staId);
817 return;
818 }
819 if (!pVosContext)
820 {
821 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
822 FL("pVosContext is NULL"));
Hoonki Lee14621352013-04-16 17:51:19 -0700823 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530824 }
Hoonki Lee14621352013-04-16 17:51:19 -0700825
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +0530826 pHddCtx = vos_get_context( VOS_MODULE_ID_HDD, pVosContext);
827 if (!pHddCtx)
828 {
829 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
830 FL("pHddCtx is NULL"));
831 return;
832 }
833
834 pAdapter = hdd_get_adapter_by_sme_session_id(pHddCtx, tdlsInfo->sessionId);
835
836 if (!pAdapter)
837 {
838 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
839 FL("pAdapter is NULL"));
840 return;
841 }
842
843 mutex_lock(&pHddCtx->tdls_lock);
844 curr_peer = wlan_hdd_tdls_find_peer(pAdapter,
845 (u8 *) &tdlsInfo->peerMac.bytes[0], FALSE);
846 if (curr_peer == NULL)
847 {
848 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
849 FL("peer doesn't exists"));
850 mutex_unlock(&pHddCtx->tdls_lock);
851 return;
852 }
Hoonki Lee14621352013-04-16 17:51:19 -0700853 pHddTdlsCtx = curr_peer->pHddTdlsCtx;
854
855 if ( NULL == pHddTdlsCtx )
c_hpothu7f63e882013-10-02 19:13:35 +0530856 {
Ratheesh S P36dbc932015-08-07 14:28:57 +0530857 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
c_hpothu7f63e882013-10-02 19:13:35 +0530858 FL("pHddTdlsCtx is NULL"));
Hoonki Lee14621352013-04-16 17:51:19 -0700859 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530860 }
Mahesh A Saptasagar4534e2b2015-03-05 20:45:41 +0530861 if (0 != (wlan_hdd_validate_context(
862 WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter))))
863 {
864 return;
865 }
Hoonki Lee14621352013-04-16 17:51:19 -0700866 WLANTL_ResumeDataTx( (WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter))->pvosContext,
867 (v_U8_t *)&curr_peer->staId);
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +0530868 mutex_unlock(&pHddCtx->tdls_lock);
Mahesh A Saptasagar4534e2b2015-03-05 20:45:41 +0530869 EXIT();
Hoonki Lee14621352013-04-16 17:51:19 -0700870}
871
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800872static void wlan_hdd_tdls_free_list(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800873{
874 int i;
875 struct list_head *head;
876 hddTdlsPeer_t *tmp;
877 struct list_head *pos, *q;
878
c_hpothu7f63e882013-10-02 19:13:35 +0530879 if (NULL == pHddTdlsCtx)
880 {
Ratheesh S P36dbc932015-08-07 14:28:57 +0530881 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
c_hpothu7f63e882013-10-02 19:13:35 +0530882 FL("pHddTdlsCtx is NULL"));
883 return;
884 }
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800885
886 for (i = 0; i < 256; i++) {
887 head = &pHddTdlsCtx->peer_list[i];
888 list_for_each_safe (pos, q, head) {
889 tmp = list_entry(pos, hddTdlsPeer_t, node);
890 list_del(pos);
891 vos_mem_free(tmp);
Srinivas Girigowda8d2348f2013-12-12 12:14:15 -0800892 tmp = NULL;
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800893 }
894 }
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800895}
896
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530897void wlan_hdd_tdls_btCoex_cb(void *data, int indType)
898{
899 hdd_adapter_t *pAdapter;
900 hdd_context_t *pHddCtx;
901 u16 connectedTdlsPeers;
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530902 hddTdlsPeer_t *currPeer;
Bhargav Shahd0715912015-10-01 18:17:37 +0530903 tANI_U16 numCurrTdlsPeers = 0;
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530904
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +0530905 ENTER();
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530906 if ((NULL == data) || (indType < 0))
907 {
908 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
909 FL("Invalid arguments"));
910 return;
911 }
912
913 pHddCtx = (hdd_context_t *)data;
914 if (0 != (wlan_hdd_validate_context(pHddCtx)))
915 {
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530916 return;
917 }
918
919 /* if tdls is not enabled, then continue btCoex */
920 if (eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode)
921 {
922 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
923 FL("tdls is not enabled"));
924 return;
925 }
926
927 /* get pAdapter context, do we need WLAN_HDD_P2P_CLIENT */
928 pAdapter = hdd_get_adapter(pHddCtx, WLAN_HDD_INFRA_STATION);
929 if (NULL == pAdapter)
930 {
931 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
932 FL("pAdapter is not valid"));
933 return;
934 }
935
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530936 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
937 "%s: BtCoex notification type %d", __func__, indType);
938 /* BtCoex notification type enabled, Disable TDLS */
939 if (indType == SIR_COEX_IND_TYPE_TDLS_DISABLE)
940 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530941 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530942 FL("BtCoex notification, Disable TDLS"));
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530943 mutex_lock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530944 /* tdls is in progress */
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530945 currPeer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0, FALSE);
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530946 if (NULL != currPeer)
947 {
948 wlan_hdd_tdls_set_peer_link_status (currPeer,
949 eTDLS_LINK_IDLE,
950 eTDLS_LINK_UNSPECIFIED);
951 }
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530952 mutex_unlock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530953
954 /* while tdls is up */
955 if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode ||
956 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode)
957 {
958 connectedTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
959 /* disable implicit trigger logic & tdls operatoin */
Masti, Narayanraddi20494af2015-12-17 20:56:42 +0530960 wlan_hdd_tdls_set_mode(pHddCtx, eTDLS_SUPPORT_DISABLED, FALSE,
961 HDD_SET_TDLS_MODE_SOURCE_BTC);
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530962
963 /* teardown the peers on the btcoex */
964 if (connectedTdlsPeers)
965 {
966 tANI_U8 staIdx;
967 hddTdlsPeer_t *curr_peer;
968
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530969 mutex_lock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530970 for (staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++)
971 {
972 if (pHddCtx->tdlsConnInfo[staIdx].staId)
973 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530974 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
975 ("%s: indicate TDLS teardown (staId %d)"),
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530976 __func__,pHddCtx->tdlsConnInfo[staIdx].staId);
977
Abhishek Singh96568922016-01-05 15:28:12 +0530978#ifdef CONFIG_TDLS_IMPLICIT
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530979 curr_peer = wlan_hdd_tdls_find_all_peer(pHddCtx,
980 pHddCtx->tdlsConnInfo[staIdx].peerMac.bytes);
981 if(curr_peer) {
982 wlan_hdd_tdls_indicate_teardown(
983 curr_peer->pHddTdlsCtx->pAdapter, curr_peer,
984 eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON);
Abhishek Singh96568922016-01-05 15:28:12 +0530985 hdd_send_wlan_tdls_teardown_event(
986 eTDLS_TEARDOWN_BTCOEX,
987 curr_peer->peerMac);
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530988 }
Abhishek Singh96568922016-01-05 15:28:12 +0530989#endif
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530990 }
991 }
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530992 mutex_unlock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530993 }
994 }
Bhargav Shahd0715912015-10-01 18:17:37 +0530995 /* stop TCP delack timer if BtCoex is enable */
996 set_bit(WLAN_BTCOEX_MODE, &pHddCtx->mode);
997 hdd_manage_delack_timer(pHddCtx);
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530998 }
999 /* BtCoex notification type enabled, Enable TDLS */
1000 else if (indType == SIR_COEX_IND_TYPE_TDLS_ENABLE)
1001 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05301002 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +05301003 FL("BtCoex notification, Enable TDLS"));
1004 /* if tdls was enabled before btCoex, re-enable tdls mode */
1005 if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode_last ||
1006 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode_last)
1007 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05301008 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +05301009 ("%s: revert tdls mode %d"), __func__,
1010 pHddCtx->tdls_mode_last);
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05301011 wlan_hdd_tdls_set_mode(pHddCtx, pHddCtx->tdls_mode_last, FALSE,
1012 HDD_SET_TDLS_MODE_SOURCE_BTC);
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +05301013 }
Bhargav Shahd0715912015-10-01 18:17:37 +05301014
1015 clear_bit(WLAN_BTCOEX_MODE, &pHddCtx->mode);
1016 numCurrTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
1017 if(numCurrTdlsPeers == 0) {
1018 /* start delack timer if BtCoex is disable and tdls is not present */
1019 hdd_manage_delack_timer(pHddCtx);
1020 }
1021 }
1022
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05301023 EXIT();
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +05301024 return;
1025}
1026
Agarwal Ashish4b87f922014-06-18 03:03:21 +05301027/* initialize TDLS global context */
1028void wlan_hdd_tdls_init(hdd_context_t *pHddCtx )
1029{
1030 v_U8_t staIdx;
Chandrasekaran, Manishekar0de84dc2015-03-10 15:12:34 +05301031 eHalStatus status;
Sameer Thalappilbee426e2013-10-30 10:30:30 -07001032
Agarwal Ashish4b87f922014-06-18 03:03:21 +05301033 pHddCtx->connected_peer_count = 0;
1034
Masti, Narayanraddi26378462016-01-05 18:20:28 +05301035 wlan_hdd_init_deinit_defer_scan_context(&pHddCtx->scan_ctxt);
Agarwal Ashish4b87f922014-06-18 03:03:21 +05301036
1037 for (staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++)
1038 {
1039 pHddCtx->tdlsConnInfo[staIdx].staId = 0;
1040 pHddCtx->tdlsConnInfo[staIdx].sessionId = 255;
1041 vos_mem_zero(&pHddCtx->tdlsConnInfo[staIdx].peerMac,
1042 sizeof(v_MACADDR_t)) ;
1043 }
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05301044
Chandrasekaran, Manishekar0de84dc2015-03-10 15:12:34 +05301045 status = sme_RegisterBtCoexTDLSCallback(pHddCtx->hHal,
1046 wlan_hdd_tdls_btCoex_cb);
1047 if (status != eHAL_STATUS_SUCCESS) {
1048 hddLog(VOS_TRACE_LEVEL_ERROR, FL("Failed to register BT Coex TDLS callback"));
1049 }
Agarwal Ashish4b87f922014-06-18 03:03:21 +05301050
Masti, Narayanraddi4fbdf762016-02-25 17:24:39 +05301051 if ((TRUE == pHddCtx->cfg_ini->fEnableTDLSSupport) &&
1052 (TRUE == sme_IsFeatureSupportedByFW(TDLS)))
Agarwal Ashish4b87f922014-06-18 03:03:21 +05301053 {
Masti, Narayanraddi4fbdf762016-02-25 17:24:39 +05301054 if (FALSE == pHddCtx->cfg_ini->fEnableTDLSImplicitTrigger)
1055 {
1056 pHddCtx->tdls_mode = eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY;
1057 hddLog(LOGE, FL("TDLS Implicit trigger not enabled!"));
1058 return;
1059 }
1060 pHddCtx->tdls_mode = eTDLS_SUPPORT_ENABLED;
Agarwal Ashish4b87f922014-06-18 03:03:21 +05301061 }
1062 else
1063 {
Masti, Narayanraddi4fbdf762016-02-25 17:24:39 +05301064 hddLog(LOGE,
1065 FL("TDLS not enabled (%d) or FW doesn't support (%d)"),
1066 pHddCtx->cfg_ini->fEnableTDLSSupport,
1067 sme_IsFeatureSupportedByFW(TDLS));
1068 pHddCtx->tdls_mode = eTDLS_SUPPORT_NOT_ENABLED;
Agarwal Ashish4b87f922014-06-18 03:03:21 +05301069 }
1070}
1071
1072int wlan_hdd_sta_tdls_init(hdd_adapter_t *pAdapter)
Chilam Ng01120412013-02-19 18:32:21 -08001073{
Chilam Ng01120412013-02-19 18:32:21 -08001074 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
Hoonki Lee27511902013-03-14 18:19:06 -07001075 tdlsCtx_t *pHddTdlsCtx;
Chilam Ng01120412013-02-19 18:32:21 -08001076 int i;
Sunil Dutt66485cb2013-12-19 19:05:03 +05301077 if (NULL == pHddCtx)
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05301078 {
1079 hddLog(VOS_TRACE_LEVEL_ERROR, "%s pHddCtx is NULL", __func__);
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +05301080 return -EINVAL;
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05301081 }
Sunil Dutt66485cb2013-12-19 19:05:03 +05301082
Mahesh A Saptasagarf5b8eff2015-01-31 01:07:07 +05301083 if (test_bit(TDLS_INIT_DONE, &pAdapter->event_flags))
1084 {
Abhishek Singh58749d62016-02-03 15:27:20 +05301085 hddLog(LOG1,
1086 FL("TDLS INIT DONE set to 1, no point in re-init"));
1087 /* Return success as TDLS is already initialized */
1088 return 0;
Mahesh A Saptasagarf5b8eff2015-01-31 01:07:07 +05301089 }
Sunil Dutt66485cb2013-12-19 19:05:03 +05301090
Hoonki Lee27511902013-03-14 18:19:06 -07001091 if ((FALSE == pHddCtx->cfg_ini->fEnableTDLSSupport) ||
1092 (FALSE == sme_IsFeatureSupportedByFW(TDLS)))
1093 {
1094 pHddCtx->tdls_mode = eTDLS_SUPPORT_NOT_ENABLED;
1095 pAdapter->sessionCtx.station.pHddTdlsCtx = NULL;
Ratheesh S P36dbc932015-08-07 14:28:57 +05301096 hddLog(VOS_TRACE_LEVEL_INFO, "%s TDLS not enabled (%d) or FW doesn't support (%d)!",
Hoonki Lee27511902013-03-14 18:19:06 -07001097 __func__, pHddCtx->cfg_ini->fEnableTDLSSupport,
1098 sme_IsFeatureSupportedByFW(TDLS));
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +05301099 return -EINVAL;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001100 }
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +05301101 /* TDLS is supported only in STA / P2P Client modes,
1102 * hence the check for TDLS support in a specific Device mode.
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +05301103 */
1104 if (0 == WLAN_HDD_IS_TDLS_SUPPORTED_ADAPTER(pAdapter))
1105 {
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05301106 hddLog(VOS_TRACE_LEVEL_ERROR, "%s TDLS is not supported in mode : %d", __func__, pAdapter->device_mode);
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +05301107 return -EINVAL;
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +05301108 }
1109 /* Check for the valid pHddTdlsCtx. If valid do not further
1110 * allocate the memory, rather continue with the initialization.
1111 * If tdls_initialization would get reinvoked without tdls_exit
1112 * getting invoked (SSR) there is no point to further proceed
1113 * with the memory allocations.
1114 */
1115 if (NULL == pAdapter->sessionCtx.station.pHddTdlsCtx)
1116 {
1117 pHddTdlsCtx = vos_mem_malloc(sizeof(tdlsCtx_t));
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001118
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +05301119 if (NULL == pHddTdlsCtx) {
1120 hddLog(VOS_TRACE_LEVEL_ERROR, "%s malloc failed!", __func__);
1121 pAdapter->sessionCtx.station.pHddTdlsCtx = NULL;
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +05301122 return -ENOMEM;
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +05301123 }
1124 /* initialize TDLS pAdater context */
1125 vos_mem_zero(pHddTdlsCtx, sizeof(tdlsCtx_t));
1126#ifdef TDLS_USE_SEPARATE_DISCOVERY_TIMER
1127 vos_timer_init(&pHddTdlsCtx->peerDiscoverTimer,
1128 VOS_TIMER_TYPE_SW,
1129 wlan_hdd_tdls_discover_peer_cb,
1130 pHddTdlsCtx);
1131#endif
Hoonki Lee27511902013-03-14 18:19:06 -07001132
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +05301133 vos_timer_init(&pHddTdlsCtx->peerUpdateTimer,
1134 VOS_TIMER_TYPE_SW,
1135 wlan_hdd_tdls_update_peer_cb,
1136 pHddTdlsCtx);
1137 vos_timer_init(&pHddTdlsCtx->peerDiscoveryTimeoutTimer,
1138 VOS_TIMER_TYPE_SW,
1139 wlan_hdd_tdls_discovery_timeout_peer_cb,
1140 pHddTdlsCtx);
1141
1142 pAdapter->sessionCtx.station.pHddTdlsCtx = pHddTdlsCtx;
Hoonki Lee27511902013-03-14 18:19:06 -07001143 }
1144
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +05301145 pHddTdlsCtx = pAdapter->sessionCtx.station.pHddTdlsCtx;
Hoonki Lee27511902013-03-14 18:19:06 -07001146
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001147 sme_SetTdlsPowerSaveProhibited(WLAN_HDD_GET_HAL_CTX(pAdapter), 0);
Hoonki Lee27511902013-03-14 18:19:06 -07001148
Hoonki Lee27511902013-03-14 18:19:06 -07001149 pHddTdlsCtx->pAdapter = pAdapter;
1150
1151 for (i = 0; i < 256; i++)
1152 {
1153 INIT_LIST_HEAD(&pHddTdlsCtx->peer_list[i]);
1154 }
1155
Hoonki Leed37cbb32013-04-20 00:31:14 -07001156 pHddTdlsCtx->curr_candidate = NULL;
1157 pHddTdlsCtx->magic = 0;
1158
Hoonki Lee27511902013-03-14 18:19:06 -07001159 /* remember configuration even if it is not used right now. it could be used later */
1160 pHddTdlsCtx->threshold_config.tx_period_t = pHddCtx->cfg_ini->fTDLSTxStatsPeriod;
1161 pHddTdlsCtx->threshold_config.tx_packet_n = pHddCtx->cfg_ini->fTDLSTxPacketThreshold;
1162 pHddTdlsCtx->threshold_config.discovery_period_t = pHddCtx->cfg_ini->fTDLSDiscoveryPeriod;
1163 pHddTdlsCtx->threshold_config.discovery_tries_n = pHddCtx->cfg_ini->fTDLSMaxDiscoveryAttempt;
1164 pHddTdlsCtx->threshold_config.idle_timeout_t = pHddCtx->cfg_ini->fTDLSIdleTimeout;
1165 pHddTdlsCtx->threshold_config.idle_packet_n = pHddCtx->cfg_ini->fTDLSIdlePacketThreshold;
1166 pHddTdlsCtx->threshold_config.rssi_hysteresis = pHddCtx->cfg_ini->fTDLSRSSIHysteresis;
1167 pHddTdlsCtx->threshold_config.rssi_trigger_threshold = pHddCtx->cfg_ini->fTDLSRSSITriggerThreshold;
1168 pHddTdlsCtx->threshold_config.rssi_teardown_threshold = pHddCtx->cfg_ini->fTDLSRSSITeardownThreshold;
Chilam NG571c65a2013-01-19 12:27:36 +05301169
Masti, Narayanraddi26378462016-01-05 18:20:28 +05301170 set_bit(TDLS_INIT_DONE, &pAdapter->event_flags);
Hoonki Lee27511902013-03-14 18:19:06 -07001171
1172 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +05301173}
1174
Pradeep Reddy POTTETI2d4d5c42015-03-03 14:34:19 +05301175void wlan_hdd_tdls_exit(hdd_adapter_t *pAdapter, tANI_BOOLEAN mutexLock)
Chilam NG571c65a2013-01-19 12:27:36 +05301176{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001177 tdlsCtx_t *pHddTdlsCtx;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07001178 hdd_context_t *pHddCtx;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001179
Chandrasekaran, Manishekar41b8e1f2015-03-10 13:30:28 +05301180 if (!pAdapter) {
1181 hddLog(VOS_TRACE_LEVEL_ERROR, FL("HDD adpater is NULL"));
1182 return;
1183 }
1184
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301185 /*
1186 * NOTE: The Callers of this function should ensure to acquire the
Mahesh A Saptasagarf5b8eff2015-01-31 01:07:07 +05301187 * tdls_lock to avoid any concurrent access to the Adapter and logp
1188 * protection has to be ensured.
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301189 */
1190
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301191 pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
Agarwal Ashish9ffa5b92014-11-18 21:07:02 +05301192
1193 if (NULL == pHddCtx || NULL == pHddCtx->cfg_ini)
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301194 {
Agarwal Ashish9ffa5b92014-11-18 21:07:02 +05301195 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1196 "%s: HDD context is Null", __func__);
1197 return ;
1198 }
Mahesh A Saptasagarf5b8eff2015-01-31 01:07:07 +05301199 if (!test_bit(TDLS_INIT_DONE, &pAdapter->event_flags))
Agarwal Ashish9ffa5b92014-11-18 21:07:02 +05301200 {
Ratheesh S P36dbc932015-08-07 14:28:57 +05301201 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Mahesh A Saptasagarf5b8eff2015-01-31 01:07:07 +05301202 "%s: TDLS INIT DONE set to 0, no point in exit", __func__);
1203 return;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301204 }
Mahesh A Saptasagarf5b8eff2015-01-31 01:07:07 +05301205 clear_bit(TDLS_INIT_DONE, &pAdapter->event_flags);
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301206
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001207 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001208 if (NULL == pHddTdlsCtx)
1209 {
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05301210 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1211 FL("pHddTdlsCtx is NULL"));
Hoonki Leebfee0342013-01-21 16:43:45 -08001212 return;
1213 }
Mahesh A Saptasagarf5b8eff2015-01-31 01:07:07 +05301214
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001215 /* must stop timer here before freeing peer list, because peerIdleTimer is
1216 part of peer list structure. */
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001217 wlan_hdd_tdls_timers_destroy(pHddTdlsCtx);
1218 wlan_hdd_tdls_free_list(pHddTdlsCtx);
Chilam Nga75d8b62013-01-29 01:35:59 -08001219
Masti, Narayanraddi26378462016-01-05 18:20:28 +05301220 wlan_hdd_init_deinit_defer_scan_context(&pHddCtx->scan_ctxt);
1221
Sushant Kaushik15c4c522014-08-14 12:24:49 +05301222 pHddTdlsCtx->magic = 0;
1223 pHddTdlsCtx->pAdapter = NULL;
Chilam Nga75d8b62013-01-29 01:35:59 -08001224 vos_mem_free(pHddTdlsCtx);
Pradeep Reddy POTTETI59c90d62014-03-24 19:45:47 +05301225 pAdapter->sessionCtx.station.pHddTdlsCtx = NULL;
Chilam Nga75d8b62013-01-29 01:35:59 -08001226 pHddTdlsCtx = NULL;
Chilam NG571c65a2013-01-19 12:27:36 +05301227}
1228
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301229/* stop all monitoring timers per Adapter */
1230static void wlan_hdd_tdls_monitor_timers_stop(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001231{
Hoonki Leed37cbb32013-04-20 00:31:14 -07001232#ifdef TDLS_USE_SEPARATE_DISCOVERY_TIMER
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001233 vos_timer_stop(&pHddTdlsCtx->peerDiscoverTimer);
Hoonki Leed37cbb32013-04-20 00:31:14 -07001234#endif
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001235 vos_timer_stop(&pHddTdlsCtx->peerUpdateTimer);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001236 vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301237}
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001238
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301239/* stop all per peer timers */
1240static void wlan_hdd_tdls_peer_timers_stop(tdlsCtx_t *pHddTdlsCtx)
1241{
1242 int i;
1243 struct list_head *head;
1244 struct list_head *pos;
1245 hddTdlsPeer_t *curr_peer;
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001246 for (i = 0; i < 256; i++)
1247 {
1248 head = &pHddTdlsCtx->peer_list[i];
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001249 list_for_each (pos, head) {
1250 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05301251 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Chilam Ng01120412013-02-19 18:32:21 -08001252 "%s: " MAC_ADDRESS_STR " -> stop idle timer",
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001253 __func__,
Chilam Ng01120412013-02-19 18:32:21 -08001254 MAC_ADDR_ARRAY(curr_peer->peerMac));
Masti, Narayanraddie8e14622015-10-17 16:10:54 +05301255 if (vos_timer_is_initialized(&curr_peer->peerIdleTimer))
1256 vos_timer_stop ( &curr_peer->peerIdleTimer );
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +05301257 if (vos_timer_is_initialized(&curr_peer->initiatorWaitTimeoutTimer))
1258 vos_timer_stop( &curr_peer->initiatorWaitTimeoutTimer );
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001259 }
1260 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001261}
1262
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301263/* stop all the tdls timers running */
1264static void wlan_hdd_tdls_timers_stop(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001265{
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301266 wlan_hdd_tdls_monitor_timers_stop(pHddTdlsCtx);
1267 wlan_hdd_tdls_peer_timers_stop(pHddTdlsCtx);
1268}
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001269
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301270static void wlan_hdd_tdls_monitor_timers_destroy(tdlsCtx_t *pHddTdlsCtx)
1271{
Hoonki Leed37cbb32013-04-20 00:31:14 -07001272#ifdef TDLS_USE_SEPARATE_DISCOVERY_TIMER
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001273 vos_timer_stop(&pHddTdlsCtx->peerDiscoverTimer);
1274 vos_timer_destroy(&pHddTdlsCtx->peerDiscoverTimer);
Hoonki Leed37cbb32013-04-20 00:31:14 -07001275#endif
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001276 vos_timer_stop(&pHddTdlsCtx->peerUpdateTimer);
1277 vos_timer_destroy(&pHddTdlsCtx->peerUpdateTimer);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001278 vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
1279 vos_timer_destroy(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301280}
1281/*Free all the timers related to the TDLS peer */
1282static void wlan_hdd_tdls_peer_timers_destroy(tdlsCtx_t *pHddTdlsCtx)
1283{
1284 int i;
1285 struct list_head *head;
1286 struct list_head *pos;
1287 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001288 for (i = 0; i < 256; i++)
1289 {
1290 head = &pHddTdlsCtx->peer_list[i];
1291
1292 list_for_each (pos, head) {
1293 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
1294
Masti, Narayanraddie8e14622015-10-17 16:10:54 +05301295 if (vos_timer_is_initialized(&curr_peer->peerIdleTimer)){
1296 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1297 "%s: " MAC_ADDRESS_STR " -> destroy idle timer",
1298 __func__,
1299 MAC_ADDR_ARRAY(curr_peer->peerMac));
1300 vos_timer_stop ( &curr_peer->peerIdleTimer );
1301 vos_timer_destroy ( &curr_peer->peerIdleTimer );
1302 }
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +05301303 if (vos_timer_is_initialized(&curr_peer->initiatorWaitTimeoutTimer))
1304 {
Masti, Narayanraddie8e14622015-10-17 16:10:54 +05301305 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1306 "%s: " MAC_ADDRESS_STR " -> destroy initiatorWaitTimeoutTimer",
1307 __func__,
1308 MAC_ADDR_ARRAY(curr_peer->peerMac));
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +05301309 vos_timer_stop(&curr_peer->initiatorWaitTimeoutTimer);
1310 vos_timer_destroy(&curr_peer->initiatorWaitTimeoutTimer);
1311 }
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001312 }
1313 }
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301314}
1315
1316/* destroy all the tdls timers running */
1317static void wlan_hdd_tdls_timers_destroy(tdlsCtx_t *pHddTdlsCtx)
1318{
1319 wlan_hdd_tdls_monitor_timers_destroy(pHddTdlsCtx);
1320 wlan_hdd_tdls_peer_timers_destroy(pHddTdlsCtx);
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001321}
1322
Hoonki Lee387663d2013-02-05 18:08:43 -08001323/* if mac address exist, return pointer
1324 if mac address doesn't exist, create a list and add, return pointer
1325 return NULL if fails to get new mac address
1326*/
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05301327hddTdlsPeer_t *wlan_hdd_tdls_get_peer(hdd_adapter_t *pAdapter,
1328#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1329 const u8 *mac
1330#else
1331 u8 *mac
1332#endif
1333 )
Chilam NG571c65a2013-01-19 12:27:36 +05301334{
Hoonki Lee387663d2013-02-05 18:08:43 -08001335 struct list_head *head;
1336 hddTdlsPeer_t *peer;
1337 u8 key;
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -07001338 tdlsCtx_t *pHddTdlsCtx;
Chandrasekaran, Manishekar41b8e1f2015-03-10 13:30:28 +05301339 hdd_context_t *pHddCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301340
Chandrasekaran, Manishekar41b8e1f2015-03-10 13:30:28 +05301341
1342 if (!pAdapter) {
1343 hddLog(VOS_TRACE_LEVEL_ERROR, FL("HDD adpater is NULL"));
1344 return NULL;
1345 }
1346
1347 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1348 if (0 != (wlan_hdd_validate_context(pHddCtx)))
c_hpothu7f63e882013-10-02 19:13:35 +05301349 {
c_hpothu7f63e882013-10-02 19:13:35 +05301350 return 0;
1351 }
Hoonki Leebfee0342013-01-21 16:43:45 -08001352
Hoonki Lee387663d2013-02-05 18:08:43 -08001353 /* if already there, just update */
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301354 peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Hoonki Lee387663d2013-02-05 18:08:43 -08001355 if (peer != NULL)
1356 {
1357 return peer;
Chilam NG571c65a2013-01-19 12:27:36 +05301358 }
1359
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301360 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1361 FL("peer mac address %pM"), mac);
1362
Hoonki Lee387663d2013-02-05 18:08:43 -08001363 /* not found, allocate and add the list */
1364 peer = vos_mem_malloc(sizeof(hddTdlsPeer_t));
1365 if (NULL == peer) {
1366 hddLog(VOS_TRACE_LEVEL_ERROR, "%s peer malloc failed!", __func__);
1367 return NULL;
1368 }
Chilam NG571c65a2013-01-19 12:27:36 +05301369
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -07001370 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
1371
1372 if (NULL == pHddTdlsCtx)
1373 {
1374 vos_mem_free(peer);
Hema Aparna Medicharla8bb6f782015-03-09 12:35:05 +05301375 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1376 FL("pHddTdlsCtx is NULL"));
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -07001377 return NULL;
1378 }
1379
1380 key = wlan_hdd_tdls_hash_key(mac);
1381 head = &pHddTdlsCtx->peer_list[key];
Chilam NG571c65a2013-01-19 12:27:36 +05301382
Hoonki Lee387663d2013-02-05 18:08:43 -08001383 vos_mem_zero(peer, sizeof(hddTdlsPeer_t));
1384 vos_mem_copy(peer->peerMac, mac, sizeof(peer->peerMac));
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001385 peer->pHddTdlsCtx = pHddTdlsCtx;
Hoonki Lee387663d2013-02-05 18:08:43 -08001386 list_add_tail(&peer->node, head);
Hoonki Lee387663d2013-02-05 18:08:43 -08001387
1388 return peer;
1389}
1390
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001391int wlan_hdd_tdls_set_cap(hdd_adapter_t *pAdapter,
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301392#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1393 const u8* mac,
1394#else
Hoonki Lee27511902013-03-14 18:19:06 -07001395 u8* mac,
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301396#endif
Hoonki Lee27511902013-03-14 18:19:06 -07001397 tTDLSCapType cap)
1398{
1399 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301400 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee27511902013-03-14 18:19:06 -07001401
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301402 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1403 return -EINVAL;
1404
1405 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001406 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee27511902013-03-14 18:19:06 -07001407 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301408 {
1409 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1410 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301411 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001412 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301413 }
Hoonki Lee27511902013-03-14 18:19:06 -07001414
1415 curr_peer->tdls_support = cap;
1416
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301417 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001418 return 0;
Hoonki Lee27511902013-03-14 18:19:06 -07001419}
1420
Atul Mittal115287b2014-07-08 13:26:33 +05301421void wlan_hdd_tdls_set_peer_link_status(hddTdlsPeer_t *curr_peer,
1422 tTDLSLinkStatus status,
1423 tTDLSLinkReason reason)
Hoonki Lee387663d2013-02-05 18:08:43 -08001424{
Atul Mittal115287b2014-07-08 13:26:33 +05301425 /*EXT TDLS*/
1426 tANI_S32 state = 0;
1427 tANI_S32 res = 0;
1428 /*EXT TDLS*/
Hoonki Lee387663d2013-02-05 18:08:43 -08001429 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301430 {
1431 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1432 "%s: curr_peer is NULL", __func__);
Hoonki Lee387663d2013-02-05 18:08:43 -08001433 return;
c_hpothu7f63e882013-10-02 19:13:35 +05301434 }
Hoonki Lee387663d2013-02-05 18:08:43 -08001435
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001436 hddLog(VOS_TRACE_LEVEL_WARN, "tdls set peer " MAC_ADDRESS_STR " link status to %u",
Chilam Ng01120412013-02-19 18:32:21 -08001437 MAC_ADDR_ARRAY(curr_peer->peerMac), status);
Chilam NG571c65a2013-01-19 12:27:36 +05301438
1439 curr_peer->link_status = status;
1440
Atul Mittal115287b2014-07-08 13:26:33 +05301441 /*EXT TDLS*/
1442 if (curr_peer->isForcedPeer && curr_peer->state_change_notification)
1443 {
1444 /*save the reason for any further query*/
1445 curr_peer->reason = reason;
1446 wlan_hdd_tdls_get_wifi_hal_state(curr_peer, &state, &res);
1447
1448 (curr_peer->state_change_notification)(
1449 curr_peer->peerMac,
1450 state,
1451 res,
1452 curr_peer->pHddTdlsCtx->pAdapter);
1453
1454 }
1455 /*EXT TDLS*/
1456
Chilam NG571c65a2013-01-19 12:27:36 +05301457}
1458
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001459void wlan_hdd_tdls_set_link_status(hdd_adapter_t *pAdapter,
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05301460#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1461 const u8 *mac,
1462#else
1463 u8 *mac,
1464#endif
Atul Mittal115287b2014-07-08 13:26:33 +05301465 tTDLSLinkStatus linkStatus,
1466 tTDLSLinkReason reason)
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001467{
Atul Mittal115287b2014-07-08 13:26:33 +05301468
1469 /*EXT TDLS*/
1470 tANI_S32 state = 0;
1471 tANI_S32 res = 0;
1472 /*EXT TDLS*/
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001473 hddTdlsPeer_t *curr_peer;
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301474 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001475
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301476 if (pHddCtx == NULL)
1477 {
1478 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1479 FL("pHddCtx is NULL"));
1480 return;
1481 }
1482
1483 mutex_lock(&pHddCtx->tdls_lock);
1484 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001485 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301486 {
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301487 mutex_unlock(&pHddCtx->tdls_lock);
c_hpothu7f63e882013-10-02 19:13:35 +05301488 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1489 "%s: curr_peer is NULL", __func__);
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001490 return;
c_hpothu7f63e882013-10-02 19:13:35 +05301491 }
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001492
Masti, Narayanraddi83dbfc22016-01-07 16:26:06 +05301493 hddLog(VOS_TRACE_LEVEL_INFO,
1494 "tdls set peer " MAC_ADDRESS_STR " link status to %u",
1495 MAC_ADDR_ARRAY(curr_peer->peerMac), linkStatus);
1496
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001497 curr_peer->link_status= linkStatus;
1498
Atul Mittal115287b2014-07-08 13:26:33 +05301499 /*EXT TDLS*/
1500
1501 if (curr_peer->isForcedPeer && curr_peer->state_change_notification)
1502 {
1503 /*save the reason for any further query*/
1504 curr_peer->reason = reason;
1505 wlan_hdd_tdls_get_wifi_hal_state(curr_peer, &state, &res);
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301506 mutex_unlock(&pHddCtx->tdls_lock);
Atul Mittal115287b2014-07-08 13:26:33 +05301507 (*curr_peer->state_change_notification)(mac,
1508 state,
1509 res,
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301510 pAdapter);
Atul Mittal115287b2014-07-08 13:26:33 +05301511 }
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301512 else
1513 mutex_unlock(&pHddCtx->tdls_lock);
1514
Atul Mittal115287b2014-07-08 13:26:33 +05301515 /*EXT TDLS*/
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001516 return;
1517}
1518
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001519int wlan_hdd_tdls_recv_discovery_resp(hdd_adapter_t *pAdapter, u8 *mac)
Chilam NG571c65a2013-01-19 12:27:36 +05301520{
1521 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301522 tdlsCtx_t *pHddTdlsCtx = NULL;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301523 hdd_context_t *pHddCtx;
1524
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05301525 ENTER();
1526
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301527 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1528 if (0 != wlan_hdd_validate_context(pHddCtx))
1529 return -1;
1530
1531 mutex_lock(&pHddCtx->tdls_lock);
1532
1533 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301534 if ( NULL == pHddTdlsCtx )
c_hpothu7f63e882013-10-02 19:13:35 +05301535 {
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301536 mutex_unlock(&pHddCtx->tdls_lock);
1537 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1538 FL("pHddTdlsCtx is NULL device mode = %d"),
1539 pAdapter->device_mode);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301540 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301541 }
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301542
1543 pHddCtx = WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter);
1544
c_hpothu7f63e882013-10-02 19:13:35 +05301545 if(0 != (wlan_hdd_validate_context(pHddCtx)))
1546 {
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301547 mutex_unlock(&pHddCtx->tdls_lock);
c_hpothu7f63e882013-10-02 19:13:35 +05301548 return 0;
1549 }
Chilam NG571c65a2013-01-19 12:27:36 +05301550
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001551 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001552
1553 if (NULL == curr_peer)
c_hpothu7f63e882013-10-02 19:13:35 +05301554 {
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301555 mutex_unlock(&pHddCtx->tdls_lock);
c_hpothu7f63e882013-10-02 19:13:35 +05301556 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1557 FL("curr_peer is NULL"));
Hoonki Lee387663d2013-02-05 18:08:43 -08001558 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301559 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001560
1561 if (pHddTdlsCtx->discovery_sent_cnt)
1562 pHddTdlsCtx->discovery_sent_cnt--;
1563
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301564
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001565 wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301566
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001567 if (0 == pHddTdlsCtx->discovery_sent_cnt)
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001568 {
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001569 vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001570 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001571
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05301572 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001573 "Discovery(%u) Response from " MAC_ADDRESS_STR " link_status %d",
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001574 pHddTdlsCtx->discovery_sent_cnt, MAC_ADDR_ARRAY(curr_peer->peerMac),
1575 curr_peer->link_status);
1576
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301577 curr_peer->tdls_support = eTDLS_CAP_SUPPORTED;
1578
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001579 if (eTDLS_LINK_DISCOVERING == curr_peer->link_status)
Gopichand Nakkala901e8922013-03-04 23:45:58 -08001580 {
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001581 /* Since we are here, it means Throughput threshold is alredy met. Make sure RSSI
1582 threshold is also met before setting up TDLS link*/
1583 if ((tANI_S32) curr_peer->rssi > (tANI_S32) pHddTdlsCtx->threshold_config.rssi_trigger_threshold)
1584 {
Atul Mittal115287b2014-07-08 13:26:33 +05301585 wlan_hdd_tdls_set_peer_link_status(curr_peer,
1586 eTDLS_LINK_DISCOVERED,
1587 eTDLS_LINK_SUCCESS);
Ganesh Kondabattinid01c4ee2016-01-04 16:13:06 +05301588
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05301589 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001590 "Rssi Threshold met: "MAC_ADDRESS_STR" rssi = %d threshold= %d" ,
1591 MAC_ADDR_ARRAY(curr_peer->peerMac), curr_peer->rssi,
1592 pHddTdlsCtx->threshold_config.rssi_trigger_threshold);
Ganesh Kondabattinid01c4ee2016-01-04 16:13:06 +05301593
1594 if (pHddCtx->tdls_mode != eTDLS_SUPPORT_DISABLED)
1595 {
1596 /* TDLS can be disabled from multiple sources like
1597 * scan, p2p-listen, p2p, btc etc ...
1598 * Dont initiate tdls setup if tdls is disabled
1599 */
1600 cfg80211_tdls_oper_request(pAdapter->dev, curr_peer->peerMac,
1601 NL80211_TDLS_SETUP, FALSE,
1602 GFP_KERNEL);
1603 }
1604 else
1605 {
1606 curr_peer->tdls_support = eTDLS_CAP_UNKNOWN;
1607 wlan_hdd_tdls_set_peer_link_status(
1608 curr_peer,
1609 eTDLS_LINK_IDLE,
1610 eTDLS_LINK_UNSPECIFIED);
1611
1612 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1613 "%s: TDLS is disabled. Resetting link_status of peer "
1614 MAC_ADDRESS_STR " to %d, tdls_support %d", __func__,
1615 MAC_ADDR_ARRAY(curr_peer->peerMac),
1616 curr_peer->link_status, curr_peer->tdls_support);
1617 }
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001618 }
1619 else
1620 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05301621 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001622 "Rssi Threshold not met: "MAC_ADDRESS_STR" rssi = %d threshold = %d ",
1623 MAC_ADDR_ARRAY(curr_peer->peerMac), curr_peer->rssi,
1624 pHddTdlsCtx->threshold_config.rssi_trigger_threshold);
Sunil Duttb0d39242014-09-10 23:54:51 +05301625
1626 /* if RSSI threshold is not met then allow further discovery
1627 * attempts by decrementing count for the last attempt
1628 */
1629 if (curr_peer->discovery_attempt)
1630 curr_peer->discovery_attempt--;
1631
Atul Mittal115287b2014-07-08 13:26:33 +05301632 wlan_hdd_tdls_set_peer_link_status(curr_peer,
1633 eTDLS_LINK_IDLE,
1634 eTDLS_LINK_UNSPECIFIED);
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001635 }
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301636 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala901e8922013-03-04 23:45:58 -08001637 }
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001638 else
1639 {
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301640 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001641 wlan_hdd_tdls_check_bmps(pAdapter);
1642 }
Chilam NG571c65a2013-01-19 12:27:36 +05301643
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05301644 EXIT();
Hoonki Lee387663d2013-02-05 18:08:43 -08001645 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +05301646}
1647
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301648int wlan_hdd_tdls_set_peer_caps(hdd_adapter_t *pAdapter,
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05301649#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1650 const u8 *mac,
1651#else
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301652 u8 *mac,
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05301653#endif
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301654 tCsrStaParams *StaParams,
1655 tANI_BOOLEAN isBufSta,
Masti, Narayanraddic754cdc2015-12-24 18:22:36 +05301656 tANI_BOOLEAN isOffChannelSupported,
1657 tANI_BOOLEAN isQosWmmSta)
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301658{
1659 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301660 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301661
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301662 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1663 return -EINVAL;
1664
1665 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301666 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
1667 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301668 {
1669 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1670 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301671 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301672 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301673 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301674
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301675 curr_peer->uapsdQueues = StaParams->uapsd_queues;
1676 curr_peer->maxSp = StaParams->max_sp;
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301677 curr_peer->isBufSta = isBufSta;
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301678 curr_peer->isOffChannelSupported = isOffChannelSupported;
1679
1680 vos_mem_copy(curr_peer->supported_channels,
1681 StaParams->supported_channels,
1682 StaParams->supported_channels_len);
1683
1684 curr_peer->supported_channels_len =
1685 StaParams->supported_channels_len;
1686
1687 vos_mem_copy(curr_peer->supported_oper_classes,
1688 StaParams->supported_oper_classes,
1689 StaParams->supported_oper_classes_len);
1690
1691 curr_peer->supported_oper_classes_len =
1692 StaParams->supported_oper_classes_len;
Masti, Narayanraddic754cdc2015-12-24 18:22:36 +05301693 curr_peer->qos = isQosWmmSta;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301694
1695 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301696 return 0;
1697}
1698
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301699int wlan_hdd_tdls_get_link_establish_params(hdd_adapter_t *pAdapter,
1700#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1701 const u8 *mac,
1702#else
1703 u8 *mac,
1704#endif
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301705 tCsrTdlsLinkEstablishParams* tdlsLinkEstablishParams)
1706{
1707 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301708 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301709
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301710 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1711 return -EINVAL;
1712
1713 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301714 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
1715 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301716 {
1717 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1718 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301719 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301720 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301721 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301722
1723 tdlsLinkEstablishParams->isResponder = curr_peer->is_responder;
1724 tdlsLinkEstablishParams->uapsdQueues = curr_peer->uapsdQueues;
1725 tdlsLinkEstablishParams->maxSp = curr_peer->maxSp;
1726 tdlsLinkEstablishParams->isBufSta = curr_peer->isBufSta;
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301727 tdlsLinkEstablishParams->isOffChannelSupported =
1728 curr_peer->isOffChannelSupported;
1729
1730 vos_mem_copy(tdlsLinkEstablishParams->supportedChannels,
1731 curr_peer->supported_channels,
1732 curr_peer->supported_channels_len);
1733
1734 tdlsLinkEstablishParams->supportedChannelsLen =
1735 curr_peer->supported_channels_len;
1736
1737 vos_mem_copy(tdlsLinkEstablishParams->supportedOperClasses,
1738 curr_peer->supported_oper_classes,
1739 curr_peer->supported_oper_classes_len);
1740
1741 tdlsLinkEstablishParams->supportedOperClassesLen =
1742 curr_peer->supported_oper_classes_len;
Agarwal Ashish16020c42014-12-29 22:01:11 +05301743 tdlsLinkEstablishParams->qos = curr_peer->qos;
1744
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301745 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301746 return 0;
1747}
1748
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301749int wlan_hdd_tdls_set_rssi(hdd_adapter_t *pAdapter,
1750#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1751 const u8 *mac,
1752#else
1753 u8 *mac,
1754#endif
1755 tANI_S8 rxRssi)
Chilam NG571c65a2013-01-19 12:27:36 +05301756{
1757 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05301758 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
Chilam NG571c65a2013-01-19 12:27:36 +05301759
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05301760 if (0 != (wlan_hdd_validate_context(hdd_ctx))) {
1761 return -1;
1762 }
1763
1764 mutex_lock(&hdd_ctx->tdls_lock);
1765 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Hoonki Lee387663d2013-02-05 18:08:43 -08001766 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301767 {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05301768 mutex_unlock(&hdd_ctx->tdls_lock);
1769 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1770 FL("curr_peer is NULL"));
Hoonki Lee387663d2013-02-05 18:08:43 -08001771 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301772 }
Chilam NG571c65a2013-01-19 12:27:36 +05301773
1774 curr_peer->rssi = rxRssi;
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05301775 mutex_unlock(&hdd_ctx->tdls_lock);
Chilam NG571c65a2013-01-19 12:27:36 +05301776
Hoonki Lee387663d2013-02-05 18:08:43 -08001777 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +05301778}
1779
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301780int wlan_hdd_tdls_set_responder(hdd_adapter_t *pAdapter,
1781#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1782 const u8 *mac,
1783#else
1784 u8 *mac,
1785#endif
1786 tANI_U8 responder)
Hoonki Leea34dd892013-02-05 22:56:02 -08001787{
1788 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301789 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Leea34dd892013-02-05 22:56:02 -08001790
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301791 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1792 return -EINVAL;
1793
1794 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001795 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001796 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301797 {
1798 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1799 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301800 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leea34dd892013-02-05 22:56:02 -08001801 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301802 }
Hoonki Leea34dd892013-02-05 22:56:02 -08001803
1804 curr_peer->is_responder = responder;
1805
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301806 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leea34dd892013-02-05 22:56:02 -08001807 return 0;
1808}
1809
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301810int wlan_hdd_tdls_set_signature(hdd_adapter_t *pAdapter,
1811#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1812 const u8 *mac,
1813#else
1814 u8 *mac,
1815#endif
1816 tANI_U8 uSignature)
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001817{
1818 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301819 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001820
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301821 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1822 return -EINVAL;
1823
1824 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001825 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001826 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301827 {
1828 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1829 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301830 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001831 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301832 }
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001833
1834 curr_peer->signature = uSignature;
1835
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301836 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001837 return 0;
1838}
1839
Hoonki Leea34dd892013-02-05 22:56:02 -08001840
Hoonki Lee387663d2013-02-05 18:08:43 -08001841void wlan_hdd_tdls_extract_da(struct sk_buff *skb, u8 *mac)
Chilam NG571c65a2013-01-19 12:27:36 +05301842{
Chilam NG571c65a2013-01-19 12:27:36 +05301843 memcpy(mac, skb->data, 6);
Chilam NG571c65a2013-01-19 12:27:36 +05301844}
1845
Hoonki Lee387663d2013-02-05 18:08:43 -08001846void wlan_hdd_tdls_extract_sa(struct sk_buff *skb, u8 *mac)
Chilam Ng1279e232013-01-25 15:06:52 -08001847{
Chilam Ng1279e232013-01-25 15:06:52 -08001848 memcpy(mac, skb->data+6, 6);
Chilam Ng1279e232013-01-25 15:06:52 -08001849}
1850
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301851/**
1852 * wlan_hdd_tdls_is_forced_peer - function to check if peer is forced peer
1853 * @adapter: pointer to hdd apater
1854 * @mac: peer mac address
1855 *
1856 * Function identified is the peer is forced for tdls connection
1857 *
1858 * return: true: peer is forced false: peer is not forced
1859 */
1860static bool wlan_hdd_tdls_is_forced_peer(hdd_adapter_t *adapter,
1861 const u8 *mac)
1862{
1863 hddTdlsPeer_t *peer;
1864 hdd_context_t *hddctx = WLAN_HDD_GET_CTX(adapter);
1865 bool is_forced_peer;
1866
1867 mutex_lock(&hddctx->tdls_lock);
1868 peer = wlan_hdd_tdls_find_peer(adapter, mac, FALSE);
1869 if (!peer)
1870 {
1871 is_forced_peer = false;
1872 goto ret;
1873 }
1874
1875 if (!peer->isForcedPeer)
1876 {
1877 is_forced_peer = false;
1878 goto ret;
1879 }
1880 is_forced_peer = true;
1881
1882ret:
1883 mutex_unlock(&hddctx->tdls_lock);
1884 return is_forced_peer;
1885}
1886
1887/**
1888 * wlan_hdd_tdls_increment_pkt_count - function to increment tdls tx packet cnt
1889 * @pAdapter: pointer to hdd adapter
1890 * @skb: pointer to sk_buff
1891 *
1892 * Function to increment packet count if packet is destined to tdls peer
1893 *
1894 * return: None
1895 */
1896static void wlan_hdd_tdls_increment_pkt_count(hdd_adapter_t *pAdapter,
1897 struct sk_buff *skb)
Chilam NG571c65a2013-01-19 12:27:36 +05301898{
Hoonki Lee387663d2013-02-05 18:08:43 -08001899 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001900 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301901 hdd_station_ctx_t *hdd_sta_ctx;
1902 u8 mac[6];
Chilam NG571c65a2013-01-19 12:27:36 +05301903
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301904 if (0 != (wlan_hdd_validate_context(pHddCtx)))
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301905 return;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301906
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001907 if (eTDLS_SUPPORT_ENABLED != pHddCtx->tdls_mode)
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301908 goto error;
1909
1910 if (!pHddCtx->cfg_ini->fEnableTDLSImplicitTrigger)
1911 goto error;
1912
1913 wlan_hdd_tdls_extract_da(skb, mac);
1914
1915 if (pHddCtx->cfg_ini->fTDLSExternalControl)
1916 {
1917 if (!wlan_hdd_tdls_is_forced_peer(pAdapter, mac))
1918 goto error;
1919 }
1920
1921 hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
1922
1923 if (vos_is_macaddr_group((v_MACADDR_t *)mac))
1924 {
1925 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_MED,
1926 "broadcast packet, not adding to peer list");
1927 goto error;
1928 }
1929
1930 if (memcmp(hdd_sta_ctx->conn_info.bssId, mac, 6) == 0) {
1931 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_MED,
1932 "packet da is bssid, not adding to peer list");
1933 goto error;
1934 }
Hoonki Leebfee0342013-01-21 16:43:45 -08001935
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301936 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001937 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08001938 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301939 {
c_hpothue21931b2014-09-08 14:02:14 +05301940 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1941 FL("curr_peer is NULL"));
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301942 mutex_unlock(&pHddCtx->tdls_lock);
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301943 goto error;
c_hpothu7f63e882013-10-02 19:13:35 +05301944 }
Chilam NG571c65a2013-01-19 12:27:36 +05301945
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301946 curr_peer->tx_pkt++;
Chilam NG571c65a2013-01-19 12:27:36 +05301947
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301948 mutex_unlock(&pHddCtx->tdls_lock);
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301949
1950error:
1951 return;
1952}
1953
1954void wlan_hdd_tdls_notify_packet(hdd_adapter_t *adapter, struct sk_buff *skb)
1955{
1956 wlan_hdd_tdls_increment_pkt_count(adapter, skb);
Chilam NG571c65a2013-01-19 12:27:36 +05301957}
1958
Hoonki Lee27511902013-03-14 18:19:06 -07001959static int wlan_hdd_tdls_check_config(tdls_config_params_t *config)
1960{
1961 if (config->tdls > 2)
1962 {
1963 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 1st argument %d. <0...2>", __func__, config->tdls);
1964 return -1;
1965 }
1966 if (config->tx_period_t < CFG_TDLS_TX_STATS_PERIOD_MIN ||
1967 config->tx_period_t > CFG_TDLS_TX_STATS_PERIOD_MAX)
1968 {
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001969 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 2nd argument %d. <%d...%ld>", __func__, config->tx_period_t,
Hoonki Lee27511902013-03-14 18:19:06 -07001970 CFG_TDLS_TX_STATS_PERIOD_MIN, CFG_TDLS_TX_STATS_PERIOD_MAX);
1971 return -1;
1972 }
1973 if (config->tx_packet_n < CFG_TDLS_TX_PACKET_THRESHOLD_MIN ||
1974 config->tx_packet_n > CFG_TDLS_TX_PACKET_THRESHOLD_MAX)
1975 {
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001976 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 3rd argument %d. <%d...%ld>", __func__, config->tx_packet_n,
Hoonki Lee27511902013-03-14 18:19:06 -07001977 CFG_TDLS_TX_PACKET_THRESHOLD_MIN, CFG_TDLS_TX_PACKET_THRESHOLD_MAX);
1978 return -1;
1979 }
1980 if (config->discovery_period_t < CFG_TDLS_DISCOVERY_PERIOD_MIN ||
1981 config->discovery_period_t > CFG_TDLS_DISCOVERY_PERIOD_MAX)
1982 {
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001983 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 4th argument %d. <%d...%ld>", __func__, config->discovery_period_t,
Hoonki Lee27511902013-03-14 18:19:06 -07001984 CFG_TDLS_DISCOVERY_PERIOD_MIN, CFG_TDLS_DISCOVERY_PERIOD_MAX);
1985 return -1;
1986 }
1987 if (config->discovery_tries_n < CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MIN ||
1988 config->discovery_tries_n > CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MAX)
1989 {
1990 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 5th argument %d. <%d...%d>", __func__, config->discovery_tries_n,
1991 CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MIN, CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MAX);
1992 return -1;
1993 }
1994 if (config->idle_timeout_t < CFG_TDLS_IDLE_TIMEOUT_MIN ||
1995 config->idle_timeout_t > CFG_TDLS_IDLE_TIMEOUT_MAX)
1996 {
1997 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 6th argument %d. <%d...%d>", __func__, config->idle_timeout_t,
1998 CFG_TDLS_IDLE_TIMEOUT_MIN, CFG_TDLS_IDLE_TIMEOUT_MAX);
1999 return -1;
2000 }
2001 if (config->idle_packet_n < CFG_TDLS_IDLE_PACKET_THRESHOLD_MIN ||
2002 config->idle_packet_n > CFG_TDLS_IDLE_PACKET_THRESHOLD_MAX)
2003 {
2004 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 7th argument %d. <%d...%d>", __func__, config->idle_packet_n,
2005 CFG_TDLS_IDLE_PACKET_THRESHOLD_MIN, CFG_TDLS_IDLE_PACKET_THRESHOLD_MAX);
2006 return -1;
2007 }
2008 if (config->rssi_hysteresis < CFG_TDLS_RSSI_HYSTERESIS_MIN ||
2009 config->rssi_hysteresis > CFG_TDLS_RSSI_HYSTERESIS_MAX)
2010 {
2011 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 8th argument %d. <%d...%d>", __func__, config->rssi_hysteresis,
2012 CFG_TDLS_RSSI_HYSTERESIS_MIN, CFG_TDLS_RSSI_HYSTERESIS_MAX);
2013 return -1;
2014 }
2015 if (config->rssi_trigger_threshold < CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MIN ||
2016 config->rssi_trigger_threshold > CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MAX)
2017 {
2018 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 9th argument %d. <%d...%d>", __func__, config->rssi_trigger_threshold,
2019 CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MIN, CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MAX);
2020 return -1;
2021 }
2022 if (config->rssi_teardown_threshold < CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MIN ||
2023 config->rssi_teardown_threshold > CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MAX)
2024 {
2025 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 10th argument %d. <%d...%d>", __func__, config->rssi_teardown_threshold,
2026 CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MIN, CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MAX);
2027 return -1;
2028 }
2029 return 0;
2030}
2031
Chilam Ng01120412013-02-19 18:32:21 -08002032int wlan_hdd_tdls_set_params(struct net_device *dev, tdls_config_params_t *config)
Chilam NG571c65a2013-01-19 12:27:36 +05302033{
Chilam Ng01120412013-02-19 18:32:21 -08002034 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
2035 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002036 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Hoonki Lee27511902013-03-14 18:19:06 -07002037 eTDLSSupportMode req_tdls_mode;
Hoonki Leebfee0342013-01-21 16:43:45 -08002038
Masti, Narayanraddi4fbdf762016-02-25 17:24:39 +05302039 if ((TRUE != pHddCtx->cfg_ini->fEnableTDLSSupport) &&
2040 (TRUE != sme_IsFeatureSupportedByFW(TDLS)))
2041 {
2042 hddLog(LOGE,
2043 FL("TDLS not enabled (%d) or FW doesn't support (%d)"),
2044 pHddCtx->cfg_ini->fEnableTDLSSupport,
2045 sme_IsFeatureSupportedByFW(TDLS));
2046 pHddCtx->tdls_mode = eTDLS_SUPPORT_NOT_ENABLED;
2047 return -EINVAL;
2048 }
2049
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302050 mutex_lock(&pHddCtx->tdls_lock);
Hoonki Lee27511902013-03-14 18:19:06 -07002051 if (NULL == pHddTdlsCtx)
2052 {
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302053 mutex_unlock(&pHddCtx->tdls_lock);
c_hpothu7f63e882013-10-02 19:13:35 +05302054 hddLog(VOS_TRACE_LEVEL_ERROR, FL("TDLS not enabled!"));
Hoonki Lee27511902013-03-14 18:19:06 -07002055 return -1;
Chilam Ng01120412013-02-19 18:32:21 -08002056 }
Chilam NG571c65a2013-01-19 12:27:36 +05302057
Hoonki Lee27511902013-03-14 18:19:06 -07002058 if (wlan_hdd_tdls_check_config(config) != 0)
2059 {
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302060 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee27511902013-03-14 18:19:06 -07002061 return -1;
2062 }
2063
2064 /* config->tdls is mapped to 0->1, 1->2, 2->3 */
2065 req_tdls_mode = config->tdls + 1;
2066 if (pHddCtx->tdls_mode == req_tdls_mode)
2067 {
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302068 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee27511902013-03-14 18:19:06 -07002069 hddLog(VOS_TRACE_LEVEL_ERROR, "%s already in mode %d", __func__, config->tdls);
2070 return -1;
2071 }
2072
2073 /* copy the configuration only when given tdls mode is implicit trigger enable */
2074 if (eTDLS_SUPPORT_ENABLED == req_tdls_mode)
2075 {
Chilam Ng01120412013-02-19 18:32:21 -08002076 memcpy(&pHddTdlsCtx->threshold_config, config, sizeof(tdls_config_params_t));
2077 }
Chilam NG571c65a2013-01-19 12:27:36 +05302078
Chilam Ng01120412013-02-19 18:32:21 -08002079 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2080 "iw set tdls params: %d %d %d %d %d %d %d %d %d %d",
2081 config->tdls,
2082 config->tx_period_t,
2083 config->tx_packet_n,
2084 config->discovery_period_t,
2085 config->discovery_tries_n,
2086 config->idle_timeout_t,
2087 config->idle_packet_n,
2088 config->rssi_hysteresis,
2089 config->rssi_trigger_threshold,
2090 config->rssi_teardown_threshold);
Chilam NG571c65a2013-01-19 12:27:36 +05302091
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302092 mutex_unlock(&pHddCtx->tdls_lock);
2093
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302094 wlan_hdd_tdls_set_mode(pHddCtx, req_tdls_mode, TRUE,
2095 HDD_SET_TDLS_MODE_SOURCE_USER);
Chilam Ng01120412013-02-19 18:32:21 -08002096
Chilam NG571c65a2013-01-19 12:27:36 +05302097 return 0;
2098}
2099
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05302100int wlan_hdd_tdls_set_sta_id(hdd_adapter_t *pAdapter,
2101#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2102 const u8 *mac,
2103#else
2104 u8 *mac,
2105#endif
2106 u8 staId)
Kiran V1ccee932012-12-12 14:49:46 -08002107{
Hoonki Lee387663d2013-02-05 18:08:43 -08002108 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302109 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Kiran V1ccee932012-12-12 14:49:46 -08002110
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302111 if (0 != (wlan_hdd_validate_context(pHddCtx)))
2112 return -EINVAL;
2113
2114 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002115 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08002116 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05302117 {
2118 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2119 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302120 mutex_unlock(&pHddCtx->tdls_lock);
Chilam NG571c65a2013-01-19 12:27:36 +05302121 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05302122 }
Chilam NG571c65a2013-01-19 12:27:36 +05302123
Hoonki Lee387663d2013-02-05 18:08:43 -08002124 curr_peer->staId = staId;
Chilam NG571c65a2013-01-19 12:27:36 +05302125
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302126 mutex_unlock(&pHddCtx->tdls_lock);
Chilam NG571c65a2013-01-19 12:27:36 +05302127 return 0;
Kiran V1ccee932012-12-12 14:49:46 -08002128}
2129
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05302130int wlan_hdd_tdls_set_force_peer(hdd_adapter_t *pAdapter,
2131#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2132 const u8 *mac,
2133#else
2134 u8 *mac,
2135#endif
Naresh Jayaram937abdf2013-11-26 19:50:25 +05302136 tANI_BOOLEAN forcePeer)
Sunil Dutt41de4e22013-11-14 18:09:02 +05302137{
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +05302138 /* NOTE:
2139 * Hold mutex tdls_lock before calling this function
2140 */
Naresh Jayaram937abdf2013-11-26 19:50:25 +05302141 hddTdlsPeer_t *curr_peer;
Sunil Dutt41de4e22013-11-14 18:09:02 +05302142 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2143
2144 if ((NULL == pHddCtx)) return -1;
2145
Naresh Jayaram937abdf2013-11-26 19:50:25 +05302146 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
2147 if (curr_peer == NULL)
Sunil Dutt41de4e22013-11-14 18:09:02 +05302148 goto error;
Naresh Jayaram937abdf2013-11-26 19:50:25 +05302149 curr_peer->isForcedPeer = forcePeer;
Naresh Jayaramca7bc3a2014-02-04 23:03:04 +05302150
Naresh Jayaramca7bc3a2014-02-04 23:03:04 +05302151 return 0;
Sunil Dutt41de4e22013-11-14 18:09:02 +05302152error:
Sunil Dutt41de4e22013-11-14 18:09:02 +05302153 return -1;
2154}
2155
Hoonki Lee387663d2013-02-05 18:08:43 -08002156/* if peerMac is found, then it returns pointer to hddTdlsPeer_t
2157 otherwise, it returns NULL
2158*/
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05302159hddTdlsPeer_t *wlan_hdd_tdls_find_peer(hdd_adapter_t *pAdapter,
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05302160 const u8 *mac,
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302161 tANI_BOOLEAN mutexLock)
Kiran V1ccee932012-12-12 14:49:46 -08002162{
Hoonki Lee387663d2013-02-05 18:08:43 -08002163 u8 key;
2164 struct list_head *pos;
2165 struct list_head *head;
2166 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002167 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302168 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee387663d2013-02-05 18:08:43 -08002169
c_hpothu7f63e882013-10-02 19:13:35 +05302170 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2171 {
c_hpothu7f63e882013-10-02 19:13:35 +05302172 return 0;
2173 }
Hoonki Lee387663d2013-02-05 18:08:43 -08002174
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302175 if ( mutexLock )
Hoonki Lee387663d2013-02-05 18:08:43 -08002176 {
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302177 mutex_lock(&pHddCtx->tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -08002178 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002179 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002180 if (NULL == pHddTdlsCtx)
2181 {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302182 if ( mutexLock )
2183 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002184 return NULL;
2185 }
2186
2187 key = wlan_hdd_tdls_hash_key(mac);
2188
2189 head = &pHddTdlsCtx->peer_list[key];
Hoonki Lee387663d2013-02-05 18:08:43 -08002190
2191 list_for_each(pos, head) {
2192 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
2193 if (!memcmp(mac, curr_peer->peerMac, 6)) {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302194 if ( mutexLock )
2195 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -08002196 return curr_peer;
2197 }
2198 }
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302199 if ( mutexLock )
2200 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302201
Hoonki Lee387663d2013-02-05 18:08:43 -08002202 return NULL;
2203}
2204
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05302205hddTdlsPeer_t *wlan_hdd_tdls_find_all_peer(hdd_context_t *pHddCtx,
2206#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2207 const u8 *mac
2208#else
2209 u8 *mac
2210#endif
2211)
Hoonki Leea6d49be2013-04-05 09:43:25 -07002212{
2213 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2214 hdd_adapter_t *pAdapter = NULL;
2215 tdlsCtx_t *pHddTdlsCtx = NULL;
2216 hddTdlsPeer_t *curr_peer= NULL;
2217 VOS_STATUS status = 0;
2218
2219 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2220 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2221 {
2222 pAdapter = pAdapterNode->pAdapter;
2223
2224 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2225 if (NULL != pHddTdlsCtx)
2226 {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302227 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Hoonki Leea6d49be2013-04-05 09:43:25 -07002228 if (curr_peer)
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302229 {
Hoonki Leea6d49be2013-04-05 09:43:25 -07002230 return curr_peer;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302231 }
Hoonki Leea6d49be2013-04-05 09:43:25 -07002232 }
2233 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2234 pAdapterNode = pNext;
2235 }
2236 return curr_peer;
2237}
2238
2239
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05302240int wlan_hdd_tdls_reset_peer(hdd_adapter_t *pAdapter,
2241#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2242 const u8 *mac
2243#else
2244 u8 *mac
2245#endif
2246)
Hoonki Lee387663d2013-02-05 18:08:43 -08002247{
Chilam Ng01120412013-02-19 18:32:21 -08002248 hdd_context_t *pHddCtx;
Chilam NG571c65a2013-01-19 12:27:36 +05302249 hddTdlsPeer_t *curr_peer;
Kiran V1ccee932012-12-12 14:49:46 -08002250
Chilam Ng01120412013-02-19 18:32:21 -08002251 pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
2252
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302253 if (0 != (wlan_hdd_validate_context(pHddCtx)))
2254 return -EINVAL;
2255
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002256 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08002257 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05302258 {
2259 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2260 "%s: curr_peer is NULL", __func__);
Hoonki Lee387663d2013-02-05 18:08:43 -08002261 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05302262 }
Chilam NG571c65a2013-01-19 12:27:36 +05302263
Atul Mittal115287b2014-07-08 13:26:33 +05302264 wlan_hdd_tdls_set_peer_link_status(curr_peer,
2265 eTDLS_LINK_IDLE,
2266 eTDLS_LINK_UNSPECIFIED);
Hoonki Leecdd8e962013-01-20 00:45:46 -08002267 curr_peer->staId = 0;
Hoonki Lee387663d2013-02-05 18:08:43 -08002268
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302269 /* Throughput Monitor shall disable the split scan when
2270 * TDLS scan coexistance is disabled.At this point of time
2271 * since TDLS scan coexistance is not meeting the criteria
2272 * to be operational, explicitly make it false to enable
2273 * throughput monitor takes the control of split scan.
2274 */
2275 if (pHddCtx->isTdlsScanCoexistence == TRUE)
2276 {
2277 pHddCtx->isTdlsScanCoexistence = FALSE;
2278 }
2279
Masti, Narayanraddie8e14622015-10-17 16:10:54 +05302280 if((eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode) &&
2281 (vos_timer_is_initialized(&curr_peer->peerIdleTimer)) &&
2282 (VOS_TIMER_STATE_RUNNING ==
2283 vos_timer_getCurrentState(&curr_peer->peerIdleTimer)))
2284 {
Chilam Nga75d8b62013-01-29 01:35:59 -08002285 vos_timer_stop( &curr_peer->peerIdleTimer );
Chilam Nga75d8b62013-01-29 01:35:59 -08002286 }
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302287
Hoonki Lee387663d2013-02-05 18:08:43 -08002288 return 0;
Hoonki Leecdd8e962013-01-20 00:45:46 -08002289}
2290
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07002291/* Caller has to take the lock before calling this function */
Hoonki Lee27511902013-03-14 18:19:06 -07002292static void wlan_tdd_tdls_reset_tx_rx(tdlsCtx_t *pHddTdlsCtx)
2293{
2294 int i;
2295 struct list_head *head;
2296 hddTdlsPeer_t *tmp;
2297 struct list_head *pos, *q;
2298
Hoonki Lee27511902013-03-14 18:19:06 -07002299 for (i = 0; i < 256; i++) {
2300 head = &pHddTdlsCtx->peer_list[i];
2301 list_for_each_safe (pos, q, head) {
2302 tmp = list_entry(pos, hddTdlsPeer_t, node);
2303 tmp->tx_pkt = 0;
2304 tmp->rx_pkt = 0;
2305 }
2306 }
Hoonki Lee27511902013-03-14 18:19:06 -07002307
2308 return ;
2309}
2310
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07002311/* Caller has to take the lock before calling this function */
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002312static tANI_S32 wlan_hdd_tdls_peer_reset_discovery_processed(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002313{
2314 int i;
2315 struct list_head *head;
2316 hddTdlsPeer_t *tmp;
2317 struct list_head *pos, *q;
2318
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002319 pHddTdlsCtx->discovery_peer_cnt = 0;
2320
2321 for (i = 0; i < 256; i++) {
2322 head = &pHddTdlsCtx->peer_list[i];
2323 list_for_each_safe (pos, q, head) {
2324 tmp = list_entry(pos, hddTdlsPeer_t, node);
2325 tmp->discovery_processed = 0;
2326 }
2327 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002328
2329 return 0;
2330}
2331
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002332static tANI_S32 wlan_hdd_get_tdls_discovery_peer_cnt(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002333{
2334 int i;
2335 struct list_head *head;
2336 struct list_head *pos, *q;
2337 int discovery_peer_cnt=0;
2338 hddTdlsPeer_t *tmp;
2339
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002340 /*
2341 * This function expects the callers to acquire the Mutex.
2342 */
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002343
2344 for (i = 0; i < 256; i++) {
2345 head = &pHddTdlsCtx->peer_list[i];
2346 list_for_each_safe (pos, q, head) {
2347 tmp = list_entry(pos, hddTdlsPeer_t, node);
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302348 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Chilam Ng01120412013-02-19 18:32:21 -08002349 "%s, %d, " MAC_ADDRESS_STR, __func__, i,
2350 MAC_ADDR_ARRAY(tmp->peerMac));
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002351 discovery_peer_cnt++;
2352 }
2353 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002354 return discovery_peer_cnt;
2355}
2356
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002357tANI_U16 wlan_hdd_tdlsConnectedPeers(hdd_adapter_t *pAdapter)
Lee Hoonkic1262f22013-01-24 21:59:00 -08002358{
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302359 hdd_context_t *pHddCtx = NULL;
2360
2361 if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
2362 {
2363 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2364 FL("invalid pAdapter: %p"), pAdapter);
2365 return 0;
2366 }
2367 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002368
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302369 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05302370 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2371 {
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002372 return 0;
c_hpothu7f63e882013-10-02 19:13:35 +05302373 }
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302374 EXIT();
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002375 return pHddCtx->connected_peer_count;
Lee Hoonkic1262f22013-01-24 21:59:00 -08002376}
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002377
Pradeep Reddy POTTETIe309c152015-02-06 13:21:07 +05302378hddTdlsPeer_t *wlan_hdd_tdls_get_connected_peer(hdd_adapter_t *pAdapter)
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302379{
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +05302380 /* NOTE:
2381 * Hold mutext tdls_lock before calling this function
2382 */
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302383 int i;
2384 struct list_head *head;
2385 struct list_head *pos;
2386 hddTdlsPeer_t *curr_peer = NULL;
2387 tdlsCtx_t *pHddTdlsCtx;
2388 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2389
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302390 ENTER();
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302391 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2392 {
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302393 return NULL;
2394 }
2395
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302396 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2397 if (NULL == pHddTdlsCtx) {
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302398 return NULL;
2399 }
2400 for (i = 0; i < 256; i++) {
2401 head = &pHddTdlsCtx->peer_list[i];
2402
2403 list_for_each(pos, head) {
2404 curr_peer= list_entry (pos, hddTdlsPeer_t, node);
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05302405 if (curr_peer && (curr_peer->link_status == eTDLS_LINK_CONNECTED))
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302406 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302407 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05302408 "%s: " MAC_ADDRESS_STR " eTDLS_LINK_CONNECTED",
2409 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302410 return curr_peer;
2411 }
2412 }
2413 }
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302414
2415 EXIT();
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302416 return NULL;
2417}
2418
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002419int wlan_hdd_tdls_get_all_peers(hdd_adapter_t *pAdapter, char *buf, int buflen)
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002420{
2421 int i;
2422 int len, init_len;
Hoonki Lee387663d2013-02-05 18:08:43 -08002423 struct list_head *head;
2424 struct list_head *pos;
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002425 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002426 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302427 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2428
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302429 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05302430 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2431 {
c_hpothu7f63e882013-10-02 19:13:35 +05302432 return 0;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302433 }
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002434
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002435 init_len = buflen;
Sameer Thalappilb0a30232013-09-27 15:37:48 -07002436 len = scnprintf(buf, buflen, "\n%-18s%-3s%-4s%-3s%-5s\n",
2437 "MAC", "Id", "cap", "up", "RSSI");
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002438 buf += len;
2439 buflen -= len;
2440 /* 1234567890123456789012345678901234567 */
Sameer Thalappilb0a30232013-09-27 15:37:48 -07002441 len = scnprintf(buf, buflen, "---------------------------------\n");
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002442 buf += len;
2443 buflen -= len;
2444
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302445 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002446 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002447 if (NULL == pHddTdlsCtx) {
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302448 mutex_unlock(&pHddCtx->tdls_lock);
Sameer Thalappilb0a30232013-09-27 15:37:48 -07002449 len = scnprintf(buf, buflen, "TDLS not enabled\n");
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002450 return len;
2451 }
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002452 for (i = 0; i < 256; i++) {
Hoonki Lee387663d2013-02-05 18:08:43 -08002453 head = &pHddTdlsCtx->peer_list[i];
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002454
Hoonki Lee387663d2013-02-05 18:08:43 -08002455 list_for_each(pos, head) {
2456 curr_peer= list_entry (pos, hddTdlsPeer_t, node);
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002457
Hoonki Lee387663d2013-02-05 18:08:43 -08002458 if (buflen < 32+1)
2459 break;
Sameer Thalappilb0a30232013-09-27 15:37:48 -07002460 len = scnprintf(buf, buflen,
Chilam Ng01120412013-02-19 18:32:21 -08002461 MAC_ADDRESS_STR"%3d%4s%3s%5d\n",
2462 MAC_ADDR_ARRAY(curr_peer->peerMac),
Hoonki Lee387663d2013-02-05 18:08:43 -08002463 curr_peer->staId,
2464 (curr_peer->tdls_support == eTDLS_CAP_SUPPORTED) ? "Y":"N",
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07002465 TDLS_IS_CONNECTED(curr_peer) ? "Y":"N",
Hoonki Lee387663d2013-02-05 18:08:43 -08002466 curr_peer->rssi);
2467 buf += len;
2468 buflen -= len;
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002469 }
2470 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302471 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302472
2473 EXIT();
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002474 return init_len-buflen;
2475}
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002476
2477void wlan_hdd_tdls_connection_callback(hdd_adapter_t *pAdapter)
2478{
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302479 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302480 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08002481
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302482 if ((NULL == pHddCtx))
c_hpothu7f63e882013-10-02 19:13:35 +05302483 {
Agarwal Ashishbf98caf2014-03-25 13:29:11 +05302484 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
2485 FL("pHddCtx or pHddTdlsCtx points to NULL"));
c_hpothu7f63e882013-10-02 19:13:35 +05302486 return;
2487 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302488
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302489 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07002490
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302491 if (0 != wlan_hdd_sta_tdls_init(pAdapter))
2492 {
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302493 mutex_unlock(&pHddCtx->tdls_lock);
Abhishek Singh58749d62016-02-03 15:27:20 +05302494 hddLog(LOGE, FL("wlan_hdd_sta_tdls_init failed"));
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302495 return;
2496 }
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302497
2498 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2499 if ((NULL == pHddTdlsCtx))
2500 {
Hema Aparna Medicharla8bb6f782015-03-09 12:35:05 +05302501 mutex_unlock(&pHddCtx->tdls_lock);
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302502 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
2503 FL("pHddCtx or pHddTdlsCtx points to NULL device mode = %d"), pAdapter->device_mode);
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302504 return;
2505 }
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302506 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002507 "%s, update %d discover %d", __func__,
2508 pHddTdlsCtx->threshold_config.tx_period_t,
2509 pHddTdlsCtx->threshold_config.discovery_period_t);
2510
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08002511 if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode)
2512 {
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002513 wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002514 pHddTdlsCtx->discovery_sent_cnt = 0;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002515 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002516
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002517 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
2518 &pHddTdlsCtx->peerUpdateTimer,
2519 pHddTdlsCtx->threshold_config.tx_period_t);
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08002520 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302521 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002522
2523}
2524
2525void wlan_hdd_tdls_disconnection_callback(hdd_adapter_t *pAdapter)
2526{
Masti, Narayanraddi4685ddd2016-03-15 15:17:37 +05302527 tdlsCtx_t *pHddTdlsCtx;
2528 hdd_context_t *pHddCtx;
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002529
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302530 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"%s", __func__);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002531
Masti, Narayanraddi4685ddd2016-03-15 15:17:37 +05302532 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2533
2534 if (0 != wlan_hdd_validate_context(pHddCtx))
2535 return;
2536
2537 mutex_lock(&pHddCtx->tdls_lock);
2538
2539 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002540 if (NULL == pHddTdlsCtx)
2541 {
Masti, Narayanraddi4685ddd2016-03-15 15:17:37 +05302542 mutex_unlock(&pHddCtx->tdls_lock);
Ratheesh S P36dbc932015-08-07 14:28:57 +05302543 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
c_hpothu7f63e882013-10-02 19:13:35 +05302544 FL("pHddTdlsCtx is NULL"));
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002545 return;
2546 }
Masti, Narayanraddide96b992015-01-08 13:00:58 +05302547
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002548 pHddTdlsCtx->discovery_sent_cnt = 0;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002549 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002550
Pradeep Reddy POTTETI2d4d5c42015-03-03 14:34:19 +05302551 wlan_hdd_tdls_exit(pAdapter, TRUE);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002552
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302553 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002554}
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002555
2556void wlan_hdd_tdls_mgmt_completion_callback(hdd_adapter_t *pAdapter, tANI_U32 statusCode)
2557{
2558 pAdapter->mgmtTxCompletionStatus = statusCode;
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302559 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2560 "%s: Mgmt TX Completion %d",__func__, statusCode);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002561 complete(&pAdapter->tdls_mgmt_comp);
2562}
2563
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002564void wlan_hdd_tdls_increment_peer_count(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002565{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002566 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002567
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302568 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05302569 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2570 {
c_hpothu7f63e882013-10-02 19:13:35 +05302571 return;
2572 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002573
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302574 mutex_lock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302575
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002576 pHddCtx->connected_peer_count++;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002577 wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002578
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302579 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: %d",
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002580 __func__, pHddCtx->connected_peer_count);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302581
2582 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302583
2584 EXIT();
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002585}
2586
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002587void wlan_hdd_tdls_decrement_peer_count(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002588{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002589 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002590
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302591 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05302592 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2593 {
c_hpothu7f63e882013-10-02 19:13:35 +05302594 return;
2595 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002596
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302597 mutex_lock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302598
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002599 if (pHddCtx->connected_peer_count)
2600 pHddCtx->connected_peer_count--;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002601 wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002602
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302603 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: %d",
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002604 __func__, pHddCtx->connected_peer_count);
2605
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302606 mutex_unlock(&pHddCtx->tdls_lock);
2607
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302608 EXIT();
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002609}
2610
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002611void wlan_hdd_tdls_check_bmps(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002612{
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302613
2614 tdlsCtx_t *pHddTdlsCtx = NULL;
2615 hdd_context_t *pHddCtx = NULL;
Hoonki Lee14621352013-04-16 17:51:19 -07002616 hddTdlsPeer_t *curr_peer;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002617
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302618 if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
2619 {
2620 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2621 FL("invalid pAdapter: %p"), pAdapter);
2622 return;
2623 }
2624
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302625 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2626
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302627 if (NULL == pHddCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302628 {
Sushant Kaushik125ae692014-11-25 17:38:48 +05302629 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302630 FL("pHddCtx points to NULL"));
c_hpothu7f63e882013-10-02 19:13:35 +05302631 return;
2632 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002633
Masti, Narayanraddifd8380e2015-10-17 16:08:37 +05302634 mutex_lock(&pHddCtx->tdls_lock);
2635 curr_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0, FALSE);
Hoonki Lee14621352013-04-16 17:51:19 -07002636 if (NULL != curr_peer)
2637 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302638 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee14621352013-04-16 17:51:19 -07002639 "%s: tdls in progress. Dont check for BMPS " MAC_ADDRESS_STR,
2640 __func__, MAC_ADDR_ARRAY (curr_peer->peerMac));
Masti, Narayanraddifd8380e2015-10-17 16:08:37 +05302641 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee14621352013-04-16 17:51:19 -07002642 return;
2643 }
2644
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302645 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2646 if (NULL == pHddTdlsCtx)
2647 {
2648 mutex_unlock(&pHddCtx->tdls_lock);
2649 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2650 FL("pHddTdlsCtx points to NULL"));
2651 return;
2652 }
Masti, Narayanraddi26378462016-01-05 18:20:28 +05302653 if ((TDLS_CTX_MAGIC != pHddCtx->scan_ctxt.magic) &&
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002654 (0 == pHddCtx->connected_peer_count) &&
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002655 (0 == pHddTdlsCtx->discovery_sent_cnt))
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002656 {
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302657 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002658 if (FALSE == sme_IsPmcBmps(WLAN_HDD_GET_HAL_CTX(pAdapter)))
2659 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302660 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002661 "%s: No TDLS peer connected/discovery sent. Enable BMPS",
2662 __func__);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002663 hdd_enable_bmps_imps(pHddCtx);
2664 }
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002665 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002666 else
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002667 {
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302668 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002669 if (TRUE == sme_IsPmcBmps(WLAN_HDD_GET_HAL_CTX(pAdapter)))
2670 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302671 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002672 "%s: TDLS peer connected. Disable BMPS", __func__);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002673 hdd_disable_bmps_imps(pHddCtx, WLAN_HDD_INFRA_STATION);
2674 }
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002675 }
2676 return;
2677}
2678
Hoonki Leefb8df672013-04-10 18:20:34 -07002679/* return pointer to hddTdlsPeer_t if TDLS is ongoing. Otherwise return NULL.
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002680 * mac - if NULL check for all the peer list, otherwise, skip this mac when skip_self is TRUE
2681 * skip_self - if TRUE, skip this mac. otherwise, check all the peer list. if
2682 mac is NULL, this argument is ignored, and check for all the peer list.
2683 */
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05302684static hddTdlsPeer_t *wlan_hdd_tdls_find_progress_peer(hdd_adapter_t *pAdapter,
2685#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2686 const u8 *mac,
2687#else
2688 u8 *mac,
2689#endif
2690 u8 skip_self)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002691{
2692 int i;
2693 struct list_head *head;
2694 hddTdlsPeer_t *curr_peer;
2695 struct list_head *pos;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302696 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302697
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302698 if (NULL == pHddTdlsCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302699 {
Ratheesh S P36dbc932015-08-07 14:28:57 +05302700 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
c_hpothu7f63e882013-10-02 19:13:35 +05302701 FL("pHddTdlsCtx is NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302702 return NULL;
c_hpothu7f63e882013-10-02 19:13:35 +05302703 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302704
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002705 for (i = 0; i < 256; i++) {
2706 head = &pHddTdlsCtx->peer_list[i];
2707 list_for_each(pos, head) {
2708 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
2709 if (skip_self && mac && !memcmp(mac, curr_peer->peerMac, 6)) {
2710 continue;
2711 }
2712 else
2713 {
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08002714 if (eTDLS_LINK_CONNECTING == curr_peer->link_status)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002715 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302716 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002717 "%s:" MAC_ADDRESS_STR " eTDLS_LINK_CONNECTING",
Gopichand Nakkalac87400e2013-03-13 18:51:00 -07002718 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
Hoonki Leefb8df672013-04-10 18:20:34 -07002719 return curr_peer;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002720 }
2721 }
2722 }
2723 }
Hoonki Leefb8df672013-04-10 18:20:34 -07002724 return NULL;
2725}
2726
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05302727hddTdlsPeer_t *wlan_hdd_tdls_is_progress(hdd_context_t *pHddCtx,
2728#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2729 const u8 *mac,
2730#else
2731 u8 *mac,
2732#endif
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302733 u8 skip_self, tANI_BOOLEAN mutexLock)
Hoonki Leefb8df672013-04-10 18:20:34 -07002734{
2735 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2736 hdd_adapter_t *pAdapter = NULL;
2737 tdlsCtx_t *pHddTdlsCtx = NULL;
2738 hddTdlsPeer_t *curr_peer= NULL;
2739 VOS_STATUS status = 0;
2740
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302741 if (mutexLock)
2742 {
2743 mutex_lock(&pHddCtx->tdls_lock);
2744 }
Hoonki Leefb8df672013-04-10 18:20:34 -07002745 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2746 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2747 {
2748 pAdapter = pAdapterNode->pAdapter;
2749
2750 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2751 if (NULL != pHddTdlsCtx)
2752 {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302753 curr_peer = wlan_hdd_tdls_find_progress_peer(pAdapter, mac, skip_self);
Hoonki Leefb8df672013-04-10 18:20:34 -07002754 if (curr_peer)
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302755 {
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302756 if (mutexLock)
2757 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leefb8df672013-04-10 18:20:34 -07002758 return curr_peer;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302759 }
Hoonki Leefb8df672013-04-10 18:20:34 -07002760 }
2761 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2762 pAdapterNode = pNext;
2763 }
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302764 if (mutexLock)
2765 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leefb8df672013-04-10 18:20:34 -07002766 return NULL;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002767}
Hoonki Lee27511902013-03-14 18:19:06 -07002768
2769static void wlan_hdd_tdls_implicit_disable(tdlsCtx_t *pHddTdlsCtx)
2770{
Hoonki Lee27511902013-03-14 18:19:06 -07002771 wlan_hdd_tdls_timers_stop(pHddTdlsCtx);
Hoonki Lee27511902013-03-14 18:19:06 -07002772}
2773
2774static void wlan_hdd_tdls_implicit_enable(tdlsCtx_t *pHddTdlsCtx)
2775{
2776 wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002777 pHddTdlsCtx->discovery_sent_cnt = 0;
Hoonki Lee27511902013-03-14 18:19:06 -07002778 wlan_tdd_tdls_reset_tx_rx(pHddTdlsCtx);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002779 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002780
Hoonki Lee27511902013-03-14 18:19:06 -07002781
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002782 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
2783 &pHddTdlsCtx->peerUpdateTimer,
2784 pHddTdlsCtx->threshold_config.tx_period_t);
Hoonki Lee27511902013-03-14 18:19:06 -07002785}
2786
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002787void wlan_hdd_tdls_set_mode(hdd_context_t *pHddCtx,
2788 eTDLSSupportMode tdls_mode,
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302789 v_BOOL_t bUpdateLast,
2790 enum tdls_disable_source source)
Hoonki Lee27511902013-03-14 18:19:06 -07002791{
2792 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2793 VOS_STATUS status;
2794 hdd_adapter_t *pAdapter;
2795 tdlsCtx_t *pHddTdlsCtx;
2796
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302797 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2798 "%s mode %d", __func__, (int)tdls_mode);
c_hpothu7f63e882013-10-02 19:13:35 +05302799
2800 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2801 {
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302802 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302803 }
Hoonki Lee27511902013-03-14 18:19:06 -07002804
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302805 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07002806
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002807 if (pHddCtx->tdls_mode == tdls_mode)
2808 {
Hema Aparna Medicharla8bb6f782015-03-09 12:35:05 +05302809 mutex_unlock(&pHddCtx->tdls_lock);
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302810 hddLog(VOS_TRACE_LEVEL_INFO, "%s already in mode %d", __func__,
2811 (int)tdls_mode);
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302812
2813 if (tdls_mode == eTDLS_SUPPORT_DISABLED)
2814 {
2815 /*
2816 * TDLS is already disabled hence set source mask and return
2817 */
2818 set_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
2819 return;
2820 }
2821 if (tdls_mode == eTDLS_SUPPORT_ENABLED)
2822 {
2823 /*
2824 * TDLS is already disabled hence set source mask and return
2825 */
2826 clear_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
2827 return;
2828 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002829 return;
2830 }
2831
Hoonki Lee27511902013-03-14 18:19:06 -07002832 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2833
2834 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2835 {
2836 pAdapter = pAdapterNode->pAdapter;
Hoonki Leea6d49be2013-04-05 09:43:25 -07002837 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2838 if (NULL != pHddTdlsCtx)
Hoonki Lee27511902013-03-14 18:19:06 -07002839 {
Hoonki Leea6d49be2013-04-05 09:43:25 -07002840 if(eTDLS_SUPPORT_ENABLED == tdls_mode)
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302841 {
2842 clear_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
2843
2844 /*
2845 * Check if any TDLS source bit is set and if bitmap is
2846 * not zero then we should not enable TDLS
2847 */
2848 if (pHddCtx->tdls_source_bitmap)
2849 {
2850 mutex_unlock(&pHddCtx->tdls_lock);
2851 return;
2852 }
Hoonki Leea6d49be2013-04-05 09:43:25 -07002853 wlan_hdd_tdls_implicit_enable(pHddTdlsCtx);
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302854 }
2855 else if((eTDLS_SUPPORT_DISABLED == tdls_mode))
2856 {
2857 set_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
Hoonki Leea6d49be2013-04-05 09:43:25 -07002858 wlan_hdd_tdls_implicit_disable(pHddTdlsCtx);
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302859 }
2860 else if ((eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == tdls_mode))
2861 {
2862 clear_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
2863
2864 /*
2865 * Check if any TDLS source bit is set and if bitmap is
2866 * not zero then we should not enable TDLS
2867 */
2868 if (pHddCtx->tdls_source_bitmap)
2869 {
2870 mutex_unlock(&pHddCtx->tdls_lock);
2871 return;
2872 }
2873 wlan_hdd_tdls_implicit_disable(pHddTdlsCtx);
2874 }
Hoonki Lee27511902013-03-14 18:19:06 -07002875 }
2876 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2877 pAdapterNode = pNext;
2878 }
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002879 if(bUpdateLast)
2880 {
2881 pHddCtx->tdls_mode_last = tdls_mode;
2882 }
2883 else
2884 {
2885 pHddCtx->tdls_mode_last = pHddCtx->tdls_mode;
2886 }
Hoonki Lee27511902013-03-14 18:19:06 -07002887 pHddCtx->tdls_mode = tdls_mode;
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002888
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302889 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302890
Hoonki Lee27511902013-03-14 18:19:06 -07002891}
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002892
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302893static
2894void wlan_hdd_tdls_implicit_send_discovery_request(tdlsCtx_t * pHddTdlsCtx)
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002895{
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302896 hdd_context_t *pHddCtx = NULL;
2897 hddTdlsPeer_t *curr_peer = NULL, *temp_peer = NULL;
Hoonki Leed37cbb32013-04-20 00:31:14 -07002898
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302899 ENTER();
Hoonki Leed37cbb32013-04-20 00:31:14 -07002900 if (NULL == pHddTdlsCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302901 {
Ratheesh S P36dbc932015-08-07 14:28:57 +05302902 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
c_hpothu7f63e882013-10-02 19:13:35 +05302903 FL("pHddTdlsCtx is NULL"));
Hoonki Leed37cbb32013-04-20 00:31:14 -07002904 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302905 }
Hoonki Leed37cbb32013-04-20 00:31:14 -07002906
Hoonki Leed37cbb32013-04-20 00:31:14 -07002907 pHddCtx = WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter);
Hoonki Leefb8df672013-04-10 18:20:34 -07002908
c_hpothu7f63e882013-10-02 19:13:35 +05302909 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2910 {
Hoonki Leefb8df672013-04-10 18:20:34 -07002911 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302912 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002913
Hoonki Leed37cbb32013-04-20 00:31:14 -07002914 curr_peer = pHddTdlsCtx->curr_candidate;
Hoonki Leed37cbb32013-04-20 00:31:14 -07002915 if (NULL == curr_peer)
c_hpothu7f63e882013-10-02 19:13:35 +05302916 {
2917 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2918 FL("curr_peer is NULL"));
2919
Hoonki Leed37cbb32013-04-20 00:31:14 -07002920 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302921 }
Hoonki Leed37cbb32013-04-20 00:31:14 -07002922
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302923 /* This function is called in mutex_lock */
2924 temp_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0, FALSE);
Hoonki Leefb8df672013-04-10 18:20:34 -07002925 if (NULL != temp_peer)
2926 {
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302927 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2928 "%s: " MAC_ADDRESS_STR " ongoing. pre_setup ignored",
2929 __func__, MAC_ADDR_ARRAY(temp_peer->peerMac));
Hoonki Leed37cbb32013-04-20 00:31:14 -07002930 goto done;
Hoonki Leefb8df672013-04-10 18:20:34 -07002931 }
2932
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002933 if (eTDLS_CAP_UNKNOWN != curr_peer->tdls_support)
Atul Mittal115287b2014-07-08 13:26:33 +05302934 wlan_hdd_tdls_set_peer_link_status(curr_peer,
2935 eTDLS_LINK_DISCOVERING,
2936 eTDLS_LINK_SUCCESS);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002937
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302938 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2939 "%s: Implicit TDLS, Send Discovery request event", __func__);
Hoonki Leed37cbb32013-04-20 00:31:14 -07002940
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302941 cfg80211_tdls_oper_request(pHddTdlsCtx->pAdapter->dev,
2942 curr_peer->peerMac,
2943 NL80211_TDLS_DISCOVERY_REQ,
2944 FALSE,
2945 GFP_KERNEL);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002946 pHddTdlsCtx->discovery_sent_cnt++;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302947
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002948 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302949
Pradeep Reddy POTTETI219ced32014-11-14 16:33:57 +05302950 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
2951 &pHddTdlsCtx->peerDiscoveryTimeoutTimer,
2952 pHddTdlsCtx->threshold_config.tx_period_t - TDLS_DISCOVERY_TIMEOUT_BEFORE_UPDATE);
2953
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302954 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2955 "%s: discovery count %u timeout %u msec",
2956 __func__, pHddTdlsCtx->discovery_sent_cnt,
2957 pHddTdlsCtx->threshold_config.tx_period_t - TDLS_DISCOVERY_TIMEOUT_BEFORE_UPDATE);
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002958
Hoonki Leed37cbb32013-04-20 00:31:14 -07002959done:
2960 pHddTdlsCtx->curr_candidate = NULL;
2961 pHddTdlsCtx->magic = 0;
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302962 EXIT();
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002963 return;
2964}
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002965
2966tANI_U32 wlan_hdd_tdls_discovery_sent_cnt(hdd_context_t *pHddCtx)
2967{
2968 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2969 hdd_adapter_t *pAdapter = NULL;
2970 tdlsCtx_t *pHddTdlsCtx = NULL;
2971 VOS_STATUS status = 0;
2972 tANI_U32 count = 0;
2973
2974 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2975 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2976 {
2977 pAdapter = pAdapterNode->pAdapter;
2978
Hoonki Leea6d49be2013-04-05 09:43:25 -07002979 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2980 if (NULL != pHddTdlsCtx)
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002981 {
Hoonki Leea6d49be2013-04-05 09:43:25 -07002982 count = count + pHddTdlsCtx->discovery_sent_cnt;
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002983 }
2984 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2985 pAdapterNode = pNext;
2986 }
2987 return count;
2988}
2989
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002990void wlan_hdd_tdls_check_power_save_prohibited(hdd_adapter_t *pAdapter)
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002991{
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302992 tdlsCtx_t *pHddTdlsCtx = NULL;
2993 hdd_context_t *pHddCtx = NULL;
Chandrasekaran, Manishekar41b8e1f2015-03-10 13:30:28 +05302994
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302995
2996 if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
2997 {
2998 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2999 FL("invalid pAdapter: %p"), pAdapter);
Chandrasekaran, Manishekar41b8e1f2015-03-10 13:30:28 +05303000 return;
3001 }
3002
3003 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
3004 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07003005
3006 if ((NULL == pHddTdlsCtx) || (NULL == pHddCtx))
c_hpothu7f63e882013-10-02 19:13:35 +05303007 {
3008 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3009 FL(" pHddCtx or pHddTdlsCtx points to NULL"));
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07003010 return;
c_hpothu7f63e882013-10-02 19:13:35 +05303011 }
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07003012
3013 if ((0 == pHddCtx->connected_peer_count) &&
3014 (0 == wlan_hdd_tdls_discovery_sent_cnt(pHddCtx)))
3015 {
3016 sme_SetTdlsPowerSaveProhibited(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter), 0);
3017 return;
3018 }
3019 sme_SetTdlsPowerSaveProhibited(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter), 1);
3020 return;
3021}
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003022
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003023/* return negative = caller should stop and return error code immediately
3024 return 0 = caller should stop and return success immediately
3025 return 1 = caller can continue to scan
3026 */
3027int wlan_hdd_tdls_scan_callback (hdd_adapter_t *pAdapter,
3028 struct wiphy *wiphy,
3029#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
3030 struct net_device *dev,
3031#endif
3032 struct cfg80211_scan_request *request)
3033{
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003034 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3035 u16 connectedTdlsPeers;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303036 hddTdlsPeer_t *curr_peer, *connected_peer;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003037 unsigned long delay;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303038 hdd_config_t *cfg_param = pHddCtx->cfg_ini;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003039
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05303040 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05303041 if(0 != (wlan_hdd_validate_context(pHddCtx)))
3042 {
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003043 return 0;
c_hpothu7f63e882013-10-02 19:13:35 +05303044 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003045
3046 /* if tdls is not enabled, then continue scan */
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303047 if ((eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode))
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003048 return 1;
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303049
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303050 mutex_lock(&pHddCtx->tdls_lock);
3051 curr_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0, FALSE);
Hoonki Leefb8df672013-04-10 18:20:34 -07003052 if (NULL != curr_peer)
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003053 {
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303054 if (pHddCtx->scan_ctxt.reject++ >= TDLS_MAX_SCAN_REJECT)
Hoonki Leefb8df672013-04-10 18:20:34 -07003055 {
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303056 pHddCtx->scan_ctxt.reject = 0;
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303057 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Leefb8df672013-04-10 18:20:34 -07003058 "%s: " MAC_ADDRESS_STR ". scan rejected %d. force it to idle",
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303059 __func__, MAC_ADDR_ARRAY (curr_peer->peerMac), pHddCtx->scan_ctxt.reject);
Hoonki Leefb8df672013-04-10 18:20:34 -07003060
Atul Mittal115287b2014-07-08 13:26:33 +05303061 wlan_hdd_tdls_set_peer_link_status (curr_peer,
3062 eTDLS_LINK_IDLE,
3063 eTDLS_LINK_UNSPECIFIED);
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303064 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leefb8df672013-04-10 18:20:34 -07003065 return 1;
3066 }
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303067 mutex_unlock(&pHddCtx->tdls_lock);
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303068 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Leefb8df672013-04-10 18:20:34 -07003069 "%s: tdls in progress. scan rejected %d",
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303070 __func__, pHddCtx->scan_ctxt.reject);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003071 return -EBUSY;
3072 }
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303073 else
3074 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003075
3076 /* tdls teardown is ongoing */
3077 if (eTDLS_SUPPORT_DISABLED == pHddCtx->tdls_mode)
3078 {
3079 connectedTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303080 if (connectedTdlsPeers && (pHddCtx->scan_ctxt.attempt < TDLS_MAX_SCAN_SCHEDULE))
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003081 {
3082 delay = (unsigned long)(TDLS_DELAY_SCAN_PER_CONNECTION*connectedTdlsPeers);
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303083 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003084 "%s: tdls disabled, but still connected_peers %d attempt %d. schedule scan %lu msec",
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303085 __func__, connectedTdlsPeers, pHddCtx->scan_ctxt.attempt, delay);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003086
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303087 wlan_hdd_defer_scan_init_work (pHddCtx, wiphy,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003088#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
3089 dev,
3090#endif
3091 request,
3092 msecs_to_jiffies(delay));
3093 /* scan should not continue */
3094 return 0;
3095 }
3096 /* no connected peer or max retry reached, scan continue */
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303097 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003098 "%s: tdls disabled. connected_peers %d attempt %d. scan allowed",
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303099 __func__, connectedTdlsPeers, pHddCtx->scan_ctxt.attempt);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003100 return 1;
3101 }
Agarwal Ashishef54a182014-12-16 15:07:31 +05303102
3103 /* if fEnableTDLSScan flag is 1 ; driverwill allow scan even if
3104 * peer station is not buffer STA capable
3105 *
3106 * RX: If there is any RX activity, device will lose RX packets,
3107 * as peer will not be aware that device is off channel.
3108 * TX: TX is stopped whenever device initiate scan.
3109 */
3110 if (pHddCtx->cfg_ini->fEnableTDLSScan == 1)
3111 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303112 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Agarwal Ashishef54a182014-12-16 15:07:31 +05303113 FL("Allow SCAN in all TDLS cases"));
3114 return 1;
3115 }
3116
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003117 /* while tdls is up, first time scan */
3118 else if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode ||
3119 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode)
3120 {
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003121 connectedTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303122
3123 /* check the TDLS link and Scan coexistance Capability */
3124 if ( (TRUE == pHddCtx->cfg_ini->fEnableTDLSScanCoexSupport) &&
3125 (TRUE == sme_IsFeatureSupportedByFW(TDLS_SCAN_COEXISTENCE)) &&
3126 (connectedTdlsPeers == 1) )
3127 {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303128 mutex_lock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303129 /* get connected peer information */
Pradeep Reddy POTTETIe309c152015-02-06 13:21:07 +05303130 connected_peer = wlan_hdd_tdls_get_connected_peer(pAdapter);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303131 if (NULL == connected_peer) {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303132 mutex_unlock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303133 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3134 "%s: Invalid connected_peer, Continue Scanning", __func__);
3135 /* scan should continue */
3136 return 1;
3137 }
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303138 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303139 ("%s: TDLS Scan Co-exist supported connectedTdlsPeers =%d buffersta =%d"),
3140 __func__,connectedTdlsPeers,connected_peer->isBufSta);
3141
3142 if (connected_peer->isBufSta)
3143 {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303144 mutex_unlock(&pHddCtx->tdls_lock);
3145 pHddCtx->isTdlsScanCoexistence = TRUE;
3146 if ((cfg_param->dynSplitscan) && (!pHddCtx->issplitscan_enabled))
3147 {
3148 pHddCtx->issplitscan_enabled = TRUE;
3149 sme_enable_disable_split_scan(
3150 WLAN_HDD_GET_HAL_CTX(pAdapter),
3151 cfg_param->nNumStaChanCombinedConc,
3152 cfg_param->nNumP2PChanCombinedConc);
3153 }
3154 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
3155 ("%s:%d TDLS Scan Co-exist supported splitscan_enabled =%d "),
3156 __func__, __LINE__, pHddCtx->issplitscan_enabled);
3157 return 1;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303158 }
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303159 else
3160 mutex_unlock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303161
3162 }
3163 else
3164 {
3165 /* Throughput Monitor shall disable the split scan when
3166 * TDLS scan coexistance is disabled.At this point of time
3167 * since TDLS scan coexistance is not meeting the criteria
3168 * to be operational, explicitly make it false to enable
3169 * throughput monitor takes the control of split scan.
3170 */
3171 pHddCtx->isTdlsScanCoexistence = FALSE;
3172 }
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303173 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303174 ("%s: TDLS Scan Co-exist not supported connectedTdlsPeers =%d"
3175 " TDLSScanCoexSupport param =%d TDLS_SCAN_COEXISTENCE =%d"),
3176 __func__, connectedTdlsPeers,
3177 pHddCtx->cfg_ini->fEnableTDLSScanCoexSupport,
3178 sme_IsFeatureSupportedByFW(TDLS_SCAN_COEXISTENCE));
3179
Atul Mittal5803b342014-09-04 15:31:19 +05303180 /* disable implicit trigger logic & tdls operatoin */
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05303181 wlan_hdd_tdls_set_mode(pHddCtx, eTDLS_SUPPORT_DISABLED, FALSE,
3182 HDD_SET_TDLS_MODE_SOURCE_SCAN);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303183 /* fall back to the implementation of teardown the peers on the scan
3184 * when the number of connected peers are more than one. TDLS Scan
3185 * coexistance feature is exercised only when a single peer is
3186 * connected and the DUT shall not advertize the Buffer Sta capability,
3187 * so that the peer shall not go to the TDLS power save
3188 */
3189
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003190 if (connectedTdlsPeers)
3191 {
3192 tANI_U8 staIdx;
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003193 hddTdlsPeer_t *curr_peer;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003194
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +05303195 mutex_lock(&pHddCtx->tdls_lock);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003196 for (staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++)
3197 {
3198 if (pHddCtx->tdlsConnInfo[staIdx].staId)
3199 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303200 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303201 ("%s: indicate TDLS teardown (staId %d)"),
3202 __func__, pHddCtx->tdlsConnInfo[staIdx].staId) ;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003203
3204#ifdef CONFIG_TDLS_IMPLICIT
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303205 curr_peer = wlan_hdd_tdls_find_all_peer(pHddCtx,
3206 pHddCtx->tdlsConnInfo[staIdx].peerMac.bytes);
Abhishek Singh96568922016-01-05 15:28:12 +05303207 if(curr_peer) {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303208 wlan_hdd_tdls_indicate_teardown(
3209 curr_peer->pHddTdlsCtx->pAdapter, curr_peer,
3210 eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON);
Abhishek Singh96568922016-01-05 15:28:12 +05303211 hdd_send_wlan_tdls_teardown_event(
3212 eTDLS_TEARDOWN_SCAN,
3213 curr_peer->peerMac);
3214 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003215#endif
3216 }
3217 }
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +05303218 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003219 /* schedule scan */
3220 delay = (unsigned long)(TDLS_DELAY_SCAN_PER_CONNECTION*connectedTdlsPeers);
3221
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303222 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003223 "%s: tdls enabled (mode %d), connected_peers %d. schedule scan %lu msec",
3224 __func__, pHddCtx->tdls_mode, wlan_hdd_tdlsConnectedPeers(pAdapter),
3225 delay);
3226
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303227 wlan_hdd_defer_scan_init_work (pHddCtx, wiphy,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003228#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
3229 dev,
3230#endif
3231 request,
3232 msecs_to_jiffies(delay));
3233 /* scan should not continue */
3234 return 0;
3235 }
3236 /* no connected peer, scan continue */
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303237 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003238 "%s: tdls_mode %d, and no tdls connection. scan allowed",
3239 __func__, pHddCtx->tdls_mode);
3240 }
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05303241 EXIT();
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003242 return 1;
3243}
3244
3245void wlan_hdd_tdls_scan_done_callback(hdd_adapter_t *pAdapter)
3246{
3247 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003248
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05303249 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05303250 if(0 != (wlan_hdd_validate_context(pHddCtx)))
3251 {
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003252 return;
c_hpothu7f63e882013-10-02 19:13:35 +05303253 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003254
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303255 /* if tdls is not enabled then don't revert tdls mode */
3256 if ((eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode)) {
3257 hddLog(VOS_TRACE_LEVEL_INFO, FL("Failed to revert: Mode=%d"),
3258 pHddCtx->tdls_mode);
Pradeep Reddy POTTETIc7822df2015-02-19 20:15:41 +05303259 return;
Chandrasekaran, Manishekar0de84dc2015-03-10 15:12:34 +05303260 }
Sunil Dutt41de4e22013-11-14 18:09:02 +05303261
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003262 /* free allocated memory at scan time */
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303263 wlan_hdd_init_deinit_defer_scan_context(&pHddCtx->scan_ctxt);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003264
3265 /* if tdls was enabled before scan, re-enable tdls mode */
3266 if(eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode_last ||
3267 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode_last)
3268 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303269 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003270 ("%s: revert tdls mode %d"), __func__, pHddCtx->tdls_mode_last);
3271
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05303272 wlan_hdd_tdls_set_mode(pHddCtx, pHddCtx->tdls_mode_last, FALSE,
3273 HDD_SET_TDLS_MODE_SOURCE_SCAN);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003274 }
3275 wlan_hdd_tdls_check_bmps(pAdapter);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05303276
3277 EXIT();
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003278}
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07003279
3280void wlan_hdd_tdls_timer_restart(hdd_adapter_t *pAdapter,
3281 vos_timer_t *timer,
3282 v_U32_t expirationTime)
3283{
3284 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
3285
3286 if (NULL == pHddStaCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05303287 {
3288 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3289 FL("pHddStaCtx is NULL"));
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07003290 return;
c_hpothu7f63e882013-10-02 19:13:35 +05303291 }
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07003292
3293 /* Check whether driver load unload is in progress */
3294 if(vos_is_load_unload_in_progress( VOS_MODULE_ID_VOSS, NULL))
3295 {
3296 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3297 "%s: Driver load/unload is in progress.", __func__);
3298 return;
3299 }
3300
3301 if (hdd_connIsConnected(pHddStaCtx))
3302 {
3303 vos_timer_stop(timer);
3304 vos_timer_start(timer, expirationTime);
3305 }
3306}
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003307void wlan_hdd_tdls_indicate_teardown(hdd_adapter_t *pAdapter,
3308 hddTdlsPeer_t *curr_peer,
3309 tANI_U16 reason)
3310{
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05303311 hdd_context_t *pHddCtx;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303312
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05303313 if ((NULL == pAdapter || WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic) ||
3314 (NULL == curr_peer))
c_hpothu7f63e882013-10-02 19:13:35 +05303315 {
3316 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3317 FL("parameters passed are invalid"));
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003318 return;
c_hpothu7f63e882013-10-02 19:13:35 +05303319 }
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003320
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05303321 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3322
Masti, Narayanraddi9d275662015-08-26 13:15:12 +05303323 if ((eTDLS_LINK_CONNECTED != curr_peer->link_status) &&
3324 (eTDLS_LINK_CONNECTING != curr_peer->link_status))
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003325 return;
3326
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303327 /* Throughput Monitor shall disable the split scan when
3328 * TDLS scan coexistance is disabled.At this point of time
3329 * since TDLS scan coexistance is not meeting the criteria
3330 * to be operational, explicitly make it false to enable
3331 * throughput monitor takes the control of split scan.
3332 */
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05303333 if (pHddCtx && (pHddCtx->isTdlsScanCoexistence == TRUE))
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303334 {
3335 pHddCtx->isTdlsScanCoexistence = FALSE;
3336 }
3337
Atul Mittal115287b2014-07-08 13:26:33 +05303338 wlan_hdd_tdls_set_peer_link_status(curr_peer,
3339 eTDLS_LINK_TEARING,
Atul Mittal271a7652014-09-12 13:18:22 +05303340 eTDLS_LINK_UNSPECIFIED);
Agarwal Ashisha7ef41d2015-06-25 18:00:26 +05303341 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3342 FL("Setting NL80211_TDLS_TEARDOWN, reason %d"), reason);
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003343 cfg80211_tdls_oper_request(pAdapter->dev,
3344 curr_peer->peerMac,
3345 NL80211_TDLS_TEARDOWN,
3346 reason,
3347 GFP_KERNEL);
3348}
Atul Mittal115287b2014-07-08 13:26:33 +05303349
3350
3351/*EXT TDLS*/
3352int wlan_hdd_set_callback(hddTdlsPeer_t *curr_peer,
3353 cfg80211_exttdls_callback callback)
3354{
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +05303355 /* NOTE:
3356 * Hold mutex tdls_lock before calling this function
3357 */
Atul Mittal115287b2014-07-08 13:26:33 +05303358
3359 hdd_context_t *pHddCtx;
3360 hdd_adapter_t *pAdapter;
3361
3362 if (!curr_peer) return -1;
3363
3364 pAdapter = curr_peer->pHddTdlsCtx->pAdapter;
3365 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3366 if ((NULL == pHddCtx)) return -1;
3367
Atul Mittal115287b2014-07-08 13:26:33 +05303368 curr_peer->state_change_notification = callback;
3369
Atul Mittal115287b2014-07-08 13:26:33 +05303370 return 0;
Atul Mittal115287b2014-07-08 13:26:33 +05303371}
3372
3373void wlan_hdd_tdls_get_wifi_hal_state(hddTdlsPeer_t *curr_peer,
3374 tANI_S32 *state,
3375 tANI_S32 *reason)
3376{
3377 *reason = curr_peer->reason;
3378
3379 switch(curr_peer->link_status)
3380 {
3381 case eTDLS_LINK_IDLE:
Atul Mittal115287b2014-07-08 13:26:33 +05303382 case eTDLS_LINK_DISCOVERED:
3383 *state = WIFI_TDLS_ENABLED;
3384 break;
Atul Mittalad630e42014-10-07 19:19:14 +05303385 case eTDLS_LINK_DISCOVERING:
Atul Mittal115287b2014-07-08 13:26:33 +05303386 case eTDLS_LINK_CONNECTING:
3387 *state = WIFI_TDLS_TRYING;
3388 break;
3389 case eTDLS_LINK_CONNECTED:
Pradeep Reddy POTTETIf3148e82015-04-16 12:10:33 +05303390 if (TRUE == curr_peer->isOffChannelEstablished)
Pradeep Reddy POTTETI16d83332015-03-26 18:28:13 +05303391 {
3392 *state = WIFI_TDLS_ESTABLISHED_OFF_CHANNEL;
3393 }
3394 else
3395 {
3396 *state = WIFI_TDLS_ESTABLISHED;
3397 }
Atul Mittal115287b2014-07-08 13:26:33 +05303398 break;
3399 case eTDLS_LINK_TEARING:
3400 *state = WIFI_TDLS_DROPPED;
3401 break;
3402 }
3403
3404}
3405
3406int wlan_hdd_tdls_get_status(hdd_adapter_t *pAdapter,
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05303407#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
3408 const tANI_U8* mac,
3409#else
Atul Mittal115287b2014-07-08 13:26:33 +05303410 tANI_U8* mac,
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05303411#endif
Atul Mittal115287b2014-07-08 13:26:33 +05303412 tANI_S32 *state,
3413 tANI_S32 *reason)
3414{
3415
3416 hddTdlsPeer_t *curr_peer;
Atul Mittala75fced2014-10-06 13:59:07 +05303417 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05303418
3419 mutex_lock(&pHddCtx->tdls_lock);
3420 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Atul Mittal115287b2014-07-08 13:26:33 +05303421 if (curr_peer == NULL)
3422 {
Atul Mittala75fced2014-10-06 13:59:07 +05303423 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Atul Mittal115287b2014-07-08 13:26:33 +05303424 FL("curr_peer is NULL"));
Atul Mittal115287b2014-07-08 13:26:33 +05303425
Atul Mittala75fced2014-10-06 13:59:07 +05303426 *state = WIFI_TDLS_DISABLED;
3427 *reason = eTDLS_LINK_UNSPECIFIED;
3428 }
3429 else
3430 {
3431 if (pHddCtx->cfg_ini->fTDLSExternalControl &&
3432 (FALSE == curr_peer->isForcedPeer))
3433 {
3434 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3435 FL("curr_peer is not Forced"));
3436 *state = WIFI_TDLS_DISABLED;
3437 *reason = eTDLS_LINK_UNSPECIFIED;
3438 }
3439 else
3440 {
3441 wlan_hdd_tdls_get_wifi_hal_state(curr_peer, state, reason);
3442 }
3443 }
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05303444 mutex_unlock(&pHddCtx->tdls_lock);
Atul Mittal115287b2014-07-08 13:26:33 +05303445 return (0);
3446}
3447
Agarwal Ashishef54a182014-12-16 15:07:31 +05303448int hdd_set_tdls_scan_type(hdd_adapter_t *pAdapter,
3449 tANI_U8 *ptr)
3450{
3451 int tdls_scan_type;
Hema Aparna Medicharla26b98042015-01-21 15:02:01 +05303452 hdd_context_t *pHddCtx;
Agarwal Ashishef54a182014-12-16 15:07:31 +05303453 if (NULL == pAdapter)
3454 {
3455 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3456 "%s: pAdapter is NULL", __func__);
3457 return -EINVAL;
3458 }
Hema Aparna Medicharla26b98042015-01-21 15:02:01 +05303459 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Agarwal Ashishef54a182014-12-16 15:07:31 +05303460 tdls_scan_type = ptr[9] - '0';
3461
3462 if (tdls_scan_type <= 2)
3463 {
3464 pHddCtx->cfg_ini->fEnableTDLSScan = tdls_scan_type;
3465 return 0;
3466 }
3467 else
3468 {
3469 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3470 " Wrong value is given for tdls_scan_type "
3471 " Making fEnableTDLSScan as 0 ");
3472 pHddCtx->cfg_ini->fEnableTDLSScan = 0;
3473 return -EINVAL;
3474 }
3475}
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +05303476int wlan_hdd_validate_tdls_context(hdd_context_t *pHddCtx,
3477 tdlsCtx_t *pHddTdlsCtx)
3478{
3479 VOS_STATUS status;
3480 int found = 0;
3481 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
3482 hdd_adapter_t *pAdapter;
Agarwal Ashishef54a182014-12-16 15:07:31 +05303483
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +05303484 if (NULL == pHddTdlsCtx)
3485 {
3486 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3487 FL("TDLS context is NULL"));
3488 return -EINVAL;
3489 }
3490 status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
3491 while (NULL != pAdapterNode && VOS_STATUS_SUCCESS == status)
3492 {
3493 pAdapter = pAdapterNode->pAdapter;
3494 if (NULL != pAdapter)
3495 {
3496 if (pHddTdlsCtx == pAdapter->sessionCtx.station.pHddTdlsCtx &&
3497 (NULL != pHddTdlsCtx->pAdapter) &&
3498 (WLAN_HDD_ADAPTER_MAGIC == pHddTdlsCtx->pAdapter->magic))
3499 {
3500 found = 1;
3501 break;
3502 }
3503 }
3504 status = hdd_get_next_adapter (pHddCtx, pAdapterNode, &pNext);
3505 pAdapterNode = pNext;
3506 }
3507 if (found == 1)
3508 {
3509 return 0;
3510 }
3511 else
3512 {
3513 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3514 FL("TDLS context doesnot belongs to valid adapter"));
3515 return -EINVAL;
3516 }
3517}
Ganesh Kondabattinif3ba0972015-08-07 15:58:04 +05303518
3519
3520void wlan_hdd_tdls_update_rx_pkt_cnt_n_rssi(hdd_adapter_t *pAdapter,
3521 u8 *mac, v_S7_t rssiAvg)
3522{
3523 hddTdlsPeer_t *curr_peer;
3524 hdd_context_t *pHddCtx = NULL;
3525 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3526 mutex_lock(&pHddCtx->tdls_lock);
3527 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
3528 if ((NULL != curr_peer) &&
3529 (eTDLS_LINK_CONNECTED == curr_peer->link_status))
3530 {
3531 curr_peer->rx_pkt++;
3532 curr_peer->rssi = rssiAvg;
3533 }
3534 mutex_unlock(&pHddCtx->tdls_lock);
3535 VOS_TRACE( VOS_MODULE_ID_HDD_DATA, VOS_TRACE_LEVEL_INFO,
3536 "mac : " MAC_ADDRESS_STR "rssi is %d",
3537 MAC_ADDR_ARRAY(mac), rssiAvg);
3538}
Atul Mittal115287b2014-07-08 13:26:33 +05303539
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303540/**
3541 * wlan_hdd_tdls_reenable() - Re-Enable TDLS
3542 * @hddctx: pointer to hdd context
3543 *
3544 * Function re-enable's TDLS which might be disabled during concurrency
3545 *
3546 * Return: None
3547 */
3548void wlan_hdd_tdls_reenable(hdd_context_t *pHddCtx)
3549{
3550
3551 if ((TRUE != pHddCtx->cfg_ini->fEnableTDLSSupport) ||
3552 (TRUE != sme_IsFeatureSupportedByFW(TDLS))) {
3553 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3554 FL("tdls support not enabled"));
3555 return;
3556 }
3557
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303558 /* if tdls is not enabled then don't revert tdls mode */
3559 if ((eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode)) {
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303560 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303561 FL("TDLS disabled so no need to enable: Mode=%d"),
3562 pHddCtx->tdls_mode);
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303563 return;
3564 }
3565
3566 if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode_last ||
3567 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY ==
3568 pHddCtx->tdls_mode_last) {
3569 /* Enable TDLS support Once P2P session ends since
3570 * upond detection of concurrency TDLS might be disabled
3571 */
3572 hddLog(LOG1, FL("TDLS mode set to %d"), pHddCtx->tdls_mode_last);
3573 wlan_hdd_tdls_set_mode(pHddCtx, pHddCtx->tdls_mode_last,
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05303574 FALSE, HDD_SET_TDLS_MODE_SOURCE_P2P);
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303575 }
3576}
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +05303577
3578tdlsConnInfo_t *wlan_hdd_get_conn_info(hdd_context_t *pHddCtx,
3579 tANI_U8 idx)
3580{
3581 tANI_U8 staIdx;
3582
3583 /* check if there is available index for this new TDLS STA */
3584 for ( staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++ )
3585 {
3586 if (idx == pHddCtx->tdlsConnInfo[staIdx].staId )
3587 {
3588 hddLog(LOG1, FL("tdls peer with staIdx %u exists"), idx );
3589 return (&pHddCtx->tdlsConnInfo[staIdx]);
3590 }
3591 }
3592 hddLog(LOGE, FL("tdls peer with staIdx %u not exists"), idx );
3593 return NULL;
3594}
Masti, Narayanraddi44b0db02015-12-22 11:54:35 +05303595
3596void wlan_hdd_change_tdls_mode(void *data)
3597{
3598 hdd_context_t *hdd_ctx = (hdd_context_t *)data;
3599
3600 wlan_hdd_tdls_set_mode(hdd_ctx, eTDLS_SUPPORT_ENABLED, FALSE,
3601 HDD_SET_TDLS_MODE_SOURCE_OFFCHANNEL);
3602}
3603
3604void wlan_hdd_start_stop_tdls_source_timer(hdd_context_t *pHddCtx,
3605 eTDLSSupportMode tdls_mode)
3606{
3607 if (VOS_TIMER_STATE_RUNNING ==
3608 vos_timer_getCurrentState(&pHddCtx->tdls_source_timer))
3609 vos_timer_stop(&pHddCtx->tdls_source_timer);
3610
3611 if (tdls_mode == eTDLS_SUPPORT_DISABLED) {
3612 wlan_hdd_tdls_set_mode(pHddCtx, tdls_mode, FALSE,
3613 HDD_SET_TDLS_MODE_SOURCE_OFFCHANNEL);
3614 }
3615
3616 vos_timer_start(&pHddCtx->tdls_source_timer,
3617 pHddCtx->cfg_ini->tdls_enable_defer_time);
3618
3619 return;
3620}
3621
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303622/*EXT TDLS*/