blob: 13da124e4441b7f34c1d4b4e79802ce1311b85a8 [file] [log] [blame]
Kiran V1ccee932012-12-12 14:49:46 -08001/*
Ganesh Kondabattini17e60662017-05-25 12:36:07 +05302 * Copyright (c) 2012-2017 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
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530242 hddLog(LOG1, FL("indicate TDLS teardown (staId %d)"),
243 curr_peer->staId);
244
245 /* Indicate teardown to supplicant */
246 wlan_hdd_tdls_indicate_teardown(
247 curr_peer->pHddTdlsCtx->pAdapter,
248 curr_peer,
249 eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON);
Abhishek Singh96568922016-01-05 15:28:12 +0530250 hdd_send_wlan_tdls_teardown_event(eTDLS_TEARDOWN_CONCURRENCY,
251 curr_peer->peerMac);
Bala Venkatesh5c06a252018-07-12 16:08:04 +0530252 wlan_hdd_tdls_reset_peer(adapter, curr_peer->peerMac);
253
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,
Bala Venkatesh5c06a252018-07-12 16:08:04 +0530272 HDD_SET_TDLS_MODE_SOURCE_CONCURRENCY);
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
Deepthi Gowric504a222016-07-25 15:43:31 +05301391/*
1392 * NOTE:
1393 * The Callers of this function should ensure to release the
1394 * tdls_lock before calling this function to avoid deadlocks.
1395 */
1396
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001397int wlan_hdd_tdls_set_cap(hdd_adapter_t *pAdapter,
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301398#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1399 const u8* mac,
1400#else
Hoonki Lee27511902013-03-14 18:19:06 -07001401 u8* mac,
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301402#endif
Hoonki Lee27511902013-03-14 18:19:06 -07001403 tTDLSCapType cap)
1404{
1405 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301406 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee27511902013-03-14 18:19:06 -07001407
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301408 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1409 return -EINVAL;
1410
1411 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001412 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee27511902013-03-14 18:19:06 -07001413 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301414 {
1415 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1416 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301417 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001418 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301419 }
Hoonki Lee27511902013-03-14 18:19:06 -07001420
1421 curr_peer->tdls_support = cap;
1422
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301423 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001424 return 0;
Hoonki Lee27511902013-03-14 18:19:06 -07001425}
1426
Atul Mittal115287b2014-07-08 13:26:33 +05301427void wlan_hdd_tdls_set_peer_link_status(hddTdlsPeer_t *curr_peer,
1428 tTDLSLinkStatus status,
1429 tTDLSLinkReason reason)
Hoonki Lee387663d2013-02-05 18:08:43 -08001430{
Atul Mittal115287b2014-07-08 13:26:33 +05301431 /*EXT TDLS*/
1432 tANI_S32 state = 0;
1433 tANI_S32 res = 0;
1434 /*EXT TDLS*/
Hoonki Lee387663d2013-02-05 18:08:43 -08001435 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301436 {
1437 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1438 "%s: curr_peer is NULL", __func__);
Hoonki Lee387663d2013-02-05 18:08:43 -08001439 return;
c_hpothu7f63e882013-10-02 19:13:35 +05301440 }
Hoonki Lee387663d2013-02-05 18:08:43 -08001441
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001442 hddLog(VOS_TRACE_LEVEL_WARN, "tdls set peer " MAC_ADDRESS_STR " link status to %u",
Chilam Ng01120412013-02-19 18:32:21 -08001443 MAC_ADDR_ARRAY(curr_peer->peerMac), status);
Chilam NG571c65a2013-01-19 12:27:36 +05301444
1445 curr_peer->link_status = status;
1446
Atul Mittal115287b2014-07-08 13:26:33 +05301447 /*EXT TDLS*/
1448 if (curr_peer->isForcedPeer && curr_peer->state_change_notification)
1449 {
1450 /*save the reason for any further query*/
1451 curr_peer->reason = reason;
1452 wlan_hdd_tdls_get_wifi_hal_state(curr_peer, &state, &res);
1453
1454 (curr_peer->state_change_notification)(
1455 curr_peer->peerMac,
1456 state,
1457 res,
1458 curr_peer->pHddTdlsCtx->pAdapter);
1459
1460 }
1461 /*EXT TDLS*/
1462
Chilam NG571c65a2013-01-19 12:27:36 +05301463}
1464
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001465void wlan_hdd_tdls_set_link_status(hdd_adapter_t *pAdapter,
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05301466#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1467 const u8 *mac,
1468#else
1469 u8 *mac,
1470#endif
Atul Mittal115287b2014-07-08 13:26:33 +05301471 tTDLSLinkStatus linkStatus,
1472 tTDLSLinkReason reason)
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001473{
Atul Mittal115287b2014-07-08 13:26:33 +05301474
1475 /*EXT TDLS*/
1476 tANI_S32 state = 0;
1477 tANI_S32 res = 0;
1478 /*EXT TDLS*/
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001479 hddTdlsPeer_t *curr_peer;
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301480 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001481
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301482 if (pHddCtx == NULL)
1483 {
1484 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1485 FL("pHddCtx is NULL"));
1486 return;
1487 }
1488
1489 mutex_lock(&pHddCtx->tdls_lock);
1490 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001491 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301492 {
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301493 mutex_unlock(&pHddCtx->tdls_lock);
c_hpothu7f63e882013-10-02 19:13:35 +05301494 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1495 "%s: curr_peer is NULL", __func__);
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001496 return;
c_hpothu7f63e882013-10-02 19:13:35 +05301497 }
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001498
Masti, Narayanraddi83dbfc22016-01-07 16:26:06 +05301499 hddLog(VOS_TRACE_LEVEL_INFO,
1500 "tdls set peer " MAC_ADDRESS_STR " link status to %u",
1501 MAC_ADDR_ARRAY(curr_peer->peerMac), linkStatus);
1502
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001503 curr_peer->link_status= linkStatus;
1504
Atul Mittal115287b2014-07-08 13:26:33 +05301505 /*EXT TDLS*/
1506
1507 if (curr_peer->isForcedPeer && curr_peer->state_change_notification)
1508 {
1509 /*save the reason for any further query*/
1510 curr_peer->reason = reason;
1511 wlan_hdd_tdls_get_wifi_hal_state(curr_peer, &state, &res);
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301512 mutex_unlock(&pHddCtx->tdls_lock);
Atul Mittal115287b2014-07-08 13:26:33 +05301513 (*curr_peer->state_change_notification)(mac,
1514 state,
1515 res,
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301516 pAdapter);
Atul Mittal115287b2014-07-08 13:26:33 +05301517 }
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301518 else
1519 mutex_unlock(&pHddCtx->tdls_lock);
1520
Atul Mittal115287b2014-07-08 13:26:33 +05301521 /*EXT TDLS*/
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001522 return;
1523}
1524
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001525int wlan_hdd_tdls_recv_discovery_resp(hdd_adapter_t *pAdapter, u8 *mac)
Chilam NG571c65a2013-01-19 12:27:36 +05301526{
1527 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301528 tdlsCtx_t *pHddTdlsCtx = NULL;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301529 hdd_context_t *pHddCtx;
1530
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05301531 ENTER();
1532
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301533 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1534 if (0 != wlan_hdd_validate_context(pHddCtx))
1535 return -1;
1536
1537 mutex_lock(&pHddCtx->tdls_lock);
1538
1539 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301540 if ( NULL == pHddTdlsCtx )
c_hpothu7f63e882013-10-02 19:13:35 +05301541 {
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301542 mutex_unlock(&pHddCtx->tdls_lock);
1543 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1544 FL("pHddTdlsCtx is NULL device mode = %d"),
1545 pAdapter->device_mode);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301546 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301547 }
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301548
1549 pHddCtx = WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter);
1550
c_hpothu7f63e882013-10-02 19:13:35 +05301551 if(0 != (wlan_hdd_validate_context(pHddCtx)))
1552 {
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301553 mutex_unlock(&pHddCtx->tdls_lock);
c_hpothu7f63e882013-10-02 19:13:35 +05301554 return 0;
1555 }
Chilam NG571c65a2013-01-19 12:27:36 +05301556
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001557 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001558
1559 if (NULL == curr_peer)
c_hpothu7f63e882013-10-02 19:13:35 +05301560 {
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301561 mutex_unlock(&pHddCtx->tdls_lock);
c_hpothu7f63e882013-10-02 19:13:35 +05301562 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1563 FL("curr_peer is NULL"));
Hoonki Lee387663d2013-02-05 18:08:43 -08001564 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301565 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001566
1567 if (pHddTdlsCtx->discovery_sent_cnt)
1568 pHddTdlsCtx->discovery_sent_cnt--;
1569
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301570
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001571 wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301572
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001573 if (0 == pHddTdlsCtx->discovery_sent_cnt)
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001574 {
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001575 vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001576 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001577
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05301578 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001579 "Discovery(%u) Response from " MAC_ADDRESS_STR " link_status %d",
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001580 pHddTdlsCtx->discovery_sent_cnt, MAC_ADDR_ARRAY(curr_peer->peerMac),
1581 curr_peer->link_status);
1582
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301583 curr_peer->tdls_support = eTDLS_CAP_SUPPORTED;
1584
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001585 if (eTDLS_LINK_DISCOVERING == curr_peer->link_status)
Gopichand Nakkala901e8922013-03-04 23:45:58 -08001586 {
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001587 /* Since we are here, it means Throughput threshold is alredy met. Make sure RSSI
1588 threshold is also met before setting up TDLS link*/
1589 if ((tANI_S32) curr_peer->rssi > (tANI_S32) pHddTdlsCtx->threshold_config.rssi_trigger_threshold)
1590 {
Atul Mittal115287b2014-07-08 13:26:33 +05301591 wlan_hdd_tdls_set_peer_link_status(curr_peer,
1592 eTDLS_LINK_DISCOVERED,
1593 eTDLS_LINK_SUCCESS);
Ganesh Kondabattinid01c4ee2016-01-04 16:13:06 +05301594
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05301595 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001596 "Rssi Threshold met: "MAC_ADDRESS_STR" rssi = %d threshold= %d" ,
1597 MAC_ADDR_ARRAY(curr_peer->peerMac), curr_peer->rssi,
1598 pHddTdlsCtx->threshold_config.rssi_trigger_threshold);
Ganesh Kondabattinid01c4ee2016-01-04 16:13:06 +05301599
1600 if (pHddCtx->tdls_mode != eTDLS_SUPPORT_DISABLED)
1601 {
1602 /* TDLS can be disabled from multiple sources like
1603 * scan, p2p-listen, p2p, btc etc ...
1604 * Dont initiate tdls setup if tdls is disabled
1605 */
1606 cfg80211_tdls_oper_request(pAdapter->dev, curr_peer->peerMac,
1607 NL80211_TDLS_SETUP, FALSE,
1608 GFP_KERNEL);
1609 }
1610 else
1611 {
1612 curr_peer->tdls_support = eTDLS_CAP_UNKNOWN;
1613 wlan_hdd_tdls_set_peer_link_status(
1614 curr_peer,
1615 eTDLS_LINK_IDLE,
1616 eTDLS_LINK_UNSPECIFIED);
1617
1618 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1619 "%s: TDLS is disabled. Resetting link_status of peer "
1620 MAC_ADDRESS_STR " to %d, tdls_support %d", __func__,
1621 MAC_ADDR_ARRAY(curr_peer->peerMac),
1622 curr_peer->link_status, curr_peer->tdls_support);
1623 }
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001624 }
1625 else
1626 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05301627 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001628 "Rssi Threshold not met: "MAC_ADDRESS_STR" rssi = %d threshold = %d ",
1629 MAC_ADDR_ARRAY(curr_peer->peerMac), curr_peer->rssi,
1630 pHddTdlsCtx->threshold_config.rssi_trigger_threshold);
Sunil Duttb0d39242014-09-10 23:54:51 +05301631
1632 /* if RSSI threshold is not met then allow further discovery
1633 * attempts by decrementing count for the last attempt
1634 */
1635 if (curr_peer->discovery_attempt)
1636 curr_peer->discovery_attempt--;
1637
Atul Mittal115287b2014-07-08 13:26:33 +05301638 wlan_hdd_tdls_set_peer_link_status(curr_peer,
1639 eTDLS_LINK_IDLE,
1640 eTDLS_LINK_UNSPECIFIED);
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001641 }
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301642 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala901e8922013-03-04 23:45:58 -08001643 }
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001644 else
1645 {
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301646 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001647 wlan_hdd_tdls_check_bmps(pAdapter);
1648 }
Chilam NG571c65a2013-01-19 12:27:36 +05301649
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05301650 EXIT();
Hoonki Lee387663d2013-02-05 18:08:43 -08001651 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +05301652}
1653
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301654int wlan_hdd_tdls_set_peer_caps(hdd_adapter_t *pAdapter,
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05301655#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1656 const u8 *mac,
1657#else
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301658 u8 *mac,
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05301659#endif
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301660 tCsrStaParams *StaParams,
1661 tANI_BOOLEAN isBufSta,
Masti, Narayanraddic754cdc2015-12-24 18:22:36 +05301662 tANI_BOOLEAN isOffChannelSupported,
1663 tANI_BOOLEAN isQosWmmSta)
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301664{
1665 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301666 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301667
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301668 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1669 return -EINVAL;
1670
1671 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301672 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
1673 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301674 {
1675 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1676 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301677 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301678 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301679 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301680
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301681 curr_peer->uapsdQueues = StaParams->uapsd_queues;
1682 curr_peer->maxSp = StaParams->max_sp;
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301683 curr_peer->isBufSta = isBufSta;
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301684 curr_peer->isOffChannelSupported = isOffChannelSupported;
1685
1686 vos_mem_copy(curr_peer->supported_channels,
1687 StaParams->supported_channels,
1688 StaParams->supported_channels_len);
1689
1690 curr_peer->supported_channels_len =
1691 StaParams->supported_channels_len;
1692
1693 vos_mem_copy(curr_peer->supported_oper_classes,
1694 StaParams->supported_oper_classes,
1695 StaParams->supported_oper_classes_len);
1696
1697 curr_peer->supported_oper_classes_len =
1698 StaParams->supported_oper_classes_len;
Masti, Narayanraddic754cdc2015-12-24 18:22:36 +05301699 curr_peer->qos = isQosWmmSta;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301700
1701 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301702 return 0;
1703}
1704
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301705int wlan_hdd_tdls_get_link_establish_params(hdd_adapter_t *pAdapter,
1706#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1707 const u8 *mac,
1708#else
1709 u8 *mac,
1710#endif
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301711 tCsrTdlsLinkEstablishParams* tdlsLinkEstablishParams)
1712{
1713 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301714 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301715
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301716 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1717 return -EINVAL;
1718
1719 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301720 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
1721 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301722 {
1723 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1724 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301725 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301726 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301727 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301728
1729 tdlsLinkEstablishParams->isResponder = curr_peer->is_responder;
1730 tdlsLinkEstablishParams->uapsdQueues = curr_peer->uapsdQueues;
1731 tdlsLinkEstablishParams->maxSp = curr_peer->maxSp;
1732 tdlsLinkEstablishParams->isBufSta = curr_peer->isBufSta;
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301733 tdlsLinkEstablishParams->isOffChannelSupported =
1734 curr_peer->isOffChannelSupported;
1735
1736 vos_mem_copy(tdlsLinkEstablishParams->supportedChannels,
1737 curr_peer->supported_channels,
1738 curr_peer->supported_channels_len);
1739
1740 tdlsLinkEstablishParams->supportedChannelsLen =
1741 curr_peer->supported_channels_len;
1742
1743 vos_mem_copy(tdlsLinkEstablishParams->supportedOperClasses,
1744 curr_peer->supported_oper_classes,
1745 curr_peer->supported_oper_classes_len);
1746
1747 tdlsLinkEstablishParams->supportedOperClassesLen =
1748 curr_peer->supported_oper_classes_len;
Agarwal Ashish16020c42014-12-29 22:01:11 +05301749 tdlsLinkEstablishParams->qos = curr_peer->qos;
1750
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301751 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301752 return 0;
1753}
1754
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301755int wlan_hdd_tdls_set_rssi(hdd_adapter_t *pAdapter,
1756#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1757 const u8 *mac,
1758#else
1759 u8 *mac,
1760#endif
1761 tANI_S8 rxRssi)
Chilam NG571c65a2013-01-19 12:27:36 +05301762{
1763 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05301764 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
Chilam NG571c65a2013-01-19 12:27:36 +05301765
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05301766 if (0 != (wlan_hdd_validate_context(hdd_ctx))) {
1767 return -1;
1768 }
1769
1770 mutex_lock(&hdd_ctx->tdls_lock);
1771 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Hoonki Lee387663d2013-02-05 18:08:43 -08001772 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301773 {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05301774 mutex_unlock(&hdd_ctx->tdls_lock);
1775 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1776 FL("curr_peer is NULL"));
Hoonki Lee387663d2013-02-05 18:08:43 -08001777 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301778 }
Chilam NG571c65a2013-01-19 12:27:36 +05301779
1780 curr_peer->rssi = rxRssi;
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05301781 mutex_unlock(&hdd_ctx->tdls_lock);
Chilam NG571c65a2013-01-19 12:27:36 +05301782
Hoonki Lee387663d2013-02-05 18:08:43 -08001783 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +05301784}
1785
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301786int wlan_hdd_tdls_set_responder(hdd_adapter_t *pAdapter,
1787#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1788 const u8 *mac,
1789#else
1790 u8 *mac,
1791#endif
1792 tANI_U8 responder)
Hoonki Leea34dd892013-02-05 22:56:02 -08001793{
1794 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301795 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Leea34dd892013-02-05 22:56:02 -08001796
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301797 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1798 return -EINVAL;
1799
1800 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001801 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001802 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301803 {
1804 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1805 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301806 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leea34dd892013-02-05 22:56:02 -08001807 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301808 }
Hoonki Leea34dd892013-02-05 22:56:02 -08001809
1810 curr_peer->is_responder = responder;
1811
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301812 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leea34dd892013-02-05 22:56:02 -08001813 return 0;
1814}
1815
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301816int wlan_hdd_tdls_set_signature(hdd_adapter_t *pAdapter,
1817#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1818 const u8 *mac,
1819#else
1820 u8 *mac,
1821#endif
1822 tANI_U8 uSignature)
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001823{
1824 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301825 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001826
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301827 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1828 return -EINVAL;
1829
1830 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001831 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001832 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301833 {
1834 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1835 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301836 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001837 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301838 }
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001839
1840 curr_peer->signature = uSignature;
1841
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301842 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001843 return 0;
1844}
1845
Hoonki Leea34dd892013-02-05 22:56:02 -08001846
Hoonki Lee387663d2013-02-05 18:08:43 -08001847void wlan_hdd_tdls_extract_da(struct sk_buff *skb, u8 *mac)
Chilam NG571c65a2013-01-19 12:27:36 +05301848{
Chilam NG571c65a2013-01-19 12:27:36 +05301849 memcpy(mac, skb->data, 6);
Chilam NG571c65a2013-01-19 12:27:36 +05301850}
1851
Hoonki Lee387663d2013-02-05 18:08:43 -08001852void wlan_hdd_tdls_extract_sa(struct sk_buff *skb, u8 *mac)
Chilam Ng1279e232013-01-25 15:06:52 -08001853{
Chilam Ng1279e232013-01-25 15:06:52 -08001854 memcpy(mac, skb->data+6, 6);
Chilam Ng1279e232013-01-25 15:06:52 -08001855}
1856
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301857/**
1858 * wlan_hdd_tdls_is_forced_peer - function to check if peer is forced peer
1859 * @adapter: pointer to hdd apater
1860 * @mac: peer mac address
1861 *
1862 * Function identified is the peer is forced for tdls connection
1863 *
1864 * return: true: peer is forced false: peer is not forced
1865 */
1866static bool wlan_hdd_tdls_is_forced_peer(hdd_adapter_t *adapter,
1867 const u8 *mac)
1868{
1869 hddTdlsPeer_t *peer;
1870 hdd_context_t *hddctx = WLAN_HDD_GET_CTX(adapter);
1871 bool is_forced_peer;
1872
1873 mutex_lock(&hddctx->tdls_lock);
1874 peer = wlan_hdd_tdls_find_peer(adapter, mac, FALSE);
1875 if (!peer)
1876 {
1877 is_forced_peer = false;
1878 goto ret;
1879 }
1880
1881 if (!peer->isForcedPeer)
1882 {
1883 is_forced_peer = false;
1884 goto ret;
1885 }
1886 is_forced_peer = true;
1887
1888ret:
1889 mutex_unlock(&hddctx->tdls_lock);
1890 return is_forced_peer;
1891}
1892
1893/**
1894 * wlan_hdd_tdls_increment_pkt_count - function to increment tdls tx packet cnt
1895 * @pAdapter: pointer to hdd adapter
1896 * @skb: pointer to sk_buff
1897 *
1898 * Function to increment packet count if packet is destined to tdls peer
1899 *
1900 * return: None
1901 */
1902static void wlan_hdd_tdls_increment_pkt_count(hdd_adapter_t *pAdapter,
1903 struct sk_buff *skb)
Chilam NG571c65a2013-01-19 12:27:36 +05301904{
Hoonki Lee387663d2013-02-05 18:08:43 -08001905 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001906 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301907 hdd_station_ctx_t *hdd_sta_ctx;
1908 u8 mac[6];
Chilam NG571c65a2013-01-19 12:27:36 +05301909
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301910 if (0 != (wlan_hdd_validate_context(pHddCtx)))
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301911 return;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301912
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001913 if (eTDLS_SUPPORT_ENABLED != pHddCtx->tdls_mode)
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301914 goto error;
1915
1916 if (!pHddCtx->cfg_ini->fEnableTDLSImplicitTrigger)
1917 goto error;
1918
1919 wlan_hdd_tdls_extract_da(skb, mac);
1920
1921 if (pHddCtx->cfg_ini->fTDLSExternalControl)
1922 {
1923 if (!wlan_hdd_tdls_is_forced_peer(pAdapter, mac))
1924 goto error;
1925 }
1926
1927 hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
1928
1929 if (vos_is_macaddr_group((v_MACADDR_t *)mac))
1930 {
1931 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_MED,
1932 "broadcast packet, not adding to peer list");
1933 goto error;
1934 }
1935
1936 if (memcmp(hdd_sta_ctx->conn_info.bssId, mac, 6) == 0) {
1937 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_MED,
1938 "packet da is bssid, not adding to peer list");
1939 goto error;
1940 }
Hoonki Leebfee0342013-01-21 16:43:45 -08001941
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301942 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001943 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08001944 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301945 {
c_hpothue21931b2014-09-08 14:02:14 +05301946 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1947 FL("curr_peer is NULL"));
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301948 mutex_unlock(&pHddCtx->tdls_lock);
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301949 goto error;
c_hpothu7f63e882013-10-02 19:13:35 +05301950 }
Chilam NG571c65a2013-01-19 12:27:36 +05301951
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301952 curr_peer->tx_pkt++;
Chilam NG571c65a2013-01-19 12:27:36 +05301953
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301954 mutex_unlock(&pHddCtx->tdls_lock);
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301955
1956error:
1957 return;
1958}
1959
1960void wlan_hdd_tdls_notify_packet(hdd_adapter_t *adapter, struct sk_buff *skb)
1961{
1962 wlan_hdd_tdls_increment_pkt_count(adapter, skb);
Chilam NG571c65a2013-01-19 12:27:36 +05301963}
1964
Hoonki Lee27511902013-03-14 18:19:06 -07001965static int wlan_hdd_tdls_check_config(tdls_config_params_t *config)
1966{
1967 if (config->tdls > 2)
1968 {
1969 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 1st argument %d. <0...2>", __func__, config->tdls);
1970 return -1;
1971 }
1972 if (config->tx_period_t < CFG_TDLS_TX_STATS_PERIOD_MIN ||
1973 config->tx_period_t > CFG_TDLS_TX_STATS_PERIOD_MAX)
1974 {
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001975 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 2nd argument %d. <%d...%ld>", __func__, config->tx_period_t,
Hoonki Lee27511902013-03-14 18:19:06 -07001976 CFG_TDLS_TX_STATS_PERIOD_MIN, CFG_TDLS_TX_STATS_PERIOD_MAX);
1977 return -1;
1978 }
1979 if (config->tx_packet_n < CFG_TDLS_TX_PACKET_THRESHOLD_MIN ||
1980 config->tx_packet_n > CFG_TDLS_TX_PACKET_THRESHOLD_MAX)
1981 {
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001982 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 3rd argument %d. <%d...%ld>", __func__, config->tx_packet_n,
Hoonki Lee27511902013-03-14 18:19:06 -07001983 CFG_TDLS_TX_PACKET_THRESHOLD_MIN, CFG_TDLS_TX_PACKET_THRESHOLD_MAX);
1984 return -1;
1985 }
1986 if (config->discovery_period_t < CFG_TDLS_DISCOVERY_PERIOD_MIN ||
1987 config->discovery_period_t > CFG_TDLS_DISCOVERY_PERIOD_MAX)
1988 {
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001989 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 4th argument %d. <%d...%ld>", __func__, config->discovery_period_t,
Hoonki Lee27511902013-03-14 18:19:06 -07001990 CFG_TDLS_DISCOVERY_PERIOD_MIN, CFG_TDLS_DISCOVERY_PERIOD_MAX);
1991 return -1;
1992 }
1993 if (config->discovery_tries_n < CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MIN ||
1994 config->discovery_tries_n > CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MAX)
1995 {
1996 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 5th argument %d. <%d...%d>", __func__, config->discovery_tries_n,
1997 CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MIN, CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MAX);
1998 return -1;
1999 }
2000 if (config->idle_timeout_t < CFG_TDLS_IDLE_TIMEOUT_MIN ||
2001 config->idle_timeout_t > CFG_TDLS_IDLE_TIMEOUT_MAX)
2002 {
2003 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 6th argument %d. <%d...%d>", __func__, config->idle_timeout_t,
2004 CFG_TDLS_IDLE_TIMEOUT_MIN, CFG_TDLS_IDLE_TIMEOUT_MAX);
2005 return -1;
2006 }
2007 if (config->idle_packet_n < CFG_TDLS_IDLE_PACKET_THRESHOLD_MIN ||
2008 config->idle_packet_n > CFG_TDLS_IDLE_PACKET_THRESHOLD_MAX)
2009 {
2010 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 7th argument %d. <%d...%d>", __func__, config->idle_packet_n,
2011 CFG_TDLS_IDLE_PACKET_THRESHOLD_MIN, CFG_TDLS_IDLE_PACKET_THRESHOLD_MAX);
2012 return -1;
2013 }
2014 if (config->rssi_hysteresis < CFG_TDLS_RSSI_HYSTERESIS_MIN ||
2015 config->rssi_hysteresis > CFG_TDLS_RSSI_HYSTERESIS_MAX)
2016 {
2017 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 8th argument %d. <%d...%d>", __func__, config->rssi_hysteresis,
2018 CFG_TDLS_RSSI_HYSTERESIS_MIN, CFG_TDLS_RSSI_HYSTERESIS_MAX);
2019 return -1;
2020 }
2021 if (config->rssi_trigger_threshold < CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MIN ||
2022 config->rssi_trigger_threshold > CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MAX)
2023 {
2024 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 9th argument %d. <%d...%d>", __func__, config->rssi_trigger_threshold,
2025 CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MIN, CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MAX);
2026 return -1;
2027 }
2028 if (config->rssi_teardown_threshold < CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MIN ||
2029 config->rssi_teardown_threshold > CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MAX)
2030 {
2031 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 10th argument %d. <%d...%d>", __func__, config->rssi_teardown_threshold,
2032 CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MIN, CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MAX);
2033 return -1;
2034 }
2035 return 0;
2036}
2037
Chilam Ng01120412013-02-19 18:32:21 -08002038int wlan_hdd_tdls_set_params(struct net_device *dev, tdls_config_params_t *config)
Chilam NG571c65a2013-01-19 12:27:36 +05302039{
Chilam Ng01120412013-02-19 18:32:21 -08002040 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
2041 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002042 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Hoonki Lee27511902013-03-14 18:19:06 -07002043 eTDLSSupportMode req_tdls_mode;
Hoonki Leebfee0342013-01-21 16:43:45 -08002044
Masti, Narayanraddi4fbdf762016-02-25 17:24:39 +05302045 if ((TRUE != pHddCtx->cfg_ini->fEnableTDLSSupport) &&
2046 (TRUE != sme_IsFeatureSupportedByFW(TDLS)))
2047 {
2048 hddLog(LOGE,
2049 FL("TDLS not enabled (%d) or FW doesn't support (%d)"),
2050 pHddCtx->cfg_ini->fEnableTDLSSupport,
2051 sme_IsFeatureSupportedByFW(TDLS));
2052 pHddCtx->tdls_mode = eTDLS_SUPPORT_NOT_ENABLED;
2053 return -EINVAL;
2054 }
2055
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302056 mutex_lock(&pHddCtx->tdls_lock);
Hoonki Lee27511902013-03-14 18:19:06 -07002057 if (NULL == pHddTdlsCtx)
2058 {
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302059 mutex_unlock(&pHddCtx->tdls_lock);
c_hpothu7f63e882013-10-02 19:13:35 +05302060 hddLog(VOS_TRACE_LEVEL_ERROR, FL("TDLS not enabled!"));
Hoonki Lee27511902013-03-14 18:19:06 -07002061 return -1;
Chilam Ng01120412013-02-19 18:32:21 -08002062 }
Chilam NG571c65a2013-01-19 12:27:36 +05302063
Hoonki Lee27511902013-03-14 18:19:06 -07002064 if (wlan_hdd_tdls_check_config(config) != 0)
2065 {
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302066 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee27511902013-03-14 18:19:06 -07002067 return -1;
2068 }
2069
2070 /* config->tdls is mapped to 0->1, 1->2, 2->3 */
2071 req_tdls_mode = config->tdls + 1;
2072 if (pHddCtx->tdls_mode == req_tdls_mode)
2073 {
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302074 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee27511902013-03-14 18:19:06 -07002075 hddLog(VOS_TRACE_LEVEL_ERROR, "%s already in mode %d", __func__, config->tdls);
2076 return -1;
2077 }
2078
2079 /* copy the configuration only when given tdls mode is implicit trigger enable */
2080 if (eTDLS_SUPPORT_ENABLED == req_tdls_mode)
2081 {
Chilam Ng01120412013-02-19 18:32:21 -08002082 memcpy(&pHddTdlsCtx->threshold_config, config, sizeof(tdls_config_params_t));
2083 }
Chilam NG571c65a2013-01-19 12:27:36 +05302084
Chilam Ng01120412013-02-19 18:32:21 -08002085 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2086 "iw set tdls params: %d %d %d %d %d %d %d %d %d %d",
2087 config->tdls,
2088 config->tx_period_t,
2089 config->tx_packet_n,
2090 config->discovery_period_t,
2091 config->discovery_tries_n,
2092 config->idle_timeout_t,
2093 config->idle_packet_n,
2094 config->rssi_hysteresis,
2095 config->rssi_trigger_threshold,
2096 config->rssi_teardown_threshold);
Chilam NG571c65a2013-01-19 12:27:36 +05302097
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302098 mutex_unlock(&pHddCtx->tdls_lock);
2099
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302100 wlan_hdd_tdls_set_mode(pHddCtx, req_tdls_mode, TRUE,
2101 HDD_SET_TDLS_MODE_SOURCE_USER);
Chilam Ng01120412013-02-19 18:32:21 -08002102
Chilam NG571c65a2013-01-19 12:27:36 +05302103 return 0;
2104}
2105
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05302106int wlan_hdd_tdls_set_sta_id(hdd_adapter_t *pAdapter,
2107#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2108 const u8 *mac,
2109#else
2110 u8 *mac,
2111#endif
2112 u8 staId)
Kiran V1ccee932012-12-12 14:49:46 -08002113{
Hoonki Lee387663d2013-02-05 18:08:43 -08002114 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302115 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Kiran V1ccee932012-12-12 14:49:46 -08002116
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302117 if (0 != (wlan_hdd_validate_context(pHddCtx)))
2118 return -EINVAL;
2119
2120 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002121 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08002122 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05302123 {
2124 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2125 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302126 mutex_unlock(&pHddCtx->tdls_lock);
Chilam NG571c65a2013-01-19 12:27:36 +05302127 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05302128 }
Chilam NG571c65a2013-01-19 12:27:36 +05302129
Hoonki Lee387663d2013-02-05 18:08:43 -08002130 curr_peer->staId = staId;
Chilam NG571c65a2013-01-19 12:27:36 +05302131
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302132 mutex_unlock(&pHddCtx->tdls_lock);
Chilam NG571c65a2013-01-19 12:27:36 +05302133 return 0;
Kiran V1ccee932012-12-12 14:49:46 -08002134}
2135
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05302136int wlan_hdd_tdls_set_force_peer(hdd_adapter_t *pAdapter,
2137#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2138 const u8 *mac,
2139#else
2140 u8 *mac,
2141#endif
Naresh Jayaram937abdf2013-11-26 19:50:25 +05302142 tANI_BOOLEAN forcePeer)
Sunil Dutt41de4e22013-11-14 18:09:02 +05302143{
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +05302144 /* NOTE:
2145 * Hold mutex tdls_lock before calling this function
2146 */
Naresh Jayaram937abdf2013-11-26 19:50:25 +05302147 hddTdlsPeer_t *curr_peer;
Sunil Dutt41de4e22013-11-14 18:09:02 +05302148 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2149
2150 if ((NULL == pHddCtx)) return -1;
2151
Naresh Jayaram937abdf2013-11-26 19:50:25 +05302152 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
2153 if (curr_peer == NULL)
Sunil Dutt41de4e22013-11-14 18:09:02 +05302154 goto error;
Naresh Jayaram937abdf2013-11-26 19:50:25 +05302155 curr_peer->isForcedPeer = forcePeer;
Naresh Jayaramca7bc3a2014-02-04 23:03:04 +05302156
Naresh Jayaramca7bc3a2014-02-04 23:03:04 +05302157 return 0;
Sunil Dutt41de4e22013-11-14 18:09:02 +05302158error:
Sunil Dutt41de4e22013-11-14 18:09:02 +05302159 return -1;
2160}
2161
Hoonki Lee387663d2013-02-05 18:08:43 -08002162/* if peerMac is found, then it returns pointer to hddTdlsPeer_t
2163 otherwise, it returns NULL
2164*/
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05302165hddTdlsPeer_t *wlan_hdd_tdls_find_peer(hdd_adapter_t *pAdapter,
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05302166 const u8 *mac,
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302167 tANI_BOOLEAN mutexLock)
Kiran V1ccee932012-12-12 14:49:46 -08002168{
Hoonki Lee387663d2013-02-05 18:08:43 -08002169 u8 key;
2170 struct list_head *pos;
2171 struct list_head *head;
2172 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002173 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302174 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee387663d2013-02-05 18:08:43 -08002175
c_hpothu7f63e882013-10-02 19:13:35 +05302176 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2177 {
c_hpothu7f63e882013-10-02 19:13:35 +05302178 return 0;
2179 }
Hoonki Lee387663d2013-02-05 18:08:43 -08002180
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302181 if ( mutexLock )
Hoonki Lee387663d2013-02-05 18:08:43 -08002182 {
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302183 mutex_lock(&pHddCtx->tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -08002184 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002185 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002186 if (NULL == pHddTdlsCtx)
2187 {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302188 if ( mutexLock )
2189 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002190 return NULL;
2191 }
2192
2193 key = wlan_hdd_tdls_hash_key(mac);
2194
2195 head = &pHddTdlsCtx->peer_list[key];
Hoonki Lee387663d2013-02-05 18:08:43 -08002196
2197 list_for_each(pos, head) {
2198 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
2199 if (!memcmp(mac, curr_peer->peerMac, 6)) {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302200 if ( mutexLock )
2201 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -08002202 return curr_peer;
2203 }
2204 }
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302205 if ( mutexLock )
2206 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302207
Hoonki Lee387663d2013-02-05 18:08:43 -08002208 return NULL;
2209}
2210
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05302211hddTdlsPeer_t *wlan_hdd_tdls_find_all_peer(hdd_context_t *pHddCtx,
2212#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2213 const u8 *mac
2214#else
2215 u8 *mac
2216#endif
2217)
Hoonki Leea6d49be2013-04-05 09:43:25 -07002218{
2219 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2220 hdd_adapter_t *pAdapter = NULL;
2221 tdlsCtx_t *pHddTdlsCtx = NULL;
2222 hddTdlsPeer_t *curr_peer= NULL;
2223 VOS_STATUS status = 0;
2224
2225 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2226 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2227 {
2228 pAdapter = pAdapterNode->pAdapter;
2229
2230 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2231 if (NULL != pHddTdlsCtx)
2232 {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302233 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Hoonki Leea6d49be2013-04-05 09:43:25 -07002234 if (curr_peer)
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302235 {
Hoonki Leea6d49be2013-04-05 09:43:25 -07002236 return curr_peer;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302237 }
Hoonki Leea6d49be2013-04-05 09:43:25 -07002238 }
2239 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2240 pAdapterNode = pNext;
2241 }
2242 return curr_peer;
2243}
2244
2245
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05302246int wlan_hdd_tdls_reset_peer(hdd_adapter_t *pAdapter,
2247#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2248 const u8 *mac
2249#else
2250 u8 *mac
2251#endif
2252)
Hoonki Lee387663d2013-02-05 18:08:43 -08002253{
Chilam Ng01120412013-02-19 18:32:21 -08002254 hdd_context_t *pHddCtx;
Chilam NG571c65a2013-01-19 12:27:36 +05302255 hddTdlsPeer_t *curr_peer;
Kiran V1ccee932012-12-12 14:49:46 -08002256
Chilam Ng01120412013-02-19 18:32:21 -08002257 pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
2258
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302259 if (0 != (wlan_hdd_validate_context(pHddCtx)))
2260 return -EINVAL;
2261
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002262 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08002263 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05302264 {
2265 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2266 "%s: curr_peer is NULL", __func__);
Hoonki Lee387663d2013-02-05 18:08:43 -08002267 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05302268 }
Chilam NG571c65a2013-01-19 12:27:36 +05302269
Atul Mittal115287b2014-07-08 13:26:33 +05302270 wlan_hdd_tdls_set_peer_link_status(curr_peer,
2271 eTDLS_LINK_IDLE,
2272 eTDLS_LINK_UNSPECIFIED);
Hoonki Leecdd8e962013-01-20 00:45:46 -08002273 curr_peer->staId = 0;
Hoonki Lee387663d2013-02-05 18:08:43 -08002274
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302275 /* Throughput Monitor shall disable the split scan when
2276 * TDLS scan coexistance is disabled.At this point of time
2277 * since TDLS scan coexistance is not meeting the criteria
2278 * to be operational, explicitly make it false to enable
2279 * throughput monitor takes the control of split scan.
2280 */
2281 if (pHddCtx->isTdlsScanCoexistence == TRUE)
2282 {
2283 pHddCtx->isTdlsScanCoexistence = FALSE;
2284 }
2285
Masti, Narayanraddie8e14622015-10-17 16:10:54 +05302286 if((eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode) &&
2287 (vos_timer_is_initialized(&curr_peer->peerIdleTimer)) &&
2288 (VOS_TIMER_STATE_RUNNING ==
2289 vos_timer_getCurrentState(&curr_peer->peerIdleTimer)))
2290 {
Chilam Nga75d8b62013-01-29 01:35:59 -08002291 vos_timer_stop( &curr_peer->peerIdleTimer );
Chilam Nga75d8b62013-01-29 01:35:59 -08002292 }
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302293
Hoonki Lee387663d2013-02-05 18:08:43 -08002294 return 0;
Hoonki Leecdd8e962013-01-20 00:45:46 -08002295}
2296
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07002297/* Caller has to take the lock before calling this function */
Hoonki Lee27511902013-03-14 18:19:06 -07002298static void wlan_tdd_tdls_reset_tx_rx(tdlsCtx_t *pHddTdlsCtx)
2299{
2300 int i;
2301 struct list_head *head;
2302 hddTdlsPeer_t *tmp;
2303 struct list_head *pos, *q;
2304
Hoonki Lee27511902013-03-14 18:19:06 -07002305 for (i = 0; i < 256; i++) {
2306 head = &pHddTdlsCtx->peer_list[i];
2307 list_for_each_safe (pos, q, head) {
2308 tmp = list_entry(pos, hddTdlsPeer_t, node);
2309 tmp->tx_pkt = 0;
2310 tmp->rx_pkt = 0;
2311 }
2312 }
Hoonki Lee27511902013-03-14 18:19:06 -07002313
2314 return ;
2315}
2316
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07002317/* Caller has to take the lock before calling this function */
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002318static tANI_S32 wlan_hdd_tdls_peer_reset_discovery_processed(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002319{
2320 int i;
2321 struct list_head *head;
2322 hddTdlsPeer_t *tmp;
2323 struct list_head *pos, *q;
2324
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002325 pHddTdlsCtx->discovery_peer_cnt = 0;
2326
2327 for (i = 0; i < 256; i++) {
2328 head = &pHddTdlsCtx->peer_list[i];
2329 list_for_each_safe (pos, q, head) {
2330 tmp = list_entry(pos, hddTdlsPeer_t, node);
2331 tmp->discovery_processed = 0;
2332 }
2333 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002334
2335 return 0;
2336}
2337
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002338static tANI_S32 wlan_hdd_get_tdls_discovery_peer_cnt(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002339{
2340 int i;
2341 struct list_head *head;
2342 struct list_head *pos, *q;
2343 int discovery_peer_cnt=0;
2344 hddTdlsPeer_t *tmp;
2345
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002346 /*
2347 * This function expects the callers to acquire the Mutex.
2348 */
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002349
2350 for (i = 0; i < 256; i++) {
2351 head = &pHddTdlsCtx->peer_list[i];
2352 list_for_each_safe (pos, q, head) {
2353 tmp = list_entry(pos, hddTdlsPeer_t, node);
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302354 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Chilam Ng01120412013-02-19 18:32:21 -08002355 "%s, %d, " MAC_ADDRESS_STR, __func__, i,
2356 MAC_ADDR_ARRAY(tmp->peerMac));
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002357 discovery_peer_cnt++;
2358 }
2359 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002360 return discovery_peer_cnt;
2361}
2362
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002363tANI_U16 wlan_hdd_tdlsConnectedPeers(hdd_adapter_t *pAdapter)
Lee Hoonkic1262f22013-01-24 21:59:00 -08002364{
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302365 hdd_context_t *pHddCtx = NULL;
2366
2367 if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
2368 {
2369 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Jeff Johnsonc135a9a2017-09-19 08:37:24 -07002370 FL("invalid pAdapter: %pK"), pAdapter);
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302371 return 0;
2372 }
2373 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002374
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302375 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05302376 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2377 {
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002378 return 0;
c_hpothu7f63e882013-10-02 19:13:35 +05302379 }
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302380 EXIT();
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002381 return pHddCtx->connected_peer_count;
Lee Hoonkic1262f22013-01-24 21:59:00 -08002382}
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002383
Pradeep Reddy POTTETIe309c152015-02-06 13:21:07 +05302384hddTdlsPeer_t *wlan_hdd_tdls_get_connected_peer(hdd_adapter_t *pAdapter)
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302385{
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +05302386 /* NOTE:
2387 * Hold mutext tdls_lock before calling this function
2388 */
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302389 int i;
2390 struct list_head *head;
2391 struct list_head *pos;
2392 hddTdlsPeer_t *curr_peer = NULL;
2393 tdlsCtx_t *pHddTdlsCtx;
2394 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2395
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302396 ENTER();
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302397 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2398 {
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302399 return NULL;
2400 }
2401
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302402 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2403 if (NULL == pHddTdlsCtx) {
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302404 return NULL;
2405 }
2406 for (i = 0; i < 256; i++) {
2407 head = &pHddTdlsCtx->peer_list[i];
2408
2409 list_for_each(pos, head) {
2410 curr_peer= list_entry (pos, hddTdlsPeer_t, node);
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05302411 if (curr_peer && (curr_peer->link_status == eTDLS_LINK_CONNECTED))
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302412 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302413 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05302414 "%s: " MAC_ADDRESS_STR " eTDLS_LINK_CONNECTED",
2415 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302416 return curr_peer;
2417 }
2418 }
2419 }
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302420
2421 EXIT();
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302422 return NULL;
2423}
2424
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002425int wlan_hdd_tdls_get_all_peers(hdd_adapter_t *pAdapter, char *buf, int buflen)
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002426{
2427 int i;
2428 int len, init_len;
Hoonki Lee387663d2013-02-05 18:08:43 -08002429 struct list_head *head;
2430 struct list_head *pos;
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002431 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002432 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302433 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2434
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302435 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05302436 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2437 {
c_hpothu7f63e882013-10-02 19:13:35 +05302438 return 0;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302439 }
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002440
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002441 init_len = buflen;
Sameer Thalappilb0a30232013-09-27 15:37:48 -07002442 len = scnprintf(buf, buflen, "\n%-18s%-3s%-4s%-3s%-5s\n",
2443 "MAC", "Id", "cap", "up", "RSSI");
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002444 buf += len;
2445 buflen -= len;
2446 /* 1234567890123456789012345678901234567 */
Sameer Thalappilb0a30232013-09-27 15:37:48 -07002447 len = scnprintf(buf, buflen, "---------------------------------\n");
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002448 buf += len;
2449 buflen -= len;
2450
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302451 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002452 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002453 if (NULL == pHddTdlsCtx) {
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302454 mutex_unlock(&pHddCtx->tdls_lock);
Sameer Thalappilb0a30232013-09-27 15:37:48 -07002455 len = scnprintf(buf, buflen, "TDLS not enabled\n");
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002456 return len;
2457 }
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002458 for (i = 0; i < 256; i++) {
Hoonki Lee387663d2013-02-05 18:08:43 -08002459 head = &pHddTdlsCtx->peer_list[i];
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002460
Hoonki Lee387663d2013-02-05 18:08:43 -08002461 list_for_each(pos, head) {
2462 curr_peer= list_entry (pos, hddTdlsPeer_t, node);
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002463
Hoonki Lee387663d2013-02-05 18:08:43 -08002464 if (buflen < 32+1)
2465 break;
Sameer Thalappilb0a30232013-09-27 15:37:48 -07002466 len = scnprintf(buf, buflen,
Chilam Ng01120412013-02-19 18:32:21 -08002467 MAC_ADDRESS_STR"%3d%4s%3s%5d\n",
2468 MAC_ADDR_ARRAY(curr_peer->peerMac),
Hoonki Lee387663d2013-02-05 18:08:43 -08002469 curr_peer->staId,
2470 (curr_peer->tdls_support == eTDLS_CAP_SUPPORTED) ? "Y":"N",
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07002471 TDLS_IS_CONNECTED(curr_peer) ? "Y":"N",
Hoonki Lee387663d2013-02-05 18:08:43 -08002472 curr_peer->rssi);
2473 buf += len;
2474 buflen -= len;
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002475 }
2476 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302477 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302478
2479 EXIT();
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002480 return init_len-buflen;
2481}
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002482
2483void wlan_hdd_tdls_connection_callback(hdd_adapter_t *pAdapter)
2484{
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302485 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302486 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08002487
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302488 if ((NULL == pHddCtx))
c_hpothu7f63e882013-10-02 19:13:35 +05302489 {
Agarwal Ashishbf98caf2014-03-25 13:29:11 +05302490 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
2491 FL("pHddCtx or pHddTdlsCtx points to NULL"));
c_hpothu7f63e882013-10-02 19:13:35 +05302492 return;
2493 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302494
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302495 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07002496
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302497 if (0 != wlan_hdd_sta_tdls_init(pAdapter))
2498 {
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302499 mutex_unlock(&pHddCtx->tdls_lock);
Abhishek Singh58749d62016-02-03 15:27:20 +05302500 hddLog(LOGE, FL("wlan_hdd_sta_tdls_init failed"));
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302501 return;
2502 }
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302503
2504 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2505 if ((NULL == pHddTdlsCtx))
2506 {
Hema Aparna Medicharla8bb6f782015-03-09 12:35:05 +05302507 mutex_unlock(&pHddCtx->tdls_lock);
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302508 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
2509 FL("pHddCtx or pHddTdlsCtx points to NULL device mode = %d"), pAdapter->device_mode);
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302510 return;
2511 }
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302512 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002513 "%s, update %d discover %d", __func__,
2514 pHddTdlsCtx->threshold_config.tx_period_t,
2515 pHddTdlsCtx->threshold_config.discovery_period_t);
2516
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08002517 if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode)
2518 {
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002519 wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002520 pHddTdlsCtx->discovery_sent_cnt = 0;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002521 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002522
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002523 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
2524 &pHddTdlsCtx->peerUpdateTimer,
2525 pHddTdlsCtx->threshold_config.tx_period_t);
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08002526 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302527 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002528
2529}
2530
2531void wlan_hdd_tdls_disconnection_callback(hdd_adapter_t *pAdapter)
2532{
Masti, Narayanraddi4685ddd2016-03-15 15:17:37 +05302533 tdlsCtx_t *pHddTdlsCtx;
2534 hdd_context_t *pHddCtx;
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002535
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302536 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"%s", __func__);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002537
Masti, Narayanraddi4685ddd2016-03-15 15:17:37 +05302538 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2539
2540 if (0 != wlan_hdd_validate_context(pHddCtx))
2541 return;
2542
2543 mutex_lock(&pHddCtx->tdls_lock);
2544
2545 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002546 if (NULL == pHddTdlsCtx)
2547 {
Masti, Narayanraddi4685ddd2016-03-15 15:17:37 +05302548 mutex_unlock(&pHddCtx->tdls_lock);
Ratheesh S P36dbc932015-08-07 14:28:57 +05302549 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
c_hpothu7f63e882013-10-02 19:13:35 +05302550 FL("pHddTdlsCtx is NULL"));
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002551 return;
2552 }
Masti, Narayanraddide96b992015-01-08 13:00:58 +05302553
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002554 pHddTdlsCtx->discovery_sent_cnt = 0;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002555 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002556
Pradeep Reddy POTTETI2d4d5c42015-03-03 14:34:19 +05302557 wlan_hdd_tdls_exit(pAdapter, TRUE);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002558
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302559 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002560}
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002561
2562void wlan_hdd_tdls_mgmt_completion_callback(hdd_adapter_t *pAdapter, tANI_U32 statusCode)
2563{
2564 pAdapter->mgmtTxCompletionStatus = statusCode;
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302565 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2566 "%s: Mgmt TX Completion %d",__func__, statusCode);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002567 complete(&pAdapter->tdls_mgmt_comp);
2568}
2569
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002570void wlan_hdd_tdls_increment_peer_count(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002571{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002572 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002573
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302574 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05302575 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2576 {
c_hpothu7f63e882013-10-02 19:13:35 +05302577 return;
2578 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002579
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302580 mutex_lock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302581
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002582 pHddCtx->connected_peer_count++;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002583 wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002584
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302585 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: %d",
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002586 __func__, pHddCtx->connected_peer_count);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302587
2588 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302589
2590 EXIT();
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002591}
2592
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002593void wlan_hdd_tdls_decrement_peer_count(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002594{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002595 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002596
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302597 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05302598 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2599 {
c_hpothu7f63e882013-10-02 19:13:35 +05302600 return;
2601 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002602
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302603 mutex_lock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302604
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002605 if (pHddCtx->connected_peer_count)
2606 pHddCtx->connected_peer_count--;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002607 wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002608
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302609 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: %d",
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002610 __func__, pHddCtx->connected_peer_count);
2611
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302612 mutex_unlock(&pHddCtx->tdls_lock);
2613
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302614 EXIT();
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002615}
2616
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002617void wlan_hdd_tdls_check_bmps(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002618{
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302619
2620 tdlsCtx_t *pHddTdlsCtx = NULL;
2621 hdd_context_t *pHddCtx = NULL;
Hoonki Lee14621352013-04-16 17:51:19 -07002622 hddTdlsPeer_t *curr_peer;
Ganesh Kondabattini17e60662017-05-25 12:36:07 +05302623 VOS_STATUS status;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002624
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302625 if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
2626 {
2627 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Jeff Johnsonc135a9a2017-09-19 08:37:24 -07002628 FL("invalid pAdapter: %pK"), pAdapter);
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302629 return;
2630 }
2631
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302632 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2633
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302634 if (NULL == pHddCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302635 {
Sushant Kaushik125ae692014-11-25 17:38:48 +05302636 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302637 FL("pHddCtx points to NULL"));
c_hpothu7f63e882013-10-02 19:13:35 +05302638 return;
2639 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002640
Masti, Narayanraddifd8380e2015-10-17 16:08:37 +05302641 mutex_lock(&pHddCtx->tdls_lock);
2642 curr_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0, FALSE);
Hoonki Lee14621352013-04-16 17:51:19 -07002643 if (NULL != curr_peer)
2644 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302645 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee14621352013-04-16 17:51:19 -07002646 "%s: tdls in progress. Dont check for BMPS " MAC_ADDRESS_STR,
2647 __func__, MAC_ADDR_ARRAY (curr_peer->peerMac));
Masti, Narayanraddifd8380e2015-10-17 16:08:37 +05302648 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee14621352013-04-16 17:51:19 -07002649 return;
2650 }
2651
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302652 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2653 if (NULL == pHddTdlsCtx)
2654 {
2655 mutex_unlock(&pHddCtx->tdls_lock);
2656 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2657 FL("pHddTdlsCtx points to NULL"));
2658 return;
2659 }
Masti, Narayanraddi26378462016-01-05 18:20:28 +05302660 if ((TDLS_CTX_MAGIC != pHddCtx->scan_ctxt.magic) &&
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002661 (0 == pHddCtx->connected_peer_count) &&
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002662 (0 == pHddTdlsCtx->discovery_sent_cnt))
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002663 {
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302664 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002665 if (FALSE == sme_IsPmcBmps(WLAN_HDD_GET_HAL_CTX(pAdapter)))
2666 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302667 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002668 "%s: No TDLS peer connected/discovery sent. Enable BMPS",
2669 __func__);
Ganesh Kondabattini17e60662017-05-25 12:36:07 +05302670 status = hdd_enable_bmps_imps(pHddCtx);
2671
2672 if (status == VOS_STATUS_SUCCESS)
2673 pHddTdlsCtx->is_tdls_disabled_bmps = false;
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002674 }
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002675 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002676 else
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002677 {
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302678 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002679 if (TRUE == sme_IsPmcBmps(WLAN_HDD_GET_HAL_CTX(pAdapter)))
2680 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302681 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002682 "%s: TDLS peer connected. Disable BMPS", __func__);
Ganesh Kondabattini17e60662017-05-25 12:36:07 +05302683 status = hdd_disable_bmps_imps(pHddCtx, WLAN_HDD_INFRA_STATION);
2684
2685 if (status == VOS_STATUS_SUCCESS)
2686 pHddTdlsCtx->is_tdls_disabled_bmps = true;
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002687 }
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002688 }
2689 return;
2690}
2691
Hoonki Leefb8df672013-04-10 18:20:34 -07002692/* return pointer to hddTdlsPeer_t if TDLS is ongoing. Otherwise return NULL.
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002693 * mac - if NULL check for all the peer list, otherwise, skip this mac when skip_self is TRUE
2694 * skip_self - if TRUE, skip this mac. otherwise, check all the peer list. if
2695 mac is NULL, this argument is ignored, and check for all the peer list.
2696 */
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05302697static hddTdlsPeer_t *wlan_hdd_tdls_find_progress_peer(hdd_adapter_t *pAdapter,
2698#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2699 const u8 *mac,
2700#else
2701 u8 *mac,
2702#endif
2703 u8 skip_self)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002704{
2705 int i;
2706 struct list_head *head;
2707 hddTdlsPeer_t *curr_peer;
2708 struct list_head *pos;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302709 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302710
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302711 if (NULL == pHddTdlsCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302712 {
Ratheesh S P36dbc932015-08-07 14:28:57 +05302713 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
c_hpothu7f63e882013-10-02 19:13:35 +05302714 FL("pHddTdlsCtx is NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302715 return NULL;
c_hpothu7f63e882013-10-02 19:13:35 +05302716 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302717
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002718 for (i = 0; i < 256; i++) {
2719 head = &pHddTdlsCtx->peer_list[i];
2720 list_for_each(pos, head) {
2721 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
2722 if (skip_self && mac && !memcmp(mac, curr_peer->peerMac, 6)) {
2723 continue;
2724 }
2725 else
2726 {
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08002727 if (eTDLS_LINK_CONNECTING == curr_peer->link_status)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002728 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302729 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002730 "%s:" MAC_ADDRESS_STR " eTDLS_LINK_CONNECTING",
Gopichand Nakkalac87400e2013-03-13 18:51:00 -07002731 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
Hoonki Leefb8df672013-04-10 18:20:34 -07002732 return curr_peer;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002733 }
2734 }
2735 }
2736 }
Hoonki Leefb8df672013-04-10 18:20:34 -07002737 return NULL;
2738}
2739
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05302740hddTdlsPeer_t *wlan_hdd_tdls_is_progress(hdd_context_t *pHddCtx,
2741#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2742 const u8 *mac,
2743#else
2744 u8 *mac,
2745#endif
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302746 u8 skip_self, tANI_BOOLEAN mutexLock)
Hoonki Leefb8df672013-04-10 18:20:34 -07002747{
2748 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2749 hdd_adapter_t *pAdapter = NULL;
2750 tdlsCtx_t *pHddTdlsCtx = NULL;
2751 hddTdlsPeer_t *curr_peer= NULL;
2752 VOS_STATUS status = 0;
2753
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302754 if (mutexLock)
2755 {
2756 mutex_lock(&pHddCtx->tdls_lock);
2757 }
Hoonki Leefb8df672013-04-10 18:20:34 -07002758 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2759 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2760 {
2761 pAdapter = pAdapterNode->pAdapter;
2762
2763 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2764 if (NULL != pHddTdlsCtx)
2765 {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302766 curr_peer = wlan_hdd_tdls_find_progress_peer(pAdapter, mac, skip_self);
Hoonki Leefb8df672013-04-10 18:20:34 -07002767 if (curr_peer)
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302768 {
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302769 if (mutexLock)
2770 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leefb8df672013-04-10 18:20:34 -07002771 return curr_peer;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302772 }
Hoonki Leefb8df672013-04-10 18:20:34 -07002773 }
2774 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2775 pAdapterNode = pNext;
2776 }
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302777 if (mutexLock)
2778 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leefb8df672013-04-10 18:20:34 -07002779 return NULL;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002780}
Hoonki Lee27511902013-03-14 18:19:06 -07002781
2782static void wlan_hdd_tdls_implicit_disable(tdlsCtx_t *pHddTdlsCtx)
2783{
Hoonki Lee27511902013-03-14 18:19:06 -07002784 wlan_hdd_tdls_timers_stop(pHddTdlsCtx);
Hoonki Lee27511902013-03-14 18:19:06 -07002785}
2786
2787static void wlan_hdd_tdls_implicit_enable(tdlsCtx_t *pHddTdlsCtx)
2788{
2789 wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002790 pHddTdlsCtx->discovery_sent_cnt = 0;
Hoonki Lee27511902013-03-14 18:19:06 -07002791 wlan_tdd_tdls_reset_tx_rx(pHddTdlsCtx);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002792 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002793
Hoonki Lee27511902013-03-14 18:19:06 -07002794
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002795 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
2796 &pHddTdlsCtx->peerUpdateTimer,
2797 pHddTdlsCtx->threshold_config.tx_period_t);
Hoonki Lee27511902013-03-14 18:19:06 -07002798}
2799
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002800void wlan_hdd_tdls_set_mode(hdd_context_t *pHddCtx,
2801 eTDLSSupportMode tdls_mode,
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302802 v_BOOL_t bUpdateLast,
2803 enum tdls_disable_source source)
Hoonki Lee27511902013-03-14 18:19:06 -07002804{
2805 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2806 VOS_STATUS status;
2807 hdd_adapter_t *pAdapter;
2808 tdlsCtx_t *pHddTdlsCtx;
2809
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302810 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2811 "%s mode %d", __func__, (int)tdls_mode);
c_hpothu7f63e882013-10-02 19:13:35 +05302812
2813 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2814 {
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302815 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302816 }
Hoonki Lee27511902013-03-14 18:19:06 -07002817
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302818 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07002819
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002820 if (pHddCtx->tdls_mode == tdls_mode)
2821 {
Hema Aparna Medicharla8bb6f782015-03-09 12:35:05 +05302822 mutex_unlock(&pHddCtx->tdls_lock);
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302823 hddLog(VOS_TRACE_LEVEL_INFO, "%s already in mode %d", __func__,
2824 (int)tdls_mode);
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302825
2826 if (tdls_mode == eTDLS_SUPPORT_DISABLED)
2827 {
2828 /*
2829 * TDLS is already disabled hence set source mask and return
2830 */
2831 set_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
2832 return;
2833 }
2834 if (tdls_mode == eTDLS_SUPPORT_ENABLED)
2835 {
2836 /*
2837 * TDLS is already disabled hence set source mask and return
2838 */
2839 clear_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
2840 return;
2841 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002842 return;
2843 }
2844
Hoonki Lee27511902013-03-14 18:19:06 -07002845 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2846
2847 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2848 {
2849 pAdapter = pAdapterNode->pAdapter;
Hoonki Leea6d49be2013-04-05 09:43:25 -07002850 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2851 if (NULL != pHddTdlsCtx)
Hoonki Lee27511902013-03-14 18:19:06 -07002852 {
Hoonki Leea6d49be2013-04-05 09:43:25 -07002853 if(eTDLS_SUPPORT_ENABLED == tdls_mode)
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302854 {
2855 clear_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
2856
2857 /*
2858 * Check if any TDLS source bit is set and if bitmap is
2859 * not zero then we should not enable TDLS
2860 */
2861 if (pHddCtx->tdls_source_bitmap)
2862 {
2863 mutex_unlock(&pHddCtx->tdls_lock);
2864 return;
2865 }
Hoonki Leea6d49be2013-04-05 09:43:25 -07002866 wlan_hdd_tdls_implicit_enable(pHddTdlsCtx);
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302867 }
2868 else if((eTDLS_SUPPORT_DISABLED == tdls_mode))
2869 {
2870 set_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
Hoonki Leea6d49be2013-04-05 09:43:25 -07002871 wlan_hdd_tdls_implicit_disable(pHddTdlsCtx);
Ganesh Kondabattini17e60662017-05-25 12:36:07 +05302872 if (pHddTdlsCtx->is_tdls_disabled_bmps) {
2873 if (FALSE == sme_IsPmcBmps(pHddCtx->hHal)) {
2874 VOS_TRACE( VOS_MODULE_ID_HDD,
2875 VOS_TRACE_LEVEL_DEBUG,
2876 "%s: TDLS is disabled. Enable BMPS",
2877 __func__);
2878 status = hdd_enable_bmps_imps(pHddCtx);
2879
2880 if (status == VOS_STATUS_SUCCESS)
2881 pHddTdlsCtx->is_tdls_disabled_bmps = false;
2882 }
2883 }
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302884 }
2885 else if ((eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == tdls_mode))
2886 {
2887 clear_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
2888
2889 /*
2890 * Check if any TDLS source bit is set and if bitmap is
2891 * not zero then we should not enable TDLS
2892 */
2893 if (pHddCtx->tdls_source_bitmap)
2894 {
2895 mutex_unlock(&pHddCtx->tdls_lock);
2896 return;
2897 }
2898 wlan_hdd_tdls_implicit_disable(pHddTdlsCtx);
2899 }
Hoonki Lee27511902013-03-14 18:19:06 -07002900 }
2901 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2902 pAdapterNode = pNext;
2903 }
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002904 if(bUpdateLast)
2905 {
2906 pHddCtx->tdls_mode_last = tdls_mode;
2907 }
2908 else
2909 {
2910 pHddCtx->tdls_mode_last = pHddCtx->tdls_mode;
2911 }
Hoonki Lee27511902013-03-14 18:19:06 -07002912 pHddCtx->tdls_mode = tdls_mode;
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002913
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302914 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302915
Hoonki Lee27511902013-03-14 18:19:06 -07002916}
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002917
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302918static
2919void wlan_hdd_tdls_implicit_send_discovery_request(tdlsCtx_t * pHddTdlsCtx)
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002920{
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302921 hdd_context_t *pHddCtx = NULL;
2922 hddTdlsPeer_t *curr_peer = NULL, *temp_peer = NULL;
Hoonki Leed37cbb32013-04-20 00:31:14 -07002923
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302924 ENTER();
Hoonki Leed37cbb32013-04-20 00:31:14 -07002925 if (NULL == pHddTdlsCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302926 {
Ratheesh S P36dbc932015-08-07 14:28:57 +05302927 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
c_hpothu7f63e882013-10-02 19:13:35 +05302928 FL("pHddTdlsCtx is NULL"));
Hoonki Leed37cbb32013-04-20 00:31:14 -07002929 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302930 }
Hoonki Leed37cbb32013-04-20 00:31:14 -07002931
Hoonki Leed37cbb32013-04-20 00:31:14 -07002932 pHddCtx = WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter);
Hoonki Leefb8df672013-04-10 18:20:34 -07002933
c_hpothu7f63e882013-10-02 19:13:35 +05302934 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2935 {
Hoonki Leefb8df672013-04-10 18:20:34 -07002936 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302937 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002938
Hoonki Leed37cbb32013-04-20 00:31:14 -07002939 curr_peer = pHddTdlsCtx->curr_candidate;
Hoonki Leed37cbb32013-04-20 00:31:14 -07002940 if (NULL == curr_peer)
c_hpothu7f63e882013-10-02 19:13:35 +05302941 {
2942 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2943 FL("curr_peer is NULL"));
2944
Hoonki Leed37cbb32013-04-20 00:31:14 -07002945 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302946 }
Hoonki Leed37cbb32013-04-20 00:31:14 -07002947
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302948 /* This function is called in mutex_lock */
2949 temp_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0, FALSE);
Hoonki Leefb8df672013-04-10 18:20:34 -07002950 if (NULL != temp_peer)
2951 {
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302952 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2953 "%s: " MAC_ADDRESS_STR " ongoing. pre_setup ignored",
2954 __func__, MAC_ADDR_ARRAY(temp_peer->peerMac));
Hoonki Leed37cbb32013-04-20 00:31:14 -07002955 goto done;
Hoonki Leefb8df672013-04-10 18:20:34 -07002956 }
2957
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002958 if (eTDLS_CAP_UNKNOWN != curr_peer->tdls_support)
Atul Mittal115287b2014-07-08 13:26:33 +05302959 wlan_hdd_tdls_set_peer_link_status(curr_peer,
2960 eTDLS_LINK_DISCOVERING,
2961 eTDLS_LINK_SUCCESS);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002962
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302963 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2964 "%s: Implicit TDLS, Send Discovery request event", __func__);
Hoonki Leed37cbb32013-04-20 00:31:14 -07002965
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302966 cfg80211_tdls_oper_request(pHddTdlsCtx->pAdapter->dev,
2967 curr_peer->peerMac,
2968 NL80211_TDLS_DISCOVERY_REQ,
2969 FALSE,
2970 GFP_KERNEL);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002971 pHddTdlsCtx->discovery_sent_cnt++;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302972
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002973 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302974
Pradeep Reddy POTTETI219ced32014-11-14 16:33:57 +05302975 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
2976 &pHddTdlsCtx->peerDiscoveryTimeoutTimer,
2977 pHddTdlsCtx->threshold_config.tx_period_t - TDLS_DISCOVERY_TIMEOUT_BEFORE_UPDATE);
2978
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302979 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2980 "%s: discovery count %u timeout %u msec",
2981 __func__, pHddTdlsCtx->discovery_sent_cnt,
2982 pHddTdlsCtx->threshold_config.tx_period_t - TDLS_DISCOVERY_TIMEOUT_BEFORE_UPDATE);
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002983
Hoonki Leed37cbb32013-04-20 00:31:14 -07002984done:
2985 pHddTdlsCtx->curr_candidate = NULL;
2986 pHddTdlsCtx->magic = 0;
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302987 EXIT();
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002988 return;
2989}
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002990
2991tANI_U32 wlan_hdd_tdls_discovery_sent_cnt(hdd_context_t *pHddCtx)
2992{
2993 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2994 hdd_adapter_t *pAdapter = NULL;
2995 tdlsCtx_t *pHddTdlsCtx = NULL;
2996 VOS_STATUS status = 0;
2997 tANI_U32 count = 0;
2998
2999 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
3000 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
3001 {
3002 pAdapter = pAdapterNode->pAdapter;
3003
Hoonki Leea6d49be2013-04-05 09:43:25 -07003004 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
3005 if (NULL != pHddTdlsCtx)
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07003006 {
Hoonki Leea6d49be2013-04-05 09:43:25 -07003007 count = count + pHddTdlsCtx->discovery_sent_cnt;
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07003008 }
3009 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
3010 pAdapterNode = pNext;
3011 }
3012 return count;
3013}
3014
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07003015void wlan_hdd_tdls_check_power_save_prohibited(hdd_adapter_t *pAdapter)
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07003016{
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05303017 tdlsCtx_t *pHddTdlsCtx = NULL;
3018 hdd_context_t *pHddCtx = NULL;
Chandrasekaran, Manishekar41b8e1f2015-03-10 13:30:28 +05303019
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05303020
3021 if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
3022 {
3023 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Jeff Johnsonc135a9a2017-09-19 08:37:24 -07003024 FL("invalid pAdapter: %pK"), pAdapter);
Chandrasekaran, Manishekar41b8e1f2015-03-10 13:30:28 +05303025 return;
3026 }
3027
3028 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
3029 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07003030
3031 if ((NULL == pHddTdlsCtx) || (NULL == pHddCtx))
c_hpothu7f63e882013-10-02 19:13:35 +05303032 {
3033 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3034 FL(" pHddCtx or pHddTdlsCtx points to NULL"));
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07003035 return;
c_hpothu7f63e882013-10-02 19:13:35 +05303036 }
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07003037
3038 if ((0 == pHddCtx->connected_peer_count) &&
3039 (0 == wlan_hdd_tdls_discovery_sent_cnt(pHddCtx)))
3040 {
3041 sme_SetTdlsPowerSaveProhibited(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter), 0);
3042 return;
3043 }
3044 sme_SetTdlsPowerSaveProhibited(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter), 1);
3045 return;
3046}
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003047
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003048/* return negative = caller should stop and return error code immediately
3049 return 0 = caller should stop and return success immediately
3050 return 1 = caller can continue to scan
3051 */
3052int wlan_hdd_tdls_scan_callback (hdd_adapter_t *pAdapter,
3053 struct wiphy *wiphy,
3054#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
3055 struct net_device *dev,
3056#endif
3057 struct cfg80211_scan_request *request)
3058{
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003059 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3060 u16 connectedTdlsPeers;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303061 hddTdlsPeer_t *curr_peer, *connected_peer;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003062 unsigned long delay;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303063 hdd_config_t *cfg_param = pHddCtx->cfg_ini;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003064
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05303065 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05303066 if(0 != (wlan_hdd_validate_context(pHddCtx)))
3067 {
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003068 return 0;
c_hpothu7f63e882013-10-02 19:13:35 +05303069 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003070
3071 /* if tdls is not enabled, then continue scan */
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303072 if ((eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode))
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003073 return 1;
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303074
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303075 mutex_lock(&pHddCtx->tdls_lock);
3076 curr_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0, FALSE);
Hoonki Leefb8df672013-04-10 18:20:34 -07003077 if (NULL != curr_peer)
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003078 {
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303079 if (pHddCtx->scan_ctxt.reject++ >= TDLS_MAX_SCAN_REJECT)
Hoonki Leefb8df672013-04-10 18:20:34 -07003080 {
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303081 pHddCtx->scan_ctxt.reject = 0;
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303082 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Leefb8df672013-04-10 18:20:34 -07003083 "%s: " MAC_ADDRESS_STR ". scan rejected %d. force it to idle",
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303084 __func__, MAC_ADDR_ARRAY (curr_peer->peerMac), pHddCtx->scan_ctxt.reject);
Hoonki Leefb8df672013-04-10 18:20:34 -07003085
Atul Mittal115287b2014-07-08 13:26:33 +05303086 wlan_hdd_tdls_set_peer_link_status (curr_peer,
3087 eTDLS_LINK_IDLE,
3088 eTDLS_LINK_UNSPECIFIED);
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303089 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leefb8df672013-04-10 18:20:34 -07003090 return 1;
3091 }
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303092 mutex_unlock(&pHddCtx->tdls_lock);
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303093 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Leefb8df672013-04-10 18:20:34 -07003094 "%s: tdls in progress. scan rejected %d",
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303095 __func__, pHddCtx->scan_ctxt.reject);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003096 return -EBUSY;
3097 }
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303098 else
3099 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003100
Bala Venkateshd3d77ee2018-07-06 21:16:30 +05303101 /* if fEnableTDLSScan flag is 1 ; driverwill allow scan even if
3102 * peer station is not buffer STA capable
3103 *
3104 * RX: If there is any RX activity, device will lose RX packets,
3105 * as peer will not be aware that device is off channel.
3106 * TX: TX is stopped whenever device initiate scan.
3107 */
3108
3109 if (pHddCtx->cfg_ini->fEnableTDLSScan == 1)
3110 {
3111 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
3112 FL("Allow SCAN in all TDLS cases"));
3113 return 1;
3114 }
3115
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003116 /* tdls teardown is ongoing */
3117 if (eTDLS_SUPPORT_DISABLED == pHddCtx->tdls_mode)
3118 {
3119 connectedTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303120 if (connectedTdlsPeers && (pHddCtx->scan_ctxt.attempt < TDLS_MAX_SCAN_SCHEDULE))
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003121 {
3122 delay = (unsigned long)(TDLS_DELAY_SCAN_PER_CONNECTION*connectedTdlsPeers);
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303123 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003124 "%s: tdls disabled, but still connected_peers %d attempt %d. schedule scan %lu msec",
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303125 __func__, connectedTdlsPeers, pHddCtx->scan_ctxt.attempt, delay);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003126
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303127 wlan_hdd_defer_scan_init_work (pHddCtx, wiphy,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003128#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
3129 dev,
3130#endif
3131 request,
3132 msecs_to_jiffies(delay));
3133 /* scan should not continue */
3134 return 0;
3135 }
3136 /* no connected peer or max retry reached, scan continue */
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303137 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003138 "%s: tdls disabled. connected_peers %d attempt %d. scan allowed",
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303139 __func__, connectedTdlsPeers, pHddCtx->scan_ctxt.attempt);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003140 return 1;
3141 }
3142 /* while tdls is up, first time scan */
3143 else if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode ||
3144 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode)
3145 {
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003146 connectedTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303147
3148 /* check the TDLS link and Scan coexistance Capability */
3149 if ( (TRUE == pHddCtx->cfg_ini->fEnableTDLSScanCoexSupport) &&
3150 (TRUE == sme_IsFeatureSupportedByFW(TDLS_SCAN_COEXISTENCE)) &&
3151 (connectedTdlsPeers == 1) )
3152 {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303153 mutex_lock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303154 /* get connected peer information */
Pradeep Reddy POTTETIe309c152015-02-06 13:21:07 +05303155 connected_peer = wlan_hdd_tdls_get_connected_peer(pAdapter);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303156 if (NULL == connected_peer) {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303157 mutex_unlock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303158 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3159 "%s: Invalid connected_peer, Continue Scanning", __func__);
3160 /* scan should continue */
3161 return 1;
3162 }
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303163 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303164 ("%s: TDLS Scan Co-exist supported connectedTdlsPeers =%d buffersta =%d"),
3165 __func__,connectedTdlsPeers,connected_peer->isBufSta);
3166
3167 if (connected_peer->isBufSta)
3168 {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303169 mutex_unlock(&pHddCtx->tdls_lock);
3170 pHddCtx->isTdlsScanCoexistence = TRUE;
3171 if ((cfg_param->dynSplitscan) && (!pHddCtx->issplitscan_enabled))
3172 {
3173 pHddCtx->issplitscan_enabled = TRUE;
3174 sme_enable_disable_split_scan(
3175 WLAN_HDD_GET_HAL_CTX(pAdapter),
3176 cfg_param->nNumStaChanCombinedConc,
3177 cfg_param->nNumP2PChanCombinedConc);
3178 }
3179 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
3180 ("%s:%d TDLS Scan Co-exist supported splitscan_enabled =%d "),
3181 __func__, __LINE__, pHddCtx->issplitscan_enabled);
3182 return 1;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303183 }
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303184 else
3185 mutex_unlock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303186
3187 }
3188 else
3189 {
3190 /* Throughput Monitor shall disable the split scan when
3191 * TDLS scan coexistance is disabled.At this point of time
3192 * since TDLS scan coexistance is not meeting the criteria
3193 * to be operational, explicitly make it false to enable
3194 * throughput monitor takes the control of split scan.
3195 */
3196 pHddCtx->isTdlsScanCoexistence = FALSE;
3197 }
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303198 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303199 ("%s: TDLS Scan Co-exist not supported connectedTdlsPeers =%d"
3200 " TDLSScanCoexSupport param =%d TDLS_SCAN_COEXISTENCE =%d"),
3201 __func__, connectedTdlsPeers,
3202 pHddCtx->cfg_ini->fEnableTDLSScanCoexSupport,
3203 sme_IsFeatureSupportedByFW(TDLS_SCAN_COEXISTENCE));
3204
Atul Mittal5803b342014-09-04 15:31:19 +05303205 /* disable implicit trigger logic & tdls operatoin */
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05303206 wlan_hdd_tdls_set_mode(pHddCtx, eTDLS_SUPPORT_DISABLED, FALSE,
3207 HDD_SET_TDLS_MODE_SOURCE_SCAN);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303208 /* fall back to the implementation of teardown the peers on the scan
3209 * when the number of connected peers are more than one. TDLS Scan
3210 * coexistance feature is exercised only when a single peer is
3211 * connected and the DUT shall not advertize the Buffer Sta capability,
3212 * so that the peer shall not go to the TDLS power save
3213 */
3214
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003215 if (connectedTdlsPeers)
3216 {
3217 tANI_U8 staIdx;
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003218 hddTdlsPeer_t *curr_peer;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003219
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +05303220 mutex_lock(&pHddCtx->tdls_lock);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003221 for (staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++)
3222 {
3223 if (pHddCtx->tdlsConnInfo[staIdx].staId)
3224 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303225 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303226 ("%s: indicate TDLS teardown (staId %d)"),
3227 __func__, pHddCtx->tdlsConnInfo[staIdx].staId) ;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003228
3229#ifdef CONFIG_TDLS_IMPLICIT
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303230 curr_peer = wlan_hdd_tdls_find_all_peer(pHddCtx,
3231 pHddCtx->tdlsConnInfo[staIdx].peerMac.bytes);
Abhishek Singh96568922016-01-05 15:28:12 +05303232 if(curr_peer) {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303233 wlan_hdd_tdls_indicate_teardown(
3234 curr_peer->pHddTdlsCtx->pAdapter, curr_peer,
3235 eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON);
Abhishek Singh96568922016-01-05 15:28:12 +05303236 hdd_send_wlan_tdls_teardown_event(
3237 eTDLS_TEARDOWN_SCAN,
3238 curr_peer->peerMac);
3239 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003240#endif
3241 }
3242 }
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +05303243 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003244 /* schedule scan */
3245 delay = (unsigned long)(TDLS_DELAY_SCAN_PER_CONNECTION*connectedTdlsPeers);
3246
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303247 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003248 "%s: tdls enabled (mode %d), connected_peers %d. schedule scan %lu msec",
3249 __func__, pHddCtx->tdls_mode, wlan_hdd_tdlsConnectedPeers(pAdapter),
3250 delay);
3251
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303252 wlan_hdd_defer_scan_init_work (pHddCtx, wiphy,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003253#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
3254 dev,
3255#endif
3256 request,
3257 msecs_to_jiffies(delay));
3258 /* scan should not continue */
3259 return 0;
3260 }
3261 /* no connected peer, scan continue */
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303262 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003263 "%s: tdls_mode %d, and no tdls connection. scan allowed",
3264 __func__, pHddCtx->tdls_mode);
3265 }
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05303266 EXIT();
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003267 return 1;
3268}
3269
3270void wlan_hdd_tdls_scan_done_callback(hdd_adapter_t *pAdapter)
3271{
3272 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003273
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05303274 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05303275 if(0 != (wlan_hdd_validate_context(pHddCtx)))
3276 {
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003277 return;
c_hpothu7f63e882013-10-02 19:13:35 +05303278 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003279
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303280 /* if tdls is not enabled then don't revert tdls mode */
3281 if ((eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode)) {
3282 hddLog(VOS_TRACE_LEVEL_INFO, FL("Failed to revert: Mode=%d"),
3283 pHddCtx->tdls_mode);
Pradeep Reddy POTTETIc7822df2015-02-19 20:15:41 +05303284 return;
Chandrasekaran, Manishekar0de84dc2015-03-10 15:12:34 +05303285 }
Sunil Dutt41de4e22013-11-14 18:09:02 +05303286
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003287 /* free allocated memory at scan time */
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303288 wlan_hdd_init_deinit_defer_scan_context(&pHddCtx->scan_ctxt);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003289
3290 /* if tdls was enabled before scan, re-enable tdls mode */
3291 if(eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode_last ||
3292 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode_last)
3293 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303294 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003295 ("%s: revert tdls mode %d"), __func__, pHddCtx->tdls_mode_last);
3296
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05303297 wlan_hdd_tdls_set_mode(pHddCtx, pHddCtx->tdls_mode_last, FALSE,
3298 HDD_SET_TDLS_MODE_SOURCE_SCAN);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003299 }
3300 wlan_hdd_tdls_check_bmps(pAdapter);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05303301
3302 EXIT();
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003303}
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07003304
3305void wlan_hdd_tdls_timer_restart(hdd_adapter_t *pAdapter,
3306 vos_timer_t *timer,
3307 v_U32_t expirationTime)
3308{
3309 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
3310
3311 if (NULL == pHddStaCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05303312 {
3313 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3314 FL("pHddStaCtx is NULL"));
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07003315 return;
c_hpothu7f63e882013-10-02 19:13:35 +05303316 }
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07003317
3318 /* Check whether driver load unload is in progress */
3319 if(vos_is_load_unload_in_progress( VOS_MODULE_ID_VOSS, NULL))
3320 {
3321 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3322 "%s: Driver load/unload is in progress.", __func__);
3323 return;
3324 }
3325
3326 if (hdd_connIsConnected(pHddStaCtx))
3327 {
3328 vos_timer_stop(timer);
3329 vos_timer_start(timer, expirationTime);
3330 }
3331}
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003332void wlan_hdd_tdls_indicate_teardown(hdd_adapter_t *pAdapter,
3333 hddTdlsPeer_t *curr_peer,
3334 tANI_U16 reason)
3335{
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05303336 hdd_context_t *pHddCtx;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303337
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05303338 if ((NULL == pAdapter || WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic) ||
3339 (NULL == curr_peer))
c_hpothu7f63e882013-10-02 19:13:35 +05303340 {
3341 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3342 FL("parameters passed are invalid"));
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003343 return;
c_hpothu7f63e882013-10-02 19:13:35 +05303344 }
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003345
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05303346 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3347
Masti, Narayanraddi9d275662015-08-26 13:15:12 +05303348 if ((eTDLS_LINK_CONNECTED != curr_peer->link_status) &&
3349 (eTDLS_LINK_CONNECTING != curr_peer->link_status))
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003350 return;
3351
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303352 /* Throughput Monitor shall disable the split scan when
3353 * TDLS scan coexistance is disabled.At this point of time
3354 * since TDLS scan coexistance is not meeting the criteria
3355 * to be operational, explicitly make it false to enable
3356 * throughput monitor takes the control of split scan.
3357 */
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05303358 if (pHddCtx && (pHddCtx->isTdlsScanCoexistence == TRUE))
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303359 {
3360 pHddCtx->isTdlsScanCoexistence = FALSE;
3361 }
3362
Atul Mittal115287b2014-07-08 13:26:33 +05303363 wlan_hdd_tdls_set_peer_link_status(curr_peer,
3364 eTDLS_LINK_TEARING,
Atul Mittal271a7652014-09-12 13:18:22 +05303365 eTDLS_LINK_UNSPECIFIED);
Agarwal Ashisha7ef41d2015-06-25 18:00:26 +05303366 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3367 FL("Setting NL80211_TDLS_TEARDOWN, reason %d"), reason);
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003368 cfg80211_tdls_oper_request(pAdapter->dev,
3369 curr_peer->peerMac,
3370 NL80211_TDLS_TEARDOWN,
3371 reason,
3372 GFP_KERNEL);
3373}
Atul Mittal115287b2014-07-08 13:26:33 +05303374
3375
3376/*EXT TDLS*/
3377int wlan_hdd_set_callback(hddTdlsPeer_t *curr_peer,
3378 cfg80211_exttdls_callback callback)
3379{
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +05303380 /* NOTE:
3381 * Hold mutex tdls_lock before calling this function
3382 */
Atul Mittal115287b2014-07-08 13:26:33 +05303383
3384 hdd_context_t *pHddCtx;
3385 hdd_adapter_t *pAdapter;
3386
3387 if (!curr_peer) return -1;
3388
3389 pAdapter = curr_peer->pHddTdlsCtx->pAdapter;
3390 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3391 if ((NULL == pHddCtx)) return -1;
3392
Atul Mittal115287b2014-07-08 13:26:33 +05303393 curr_peer->state_change_notification = callback;
3394
Atul Mittal115287b2014-07-08 13:26:33 +05303395 return 0;
Atul Mittal115287b2014-07-08 13:26:33 +05303396}
3397
3398void wlan_hdd_tdls_get_wifi_hal_state(hddTdlsPeer_t *curr_peer,
3399 tANI_S32 *state,
3400 tANI_S32 *reason)
3401{
3402 *reason = curr_peer->reason;
3403
3404 switch(curr_peer->link_status)
3405 {
3406 case eTDLS_LINK_IDLE:
Atul Mittal115287b2014-07-08 13:26:33 +05303407 case eTDLS_LINK_DISCOVERED:
3408 *state = WIFI_TDLS_ENABLED;
3409 break;
Atul Mittalad630e42014-10-07 19:19:14 +05303410 case eTDLS_LINK_DISCOVERING:
Atul Mittal115287b2014-07-08 13:26:33 +05303411 case eTDLS_LINK_CONNECTING:
3412 *state = WIFI_TDLS_TRYING;
3413 break;
3414 case eTDLS_LINK_CONNECTED:
Pradeep Reddy POTTETIf3148e82015-04-16 12:10:33 +05303415 if (TRUE == curr_peer->isOffChannelEstablished)
Pradeep Reddy POTTETI16d83332015-03-26 18:28:13 +05303416 {
3417 *state = WIFI_TDLS_ESTABLISHED_OFF_CHANNEL;
3418 }
3419 else
3420 {
3421 *state = WIFI_TDLS_ESTABLISHED;
3422 }
Atul Mittal115287b2014-07-08 13:26:33 +05303423 break;
3424 case eTDLS_LINK_TEARING:
3425 *state = WIFI_TDLS_DROPPED;
3426 break;
3427 }
3428
3429}
3430
3431int wlan_hdd_tdls_get_status(hdd_adapter_t *pAdapter,
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05303432#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
3433 const tANI_U8* mac,
3434#else
Atul Mittal115287b2014-07-08 13:26:33 +05303435 tANI_U8* mac,
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05303436#endif
Atul Mittal115287b2014-07-08 13:26:33 +05303437 tANI_S32 *state,
3438 tANI_S32 *reason)
3439{
3440
3441 hddTdlsPeer_t *curr_peer;
Atul Mittala75fced2014-10-06 13:59:07 +05303442 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05303443
3444 mutex_lock(&pHddCtx->tdls_lock);
3445 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Atul Mittal115287b2014-07-08 13:26:33 +05303446 if (curr_peer == NULL)
3447 {
Atul Mittala75fced2014-10-06 13:59:07 +05303448 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Atul Mittal115287b2014-07-08 13:26:33 +05303449 FL("curr_peer is NULL"));
Atul Mittal115287b2014-07-08 13:26:33 +05303450
Atul Mittala75fced2014-10-06 13:59:07 +05303451 *state = WIFI_TDLS_DISABLED;
3452 *reason = eTDLS_LINK_UNSPECIFIED;
3453 }
3454 else
3455 {
3456 if (pHddCtx->cfg_ini->fTDLSExternalControl &&
3457 (FALSE == curr_peer->isForcedPeer))
3458 {
3459 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3460 FL("curr_peer is not Forced"));
3461 *state = WIFI_TDLS_DISABLED;
3462 *reason = eTDLS_LINK_UNSPECIFIED;
3463 }
3464 else
3465 {
3466 wlan_hdd_tdls_get_wifi_hal_state(curr_peer, state, reason);
3467 }
3468 }
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05303469 mutex_unlock(&pHddCtx->tdls_lock);
Atul Mittal115287b2014-07-08 13:26:33 +05303470 return (0);
3471}
3472
Agarwal Ashishef54a182014-12-16 15:07:31 +05303473int hdd_set_tdls_scan_type(hdd_adapter_t *pAdapter,
3474 tANI_U8 *ptr)
3475{
3476 int tdls_scan_type;
Hema Aparna Medicharla26b98042015-01-21 15:02:01 +05303477 hdd_context_t *pHddCtx;
Agarwal Ashishef54a182014-12-16 15:07:31 +05303478 if (NULL == pAdapter)
3479 {
3480 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3481 "%s: pAdapter is NULL", __func__);
3482 return -EINVAL;
3483 }
Hema Aparna Medicharla26b98042015-01-21 15:02:01 +05303484 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Agarwal Ashishef54a182014-12-16 15:07:31 +05303485 tdls_scan_type = ptr[9] - '0';
3486
3487 if (tdls_scan_type <= 2)
3488 {
3489 pHddCtx->cfg_ini->fEnableTDLSScan = tdls_scan_type;
3490 return 0;
3491 }
3492 else
3493 {
3494 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3495 " Wrong value is given for tdls_scan_type "
3496 " Making fEnableTDLSScan as 0 ");
3497 pHddCtx->cfg_ini->fEnableTDLSScan = 0;
3498 return -EINVAL;
3499 }
3500}
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +05303501int wlan_hdd_validate_tdls_context(hdd_context_t *pHddCtx,
3502 tdlsCtx_t *pHddTdlsCtx)
3503{
3504 VOS_STATUS status;
3505 int found = 0;
3506 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
3507 hdd_adapter_t *pAdapter;
Agarwal Ashishef54a182014-12-16 15:07:31 +05303508
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +05303509 if (NULL == pHddTdlsCtx)
3510 {
3511 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3512 FL("TDLS context is NULL"));
3513 return -EINVAL;
3514 }
3515 status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
3516 while (NULL != pAdapterNode && VOS_STATUS_SUCCESS == status)
3517 {
3518 pAdapter = pAdapterNode->pAdapter;
3519 if (NULL != pAdapter)
3520 {
3521 if (pHddTdlsCtx == pAdapter->sessionCtx.station.pHddTdlsCtx &&
3522 (NULL != pHddTdlsCtx->pAdapter) &&
3523 (WLAN_HDD_ADAPTER_MAGIC == pHddTdlsCtx->pAdapter->magic))
3524 {
3525 found = 1;
3526 break;
3527 }
3528 }
3529 status = hdd_get_next_adapter (pHddCtx, pAdapterNode, &pNext);
3530 pAdapterNode = pNext;
3531 }
3532 if (found == 1)
3533 {
3534 return 0;
3535 }
3536 else
3537 {
3538 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3539 FL("TDLS context doesnot belongs to valid adapter"));
3540 return -EINVAL;
3541 }
3542}
Ganesh Kondabattinif3ba0972015-08-07 15:58:04 +05303543
3544
3545void wlan_hdd_tdls_update_rx_pkt_cnt_n_rssi(hdd_adapter_t *pAdapter,
3546 u8 *mac, v_S7_t rssiAvg)
3547{
3548 hddTdlsPeer_t *curr_peer;
3549 hdd_context_t *pHddCtx = NULL;
3550 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3551 mutex_lock(&pHddCtx->tdls_lock);
3552 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
3553 if ((NULL != curr_peer) &&
3554 (eTDLS_LINK_CONNECTED == curr_peer->link_status))
3555 {
3556 curr_peer->rx_pkt++;
3557 curr_peer->rssi = rssiAvg;
3558 }
3559 mutex_unlock(&pHddCtx->tdls_lock);
3560 VOS_TRACE( VOS_MODULE_ID_HDD_DATA, VOS_TRACE_LEVEL_INFO,
3561 "mac : " MAC_ADDRESS_STR "rssi is %d",
3562 MAC_ADDR_ARRAY(mac), rssiAvg);
3563}
Atul Mittal115287b2014-07-08 13:26:33 +05303564
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303565/**
3566 * wlan_hdd_tdls_reenable() - Re-Enable TDLS
3567 * @hddctx: pointer to hdd context
3568 *
3569 * Function re-enable's TDLS which might be disabled during concurrency
3570 *
3571 * Return: None
3572 */
3573void wlan_hdd_tdls_reenable(hdd_context_t *pHddCtx)
3574{
3575
3576 if ((TRUE != pHddCtx->cfg_ini->fEnableTDLSSupport) ||
3577 (TRUE != sme_IsFeatureSupportedByFW(TDLS))) {
3578 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3579 FL("tdls support not enabled"));
3580 return;
3581 }
3582
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303583 /* if tdls is not enabled then don't revert tdls mode */
3584 if ((eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode)) {
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303585 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303586 FL("TDLS disabled so no need to enable: Mode=%d"),
3587 pHddCtx->tdls_mode);
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303588 return;
3589 }
3590
3591 if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode_last ||
3592 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY ==
3593 pHddCtx->tdls_mode_last) {
3594 /* Enable TDLS support Once P2P session ends since
3595 * upond detection of concurrency TDLS might be disabled
3596 */
3597 hddLog(LOG1, FL("TDLS mode set to %d"), pHddCtx->tdls_mode_last);
3598 wlan_hdd_tdls_set_mode(pHddCtx, pHddCtx->tdls_mode_last,
Bala Venkatesh5c06a252018-07-12 16:08:04 +05303599 FALSE,
3600 HDD_SET_TDLS_MODE_SOURCE_CONCURRENCY);
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303601 }
3602}
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +05303603
3604tdlsConnInfo_t *wlan_hdd_get_conn_info(hdd_context_t *pHddCtx,
3605 tANI_U8 idx)
3606{
3607 tANI_U8 staIdx;
3608
3609 /* check if there is available index for this new TDLS STA */
3610 for ( staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++ )
3611 {
3612 if (idx == pHddCtx->tdlsConnInfo[staIdx].staId )
3613 {
3614 hddLog(LOG1, FL("tdls peer with staIdx %u exists"), idx );
3615 return (&pHddCtx->tdlsConnInfo[staIdx]);
3616 }
3617 }
3618 hddLog(LOGE, FL("tdls peer with staIdx %u not exists"), idx );
3619 return NULL;
3620}
Masti, Narayanraddi44b0db02015-12-22 11:54:35 +05303621
3622void wlan_hdd_change_tdls_mode(void *data)
3623{
3624 hdd_context_t *hdd_ctx = (hdd_context_t *)data;
3625
3626 wlan_hdd_tdls_set_mode(hdd_ctx, eTDLS_SUPPORT_ENABLED, FALSE,
3627 HDD_SET_TDLS_MODE_SOURCE_OFFCHANNEL);
3628}
3629
3630void wlan_hdd_start_stop_tdls_source_timer(hdd_context_t *pHddCtx,
3631 eTDLSSupportMode tdls_mode)
3632{
3633 if (VOS_TIMER_STATE_RUNNING ==
3634 vos_timer_getCurrentState(&pHddCtx->tdls_source_timer))
3635 vos_timer_stop(&pHddCtx->tdls_source_timer);
3636
3637 if (tdls_mode == eTDLS_SUPPORT_DISABLED) {
3638 wlan_hdd_tdls_set_mode(pHddCtx, tdls_mode, FALSE,
3639 HDD_SET_TDLS_MODE_SOURCE_OFFCHANNEL);
3640 }
3641
3642 vos_timer_start(&pHddCtx->tdls_source_timer,
3643 pHddCtx->cfg_ini->tdls_enable_defer_time);
3644
3645 return;
3646}
3647
Deepthi Gowri03a979f2016-11-03 15:20:19 +05303648void wlan_hdd_get_tdls_stats(hdd_adapter_t *pAdapter)
3649{
3650 hdd_context_t *pHddCtx = NULL;
3651 tdlsCtx_t *pHddTdlsCtx = NULL;
3652 tANI_U16 numConnectedTdlsPeers = 0;
3653 tANI_U16 numDiscoverySentCnt = 0;
3654
3655 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3656
3657 ENTER();
3658 if (0 != (wlan_hdd_validate_context(pHddCtx)))
3659 {
3660 return;
3661 }
3662
3663 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
3664
3665 mutex_lock(&pHddCtx->tdls_lock);
3666 if (NULL == pHddTdlsCtx)
3667 {
3668 mutex_unlock(&pHddCtx->tdls_lock);
3669 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
3670 FL("pHddTdlsCtx points to NULL"));
3671 return;
3672 }
3673 numConnectedTdlsPeers = pHddCtx->connected_peer_count;
3674 numDiscoverySentCnt = pHddTdlsCtx->discovery_sent_cnt;
3675 mutex_unlock(&pHddCtx->tdls_lock);
3676
3677 hddLog( LOGE, "%s: TDLS Mode: %d TDLS connected peer count %d"
3678 " DiscoverySentCnt=%d", __func__, pHddCtx->tdls_mode,
3679 numConnectedTdlsPeers, numDiscoverySentCnt);
3680 EXIT();
3681
3682 return;
3683}
3684
3685
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303686/*EXT TDLS*/