blob: b8049684ea688c7cfc80d1c23acded782cbdbb24 [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));
Sai Pavan Akhil Remellabe775352021-04-02 17:03:13 +05301385 if (pHddCtx->cfg_ini->fTDLSExternalControl)
1386 peer->isForcedPeer = 1;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001387 peer->pHddTdlsCtx = pHddTdlsCtx;
Hoonki Lee387663d2013-02-05 18:08:43 -08001388 list_add_tail(&peer->node, head);
Hoonki Lee387663d2013-02-05 18:08:43 -08001389
1390 return peer;
1391}
1392
Deepthi Gowric504a222016-07-25 15:43:31 +05301393/*
1394 * NOTE:
1395 * The Callers of this function should ensure to release the
1396 * tdls_lock before calling this function to avoid deadlocks.
1397 */
1398
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001399int wlan_hdd_tdls_set_cap(hdd_adapter_t *pAdapter,
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301400#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1401 const u8* mac,
1402#else
Hoonki Lee27511902013-03-14 18:19:06 -07001403 u8* mac,
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301404#endif
Hoonki Lee27511902013-03-14 18:19:06 -07001405 tTDLSCapType cap)
1406{
1407 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301408 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee27511902013-03-14 18:19:06 -07001409
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301410 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1411 return -EINVAL;
1412
1413 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001414 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee27511902013-03-14 18:19:06 -07001415 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301416 {
1417 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1418 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301419 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001420 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301421 }
Hoonki Lee27511902013-03-14 18:19:06 -07001422
1423 curr_peer->tdls_support = cap;
1424
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301425 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001426 return 0;
Hoonki Lee27511902013-03-14 18:19:06 -07001427}
1428
Atul Mittal115287b2014-07-08 13:26:33 +05301429void wlan_hdd_tdls_set_peer_link_status(hddTdlsPeer_t *curr_peer,
1430 tTDLSLinkStatus status,
1431 tTDLSLinkReason reason)
Hoonki Lee387663d2013-02-05 18:08:43 -08001432{
Atul Mittal115287b2014-07-08 13:26:33 +05301433 /*EXT TDLS*/
1434 tANI_S32 state = 0;
1435 tANI_S32 res = 0;
1436 /*EXT TDLS*/
Hoonki Lee387663d2013-02-05 18:08:43 -08001437 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301438 {
1439 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1440 "%s: curr_peer is NULL", __func__);
Hoonki Lee387663d2013-02-05 18:08:43 -08001441 return;
c_hpothu7f63e882013-10-02 19:13:35 +05301442 }
Hoonki Lee387663d2013-02-05 18:08:43 -08001443
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001444 hddLog(VOS_TRACE_LEVEL_WARN, "tdls set peer " MAC_ADDRESS_STR " link status to %u",
Chilam Ng01120412013-02-19 18:32:21 -08001445 MAC_ADDR_ARRAY(curr_peer->peerMac), status);
Chilam NG571c65a2013-01-19 12:27:36 +05301446
1447 curr_peer->link_status = status;
1448
Atul Mittal115287b2014-07-08 13:26:33 +05301449 /*EXT TDLS*/
1450 if (curr_peer->isForcedPeer && curr_peer->state_change_notification)
1451 {
1452 /*save the reason for any further query*/
1453 curr_peer->reason = reason;
1454 wlan_hdd_tdls_get_wifi_hal_state(curr_peer, &state, &res);
1455
1456 (curr_peer->state_change_notification)(
1457 curr_peer->peerMac,
1458 state,
1459 res,
1460 curr_peer->pHddTdlsCtx->pAdapter);
1461
1462 }
1463 /*EXT TDLS*/
1464
Chilam NG571c65a2013-01-19 12:27:36 +05301465}
1466
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001467void wlan_hdd_tdls_set_link_status(hdd_adapter_t *pAdapter,
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05301468#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1469 const u8 *mac,
1470#else
1471 u8 *mac,
1472#endif
Atul Mittal115287b2014-07-08 13:26:33 +05301473 tTDLSLinkStatus linkStatus,
1474 tTDLSLinkReason reason)
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001475{
Atul Mittal115287b2014-07-08 13:26:33 +05301476
1477 /*EXT TDLS*/
1478 tANI_S32 state = 0;
1479 tANI_S32 res = 0;
1480 /*EXT TDLS*/
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001481 hddTdlsPeer_t *curr_peer;
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301482 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001483
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301484 if (pHddCtx == NULL)
1485 {
1486 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1487 FL("pHddCtx is NULL"));
1488 return;
1489 }
1490
1491 mutex_lock(&pHddCtx->tdls_lock);
1492 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001493 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301494 {
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301495 mutex_unlock(&pHddCtx->tdls_lock);
c_hpothu7f63e882013-10-02 19:13:35 +05301496 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1497 "%s: curr_peer is NULL", __func__);
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001498 return;
c_hpothu7f63e882013-10-02 19:13:35 +05301499 }
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001500
Masti, Narayanraddi83dbfc22016-01-07 16:26:06 +05301501 hddLog(VOS_TRACE_LEVEL_INFO,
1502 "tdls set peer " MAC_ADDRESS_STR " link status to %u",
1503 MAC_ADDR_ARRAY(curr_peer->peerMac), linkStatus);
1504
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001505 curr_peer->link_status= linkStatus;
1506
Atul Mittal115287b2014-07-08 13:26:33 +05301507 /*EXT TDLS*/
1508
1509 if (curr_peer->isForcedPeer && curr_peer->state_change_notification)
1510 {
1511 /*save the reason for any further query*/
1512 curr_peer->reason = reason;
1513 wlan_hdd_tdls_get_wifi_hal_state(curr_peer, &state, &res);
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301514 mutex_unlock(&pHddCtx->tdls_lock);
Atul Mittal115287b2014-07-08 13:26:33 +05301515 (*curr_peer->state_change_notification)(mac,
1516 state,
1517 res,
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301518 pAdapter);
Atul Mittal115287b2014-07-08 13:26:33 +05301519 }
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301520 else
1521 mutex_unlock(&pHddCtx->tdls_lock);
1522
Atul Mittal115287b2014-07-08 13:26:33 +05301523 /*EXT TDLS*/
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001524 return;
1525}
1526
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001527int wlan_hdd_tdls_recv_discovery_resp(hdd_adapter_t *pAdapter, u8 *mac)
Chilam NG571c65a2013-01-19 12:27:36 +05301528{
1529 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301530 tdlsCtx_t *pHddTdlsCtx = NULL;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301531 hdd_context_t *pHddCtx;
1532
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05301533 ENTER();
1534
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301535 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1536 if (0 != wlan_hdd_validate_context(pHddCtx))
1537 return -1;
1538
1539 mutex_lock(&pHddCtx->tdls_lock);
1540
1541 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301542 if ( NULL == pHddTdlsCtx )
c_hpothu7f63e882013-10-02 19:13:35 +05301543 {
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301544 mutex_unlock(&pHddCtx->tdls_lock);
1545 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1546 FL("pHddTdlsCtx is NULL device mode = %d"),
1547 pAdapter->device_mode);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301548 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301549 }
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301550
1551 pHddCtx = WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter);
1552
c_hpothu7f63e882013-10-02 19:13:35 +05301553 if(0 != (wlan_hdd_validate_context(pHddCtx)))
1554 {
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301555 mutex_unlock(&pHddCtx->tdls_lock);
c_hpothu7f63e882013-10-02 19:13:35 +05301556 return 0;
1557 }
Chilam NG571c65a2013-01-19 12:27:36 +05301558
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001559 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001560
1561 if (NULL == curr_peer)
c_hpothu7f63e882013-10-02 19:13:35 +05301562 {
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301563 mutex_unlock(&pHddCtx->tdls_lock);
c_hpothu7f63e882013-10-02 19:13:35 +05301564 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1565 FL("curr_peer is NULL"));
Hoonki Lee387663d2013-02-05 18:08:43 -08001566 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301567 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001568
1569 if (pHddTdlsCtx->discovery_sent_cnt)
1570 pHddTdlsCtx->discovery_sent_cnt--;
1571
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301572
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001573 wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301574
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001575 if (0 == pHddTdlsCtx->discovery_sent_cnt)
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001576 {
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001577 vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001578 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001579
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05301580 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001581 "Discovery(%u) Response from " MAC_ADDRESS_STR " link_status %d",
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001582 pHddTdlsCtx->discovery_sent_cnt, MAC_ADDR_ARRAY(curr_peer->peerMac),
1583 curr_peer->link_status);
1584
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301585 curr_peer->tdls_support = eTDLS_CAP_SUPPORTED;
1586
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001587 if (eTDLS_LINK_DISCOVERING == curr_peer->link_status)
Gopichand Nakkala901e8922013-03-04 23:45:58 -08001588 {
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001589 /* Since we are here, it means Throughput threshold is alredy met. Make sure RSSI
1590 threshold is also met before setting up TDLS link*/
1591 if ((tANI_S32) curr_peer->rssi > (tANI_S32) pHddTdlsCtx->threshold_config.rssi_trigger_threshold)
1592 {
Atul Mittal115287b2014-07-08 13:26:33 +05301593 wlan_hdd_tdls_set_peer_link_status(curr_peer,
1594 eTDLS_LINK_DISCOVERED,
1595 eTDLS_LINK_SUCCESS);
Ganesh Kondabattinid01c4ee2016-01-04 16:13:06 +05301596
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05301597 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001598 "Rssi Threshold met: "MAC_ADDRESS_STR" rssi = %d threshold= %d" ,
1599 MAC_ADDR_ARRAY(curr_peer->peerMac), curr_peer->rssi,
1600 pHddTdlsCtx->threshold_config.rssi_trigger_threshold);
Ganesh Kondabattinid01c4ee2016-01-04 16:13:06 +05301601
1602 if (pHddCtx->tdls_mode != eTDLS_SUPPORT_DISABLED)
1603 {
1604 /* TDLS can be disabled from multiple sources like
1605 * scan, p2p-listen, p2p, btc etc ...
1606 * Dont initiate tdls setup if tdls is disabled
1607 */
1608 cfg80211_tdls_oper_request(pAdapter->dev, curr_peer->peerMac,
1609 NL80211_TDLS_SETUP, FALSE,
1610 GFP_KERNEL);
1611 }
1612 else
1613 {
1614 curr_peer->tdls_support = eTDLS_CAP_UNKNOWN;
1615 wlan_hdd_tdls_set_peer_link_status(
1616 curr_peer,
1617 eTDLS_LINK_IDLE,
1618 eTDLS_LINK_UNSPECIFIED);
1619
1620 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1621 "%s: TDLS is disabled. Resetting link_status of peer "
1622 MAC_ADDRESS_STR " to %d, tdls_support %d", __func__,
1623 MAC_ADDR_ARRAY(curr_peer->peerMac),
1624 curr_peer->link_status, curr_peer->tdls_support);
1625 }
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001626 }
1627 else
1628 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05301629 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001630 "Rssi Threshold not met: "MAC_ADDRESS_STR" rssi = %d threshold = %d ",
1631 MAC_ADDR_ARRAY(curr_peer->peerMac), curr_peer->rssi,
1632 pHddTdlsCtx->threshold_config.rssi_trigger_threshold);
Sunil Duttb0d39242014-09-10 23:54:51 +05301633
1634 /* if RSSI threshold is not met then allow further discovery
1635 * attempts by decrementing count for the last attempt
1636 */
1637 if (curr_peer->discovery_attempt)
1638 curr_peer->discovery_attempt--;
1639
Atul Mittal115287b2014-07-08 13:26:33 +05301640 wlan_hdd_tdls_set_peer_link_status(curr_peer,
1641 eTDLS_LINK_IDLE,
1642 eTDLS_LINK_UNSPECIFIED);
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001643 }
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301644 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala901e8922013-03-04 23:45:58 -08001645 }
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001646 else
1647 {
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301648 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001649 wlan_hdd_tdls_check_bmps(pAdapter);
1650 }
Chilam NG571c65a2013-01-19 12:27:36 +05301651
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05301652 EXIT();
Hoonki Lee387663d2013-02-05 18:08:43 -08001653 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +05301654}
1655
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301656int wlan_hdd_tdls_set_peer_caps(hdd_adapter_t *pAdapter,
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05301657#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1658 const u8 *mac,
1659#else
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301660 u8 *mac,
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05301661#endif
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301662 tCsrStaParams *StaParams,
1663 tANI_BOOLEAN isBufSta,
Masti, Narayanraddic754cdc2015-12-24 18:22:36 +05301664 tANI_BOOLEAN isOffChannelSupported,
1665 tANI_BOOLEAN isQosWmmSta)
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301666{
1667 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301668 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301669
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301670 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1671 return -EINVAL;
1672
1673 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301674 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
1675 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301676 {
1677 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1678 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301679 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301680 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301681 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301682
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301683 curr_peer->uapsdQueues = StaParams->uapsd_queues;
1684 curr_peer->maxSp = StaParams->max_sp;
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301685 curr_peer->isBufSta = isBufSta;
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301686 curr_peer->isOffChannelSupported = isOffChannelSupported;
1687
1688 vos_mem_copy(curr_peer->supported_channels,
1689 StaParams->supported_channels,
1690 StaParams->supported_channels_len);
1691
1692 curr_peer->supported_channels_len =
1693 StaParams->supported_channels_len;
1694
1695 vos_mem_copy(curr_peer->supported_oper_classes,
1696 StaParams->supported_oper_classes,
1697 StaParams->supported_oper_classes_len);
1698
1699 curr_peer->supported_oper_classes_len =
1700 StaParams->supported_oper_classes_len;
Masti, Narayanraddic754cdc2015-12-24 18:22:36 +05301701 curr_peer->qos = isQosWmmSta;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301702
1703 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301704 return 0;
1705}
1706
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301707int wlan_hdd_tdls_get_link_establish_params(hdd_adapter_t *pAdapter,
1708#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1709 const u8 *mac,
1710#else
1711 u8 *mac,
1712#endif
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301713 tCsrTdlsLinkEstablishParams* tdlsLinkEstablishParams)
1714{
1715 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301716 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301717
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301718 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1719 return -EINVAL;
1720
1721 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301722 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
1723 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301724 {
1725 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1726 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301727 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301728 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301729 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301730
1731 tdlsLinkEstablishParams->isResponder = curr_peer->is_responder;
1732 tdlsLinkEstablishParams->uapsdQueues = curr_peer->uapsdQueues;
1733 tdlsLinkEstablishParams->maxSp = curr_peer->maxSp;
1734 tdlsLinkEstablishParams->isBufSta = curr_peer->isBufSta;
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301735 tdlsLinkEstablishParams->isOffChannelSupported =
1736 curr_peer->isOffChannelSupported;
1737
1738 vos_mem_copy(tdlsLinkEstablishParams->supportedChannels,
1739 curr_peer->supported_channels,
1740 curr_peer->supported_channels_len);
1741
1742 tdlsLinkEstablishParams->supportedChannelsLen =
1743 curr_peer->supported_channels_len;
1744
1745 vos_mem_copy(tdlsLinkEstablishParams->supportedOperClasses,
1746 curr_peer->supported_oper_classes,
1747 curr_peer->supported_oper_classes_len);
1748
1749 tdlsLinkEstablishParams->supportedOperClassesLen =
1750 curr_peer->supported_oper_classes_len;
Agarwal Ashish16020c42014-12-29 22:01:11 +05301751 tdlsLinkEstablishParams->qos = curr_peer->qos;
1752
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301753 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301754 return 0;
1755}
1756
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301757int wlan_hdd_tdls_set_rssi(hdd_adapter_t *pAdapter,
1758#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1759 const u8 *mac,
1760#else
1761 u8 *mac,
1762#endif
1763 tANI_S8 rxRssi)
Chilam NG571c65a2013-01-19 12:27:36 +05301764{
1765 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05301766 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
Chilam NG571c65a2013-01-19 12:27:36 +05301767
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05301768 if (0 != (wlan_hdd_validate_context(hdd_ctx))) {
1769 return -1;
1770 }
1771
1772 mutex_lock(&hdd_ctx->tdls_lock);
1773 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Hoonki Lee387663d2013-02-05 18:08:43 -08001774 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301775 {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05301776 mutex_unlock(&hdd_ctx->tdls_lock);
1777 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1778 FL("curr_peer is NULL"));
Hoonki Lee387663d2013-02-05 18:08:43 -08001779 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301780 }
Chilam NG571c65a2013-01-19 12:27:36 +05301781
1782 curr_peer->rssi = rxRssi;
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05301783 mutex_unlock(&hdd_ctx->tdls_lock);
Chilam NG571c65a2013-01-19 12:27:36 +05301784
Hoonki Lee387663d2013-02-05 18:08:43 -08001785 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +05301786}
1787
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301788int wlan_hdd_tdls_set_responder(hdd_adapter_t *pAdapter,
1789#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1790 const u8 *mac,
1791#else
1792 u8 *mac,
1793#endif
1794 tANI_U8 responder)
Hoonki Leea34dd892013-02-05 22:56:02 -08001795{
1796 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301797 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Leea34dd892013-02-05 22:56:02 -08001798
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301799 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1800 return -EINVAL;
1801
1802 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001803 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001804 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301805 {
1806 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1807 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301808 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leea34dd892013-02-05 22:56:02 -08001809 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301810 }
Hoonki Leea34dd892013-02-05 22:56:02 -08001811
1812 curr_peer->is_responder = responder;
1813
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301814 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leea34dd892013-02-05 22:56:02 -08001815 return 0;
1816}
1817
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301818int wlan_hdd_tdls_set_signature(hdd_adapter_t *pAdapter,
1819#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1820 const u8 *mac,
1821#else
1822 u8 *mac,
1823#endif
1824 tANI_U8 uSignature)
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001825{
1826 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301827 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001828
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301829 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1830 return -EINVAL;
1831
1832 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001833 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001834 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301835 {
1836 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1837 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301838 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001839 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301840 }
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001841
1842 curr_peer->signature = uSignature;
1843
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301844 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001845 return 0;
1846}
1847
Hoonki Leea34dd892013-02-05 22:56:02 -08001848
Hoonki Lee387663d2013-02-05 18:08:43 -08001849void wlan_hdd_tdls_extract_da(struct sk_buff *skb, u8 *mac)
Chilam NG571c65a2013-01-19 12:27:36 +05301850{
Chilam NG571c65a2013-01-19 12:27:36 +05301851 memcpy(mac, skb->data, 6);
Chilam NG571c65a2013-01-19 12:27:36 +05301852}
1853
Hoonki Lee387663d2013-02-05 18:08:43 -08001854void wlan_hdd_tdls_extract_sa(struct sk_buff *skb, u8 *mac)
Chilam Ng1279e232013-01-25 15:06:52 -08001855{
Chilam Ng1279e232013-01-25 15:06:52 -08001856 memcpy(mac, skb->data+6, 6);
Chilam Ng1279e232013-01-25 15:06:52 -08001857}
1858
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301859/**
1860 * wlan_hdd_tdls_is_forced_peer - function to check if peer is forced peer
1861 * @adapter: pointer to hdd apater
1862 * @mac: peer mac address
1863 *
1864 * Function identified is the peer is forced for tdls connection
1865 *
1866 * return: true: peer is forced false: peer is not forced
1867 */
1868static bool wlan_hdd_tdls_is_forced_peer(hdd_adapter_t *adapter,
1869 const u8 *mac)
1870{
1871 hddTdlsPeer_t *peer;
1872 hdd_context_t *hddctx = WLAN_HDD_GET_CTX(adapter);
1873 bool is_forced_peer;
1874
1875 mutex_lock(&hddctx->tdls_lock);
1876 peer = wlan_hdd_tdls_find_peer(adapter, mac, FALSE);
1877 if (!peer)
1878 {
1879 is_forced_peer = false;
1880 goto ret;
1881 }
1882
1883 if (!peer->isForcedPeer)
1884 {
1885 is_forced_peer = false;
1886 goto ret;
1887 }
1888 is_forced_peer = true;
1889
1890ret:
1891 mutex_unlock(&hddctx->tdls_lock);
1892 return is_forced_peer;
1893}
1894
1895/**
1896 * wlan_hdd_tdls_increment_pkt_count - function to increment tdls tx packet cnt
1897 * @pAdapter: pointer to hdd adapter
1898 * @skb: pointer to sk_buff
1899 *
1900 * Function to increment packet count if packet is destined to tdls peer
1901 *
1902 * return: None
1903 */
1904static void wlan_hdd_tdls_increment_pkt_count(hdd_adapter_t *pAdapter,
1905 struct sk_buff *skb)
Chilam NG571c65a2013-01-19 12:27:36 +05301906{
Hoonki Lee387663d2013-02-05 18:08:43 -08001907 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001908 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301909 hdd_station_ctx_t *hdd_sta_ctx;
1910 u8 mac[6];
Chilam NG571c65a2013-01-19 12:27:36 +05301911
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301912 if (0 != (wlan_hdd_validate_context(pHddCtx)))
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301913 return;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301914
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001915 if (eTDLS_SUPPORT_ENABLED != pHddCtx->tdls_mode)
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301916 goto error;
1917
1918 if (!pHddCtx->cfg_ini->fEnableTDLSImplicitTrigger)
1919 goto error;
1920
1921 wlan_hdd_tdls_extract_da(skb, mac);
1922
1923 if (pHddCtx->cfg_ini->fTDLSExternalControl)
1924 {
1925 if (!wlan_hdd_tdls_is_forced_peer(pAdapter, mac))
1926 goto error;
1927 }
1928
1929 hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
1930
1931 if (vos_is_macaddr_group((v_MACADDR_t *)mac))
1932 {
1933 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_MED,
1934 "broadcast packet, not adding to peer list");
1935 goto error;
1936 }
1937
1938 if (memcmp(hdd_sta_ctx->conn_info.bssId, mac, 6) == 0) {
1939 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_MED,
1940 "packet da is bssid, not adding to peer list");
1941 goto error;
1942 }
Hoonki Leebfee0342013-01-21 16:43:45 -08001943
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301944 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001945 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08001946 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301947 {
c_hpothue21931b2014-09-08 14:02:14 +05301948 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1949 FL("curr_peer is NULL"));
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301950 mutex_unlock(&pHddCtx->tdls_lock);
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301951 goto error;
c_hpothu7f63e882013-10-02 19:13:35 +05301952 }
Chilam NG571c65a2013-01-19 12:27:36 +05301953
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301954 curr_peer->tx_pkt++;
Chilam NG571c65a2013-01-19 12:27:36 +05301955
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301956 mutex_unlock(&pHddCtx->tdls_lock);
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301957
1958error:
1959 return;
1960}
1961
1962void wlan_hdd_tdls_notify_packet(hdd_adapter_t *adapter, struct sk_buff *skb)
1963{
1964 wlan_hdd_tdls_increment_pkt_count(adapter, skb);
Chilam NG571c65a2013-01-19 12:27:36 +05301965}
1966
Hoonki Lee27511902013-03-14 18:19:06 -07001967static int wlan_hdd_tdls_check_config(tdls_config_params_t *config)
1968{
1969 if (config->tdls > 2)
1970 {
1971 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 1st argument %d. <0...2>", __func__, config->tdls);
1972 return -1;
1973 }
1974 if (config->tx_period_t < CFG_TDLS_TX_STATS_PERIOD_MIN ||
1975 config->tx_period_t > CFG_TDLS_TX_STATS_PERIOD_MAX)
1976 {
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001977 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 2nd argument %d. <%d...%ld>", __func__, config->tx_period_t,
Hoonki Lee27511902013-03-14 18:19:06 -07001978 CFG_TDLS_TX_STATS_PERIOD_MIN, CFG_TDLS_TX_STATS_PERIOD_MAX);
1979 return -1;
1980 }
1981 if (config->tx_packet_n < CFG_TDLS_TX_PACKET_THRESHOLD_MIN ||
1982 config->tx_packet_n > CFG_TDLS_TX_PACKET_THRESHOLD_MAX)
1983 {
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001984 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 3rd argument %d. <%d...%ld>", __func__, config->tx_packet_n,
Hoonki Lee27511902013-03-14 18:19:06 -07001985 CFG_TDLS_TX_PACKET_THRESHOLD_MIN, CFG_TDLS_TX_PACKET_THRESHOLD_MAX);
1986 return -1;
1987 }
1988 if (config->discovery_period_t < CFG_TDLS_DISCOVERY_PERIOD_MIN ||
1989 config->discovery_period_t > CFG_TDLS_DISCOVERY_PERIOD_MAX)
1990 {
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001991 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 4th argument %d. <%d...%ld>", __func__, config->discovery_period_t,
Hoonki Lee27511902013-03-14 18:19:06 -07001992 CFG_TDLS_DISCOVERY_PERIOD_MIN, CFG_TDLS_DISCOVERY_PERIOD_MAX);
1993 return -1;
1994 }
1995 if (config->discovery_tries_n < CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MIN ||
1996 config->discovery_tries_n > CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MAX)
1997 {
1998 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 5th argument %d. <%d...%d>", __func__, config->discovery_tries_n,
1999 CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MIN, CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MAX);
2000 return -1;
2001 }
2002 if (config->idle_timeout_t < CFG_TDLS_IDLE_TIMEOUT_MIN ||
2003 config->idle_timeout_t > CFG_TDLS_IDLE_TIMEOUT_MAX)
2004 {
2005 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 6th argument %d. <%d...%d>", __func__, config->idle_timeout_t,
2006 CFG_TDLS_IDLE_TIMEOUT_MIN, CFG_TDLS_IDLE_TIMEOUT_MAX);
2007 return -1;
2008 }
2009 if (config->idle_packet_n < CFG_TDLS_IDLE_PACKET_THRESHOLD_MIN ||
2010 config->idle_packet_n > CFG_TDLS_IDLE_PACKET_THRESHOLD_MAX)
2011 {
2012 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 7th argument %d. <%d...%d>", __func__, config->idle_packet_n,
2013 CFG_TDLS_IDLE_PACKET_THRESHOLD_MIN, CFG_TDLS_IDLE_PACKET_THRESHOLD_MAX);
2014 return -1;
2015 }
2016 if (config->rssi_hysteresis < CFG_TDLS_RSSI_HYSTERESIS_MIN ||
2017 config->rssi_hysteresis > CFG_TDLS_RSSI_HYSTERESIS_MAX)
2018 {
2019 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 8th argument %d. <%d...%d>", __func__, config->rssi_hysteresis,
2020 CFG_TDLS_RSSI_HYSTERESIS_MIN, CFG_TDLS_RSSI_HYSTERESIS_MAX);
2021 return -1;
2022 }
2023 if (config->rssi_trigger_threshold < CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MIN ||
2024 config->rssi_trigger_threshold > CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MAX)
2025 {
2026 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 9th argument %d. <%d...%d>", __func__, config->rssi_trigger_threshold,
2027 CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MIN, CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MAX);
2028 return -1;
2029 }
2030 if (config->rssi_teardown_threshold < CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MIN ||
2031 config->rssi_teardown_threshold > CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MAX)
2032 {
2033 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 10th argument %d. <%d...%d>", __func__, config->rssi_teardown_threshold,
2034 CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MIN, CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MAX);
2035 return -1;
2036 }
2037 return 0;
2038}
2039
Chilam Ng01120412013-02-19 18:32:21 -08002040int wlan_hdd_tdls_set_params(struct net_device *dev, tdls_config_params_t *config)
Chilam NG571c65a2013-01-19 12:27:36 +05302041{
Chilam Ng01120412013-02-19 18:32:21 -08002042 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
2043 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002044 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Hoonki Lee27511902013-03-14 18:19:06 -07002045 eTDLSSupportMode req_tdls_mode;
Hoonki Leebfee0342013-01-21 16:43:45 -08002046
Masti, Narayanraddi4fbdf762016-02-25 17:24:39 +05302047 if ((TRUE != pHddCtx->cfg_ini->fEnableTDLSSupport) &&
2048 (TRUE != sme_IsFeatureSupportedByFW(TDLS)))
2049 {
2050 hddLog(LOGE,
2051 FL("TDLS not enabled (%d) or FW doesn't support (%d)"),
2052 pHddCtx->cfg_ini->fEnableTDLSSupport,
2053 sme_IsFeatureSupportedByFW(TDLS));
2054 pHddCtx->tdls_mode = eTDLS_SUPPORT_NOT_ENABLED;
2055 return -EINVAL;
2056 }
2057
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302058 mutex_lock(&pHddCtx->tdls_lock);
Hoonki Lee27511902013-03-14 18:19:06 -07002059 if (NULL == pHddTdlsCtx)
2060 {
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302061 mutex_unlock(&pHddCtx->tdls_lock);
c_hpothu7f63e882013-10-02 19:13:35 +05302062 hddLog(VOS_TRACE_LEVEL_ERROR, FL("TDLS not enabled!"));
Hoonki Lee27511902013-03-14 18:19:06 -07002063 return -1;
Chilam Ng01120412013-02-19 18:32:21 -08002064 }
Chilam NG571c65a2013-01-19 12:27:36 +05302065
Hoonki Lee27511902013-03-14 18:19:06 -07002066 if (wlan_hdd_tdls_check_config(config) != 0)
2067 {
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302068 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee27511902013-03-14 18:19:06 -07002069 return -1;
2070 }
2071
2072 /* config->tdls is mapped to 0->1, 1->2, 2->3 */
2073 req_tdls_mode = config->tdls + 1;
2074 if (pHddCtx->tdls_mode == req_tdls_mode)
2075 {
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302076 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee27511902013-03-14 18:19:06 -07002077 hddLog(VOS_TRACE_LEVEL_ERROR, "%s already in mode %d", __func__, config->tdls);
2078 return -1;
2079 }
2080
2081 /* copy the configuration only when given tdls mode is implicit trigger enable */
2082 if (eTDLS_SUPPORT_ENABLED == req_tdls_mode)
2083 {
Chilam Ng01120412013-02-19 18:32:21 -08002084 memcpy(&pHddTdlsCtx->threshold_config, config, sizeof(tdls_config_params_t));
2085 }
Chilam NG571c65a2013-01-19 12:27:36 +05302086
Chilam Ng01120412013-02-19 18:32:21 -08002087 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2088 "iw set tdls params: %d %d %d %d %d %d %d %d %d %d",
2089 config->tdls,
2090 config->tx_period_t,
2091 config->tx_packet_n,
2092 config->discovery_period_t,
2093 config->discovery_tries_n,
2094 config->idle_timeout_t,
2095 config->idle_packet_n,
2096 config->rssi_hysteresis,
2097 config->rssi_trigger_threshold,
2098 config->rssi_teardown_threshold);
Chilam NG571c65a2013-01-19 12:27:36 +05302099
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302100 mutex_unlock(&pHddCtx->tdls_lock);
2101
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302102 wlan_hdd_tdls_set_mode(pHddCtx, req_tdls_mode, TRUE,
2103 HDD_SET_TDLS_MODE_SOURCE_USER);
Chilam Ng01120412013-02-19 18:32:21 -08002104
Chilam NG571c65a2013-01-19 12:27:36 +05302105 return 0;
2106}
2107
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05302108int wlan_hdd_tdls_set_sta_id(hdd_adapter_t *pAdapter,
2109#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2110 const u8 *mac,
2111#else
2112 u8 *mac,
2113#endif
2114 u8 staId)
Kiran V1ccee932012-12-12 14:49:46 -08002115{
Hoonki Lee387663d2013-02-05 18:08:43 -08002116 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302117 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Kiran V1ccee932012-12-12 14:49:46 -08002118
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302119 if (0 != (wlan_hdd_validate_context(pHddCtx)))
2120 return -EINVAL;
2121
2122 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002123 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08002124 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05302125 {
2126 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2127 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302128 mutex_unlock(&pHddCtx->tdls_lock);
Chilam NG571c65a2013-01-19 12:27:36 +05302129 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05302130 }
Chilam NG571c65a2013-01-19 12:27:36 +05302131
Hoonki Lee387663d2013-02-05 18:08:43 -08002132 curr_peer->staId = staId;
Chilam NG571c65a2013-01-19 12:27:36 +05302133
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302134 mutex_unlock(&pHddCtx->tdls_lock);
Chilam NG571c65a2013-01-19 12:27:36 +05302135 return 0;
Kiran V1ccee932012-12-12 14:49:46 -08002136}
2137
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05302138int wlan_hdd_tdls_set_force_peer(hdd_adapter_t *pAdapter,
2139#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2140 const u8 *mac,
2141#else
2142 u8 *mac,
2143#endif
Naresh Jayaram937abdf2013-11-26 19:50:25 +05302144 tANI_BOOLEAN forcePeer)
Sunil Dutt41de4e22013-11-14 18:09:02 +05302145{
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +05302146 /* NOTE:
2147 * Hold mutex tdls_lock before calling this function
2148 */
Naresh Jayaram937abdf2013-11-26 19:50:25 +05302149 hddTdlsPeer_t *curr_peer;
Sunil Dutt41de4e22013-11-14 18:09:02 +05302150 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2151
2152 if ((NULL == pHddCtx)) return -1;
2153
Naresh Jayaram937abdf2013-11-26 19:50:25 +05302154 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
2155 if (curr_peer == NULL)
Sunil Dutt41de4e22013-11-14 18:09:02 +05302156 goto error;
Naresh Jayaram937abdf2013-11-26 19:50:25 +05302157 curr_peer->isForcedPeer = forcePeer;
Naresh Jayaramca7bc3a2014-02-04 23:03:04 +05302158
Naresh Jayaramca7bc3a2014-02-04 23:03:04 +05302159 return 0;
Sunil Dutt41de4e22013-11-14 18:09:02 +05302160error:
Sunil Dutt41de4e22013-11-14 18:09:02 +05302161 return -1;
2162}
2163
Hoonki Lee387663d2013-02-05 18:08:43 -08002164/* if peerMac is found, then it returns pointer to hddTdlsPeer_t
2165 otherwise, it returns NULL
2166*/
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05302167hddTdlsPeer_t *wlan_hdd_tdls_find_peer(hdd_adapter_t *pAdapter,
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05302168 const u8 *mac,
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302169 tANI_BOOLEAN mutexLock)
Kiran V1ccee932012-12-12 14:49:46 -08002170{
Hoonki Lee387663d2013-02-05 18:08:43 -08002171 u8 key;
2172 struct list_head *pos;
2173 struct list_head *head;
2174 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002175 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302176 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee387663d2013-02-05 18:08:43 -08002177
c_hpothu7f63e882013-10-02 19:13:35 +05302178 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2179 {
c_hpothu7f63e882013-10-02 19:13:35 +05302180 return 0;
2181 }
Hoonki Lee387663d2013-02-05 18:08:43 -08002182
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302183 if ( mutexLock )
Hoonki Lee387663d2013-02-05 18:08:43 -08002184 {
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302185 mutex_lock(&pHddCtx->tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -08002186 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002187 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002188 if (NULL == pHddTdlsCtx)
2189 {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302190 if ( mutexLock )
2191 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002192 return NULL;
2193 }
2194
2195 key = wlan_hdd_tdls_hash_key(mac);
2196
2197 head = &pHddTdlsCtx->peer_list[key];
Hoonki Lee387663d2013-02-05 18:08:43 -08002198
2199 list_for_each(pos, head) {
2200 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
2201 if (!memcmp(mac, curr_peer->peerMac, 6)) {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302202 if ( mutexLock )
2203 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -08002204 return curr_peer;
2205 }
2206 }
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302207 if ( mutexLock )
2208 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302209
Hoonki Lee387663d2013-02-05 18:08:43 -08002210 return NULL;
2211}
2212
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05302213hddTdlsPeer_t *wlan_hdd_tdls_find_all_peer(hdd_context_t *pHddCtx,
2214#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2215 const u8 *mac
2216#else
2217 u8 *mac
2218#endif
2219)
Hoonki Leea6d49be2013-04-05 09:43:25 -07002220{
2221 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2222 hdd_adapter_t *pAdapter = NULL;
2223 tdlsCtx_t *pHddTdlsCtx = NULL;
2224 hddTdlsPeer_t *curr_peer= NULL;
2225 VOS_STATUS status = 0;
2226
2227 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2228 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2229 {
2230 pAdapter = pAdapterNode->pAdapter;
2231
2232 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2233 if (NULL != pHddTdlsCtx)
2234 {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302235 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Hoonki Leea6d49be2013-04-05 09:43:25 -07002236 if (curr_peer)
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302237 {
Hoonki Leea6d49be2013-04-05 09:43:25 -07002238 return curr_peer;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302239 }
Hoonki Leea6d49be2013-04-05 09:43:25 -07002240 }
2241 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2242 pAdapterNode = pNext;
2243 }
2244 return curr_peer;
2245}
2246
2247
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05302248int wlan_hdd_tdls_reset_peer(hdd_adapter_t *pAdapter,
2249#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2250 const u8 *mac
2251#else
2252 u8 *mac
2253#endif
2254)
Hoonki Lee387663d2013-02-05 18:08:43 -08002255{
Chilam Ng01120412013-02-19 18:32:21 -08002256 hdd_context_t *pHddCtx;
Chilam NG571c65a2013-01-19 12:27:36 +05302257 hddTdlsPeer_t *curr_peer;
Kiran V1ccee932012-12-12 14:49:46 -08002258
Chilam Ng01120412013-02-19 18:32:21 -08002259 pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
2260
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302261 if (0 != (wlan_hdd_validate_context(pHddCtx)))
2262 return -EINVAL;
2263
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002264 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08002265 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05302266 {
2267 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2268 "%s: curr_peer is NULL", __func__);
Hoonki Lee387663d2013-02-05 18:08:43 -08002269 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05302270 }
Chilam NG571c65a2013-01-19 12:27:36 +05302271
Atul Mittal115287b2014-07-08 13:26:33 +05302272 wlan_hdd_tdls_set_peer_link_status(curr_peer,
2273 eTDLS_LINK_IDLE,
2274 eTDLS_LINK_UNSPECIFIED);
Hoonki Leecdd8e962013-01-20 00:45:46 -08002275 curr_peer->staId = 0;
Hoonki Lee387663d2013-02-05 18:08:43 -08002276
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302277 /* Throughput Monitor shall disable the split scan when
2278 * TDLS scan coexistance is disabled.At this point of time
2279 * since TDLS scan coexistance is not meeting the criteria
2280 * to be operational, explicitly make it false to enable
2281 * throughput monitor takes the control of split scan.
2282 */
2283 if (pHddCtx->isTdlsScanCoexistence == TRUE)
2284 {
2285 pHddCtx->isTdlsScanCoexistence = FALSE;
2286 }
2287
Masti, Narayanraddie8e14622015-10-17 16:10:54 +05302288 if((eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode) &&
2289 (vos_timer_is_initialized(&curr_peer->peerIdleTimer)) &&
2290 (VOS_TIMER_STATE_RUNNING ==
2291 vos_timer_getCurrentState(&curr_peer->peerIdleTimer)))
2292 {
Chilam Nga75d8b62013-01-29 01:35:59 -08002293 vos_timer_stop( &curr_peer->peerIdleTimer );
Chilam Nga75d8b62013-01-29 01:35:59 -08002294 }
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302295
Hoonki Lee387663d2013-02-05 18:08:43 -08002296 return 0;
Hoonki Leecdd8e962013-01-20 00:45:46 -08002297}
2298
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07002299/* Caller has to take the lock before calling this function */
Hoonki Lee27511902013-03-14 18:19:06 -07002300static void wlan_tdd_tdls_reset_tx_rx(tdlsCtx_t *pHddTdlsCtx)
2301{
2302 int i;
2303 struct list_head *head;
2304 hddTdlsPeer_t *tmp;
2305 struct list_head *pos, *q;
2306
Hoonki Lee27511902013-03-14 18:19:06 -07002307 for (i = 0; i < 256; i++) {
2308 head = &pHddTdlsCtx->peer_list[i];
2309 list_for_each_safe (pos, q, head) {
2310 tmp = list_entry(pos, hddTdlsPeer_t, node);
2311 tmp->tx_pkt = 0;
2312 tmp->rx_pkt = 0;
2313 }
2314 }
Hoonki Lee27511902013-03-14 18:19:06 -07002315
2316 return ;
2317}
2318
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07002319/* Caller has to take the lock before calling this function */
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002320static tANI_S32 wlan_hdd_tdls_peer_reset_discovery_processed(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002321{
2322 int i;
2323 struct list_head *head;
2324 hddTdlsPeer_t *tmp;
2325 struct list_head *pos, *q;
2326
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002327 pHddTdlsCtx->discovery_peer_cnt = 0;
2328
2329 for (i = 0; i < 256; i++) {
2330 head = &pHddTdlsCtx->peer_list[i];
2331 list_for_each_safe (pos, q, head) {
2332 tmp = list_entry(pos, hddTdlsPeer_t, node);
2333 tmp->discovery_processed = 0;
2334 }
2335 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002336
2337 return 0;
2338}
2339
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002340static tANI_S32 wlan_hdd_get_tdls_discovery_peer_cnt(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002341{
2342 int i;
2343 struct list_head *head;
2344 struct list_head *pos, *q;
2345 int discovery_peer_cnt=0;
2346 hddTdlsPeer_t *tmp;
2347
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002348 /*
2349 * This function expects the callers to acquire the Mutex.
2350 */
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002351
2352 for (i = 0; i < 256; i++) {
2353 head = &pHddTdlsCtx->peer_list[i];
2354 list_for_each_safe (pos, q, head) {
2355 tmp = list_entry(pos, hddTdlsPeer_t, node);
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302356 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Chilam Ng01120412013-02-19 18:32:21 -08002357 "%s, %d, " MAC_ADDRESS_STR, __func__, i,
2358 MAC_ADDR_ARRAY(tmp->peerMac));
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002359 discovery_peer_cnt++;
2360 }
2361 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002362 return discovery_peer_cnt;
2363}
2364
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002365tANI_U16 wlan_hdd_tdlsConnectedPeers(hdd_adapter_t *pAdapter)
Lee Hoonkic1262f22013-01-24 21:59:00 -08002366{
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302367 hdd_context_t *pHddCtx = NULL;
2368
2369 if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
2370 {
2371 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Jeff Johnsonc135a9a2017-09-19 08:37:24 -07002372 FL("invalid pAdapter: %pK"), pAdapter);
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302373 return 0;
2374 }
2375 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002376
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302377 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05302378 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2379 {
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002380 return 0;
c_hpothu7f63e882013-10-02 19:13:35 +05302381 }
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302382 EXIT();
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002383 return pHddCtx->connected_peer_count;
Lee Hoonkic1262f22013-01-24 21:59:00 -08002384}
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002385
Pradeep Reddy POTTETIe309c152015-02-06 13:21:07 +05302386hddTdlsPeer_t *wlan_hdd_tdls_get_connected_peer(hdd_adapter_t *pAdapter)
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302387{
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +05302388 /* NOTE:
2389 * Hold mutext tdls_lock before calling this function
2390 */
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302391 int i;
2392 struct list_head *head;
2393 struct list_head *pos;
2394 hddTdlsPeer_t *curr_peer = NULL;
2395 tdlsCtx_t *pHddTdlsCtx;
2396 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2397
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302398 ENTER();
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302399 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2400 {
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302401 return NULL;
2402 }
2403
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302404 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2405 if (NULL == pHddTdlsCtx) {
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302406 return NULL;
2407 }
2408 for (i = 0; i < 256; i++) {
2409 head = &pHddTdlsCtx->peer_list[i];
2410
2411 list_for_each(pos, head) {
2412 curr_peer= list_entry (pos, hddTdlsPeer_t, node);
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05302413 if (curr_peer && (curr_peer->link_status == eTDLS_LINK_CONNECTED))
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302414 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302415 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05302416 "%s: " MAC_ADDRESS_STR " eTDLS_LINK_CONNECTED",
2417 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302418 return curr_peer;
2419 }
2420 }
2421 }
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302422
2423 EXIT();
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302424 return NULL;
2425}
2426
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002427int wlan_hdd_tdls_get_all_peers(hdd_adapter_t *pAdapter, char *buf, int buflen)
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002428{
2429 int i;
2430 int len, init_len;
Hoonki Lee387663d2013-02-05 18:08:43 -08002431 struct list_head *head;
2432 struct list_head *pos;
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002433 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002434 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302435 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2436
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302437 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05302438 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2439 {
c_hpothu7f63e882013-10-02 19:13:35 +05302440 return 0;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302441 }
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002442
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002443 init_len = buflen;
Sameer Thalappilb0a30232013-09-27 15:37:48 -07002444 len = scnprintf(buf, buflen, "\n%-18s%-3s%-4s%-3s%-5s\n",
2445 "MAC", "Id", "cap", "up", "RSSI");
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002446 buf += len;
2447 buflen -= len;
2448 /* 1234567890123456789012345678901234567 */
Sameer Thalappilb0a30232013-09-27 15:37:48 -07002449 len = scnprintf(buf, buflen, "---------------------------------\n");
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002450 buf += len;
2451 buflen -= len;
2452
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302453 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002454 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002455 if (NULL == pHddTdlsCtx) {
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302456 mutex_unlock(&pHddCtx->tdls_lock);
Sameer Thalappilb0a30232013-09-27 15:37:48 -07002457 len = scnprintf(buf, buflen, "TDLS not enabled\n");
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002458 return len;
2459 }
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002460 for (i = 0; i < 256; i++) {
Hoonki Lee387663d2013-02-05 18:08:43 -08002461 head = &pHddTdlsCtx->peer_list[i];
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002462
Hoonki Lee387663d2013-02-05 18:08:43 -08002463 list_for_each(pos, head) {
2464 curr_peer= list_entry (pos, hddTdlsPeer_t, node);
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002465
Hoonki Lee387663d2013-02-05 18:08:43 -08002466 if (buflen < 32+1)
2467 break;
Sameer Thalappilb0a30232013-09-27 15:37:48 -07002468 len = scnprintf(buf, buflen,
Chilam Ng01120412013-02-19 18:32:21 -08002469 MAC_ADDRESS_STR"%3d%4s%3s%5d\n",
2470 MAC_ADDR_ARRAY(curr_peer->peerMac),
Hoonki Lee387663d2013-02-05 18:08:43 -08002471 curr_peer->staId,
2472 (curr_peer->tdls_support == eTDLS_CAP_SUPPORTED) ? "Y":"N",
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07002473 TDLS_IS_CONNECTED(curr_peer) ? "Y":"N",
Hoonki Lee387663d2013-02-05 18:08:43 -08002474 curr_peer->rssi);
2475 buf += len;
2476 buflen -= len;
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002477 }
2478 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302479 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302480
2481 EXIT();
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002482 return init_len-buflen;
2483}
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002484
2485void wlan_hdd_tdls_connection_callback(hdd_adapter_t *pAdapter)
2486{
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302487 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302488 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08002489
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302490 if ((NULL == pHddCtx))
c_hpothu7f63e882013-10-02 19:13:35 +05302491 {
Agarwal Ashishbf98caf2014-03-25 13:29:11 +05302492 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
2493 FL("pHddCtx or pHddTdlsCtx points to NULL"));
c_hpothu7f63e882013-10-02 19:13:35 +05302494 return;
2495 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302496
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302497 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07002498
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302499 if (0 != wlan_hdd_sta_tdls_init(pAdapter))
2500 {
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302501 mutex_unlock(&pHddCtx->tdls_lock);
Abhishek Singh58749d62016-02-03 15:27:20 +05302502 hddLog(LOGE, FL("wlan_hdd_sta_tdls_init failed"));
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302503 return;
2504 }
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302505
2506 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2507 if ((NULL == pHddTdlsCtx))
2508 {
Hema Aparna Medicharla8bb6f782015-03-09 12:35:05 +05302509 mutex_unlock(&pHddCtx->tdls_lock);
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302510 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
2511 FL("pHddCtx or pHddTdlsCtx points to NULL device mode = %d"), pAdapter->device_mode);
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302512 return;
2513 }
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302514 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002515 "%s, update %d discover %d", __func__,
2516 pHddTdlsCtx->threshold_config.tx_period_t,
2517 pHddTdlsCtx->threshold_config.discovery_period_t);
2518
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08002519 if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode)
2520 {
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002521 wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002522 pHddTdlsCtx->discovery_sent_cnt = 0;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002523 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002524
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002525 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
2526 &pHddTdlsCtx->peerUpdateTimer,
2527 pHddTdlsCtx->threshold_config.tx_period_t);
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08002528 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302529 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002530
2531}
2532
2533void wlan_hdd_tdls_disconnection_callback(hdd_adapter_t *pAdapter)
2534{
Masti, Narayanraddi4685ddd2016-03-15 15:17:37 +05302535 tdlsCtx_t *pHddTdlsCtx;
2536 hdd_context_t *pHddCtx;
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002537
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302538 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"%s", __func__);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002539
Masti, Narayanraddi4685ddd2016-03-15 15:17:37 +05302540 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2541
2542 if (0 != wlan_hdd_validate_context(pHddCtx))
2543 return;
2544
2545 mutex_lock(&pHddCtx->tdls_lock);
2546
2547 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002548 if (NULL == pHddTdlsCtx)
2549 {
Masti, Narayanraddi4685ddd2016-03-15 15:17:37 +05302550 mutex_unlock(&pHddCtx->tdls_lock);
Ratheesh S P36dbc932015-08-07 14:28:57 +05302551 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
c_hpothu7f63e882013-10-02 19:13:35 +05302552 FL("pHddTdlsCtx is NULL"));
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002553 return;
2554 }
Masti, Narayanraddide96b992015-01-08 13:00:58 +05302555
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002556 pHddTdlsCtx->discovery_sent_cnt = 0;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002557 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002558
Pradeep Reddy POTTETI2d4d5c42015-03-03 14:34:19 +05302559 wlan_hdd_tdls_exit(pAdapter, TRUE);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002560
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302561 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002562}
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002563
2564void wlan_hdd_tdls_mgmt_completion_callback(hdd_adapter_t *pAdapter, tANI_U32 statusCode)
2565{
2566 pAdapter->mgmtTxCompletionStatus = statusCode;
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302567 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2568 "%s: Mgmt TX Completion %d",__func__, statusCode);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002569 complete(&pAdapter->tdls_mgmt_comp);
2570}
2571
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002572void wlan_hdd_tdls_increment_peer_count(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002573{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002574 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002575
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302576 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05302577 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2578 {
c_hpothu7f63e882013-10-02 19:13:35 +05302579 return;
2580 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002581
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302582 mutex_lock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302583
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002584 pHddCtx->connected_peer_count++;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002585 wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002586
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302587 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: %d",
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002588 __func__, pHddCtx->connected_peer_count);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302589
2590 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302591
2592 EXIT();
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002593}
2594
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002595void wlan_hdd_tdls_decrement_peer_count(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002596{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002597 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002598
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302599 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05302600 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2601 {
c_hpothu7f63e882013-10-02 19:13:35 +05302602 return;
2603 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002604
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302605 mutex_lock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302606
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002607 if (pHddCtx->connected_peer_count)
2608 pHddCtx->connected_peer_count--;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002609 wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002610
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302611 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: %d",
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002612 __func__, pHddCtx->connected_peer_count);
2613
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302614 mutex_unlock(&pHddCtx->tdls_lock);
2615
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302616 EXIT();
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002617}
2618
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002619void wlan_hdd_tdls_check_bmps(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002620{
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302621
2622 tdlsCtx_t *pHddTdlsCtx = NULL;
2623 hdd_context_t *pHddCtx = NULL;
Hoonki Lee14621352013-04-16 17:51:19 -07002624 hddTdlsPeer_t *curr_peer;
Ganesh Kondabattini17e60662017-05-25 12:36:07 +05302625 VOS_STATUS status;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002626
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302627 if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
2628 {
2629 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Jeff Johnsonc135a9a2017-09-19 08:37:24 -07002630 FL("invalid pAdapter: %pK"), pAdapter);
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302631 return;
2632 }
2633
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302634 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2635
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302636 if (NULL == pHddCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302637 {
Sushant Kaushik125ae692014-11-25 17:38:48 +05302638 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302639 FL("pHddCtx points to NULL"));
c_hpothu7f63e882013-10-02 19:13:35 +05302640 return;
2641 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002642
Masti, Narayanraddifd8380e2015-10-17 16:08:37 +05302643 mutex_lock(&pHddCtx->tdls_lock);
2644 curr_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0, FALSE);
Hoonki Lee14621352013-04-16 17:51:19 -07002645 if (NULL != curr_peer)
2646 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302647 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee14621352013-04-16 17:51:19 -07002648 "%s: tdls in progress. Dont check for BMPS " MAC_ADDRESS_STR,
2649 __func__, MAC_ADDR_ARRAY (curr_peer->peerMac));
Masti, Narayanraddifd8380e2015-10-17 16:08:37 +05302650 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee14621352013-04-16 17:51:19 -07002651 return;
2652 }
2653
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302654 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2655 if (NULL == pHddTdlsCtx)
2656 {
2657 mutex_unlock(&pHddCtx->tdls_lock);
2658 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2659 FL("pHddTdlsCtx points to NULL"));
2660 return;
2661 }
Masti, Narayanraddi26378462016-01-05 18:20:28 +05302662 if ((TDLS_CTX_MAGIC != pHddCtx->scan_ctxt.magic) &&
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002663 (0 == pHddCtx->connected_peer_count) &&
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002664 (0 == pHddTdlsCtx->discovery_sent_cnt))
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002665 {
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302666 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002667 if (FALSE == sme_IsPmcBmps(WLAN_HDD_GET_HAL_CTX(pAdapter)))
2668 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302669 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002670 "%s: No TDLS peer connected/discovery sent. Enable BMPS",
2671 __func__);
Ganesh Kondabattini17e60662017-05-25 12:36:07 +05302672 status = hdd_enable_bmps_imps(pHddCtx);
2673
2674 if (status == VOS_STATUS_SUCCESS)
2675 pHddTdlsCtx->is_tdls_disabled_bmps = false;
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002676 }
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002677 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002678 else
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002679 {
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302680 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002681 if (TRUE == sme_IsPmcBmps(WLAN_HDD_GET_HAL_CTX(pAdapter)))
2682 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302683 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002684 "%s: TDLS peer connected. Disable BMPS", __func__);
Ganesh Kondabattini17e60662017-05-25 12:36:07 +05302685 status = hdd_disable_bmps_imps(pHddCtx, WLAN_HDD_INFRA_STATION);
2686
2687 if (status == VOS_STATUS_SUCCESS)
2688 pHddTdlsCtx->is_tdls_disabled_bmps = true;
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002689 }
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002690 }
2691 return;
2692}
2693
Hoonki Leefb8df672013-04-10 18:20:34 -07002694/* return pointer to hddTdlsPeer_t if TDLS is ongoing. Otherwise return NULL.
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002695 * mac - if NULL check for all the peer list, otherwise, skip this mac when skip_self is TRUE
2696 * skip_self - if TRUE, skip this mac. otherwise, check all the peer list. if
2697 mac is NULL, this argument is ignored, and check for all the peer list.
2698 */
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05302699static hddTdlsPeer_t *wlan_hdd_tdls_find_progress_peer(hdd_adapter_t *pAdapter,
2700#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2701 const u8 *mac,
2702#else
2703 u8 *mac,
2704#endif
2705 u8 skip_self)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002706{
2707 int i;
2708 struct list_head *head;
2709 hddTdlsPeer_t *curr_peer;
2710 struct list_head *pos;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302711 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302712
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302713 if (NULL == pHddTdlsCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302714 {
Ratheesh S P36dbc932015-08-07 14:28:57 +05302715 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
c_hpothu7f63e882013-10-02 19:13:35 +05302716 FL("pHddTdlsCtx is NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302717 return NULL;
c_hpothu7f63e882013-10-02 19:13:35 +05302718 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302719
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002720 for (i = 0; i < 256; i++) {
2721 head = &pHddTdlsCtx->peer_list[i];
2722 list_for_each(pos, head) {
2723 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
2724 if (skip_self && mac && !memcmp(mac, curr_peer->peerMac, 6)) {
2725 continue;
2726 }
2727 else
2728 {
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08002729 if (eTDLS_LINK_CONNECTING == curr_peer->link_status)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002730 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302731 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002732 "%s:" MAC_ADDRESS_STR " eTDLS_LINK_CONNECTING",
Gopichand Nakkalac87400e2013-03-13 18:51:00 -07002733 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
Hoonki Leefb8df672013-04-10 18:20:34 -07002734 return curr_peer;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002735 }
2736 }
2737 }
2738 }
Hoonki Leefb8df672013-04-10 18:20:34 -07002739 return NULL;
2740}
2741
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05302742hddTdlsPeer_t *wlan_hdd_tdls_is_progress(hdd_context_t *pHddCtx,
2743#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2744 const u8 *mac,
2745#else
2746 u8 *mac,
2747#endif
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302748 u8 skip_self, tANI_BOOLEAN mutexLock)
Hoonki Leefb8df672013-04-10 18:20:34 -07002749{
2750 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2751 hdd_adapter_t *pAdapter = NULL;
2752 tdlsCtx_t *pHddTdlsCtx = NULL;
2753 hddTdlsPeer_t *curr_peer= NULL;
2754 VOS_STATUS status = 0;
2755
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302756 if (mutexLock)
2757 {
2758 mutex_lock(&pHddCtx->tdls_lock);
2759 }
Hoonki Leefb8df672013-04-10 18:20:34 -07002760 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2761 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2762 {
2763 pAdapter = pAdapterNode->pAdapter;
2764
2765 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2766 if (NULL != pHddTdlsCtx)
2767 {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302768 curr_peer = wlan_hdd_tdls_find_progress_peer(pAdapter, mac, skip_self);
Hoonki Leefb8df672013-04-10 18:20:34 -07002769 if (curr_peer)
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302770 {
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302771 if (mutexLock)
2772 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leefb8df672013-04-10 18:20:34 -07002773 return curr_peer;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302774 }
Hoonki Leefb8df672013-04-10 18:20:34 -07002775 }
2776 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2777 pAdapterNode = pNext;
2778 }
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302779 if (mutexLock)
2780 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leefb8df672013-04-10 18:20:34 -07002781 return NULL;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002782}
Hoonki Lee27511902013-03-14 18:19:06 -07002783
2784static void wlan_hdd_tdls_implicit_disable(tdlsCtx_t *pHddTdlsCtx)
2785{
Hoonki Lee27511902013-03-14 18:19:06 -07002786 wlan_hdd_tdls_timers_stop(pHddTdlsCtx);
Hoonki Lee27511902013-03-14 18:19:06 -07002787}
2788
2789static void wlan_hdd_tdls_implicit_enable(tdlsCtx_t *pHddTdlsCtx)
2790{
2791 wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002792 pHddTdlsCtx->discovery_sent_cnt = 0;
Hoonki Lee27511902013-03-14 18:19:06 -07002793 wlan_tdd_tdls_reset_tx_rx(pHddTdlsCtx);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002794 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002795
Hoonki Lee27511902013-03-14 18:19:06 -07002796
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002797 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
2798 &pHddTdlsCtx->peerUpdateTimer,
2799 pHddTdlsCtx->threshold_config.tx_period_t);
Hoonki Lee27511902013-03-14 18:19:06 -07002800}
2801
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002802void wlan_hdd_tdls_set_mode(hdd_context_t *pHddCtx,
2803 eTDLSSupportMode tdls_mode,
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302804 v_BOOL_t bUpdateLast,
2805 enum tdls_disable_source source)
Hoonki Lee27511902013-03-14 18:19:06 -07002806{
2807 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2808 VOS_STATUS status;
2809 hdd_adapter_t *pAdapter;
2810 tdlsCtx_t *pHddTdlsCtx;
2811
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302812 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2813 "%s mode %d", __func__, (int)tdls_mode);
c_hpothu7f63e882013-10-02 19:13:35 +05302814
2815 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2816 {
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302817 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302818 }
Hoonki Lee27511902013-03-14 18:19:06 -07002819
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302820 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07002821
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002822 if (pHddCtx->tdls_mode == tdls_mode)
2823 {
Hema Aparna Medicharla8bb6f782015-03-09 12:35:05 +05302824 mutex_unlock(&pHddCtx->tdls_lock);
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302825 hddLog(VOS_TRACE_LEVEL_INFO, "%s already in mode %d", __func__,
2826 (int)tdls_mode);
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302827
2828 if (tdls_mode == eTDLS_SUPPORT_DISABLED)
2829 {
2830 /*
2831 * TDLS is already disabled hence set source mask and return
2832 */
2833 set_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
2834 return;
2835 }
2836 if (tdls_mode == eTDLS_SUPPORT_ENABLED)
2837 {
2838 /*
2839 * TDLS is already disabled hence set source mask and return
2840 */
2841 clear_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
2842 return;
2843 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002844 return;
2845 }
2846
Hoonki Lee27511902013-03-14 18:19:06 -07002847 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2848
2849 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2850 {
2851 pAdapter = pAdapterNode->pAdapter;
Hoonki Leea6d49be2013-04-05 09:43:25 -07002852 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2853 if (NULL != pHddTdlsCtx)
Hoonki Lee27511902013-03-14 18:19:06 -07002854 {
Hoonki Leea6d49be2013-04-05 09:43:25 -07002855 if(eTDLS_SUPPORT_ENABLED == tdls_mode)
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302856 {
2857 clear_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
2858
2859 /*
2860 * Check if any TDLS source bit is set and if bitmap is
2861 * not zero then we should not enable TDLS
2862 */
2863 if (pHddCtx->tdls_source_bitmap)
2864 {
2865 mutex_unlock(&pHddCtx->tdls_lock);
2866 return;
2867 }
Hoonki Leea6d49be2013-04-05 09:43:25 -07002868 wlan_hdd_tdls_implicit_enable(pHddTdlsCtx);
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302869 }
2870 else if((eTDLS_SUPPORT_DISABLED == tdls_mode))
2871 {
2872 set_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
Hoonki Leea6d49be2013-04-05 09:43:25 -07002873 wlan_hdd_tdls_implicit_disable(pHddTdlsCtx);
Ganesh Kondabattini17e60662017-05-25 12:36:07 +05302874 if (pHddTdlsCtx->is_tdls_disabled_bmps) {
2875 if (FALSE == sme_IsPmcBmps(pHddCtx->hHal)) {
2876 VOS_TRACE( VOS_MODULE_ID_HDD,
2877 VOS_TRACE_LEVEL_DEBUG,
2878 "%s: TDLS is disabled. Enable BMPS",
2879 __func__);
2880 status = hdd_enable_bmps_imps(pHddCtx);
2881
2882 if (status == VOS_STATUS_SUCCESS)
2883 pHddTdlsCtx->is_tdls_disabled_bmps = false;
2884 }
2885 }
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302886 }
2887 else if ((eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == tdls_mode))
2888 {
2889 clear_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
2890
2891 /*
2892 * Check if any TDLS source bit is set and if bitmap is
2893 * not zero then we should not enable TDLS
2894 */
2895 if (pHddCtx->tdls_source_bitmap)
2896 {
2897 mutex_unlock(&pHddCtx->tdls_lock);
2898 return;
2899 }
2900 wlan_hdd_tdls_implicit_disable(pHddTdlsCtx);
2901 }
Hoonki Lee27511902013-03-14 18:19:06 -07002902 }
2903 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2904 pAdapterNode = pNext;
2905 }
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002906 if(bUpdateLast)
2907 {
2908 pHddCtx->tdls_mode_last = tdls_mode;
2909 }
2910 else
2911 {
2912 pHddCtx->tdls_mode_last = pHddCtx->tdls_mode;
2913 }
Hoonki Lee27511902013-03-14 18:19:06 -07002914 pHddCtx->tdls_mode = tdls_mode;
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002915
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302916 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302917
Hoonki Lee27511902013-03-14 18:19:06 -07002918}
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002919
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302920static
2921void wlan_hdd_tdls_implicit_send_discovery_request(tdlsCtx_t * pHddTdlsCtx)
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002922{
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302923 hdd_context_t *pHddCtx = NULL;
2924 hddTdlsPeer_t *curr_peer = NULL, *temp_peer = NULL;
Hoonki Leed37cbb32013-04-20 00:31:14 -07002925
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302926 ENTER();
Hoonki Leed37cbb32013-04-20 00:31:14 -07002927 if (NULL == pHddTdlsCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302928 {
Ratheesh S P36dbc932015-08-07 14:28:57 +05302929 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
c_hpothu7f63e882013-10-02 19:13:35 +05302930 FL("pHddTdlsCtx is NULL"));
Hoonki Leed37cbb32013-04-20 00:31:14 -07002931 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302932 }
Hoonki Leed37cbb32013-04-20 00:31:14 -07002933
Hoonki Leed37cbb32013-04-20 00:31:14 -07002934 pHddCtx = WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter);
Hoonki Leefb8df672013-04-10 18:20:34 -07002935
c_hpothu7f63e882013-10-02 19:13:35 +05302936 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2937 {
Hoonki Leefb8df672013-04-10 18:20:34 -07002938 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302939 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002940
Hoonki Leed37cbb32013-04-20 00:31:14 -07002941 curr_peer = pHddTdlsCtx->curr_candidate;
Hoonki Leed37cbb32013-04-20 00:31:14 -07002942 if (NULL == curr_peer)
c_hpothu7f63e882013-10-02 19:13:35 +05302943 {
2944 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2945 FL("curr_peer is NULL"));
2946
Hoonki Leed37cbb32013-04-20 00:31:14 -07002947 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302948 }
Hoonki Leed37cbb32013-04-20 00:31:14 -07002949
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302950 /* This function is called in mutex_lock */
2951 temp_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0, FALSE);
Hoonki Leefb8df672013-04-10 18:20:34 -07002952 if (NULL != temp_peer)
2953 {
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302954 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2955 "%s: " MAC_ADDRESS_STR " ongoing. pre_setup ignored",
2956 __func__, MAC_ADDR_ARRAY(temp_peer->peerMac));
Hoonki Leed37cbb32013-04-20 00:31:14 -07002957 goto done;
Hoonki Leefb8df672013-04-10 18:20:34 -07002958 }
2959
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002960 if (eTDLS_CAP_UNKNOWN != curr_peer->tdls_support)
Atul Mittal115287b2014-07-08 13:26:33 +05302961 wlan_hdd_tdls_set_peer_link_status(curr_peer,
2962 eTDLS_LINK_DISCOVERING,
2963 eTDLS_LINK_SUCCESS);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002964
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302965 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2966 "%s: Implicit TDLS, Send Discovery request event", __func__);
Hoonki Leed37cbb32013-04-20 00:31:14 -07002967
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302968 cfg80211_tdls_oper_request(pHddTdlsCtx->pAdapter->dev,
2969 curr_peer->peerMac,
2970 NL80211_TDLS_DISCOVERY_REQ,
2971 FALSE,
2972 GFP_KERNEL);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002973 pHddTdlsCtx->discovery_sent_cnt++;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302974
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002975 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302976
Pradeep Reddy POTTETI219ced32014-11-14 16:33:57 +05302977 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
2978 &pHddTdlsCtx->peerDiscoveryTimeoutTimer,
2979 pHddTdlsCtx->threshold_config.tx_period_t - TDLS_DISCOVERY_TIMEOUT_BEFORE_UPDATE);
2980
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302981 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2982 "%s: discovery count %u timeout %u msec",
2983 __func__, pHddTdlsCtx->discovery_sent_cnt,
2984 pHddTdlsCtx->threshold_config.tx_period_t - TDLS_DISCOVERY_TIMEOUT_BEFORE_UPDATE);
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002985
Hoonki Leed37cbb32013-04-20 00:31:14 -07002986done:
2987 pHddTdlsCtx->curr_candidate = NULL;
2988 pHddTdlsCtx->magic = 0;
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302989 EXIT();
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002990 return;
2991}
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002992
2993tANI_U32 wlan_hdd_tdls_discovery_sent_cnt(hdd_context_t *pHddCtx)
2994{
2995 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2996 hdd_adapter_t *pAdapter = NULL;
2997 tdlsCtx_t *pHddTdlsCtx = NULL;
2998 VOS_STATUS status = 0;
2999 tANI_U32 count = 0;
3000
3001 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
3002 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
3003 {
3004 pAdapter = pAdapterNode->pAdapter;
3005
Hoonki Leea6d49be2013-04-05 09:43:25 -07003006 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
3007 if (NULL != pHddTdlsCtx)
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07003008 {
Hoonki Leea6d49be2013-04-05 09:43:25 -07003009 count = count + pHddTdlsCtx->discovery_sent_cnt;
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07003010 }
3011 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
3012 pAdapterNode = pNext;
3013 }
3014 return count;
3015}
3016
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07003017void wlan_hdd_tdls_check_power_save_prohibited(hdd_adapter_t *pAdapter)
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07003018{
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05303019 tdlsCtx_t *pHddTdlsCtx = NULL;
3020 hdd_context_t *pHddCtx = NULL;
Chandrasekaran, Manishekar41b8e1f2015-03-10 13:30:28 +05303021
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05303022
3023 if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
3024 {
3025 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Jeff Johnsonc135a9a2017-09-19 08:37:24 -07003026 FL("invalid pAdapter: %pK"), pAdapter);
Chandrasekaran, Manishekar41b8e1f2015-03-10 13:30:28 +05303027 return;
3028 }
3029
3030 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
3031 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07003032
3033 if ((NULL == pHddTdlsCtx) || (NULL == pHddCtx))
c_hpothu7f63e882013-10-02 19:13:35 +05303034 {
3035 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3036 FL(" pHddCtx or pHddTdlsCtx points to NULL"));
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07003037 return;
c_hpothu7f63e882013-10-02 19:13:35 +05303038 }
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07003039
3040 if ((0 == pHddCtx->connected_peer_count) &&
3041 (0 == wlan_hdd_tdls_discovery_sent_cnt(pHddCtx)))
3042 {
3043 sme_SetTdlsPowerSaveProhibited(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter), 0);
3044 return;
3045 }
3046 sme_SetTdlsPowerSaveProhibited(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter), 1);
3047 return;
3048}
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003049
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003050/* return negative = caller should stop and return error code immediately
3051 return 0 = caller should stop and return success immediately
3052 return 1 = caller can continue to scan
3053 */
3054int wlan_hdd_tdls_scan_callback (hdd_adapter_t *pAdapter,
3055 struct wiphy *wiphy,
3056#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
3057 struct net_device *dev,
3058#endif
3059 struct cfg80211_scan_request *request)
3060{
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003061 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3062 u16 connectedTdlsPeers;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303063 hddTdlsPeer_t *curr_peer, *connected_peer;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003064 unsigned long delay;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303065 hdd_config_t *cfg_param = pHddCtx->cfg_ini;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003066
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05303067 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05303068 if(0 != (wlan_hdd_validate_context(pHddCtx)))
3069 {
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003070 return 0;
c_hpothu7f63e882013-10-02 19:13:35 +05303071 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003072
3073 /* if tdls is not enabled, then continue scan */
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303074 if ((eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode))
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003075 return 1;
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303076
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303077 mutex_lock(&pHddCtx->tdls_lock);
3078 curr_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0, FALSE);
Hoonki Leefb8df672013-04-10 18:20:34 -07003079 if (NULL != curr_peer)
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003080 {
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303081 if (pHddCtx->scan_ctxt.reject++ >= TDLS_MAX_SCAN_REJECT)
Hoonki Leefb8df672013-04-10 18:20:34 -07003082 {
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303083 pHddCtx->scan_ctxt.reject = 0;
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303084 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Leefb8df672013-04-10 18:20:34 -07003085 "%s: " MAC_ADDRESS_STR ". scan rejected %d. force it to idle",
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303086 __func__, MAC_ADDR_ARRAY (curr_peer->peerMac), pHddCtx->scan_ctxt.reject);
Hoonki Leefb8df672013-04-10 18:20:34 -07003087
Atul Mittal115287b2014-07-08 13:26:33 +05303088 wlan_hdd_tdls_set_peer_link_status (curr_peer,
3089 eTDLS_LINK_IDLE,
3090 eTDLS_LINK_UNSPECIFIED);
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303091 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leefb8df672013-04-10 18:20:34 -07003092 return 1;
3093 }
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303094 mutex_unlock(&pHddCtx->tdls_lock);
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303095 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Leefb8df672013-04-10 18:20:34 -07003096 "%s: tdls in progress. scan rejected %d",
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303097 __func__, pHddCtx->scan_ctxt.reject);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003098 return -EBUSY;
3099 }
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303100 else
3101 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003102
Bala Venkateshd3d77ee2018-07-06 21:16:30 +05303103 /* if fEnableTDLSScan flag is 1 ; driverwill allow scan even if
3104 * peer station is not buffer STA capable
3105 *
3106 * RX: If there is any RX activity, device will lose RX packets,
3107 * as peer will not be aware that device is off channel.
3108 * TX: TX is stopped whenever device initiate scan.
3109 */
3110
3111 if (pHddCtx->cfg_ini->fEnableTDLSScan == 1)
3112 {
3113 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
3114 FL("Allow SCAN in all TDLS cases"));
3115 return 1;
3116 }
3117
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003118 /* tdls teardown is ongoing */
3119 if (eTDLS_SUPPORT_DISABLED == pHddCtx->tdls_mode)
3120 {
3121 connectedTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303122 if (connectedTdlsPeers && (pHddCtx->scan_ctxt.attempt < TDLS_MAX_SCAN_SCHEDULE))
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003123 {
3124 delay = (unsigned long)(TDLS_DELAY_SCAN_PER_CONNECTION*connectedTdlsPeers);
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303125 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003126 "%s: tdls disabled, but still connected_peers %d attempt %d. schedule scan %lu msec",
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303127 __func__, connectedTdlsPeers, pHddCtx->scan_ctxt.attempt, delay);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003128
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303129 wlan_hdd_defer_scan_init_work (pHddCtx, wiphy,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003130#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
3131 dev,
3132#endif
3133 request,
3134 msecs_to_jiffies(delay));
3135 /* scan should not continue */
3136 return 0;
3137 }
3138 /* no connected peer or max retry reached, scan continue */
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303139 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003140 "%s: tdls disabled. connected_peers %d attempt %d. scan allowed",
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303141 __func__, connectedTdlsPeers, pHddCtx->scan_ctxt.attempt);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003142 return 1;
3143 }
3144 /* while tdls is up, first time scan */
3145 else if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode ||
3146 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode)
3147 {
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003148 connectedTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303149
3150 /* check the TDLS link and Scan coexistance Capability */
3151 if ( (TRUE == pHddCtx->cfg_ini->fEnableTDLSScanCoexSupport) &&
3152 (TRUE == sme_IsFeatureSupportedByFW(TDLS_SCAN_COEXISTENCE)) &&
3153 (connectedTdlsPeers == 1) )
3154 {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303155 mutex_lock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303156 /* get connected peer information */
Pradeep Reddy POTTETIe309c152015-02-06 13:21:07 +05303157 connected_peer = wlan_hdd_tdls_get_connected_peer(pAdapter);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303158 if (NULL == connected_peer) {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303159 mutex_unlock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303160 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3161 "%s: Invalid connected_peer, Continue Scanning", __func__);
3162 /* scan should continue */
3163 return 1;
3164 }
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303165 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303166 ("%s: TDLS Scan Co-exist supported connectedTdlsPeers =%d buffersta =%d"),
3167 __func__,connectedTdlsPeers,connected_peer->isBufSta);
3168
3169 if (connected_peer->isBufSta)
3170 {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303171 mutex_unlock(&pHddCtx->tdls_lock);
3172 pHddCtx->isTdlsScanCoexistence = TRUE;
3173 if ((cfg_param->dynSplitscan) && (!pHddCtx->issplitscan_enabled))
3174 {
3175 pHddCtx->issplitscan_enabled = TRUE;
3176 sme_enable_disable_split_scan(
3177 WLAN_HDD_GET_HAL_CTX(pAdapter),
3178 cfg_param->nNumStaChanCombinedConc,
3179 cfg_param->nNumP2PChanCombinedConc);
3180 }
3181 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
3182 ("%s:%d TDLS Scan Co-exist supported splitscan_enabled =%d "),
3183 __func__, __LINE__, pHddCtx->issplitscan_enabled);
3184 return 1;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303185 }
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303186 else
3187 mutex_unlock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303188
3189 }
3190 else
3191 {
3192 /* Throughput Monitor shall disable the split scan when
3193 * TDLS scan coexistance is disabled.At this point of time
3194 * since TDLS scan coexistance is not meeting the criteria
3195 * to be operational, explicitly make it false to enable
3196 * throughput monitor takes the control of split scan.
3197 */
3198 pHddCtx->isTdlsScanCoexistence = FALSE;
3199 }
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303200 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303201 ("%s: TDLS Scan Co-exist not supported connectedTdlsPeers =%d"
3202 " TDLSScanCoexSupport param =%d TDLS_SCAN_COEXISTENCE =%d"),
3203 __func__, connectedTdlsPeers,
3204 pHddCtx->cfg_ini->fEnableTDLSScanCoexSupport,
3205 sme_IsFeatureSupportedByFW(TDLS_SCAN_COEXISTENCE));
3206
Atul Mittal5803b342014-09-04 15:31:19 +05303207 /* disable implicit trigger logic & tdls operatoin */
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05303208 wlan_hdd_tdls_set_mode(pHddCtx, eTDLS_SUPPORT_DISABLED, FALSE,
3209 HDD_SET_TDLS_MODE_SOURCE_SCAN);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303210 /* fall back to the implementation of teardown the peers on the scan
3211 * when the number of connected peers are more than one. TDLS Scan
3212 * coexistance feature is exercised only when a single peer is
3213 * connected and the DUT shall not advertize the Buffer Sta capability,
3214 * so that the peer shall not go to the TDLS power save
3215 */
3216
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003217 if (connectedTdlsPeers)
3218 {
3219 tANI_U8 staIdx;
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003220 hddTdlsPeer_t *curr_peer;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003221
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +05303222 mutex_lock(&pHddCtx->tdls_lock);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003223 for (staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++)
3224 {
3225 if (pHddCtx->tdlsConnInfo[staIdx].staId)
3226 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303227 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303228 ("%s: indicate TDLS teardown (staId %d)"),
3229 __func__, pHddCtx->tdlsConnInfo[staIdx].staId) ;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003230
3231#ifdef CONFIG_TDLS_IMPLICIT
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303232 curr_peer = wlan_hdd_tdls_find_all_peer(pHddCtx,
3233 pHddCtx->tdlsConnInfo[staIdx].peerMac.bytes);
Abhishek Singh96568922016-01-05 15:28:12 +05303234 if(curr_peer) {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303235 wlan_hdd_tdls_indicate_teardown(
3236 curr_peer->pHddTdlsCtx->pAdapter, curr_peer,
3237 eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON);
Abhishek Singh96568922016-01-05 15:28:12 +05303238 hdd_send_wlan_tdls_teardown_event(
3239 eTDLS_TEARDOWN_SCAN,
3240 curr_peer->peerMac);
3241 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003242#endif
3243 }
3244 }
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +05303245 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003246 /* schedule scan */
3247 delay = (unsigned long)(TDLS_DELAY_SCAN_PER_CONNECTION*connectedTdlsPeers);
3248
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303249 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003250 "%s: tdls enabled (mode %d), connected_peers %d. schedule scan %lu msec",
3251 __func__, pHddCtx->tdls_mode, wlan_hdd_tdlsConnectedPeers(pAdapter),
3252 delay);
3253
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303254 wlan_hdd_defer_scan_init_work (pHddCtx, wiphy,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003255#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
3256 dev,
3257#endif
3258 request,
3259 msecs_to_jiffies(delay));
3260 /* scan should not continue */
3261 return 0;
3262 }
3263 /* no connected peer, scan continue */
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303264 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003265 "%s: tdls_mode %d, and no tdls connection. scan allowed",
3266 __func__, pHddCtx->tdls_mode);
3267 }
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05303268 EXIT();
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003269 return 1;
3270}
3271
3272void wlan_hdd_tdls_scan_done_callback(hdd_adapter_t *pAdapter)
3273{
3274 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003275
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05303276 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05303277 if(0 != (wlan_hdd_validate_context(pHddCtx)))
3278 {
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003279 return;
c_hpothu7f63e882013-10-02 19:13:35 +05303280 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003281
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303282 /* if tdls is not enabled then don't revert tdls mode */
3283 if ((eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode)) {
3284 hddLog(VOS_TRACE_LEVEL_INFO, FL("Failed to revert: Mode=%d"),
3285 pHddCtx->tdls_mode);
Pradeep Reddy POTTETIc7822df2015-02-19 20:15:41 +05303286 return;
Chandrasekaran, Manishekar0de84dc2015-03-10 15:12:34 +05303287 }
Sunil Dutt41de4e22013-11-14 18:09:02 +05303288
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003289 /* free allocated memory at scan time */
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303290 wlan_hdd_init_deinit_defer_scan_context(&pHddCtx->scan_ctxt);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003291
3292 /* if tdls was enabled before scan, re-enable tdls mode */
3293 if(eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode_last ||
3294 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode_last)
3295 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303296 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003297 ("%s: revert tdls mode %d"), __func__, pHddCtx->tdls_mode_last);
3298
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05303299 wlan_hdd_tdls_set_mode(pHddCtx, pHddCtx->tdls_mode_last, FALSE,
3300 HDD_SET_TDLS_MODE_SOURCE_SCAN);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003301 }
3302 wlan_hdd_tdls_check_bmps(pAdapter);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05303303
3304 EXIT();
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003305}
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07003306
3307void wlan_hdd_tdls_timer_restart(hdd_adapter_t *pAdapter,
3308 vos_timer_t *timer,
3309 v_U32_t expirationTime)
3310{
3311 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
3312
3313 if (NULL == pHddStaCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05303314 {
3315 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3316 FL("pHddStaCtx is NULL"));
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07003317 return;
c_hpothu7f63e882013-10-02 19:13:35 +05303318 }
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07003319
3320 /* Check whether driver load unload is in progress */
3321 if(vos_is_load_unload_in_progress( VOS_MODULE_ID_VOSS, NULL))
3322 {
3323 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3324 "%s: Driver load/unload is in progress.", __func__);
3325 return;
3326 }
3327
3328 if (hdd_connIsConnected(pHddStaCtx))
3329 {
3330 vos_timer_stop(timer);
3331 vos_timer_start(timer, expirationTime);
3332 }
3333}
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003334void wlan_hdd_tdls_indicate_teardown(hdd_adapter_t *pAdapter,
3335 hddTdlsPeer_t *curr_peer,
3336 tANI_U16 reason)
3337{
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05303338 hdd_context_t *pHddCtx;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303339
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05303340 if ((NULL == pAdapter || WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic) ||
3341 (NULL == curr_peer))
c_hpothu7f63e882013-10-02 19:13:35 +05303342 {
3343 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3344 FL("parameters passed are invalid"));
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003345 return;
c_hpothu7f63e882013-10-02 19:13:35 +05303346 }
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003347
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05303348 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3349
Masti, Narayanraddi9d275662015-08-26 13:15:12 +05303350 if ((eTDLS_LINK_CONNECTED != curr_peer->link_status) &&
3351 (eTDLS_LINK_CONNECTING != curr_peer->link_status))
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003352 return;
3353
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303354 /* Throughput Monitor shall disable the split scan when
3355 * TDLS scan coexistance is disabled.At this point of time
3356 * since TDLS scan coexistance is not meeting the criteria
3357 * to be operational, explicitly make it false to enable
3358 * throughput monitor takes the control of split scan.
3359 */
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05303360 if (pHddCtx && (pHddCtx->isTdlsScanCoexistence == TRUE))
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303361 {
3362 pHddCtx->isTdlsScanCoexistence = FALSE;
3363 }
3364
Atul Mittal115287b2014-07-08 13:26:33 +05303365 wlan_hdd_tdls_set_peer_link_status(curr_peer,
3366 eTDLS_LINK_TEARING,
Atul Mittal271a7652014-09-12 13:18:22 +05303367 eTDLS_LINK_UNSPECIFIED);
Agarwal Ashisha7ef41d2015-06-25 18:00:26 +05303368 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3369 FL("Setting NL80211_TDLS_TEARDOWN, reason %d"), reason);
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003370 cfg80211_tdls_oper_request(pAdapter->dev,
3371 curr_peer->peerMac,
3372 NL80211_TDLS_TEARDOWN,
3373 reason,
3374 GFP_KERNEL);
3375}
Atul Mittal115287b2014-07-08 13:26:33 +05303376
3377
3378/*EXT TDLS*/
3379int wlan_hdd_set_callback(hddTdlsPeer_t *curr_peer,
3380 cfg80211_exttdls_callback callback)
3381{
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +05303382 /* NOTE:
3383 * Hold mutex tdls_lock before calling this function
3384 */
Atul Mittal115287b2014-07-08 13:26:33 +05303385
3386 hdd_context_t *pHddCtx;
3387 hdd_adapter_t *pAdapter;
3388
3389 if (!curr_peer) return -1;
3390
3391 pAdapter = curr_peer->pHddTdlsCtx->pAdapter;
3392 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3393 if ((NULL == pHddCtx)) return -1;
3394
Atul Mittal115287b2014-07-08 13:26:33 +05303395 curr_peer->state_change_notification = callback;
3396
Atul Mittal115287b2014-07-08 13:26:33 +05303397 return 0;
Atul Mittal115287b2014-07-08 13:26:33 +05303398}
3399
3400void wlan_hdd_tdls_get_wifi_hal_state(hddTdlsPeer_t *curr_peer,
3401 tANI_S32 *state,
3402 tANI_S32 *reason)
3403{
3404 *reason = curr_peer->reason;
3405
3406 switch(curr_peer->link_status)
3407 {
3408 case eTDLS_LINK_IDLE:
Atul Mittal115287b2014-07-08 13:26:33 +05303409 case eTDLS_LINK_DISCOVERED:
3410 *state = WIFI_TDLS_ENABLED;
3411 break;
Atul Mittalad630e42014-10-07 19:19:14 +05303412 case eTDLS_LINK_DISCOVERING:
Atul Mittal115287b2014-07-08 13:26:33 +05303413 case eTDLS_LINK_CONNECTING:
3414 *state = WIFI_TDLS_TRYING;
3415 break;
3416 case eTDLS_LINK_CONNECTED:
Pradeep Reddy POTTETIf3148e82015-04-16 12:10:33 +05303417 if (TRUE == curr_peer->isOffChannelEstablished)
Pradeep Reddy POTTETI16d83332015-03-26 18:28:13 +05303418 {
3419 *state = WIFI_TDLS_ESTABLISHED_OFF_CHANNEL;
3420 }
3421 else
3422 {
3423 *state = WIFI_TDLS_ESTABLISHED;
3424 }
Atul Mittal115287b2014-07-08 13:26:33 +05303425 break;
3426 case eTDLS_LINK_TEARING:
3427 *state = WIFI_TDLS_DROPPED;
3428 break;
3429 }
3430
3431}
3432
3433int wlan_hdd_tdls_get_status(hdd_adapter_t *pAdapter,
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05303434#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
3435 const tANI_U8* mac,
3436#else
Atul Mittal115287b2014-07-08 13:26:33 +05303437 tANI_U8* mac,
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05303438#endif
Atul Mittal115287b2014-07-08 13:26:33 +05303439 tANI_S32 *state,
3440 tANI_S32 *reason)
3441{
3442
3443 hddTdlsPeer_t *curr_peer;
Atul Mittala75fced2014-10-06 13:59:07 +05303444 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05303445
3446 mutex_lock(&pHddCtx->tdls_lock);
3447 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Atul Mittal115287b2014-07-08 13:26:33 +05303448 if (curr_peer == NULL)
3449 {
Atul Mittala75fced2014-10-06 13:59:07 +05303450 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Atul Mittal115287b2014-07-08 13:26:33 +05303451 FL("curr_peer is NULL"));
Atul Mittal115287b2014-07-08 13:26:33 +05303452
Atul Mittala75fced2014-10-06 13:59:07 +05303453 *state = WIFI_TDLS_DISABLED;
3454 *reason = eTDLS_LINK_UNSPECIFIED;
3455 }
3456 else
3457 {
3458 if (pHddCtx->cfg_ini->fTDLSExternalControl &&
3459 (FALSE == curr_peer->isForcedPeer))
3460 {
3461 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3462 FL("curr_peer is not Forced"));
3463 *state = WIFI_TDLS_DISABLED;
3464 *reason = eTDLS_LINK_UNSPECIFIED;
3465 }
3466 else
3467 {
3468 wlan_hdd_tdls_get_wifi_hal_state(curr_peer, state, reason);
3469 }
3470 }
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05303471 mutex_unlock(&pHddCtx->tdls_lock);
Atul Mittal115287b2014-07-08 13:26:33 +05303472 return (0);
3473}
3474
Agarwal Ashishef54a182014-12-16 15:07:31 +05303475int hdd_set_tdls_scan_type(hdd_adapter_t *pAdapter,
3476 tANI_U8 *ptr)
3477{
3478 int tdls_scan_type;
Hema Aparna Medicharla26b98042015-01-21 15:02:01 +05303479 hdd_context_t *pHddCtx;
Agarwal Ashishef54a182014-12-16 15:07:31 +05303480 if (NULL == pAdapter)
3481 {
3482 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3483 "%s: pAdapter is NULL", __func__);
3484 return -EINVAL;
3485 }
Hema Aparna Medicharla26b98042015-01-21 15:02:01 +05303486 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Agarwal Ashishef54a182014-12-16 15:07:31 +05303487 tdls_scan_type = ptr[9] - '0';
3488
3489 if (tdls_scan_type <= 2)
3490 {
3491 pHddCtx->cfg_ini->fEnableTDLSScan = tdls_scan_type;
3492 return 0;
3493 }
3494 else
3495 {
3496 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3497 " Wrong value is given for tdls_scan_type "
3498 " Making fEnableTDLSScan as 0 ");
3499 pHddCtx->cfg_ini->fEnableTDLSScan = 0;
3500 return -EINVAL;
3501 }
3502}
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +05303503int wlan_hdd_validate_tdls_context(hdd_context_t *pHddCtx,
3504 tdlsCtx_t *pHddTdlsCtx)
3505{
3506 VOS_STATUS status;
3507 int found = 0;
3508 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
3509 hdd_adapter_t *pAdapter;
Agarwal Ashishef54a182014-12-16 15:07:31 +05303510
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +05303511 if (NULL == pHddTdlsCtx)
3512 {
3513 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3514 FL("TDLS context is NULL"));
3515 return -EINVAL;
3516 }
3517 status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
3518 while (NULL != pAdapterNode && VOS_STATUS_SUCCESS == status)
3519 {
3520 pAdapter = pAdapterNode->pAdapter;
3521 if (NULL != pAdapter)
3522 {
3523 if (pHddTdlsCtx == pAdapter->sessionCtx.station.pHddTdlsCtx &&
3524 (NULL != pHddTdlsCtx->pAdapter) &&
3525 (WLAN_HDD_ADAPTER_MAGIC == pHddTdlsCtx->pAdapter->magic))
3526 {
3527 found = 1;
3528 break;
3529 }
3530 }
3531 status = hdd_get_next_adapter (pHddCtx, pAdapterNode, &pNext);
3532 pAdapterNode = pNext;
3533 }
3534 if (found == 1)
3535 {
3536 return 0;
3537 }
3538 else
3539 {
3540 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3541 FL("TDLS context doesnot belongs to valid adapter"));
3542 return -EINVAL;
3543 }
3544}
Ganesh Kondabattinif3ba0972015-08-07 15:58:04 +05303545
3546
3547void wlan_hdd_tdls_update_rx_pkt_cnt_n_rssi(hdd_adapter_t *pAdapter,
3548 u8 *mac, v_S7_t rssiAvg)
3549{
3550 hddTdlsPeer_t *curr_peer;
3551 hdd_context_t *pHddCtx = NULL;
3552 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3553 mutex_lock(&pHddCtx->tdls_lock);
3554 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
3555 if ((NULL != curr_peer) &&
3556 (eTDLS_LINK_CONNECTED == curr_peer->link_status))
3557 {
3558 curr_peer->rx_pkt++;
3559 curr_peer->rssi = rssiAvg;
3560 }
3561 mutex_unlock(&pHddCtx->tdls_lock);
3562 VOS_TRACE( VOS_MODULE_ID_HDD_DATA, VOS_TRACE_LEVEL_INFO,
3563 "mac : " MAC_ADDRESS_STR "rssi is %d",
3564 MAC_ADDR_ARRAY(mac), rssiAvg);
3565}
Atul Mittal115287b2014-07-08 13:26:33 +05303566
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303567/**
3568 * wlan_hdd_tdls_reenable() - Re-Enable TDLS
3569 * @hddctx: pointer to hdd context
3570 *
3571 * Function re-enable's TDLS which might be disabled during concurrency
3572 *
3573 * Return: None
3574 */
3575void wlan_hdd_tdls_reenable(hdd_context_t *pHddCtx)
3576{
3577
3578 if ((TRUE != pHddCtx->cfg_ini->fEnableTDLSSupport) ||
3579 (TRUE != sme_IsFeatureSupportedByFW(TDLS))) {
3580 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3581 FL("tdls support not enabled"));
3582 return;
3583 }
3584
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303585 /* if tdls is not enabled then don't revert tdls mode */
3586 if ((eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode)) {
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303587 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303588 FL("TDLS disabled so no need to enable: Mode=%d"),
3589 pHddCtx->tdls_mode);
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303590 return;
3591 }
3592
3593 if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode_last ||
3594 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY ==
3595 pHddCtx->tdls_mode_last) {
3596 /* Enable TDLS support Once P2P session ends since
3597 * upond detection of concurrency TDLS might be disabled
3598 */
3599 hddLog(LOG1, FL("TDLS mode set to %d"), pHddCtx->tdls_mode_last);
3600 wlan_hdd_tdls_set_mode(pHddCtx, pHddCtx->tdls_mode_last,
Bala Venkatesh5c06a252018-07-12 16:08:04 +05303601 FALSE,
3602 HDD_SET_TDLS_MODE_SOURCE_CONCURRENCY);
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303603 }
3604}
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +05303605
3606tdlsConnInfo_t *wlan_hdd_get_conn_info(hdd_context_t *pHddCtx,
3607 tANI_U8 idx)
3608{
3609 tANI_U8 staIdx;
3610
3611 /* check if there is available index for this new TDLS STA */
3612 for ( staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++ )
3613 {
3614 if (idx == pHddCtx->tdlsConnInfo[staIdx].staId )
3615 {
3616 hddLog(LOG1, FL("tdls peer with staIdx %u exists"), idx );
3617 return (&pHddCtx->tdlsConnInfo[staIdx]);
3618 }
3619 }
3620 hddLog(LOGE, FL("tdls peer with staIdx %u not exists"), idx );
3621 return NULL;
3622}
Masti, Narayanraddi44b0db02015-12-22 11:54:35 +05303623
3624void wlan_hdd_change_tdls_mode(void *data)
3625{
3626 hdd_context_t *hdd_ctx = (hdd_context_t *)data;
3627
3628 wlan_hdd_tdls_set_mode(hdd_ctx, eTDLS_SUPPORT_ENABLED, FALSE,
3629 HDD_SET_TDLS_MODE_SOURCE_OFFCHANNEL);
3630}
3631
3632void wlan_hdd_start_stop_tdls_source_timer(hdd_context_t *pHddCtx,
3633 eTDLSSupportMode tdls_mode)
3634{
3635 if (VOS_TIMER_STATE_RUNNING ==
3636 vos_timer_getCurrentState(&pHddCtx->tdls_source_timer))
3637 vos_timer_stop(&pHddCtx->tdls_source_timer);
3638
3639 if (tdls_mode == eTDLS_SUPPORT_DISABLED) {
3640 wlan_hdd_tdls_set_mode(pHddCtx, tdls_mode, FALSE,
3641 HDD_SET_TDLS_MODE_SOURCE_OFFCHANNEL);
3642 }
3643
3644 vos_timer_start(&pHddCtx->tdls_source_timer,
3645 pHddCtx->cfg_ini->tdls_enable_defer_time);
3646
3647 return;
3648}
3649
Deepthi Gowri03a979f2016-11-03 15:20:19 +05303650void wlan_hdd_get_tdls_stats(hdd_adapter_t *pAdapter)
3651{
3652 hdd_context_t *pHddCtx = NULL;
3653 tdlsCtx_t *pHddTdlsCtx = NULL;
3654 tANI_U16 numConnectedTdlsPeers = 0;
3655 tANI_U16 numDiscoverySentCnt = 0;
3656
3657 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3658
3659 ENTER();
3660 if (0 != (wlan_hdd_validate_context(pHddCtx)))
3661 {
3662 return;
3663 }
3664
3665 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
3666
3667 mutex_lock(&pHddCtx->tdls_lock);
3668 if (NULL == pHddTdlsCtx)
3669 {
3670 mutex_unlock(&pHddCtx->tdls_lock);
3671 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
3672 FL("pHddTdlsCtx points to NULL"));
3673 return;
3674 }
3675 numConnectedTdlsPeers = pHddCtx->connected_peer_count;
3676 numDiscoverySentCnt = pHddTdlsCtx->discovery_sent_cnt;
3677 mutex_unlock(&pHddCtx->tdls_lock);
3678
3679 hddLog( LOGE, "%s: TDLS Mode: %d TDLS connected peer count %d"
3680 " DiscoverySentCnt=%d", __func__, pHddCtx->tdls_mode,
3681 numConnectedTdlsPeers, numDiscoverySentCnt);
3682 EXIT();
3683
3684 return;
3685}
3686
3687
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303688/*EXT TDLS*/