blob: 6e07a9c977691d26f9d89e6a0b2970f0a89f53ad [file] [log] [blame]
Kiran V1ccee932012-12-12 14:49:46 -08001/*
Masti, Narayanraddi44b0db02015-12-22 11:54:35 +05302 * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
Kiet Lam842dad02014-02-18 18:44:02 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
Gopichand Nakkala0c1331e2013-01-07 22:49:07 -080020 */
Kiet Lam842dad02014-02-18 18:44:02 -080021
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
Kiran V1ccee932012-12-12 14:49:46 -080028/**========================================================================
29
30 \file wlan_hdd_tdls.c
31
Chilam NG571c65a2013-01-19 12:27:36 +053032 \brief WLAN Host Device Driver implementation for TDLS
Kiran V1ccee932012-12-12 14:49:46 -080033
Kiran V1ccee932012-12-12 14:49:46 -080034 ========================================================================*/
35
36#include <wlan_hdd_includes.h>
37#include <wlan_hdd_hostapd.h>
38#include <net/cfg80211.h>
39#include <linux/netdevice.h>
40#include <linux/skbuff.h>
Chilam NG571c65a2013-01-19 12:27:36 +053041#include <linux/list.h>
Kiran V1ccee932012-12-12 14:49:46 -080042#include <linux/etherdevice.h>
43#include <net/ieee80211_radiotap.h>
44#include "wlan_hdd_tdls.h"
Chilam NG571c65a2013-01-19 12:27:36 +053045#include "wlan_hdd_cfg80211.h"
Masti, Narayanraddi1fb32a92015-06-29 13:14:06 +053046#include "wlan_hdd_assoc.h"
47#include "sme_Api.h"
Mahesh A Saptasagar8b231b32014-08-11 11:58:15 +053048#include "vos_sched.h"
Chilam NG571c65a2013-01-19 12:27:36 +053049
Gopichand Nakkala4327a152013-03-04 23:22:42 -080050static tANI_S32 wlan_hdd_get_tdls_discovery_peer_cnt(tdlsCtx_t *pHddTdlsCtx);
51static tANI_S32 wlan_hdd_tdls_peer_reset_discovery_processed(tdlsCtx_t *pHddTdlsCtx);
52static void wlan_hdd_tdls_timers_destroy(tdlsCtx_t *pHddTdlsCtx);
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +053053static void wlan_hdd_tdls_peer_timers_destroy(tdlsCtx_t *pHddTdlsCtx);
Sunil Dutt41de4e22013-11-14 18:09:02 +053054int wpa_tdls_is_allowed_force_peer(tdlsCtx_t *pHddTdlsCtx, u8 *mac);
Hoonki Leed37cbb32013-04-20 00:31:14 -070055#ifdef CONFIG_TDLS_IMPLICIT
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +053056static void wlan_hdd_tdls_implicit_send_discovery_request(tdlsCtx_t *pHddTdlsCtx);
Hoonki Leed37cbb32013-04-20 00:31:14 -070057#endif
Chilam NG571c65a2013-01-19 12:27:36 +053058
Masti, Narayanraddi63d62352015-10-01 12:52:50 +053059static u8 wlan_hdd_tdls_hash_key (const u8 *mac)
Hoonki Leef63df0d2013-01-16 19:29:14 -080060{
61 int i;
Hoonki Lee387663d2013-02-05 18:08:43 -080062 u8 key = 0;
63
64 for (i = 0; i < 6; i++)
65 key ^= mac[i];
66
67 return key;
68}
69
Abhishek Singh96568922016-01-05 15:28:12 +053070#ifdef FEATURE_WLAN_DIAG_SUPPORT
71/**
72 * hdd_send_wlan_tdls_teardown_event()- send TDLS teardown event
73 *
74 * @reason: reason for tear down.
75 * @peer_mac: peer mac
76 *
77 * This Function send TDLS teardown diag event
78 *
79 * Return: void.
80 */
81void hdd_send_wlan_tdls_teardown_event(uint32_t reason,
82 uint8_t *peer_mac)
83{
84 WLAN_VOS_DIAG_EVENT_DEF(tdls_tear_down,
85 struct vos_event_tdls_teardown);
86 vos_mem_zero(&tdls_tear_down,
87 sizeof(tdls_tear_down));
88
89 tdls_tear_down.reason = reason;
90 vos_mem_copy(tdls_tear_down.peer_mac,
91 peer_mac, HDD_MAC_ADDR_LEN);
92 WLAN_VOS_DIAG_EVENT_REPORT(&tdls_tear_down,
93 EVENT_WLAN_TDLS_TEARDOWN);
94}
Abhishek Singh5f544022016-01-05 15:57:19 +053095
96/**
97 * hdd_wlan_tdls_enable_link_event()- send TDLS enable link event
98 *
99 * @peer_mac: peer mac
100 * @is_off_chan_supported: Does peer supports off chan
101 * @is_off_chan_configured: If off channel is configured
102 * @is_off_chan_established: If off chan is established
103 *
104 * This Function send TDLS enable link diag event
105 *
106 * Return: void.
107 */
108
109void hdd_wlan_tdls_enable_link_event(const uint8_t *peer_mac,
110 uint8_t is_off_chan_supported,
111 uint8_t is_off_chan_configured,
112 uint8_t is_off_chan_established)
113{
114 WLAN_VOS_DIAG_EVENT_DEF(tdls_event,
115 struct vos_event_tdls_enable_link);
116 vos_mem_zero(&tdls_event,
117 sizeof(tdls_event));
118
119 vos_mem_copy(tdls_event.peer_mac,
120 peer_mac, HDD_MAC_ADDR_LEN);
121
122 tdls_event.is_off_chan_supported =
123 is_off_chan_supported;
124 tdls_event.is_off_chan_configured =
125 is_off_chan_configured;
126 tdls_event.is_off_chan_established =
127 is_off_chan_established;
128
129 WLAN_VOS_DIAG_EVENT_REPORT(&tdls_event,
130 EVENT_WLAN_TDLS_ENABLE_LINK);
131}
Abhishek Singh96568922016-01-05 15:28:12 +0530132#endif
133
Abhishek Singh5f544022016-01-05 15:57:19 +0530134
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +0530135/**
136 * wlan_hdd_tdls_disable_offchan_and_teardown_links - Disable offchannel
137 * and teardown TDLS links
138 * @hddCtx : pointer to hdd context
139 *
140 * Return: None
141 */
142void wlan_hdd_tdls_disable_offchan_and_teardown_links(hdd_context_t *hddctx)
143{
144 u16 connected_tdls_peers = 0;
Masti, Narayanraddi1fb32a92015-06-29 13:14:06 +0530145 u8 staIdx;
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530146 hddTdlsPeer_t *curr_peer = NULL;
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +0530147 hdd_adapter_t *adapter = NULL;
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +0530148 bool tdls_unlock = FALSE;
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +0530149
150 if (eTDLS_SUPPORT_NOT_ENABLED == hddctx->tdls_mode) {
151 hddLog(LOG1, FL("TDLS mode is disabled OR not enabled in FW"));
152 return ;
153 }
154
155 adapter = hdd_get_adapter(hddctx, WLAN_HDD_INFRA_STATION);
156
157 if (adapter == NULL) {
158 hddLog(LOGE, FL("Station Adapter Not Found"));
Masti, Narayanraddi70e5b472015-08-04 12:54:16 +0530159 goto done;
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +0530160 }
161
162 connected_tdls_peers = wlan_hdd_tdlsConnectedPeers(adapter);
Masti, Narayanraddi1fb32a92015-06-29 13:14:06 +0530163 if (!connected_tdls_peers) {
Masti, Narayanraddi70e5b472015-08-04 12:54:16 +0530164 hddLog(LOG1, FL("No TDLS connected peers to delete TDLS peers"));
165 goto done;
Masti, Narayanraddi1fb32a92015-06-29 13:14:06 +0530166 }
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +0530167
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530168 /* TDLS is not supported in case of concurrency
169 * Disable TDLS Offchannel to avoid more than two concurrent channels.
170 */
171 if (connected_tdls_peers == 1) {
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +0530172 tSirMacAddr peer_mac;
173 int32_t channel;
174
175 mutex_lock(&hddctx->tdls_lock);
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530176 curr_peer = wlan_hdd_tdls_get_connected_peer(adapter);
177 if (curr_peer && (curr_peer->isOffChannelConfigured == TRUE)) {
178 hddLog(LOG1, FL("%s: Concurrency detected, Disable "
179 "TDLS channel switch"), __func__);
180 curr_peer->isOffChannelEstablished = FALSE;
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +0530181 channel = curr_peer->peerParams.channel;
182 vos_mem_copy(peer_mac, curr_peer->peerMac, sizeof(tSirMacAddr));
183 mutex_unlock(&hddctx->tdls_lock);
184
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530185 sme_SendTdlsChanSwitchReq(WLAN_HDD_GET_HAL_CTX(adapter),
186 adapter->sessionId,
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +0530187 peer_mac,
188 channel,
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530189 TDLS_OFF_CHANNEL_BW_OFFSET,
190 TDLS_CHANNEL_SWITCH_DISABLE);
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +0530191 tdls_unlock = TRUE;
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +0530192 }
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +0530193 if (tdls_unlock == FALSE)
194 mutex_unlock(&hddctx->tdls_lock);
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +0530195 }
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530196
197 /* Send Msg to PE for sending deauth and deleting all the TDLS peers */
198 sme_DeleteAllTDLSPeers(hddctx->hHal, adapter->sessionId);
199
200 /* As mentioned above TDLS is not supported in case of concurrency
201 * Find the connected peer and generate TDLS teardown indication to
202 * supplicant.
203 */
204 for (staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++) {
205 if (!hddctx->tdlsConnInfo[staIdx].staId)
206 continue;
207
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530208 mutex_lock(&hddctx->tdls_lock);
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530209 curr_peer = wlan_hdd_tdls_find_all_peer(hddctx,
210 hddctx->tdlsConnInfo[staIdx].peerMac.bytes);
211
212 if (!curr_peer)
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530213 {
214 mutex_unlock(&hddctx->tdls_lock);
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530215 continue;
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530216 }
217
218 wlan_hdd_tdls_reset_peer(adapter, curr_peer->peerMac);
219
220 hddLog(LOG1, FL("indicate TDLS teardown (staId %d)"),
221 curr_peer->staId);
222
223 /* Indicate teardown to supplicant */
224 wlan_hdd_tdls_indicate_teardown(
225 curr_peer->pHddTdlsCtx->pAdapter,
226 curr_peer,
227 eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON);
Abhishek Singh96568922016-01-05 15:28:12 +0530228 hdd_send_wlan_tdls_teardown_event(eTDLS_TEARDOWN_CONCURRENCY,
229 curr_peer->peerMac);
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530230 mutex_unlock(&hddctx->tdls_lock);
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530231
232 /* Del Sta happened already as part of sme_DeleteAllTDLSPeers
233 * Hence clear hdd data structure.
234 */
235 hdd_roamDeregisterTDLSSTA(adapter,
236 hddctx->tdlsConnInfo[staIdx].staId);
237 wlan_hdd_tdls_decrement_peer_count(adapter);
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530238
239 hddctx->tdlsConnInfo[staIdx].staId = 0 ;
240 hddctx->tdlsConnInfo[staIdx].sessionId = 255;
241 vos_mem_zero(&hddctx->tdlsConnInfo[staIdx].peerMac,
242 sizeof(v_MACADDR_t)) ;
243 wlan_hdd_tdls_check_bmps(adapter);
Masti, Narayanraddi471e9382015-07-23 18:51:29 +0530244 }
245
Masti, Narayanraddi70e5b472015-08-04 12:54:16 +0530246done:
Masti, Narayanraddi20494af2015-12-17 20:56:42 +0530247 wlan_hdd_tdls_set_mode(hddctx, eTDLS_SUPPORT_DISABLED, FALSE,
248 HDD_SET_TDLS_MODE_SOURCE_P2P);
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +0530249 hddLog(LOG1, FL("TDLS Support Disabled"));
250}
251
252/**
253 * hdd_tdls_notify_mode_change - Notify mode change
254 * @adapter: pointer to hdd adapter
255 * @hddCtx : pointer to hdd context
256 *
257 * Return: None
258 */
259void hdd_tdls_notify_mode_change(hdd_adapter_t *adapter, hdd_context_t *hddctx)
260{
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +0530261 wlan_hdd_tdls_disable_offchan_and_teardown_links(hddctx);
262}
263
Hoonki Leed37cbb32013-04-20 00:31:14 -0700264#ifdef TDLS_USE_SEPARATE_DISCOVERY_TIMER
Hoonki Lee387663d2013-02-05 18:08:43 -0800265static v_VOID_t wlan_hdd_tdls_discover_peer_cb( v_PVOID_t userData )
266{
267 int i;
268 struct list_head *head;
269 struct list_head *pos;
Chilam NG571c65a2013-01-19 12:27:36 +0530270 hddTdlsPeer_t *curr_peer;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530271 hdd_context_t *pHddCtx;
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530272 tdlsCtx_t *pHddTdlsCtx;
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800273 int discover_req_sent = 0;
274 v_U32_t discover_expiry = TDLS_SUB_DISCOVERY_PERIOD;
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530275 v_CONTEXT_t pVosContext;
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800276
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +0530277 ENTER();
278
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530279 pVosContext = vos_get_global_context(VOS_MODULE_ID_HDD, NULL);
280 if (NULL == pVosContext)
c_hpothu7f63e882013-10-02 19:13:35 +0530281 {
282 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530283 FL("pVosContext points to NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530284 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530285 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530286
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530287 pHddCtx = vos_get_context(VOS_MODULE_ID_HDD, pVosContext);
288 if (0 != (wlan_hdd_validate_context(pHddCtx)))
Sushant Kaushik15c4c522014-08-14 12:24:49 +0530289 {
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530290 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530291 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530292
Rajesh Chauhana34c6e62014-03-25 16:37:58 +0530293 mutex_lock(&pHddCtx->tdls_lock);
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530294 pHddTdlsCtx = (tdlsCtx_t *)userData;
295 if (0 != (wlan_hdd_validate_tdls_context(pHddCtx, pHddTdlsCtx)))
296 {
297 mutex_unlock(&pHddCtx->tdls_lock);
298 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
299 FL("Invalid pHddTdlsCtx context"));
300 return;
301 }
Hoonki Leebfee0342013-01-21 16:43:45 -0800302
Hoonki Lee387663d2013-02-05 18:08:43 -0800303 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: ", __func__);
304
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800305 if (0 == pHddTdlsCtx->discovery_peer_cnt)
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800306 pHddTdlsCtx->discovery_peer_cnt = wlan_hdd_get_tdls_discovery_peer_cnt(pHddTdlsCtx);
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800307
Chilam NG571c65a2013-01-19 12:27:36 +0530308 for (i = 0; i < 256; i++) {
Hoonki Lee387663d2013-02-05 18:08:43 -0800309 head = &pHddTdlsCtx->peer_list[i];
Chilam NG571c65a2013-01-19 12:27:36 +0530310
Hoonki Lee387663d2013-02-05 18:08:43 -0800311 list_for_each (pos, head) {
312 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
Chilam NG571c65a2013-01-19 12:27:36 +0530313
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530314 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Chilam Ng01120412013-02-19 18:32:21 -0800315 "%d " MAC_ADDRESS_STR " %d %d, %d %d %d %d", i,
316 MAC_ADDR_ARRAY(curr_peer->peerMac),
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800317 curr_peer->discovery_processed,
318 discover_req_sent,
Gopichand Nakkala2a0a1572013-02-10 21:39:16 -0800319 curr_peer->tdls_support,
320 curr_peer->link_status,
321 curr_peer->discovery_attempt,
322 pHddTdlsCtx->threshold_config.discovery_tries_n);
Hoonki Lee387663d2013-02-05 18:08:43 -0800323
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800324 if (discover_req_sent < TDLS_MAX_DISCOVER_REQS_PER_TIMER) {
325 if (!curr_peer->discovery_processed) {
Chilam NG571c65a2013-01-19 12:27:36 +0530326
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800327 curr_peer->discovery_processed = 1;
328 discover_req_sent++;
329 pHddTdlsCtx->discovery_peer_cnt--;
330
331 if ((eTDLS_CAP_UNKNOWN == curr_peer->tdls_support) &&
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800332 (eTDLS_LINK_IDLE == curr_peer->link_status) &&
Gopichand Nakkalab88f6772013-02-27 18:12:56 -0800333 (curr_peer->tx_pkt >=
334 pHddTdlsCtx->threshold_config.tx_packet_n)) {
Gopichand Nakkala273d5a02013-02-19 15:15:09 -0800335
336 if (curr_peer->discovery_attempt <
337 pHddTdlsCtx->threshold_config.discovery_tries_n) {
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +0530338 cfg80211_tdls_oper_request(
339 pHddTdlsCtx->pAdapter->dev,
340 curr_peer->peerMac,
341 NL80211_TDLS_DISCOVERY_REQ,
342 FALSE,
343 GFP_KERNEL);
Gopichand Nakkala273d5a02013-02-19 15:15:09 -0800344 curr_peer->discovery_attempt++;
345 }
346 else
347 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530348 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
Gopichand Nakkala273d5a02013-02-19 15:15:09 -0800349 "%s: Maximum Discovery retries reached", __func__);
350 curr_peer->tdls_support = eTDLS_CAP_NOT_SUPPORTED;
351 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800352
353 }
354 }
Chilam NG571c65a2013-01-19 12:27:36 +0530355 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800356 else
357 goto exit_loop;
Hoonki Lee387663d2013-02-05 18:08:43 -0800358 }
Hoonki Leef63df0d2013-01-16 19:29:14 -0800359 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800360exit_loop:
Hoonki Leef63df0d2013-01-16 19:29:14 -0800361
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800362 if (0 != pHddTdlsCtx->discovery_peer_cnt) {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530363 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800364 "discovery_peer_cnt is %d , Starting SUB_DISCOVERY_TIMER",
365 pHddTdlsCtx->discovery_peer_cnt);
366 discover_expiry = TDLS_SUB_DISCOVERY_PERIOD;
367 goto done;
368 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800369 discover_expiry = pHddTdlsCtx->threshold_config.discovery_period_t;
370
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800371 wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
Chilam NG571c65a2013-01-19 12:27:36 +0530372
Gopichand Nakkala638ebc72013-03-21 18:04:02 -0700373
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800374 /* Commenting out the following function as it was introducing
375 * a race condition when pHddTdlsCtx is deleted. Also , this
376 * function is consuming more time in the timer callback.
377 * RSSI based trigger needs to revisit this part of the code.
378 */
379
380 /*
381 * wlan_hdd_get_rssi(pAdapter, &pHddTdlsCtx->ap_rssi);
382 */
Chilam NG571c65a2013-01-19 12:27:36 +0530383
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800384done:
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +0530385 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +0530386 EXIT();
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800387 return;
Hoonki Leef63df0d2013-01-16 19:29:14 -0800388}
Hoonki Leed37cbb32013-04-20 00:31:14 -0700389#endif
Chilam NG571c65a2013-01-19 12:27:36 +0530390
Masti, Narayanraddie8e14622015-10-17 16:10:54 +0530391static v_VOID_t wlan_hdd_tdls_idle_cb( v_PVOID_t userData )
392{
393#ifdef CONFIG_TDLS_IMPLICIT
394 tdlsConnInfo_t *tdlsInfo = (tdlsConnInfo_t *) userData;
395 hddTdlsPeer_t *curr_peer;
396 tdlsCtx_t *pHddTdlsCtx;
397 hdd_context_t *pHddCtx;
398 v_CONTEXT_t pVosContext;
399 hdd_adapter_t *pAdapter = NULL;
400
401 ENTER();
402
403 if (!tdlsInfo->staId)
404 {
405 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
406 FL("peer (staidx %u) doesn't exists"), tdlsInfo->staId);
407 return;
408 }
409
410 pVosContext = vos_get_global_context(VOS_MODULE_ID_HDD, NULL);
411 if (NULL == pVosContext)
412 {
413 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
414 FL("pVosContext points to NULL"));
415 return;
416 }
417
418 pHddCtx = vos_get_context(VOS_MODULE_ID_HDD, pVosContext);
419 if (0 != (wlan_hdd_validate_context(pHddCtx)))
420 {
421 return;
422 }
423
424 pAdapter = hdd_get_adapter_by_sme_session_id(pHddCtx, tdlsInfo->sessionId);
425
426 if (!pAdapter)
427 {
428 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
429 FL("pAdapter is NULL"));
430 return;
431 }
432
433 mutex_lock(&pHddCtx->tdls_lock);
434
435 curr_peer = wlan_hdd_tdls_find_peer(pAdapter,
436 (u8 *) &tdlsInfo->peerMac.bytes[0], FALSE);
437
438 if (NULL == curr_peer)
439 {
440 mutex_unlock(&pHddCtx->tdls_lock);
441 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
442 FL("Invalid tdls idle timer expired"));
443 return;
444 }
445
446 pHddTdlsCtx = curr_peer->pHddTdlsCtx;
447 if (0 != (wlan_hdd_validate_tdls_context(pHddCtx, pHddTdlsCtx)))
448 {
449 mutex_unlock(&pHddCtx->tdls_lock);
450 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
451 FL("Invalid pHddTdlsCtx context"));
452 return;
453 }
454
455 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
456 "%s: Tx/Rx Idle " MAC_ADDRESS_STR " tx_pkt: %d, rx_pkt: %d, idle_packet_n: %d",
457 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac),
458 curr_peer->tx_pkt,
459 curr_peer->rx_pkt,
460 curr_peer->pHddTdlsCtx->threshold_config.idle_packet_n);
461
462 /* Check tx/rx statistics on this tdls link for recent activities and
463 * then decide whether to tear down the link or keep it.
464 */
465 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))
466 {
467 /* this tdls link got back to normal, so keep it */
468 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
469 "%s: tdls link to " MAC_ADDRESS_STR " back to normal, will stay",
470 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
471 }
472 else
473 {
474 /* this tdls link needs to get torn down */
475 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
476 "%s: trigger tdls link to " MAC_ADDRESS_STR " down",
477 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
478
479 wlan_hdd_tdls_indicate_teardown(curr_peer->pHddTdlsCtx->pAdapter,
480 curr_peer,
481 eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON);
Abhishek Singh96568922016-01-05 15:28:12 +0530482 hdd_send_wlan_tdls_teardown_event(eTDLS_TEARDOWN_TXRX_THRESHOLD,
483 curr_peer->peerMac);
484
Masti, Narayanraddie8e14622015-10-17 16:10:54 +0530485 }
486 mutex_unlock(&pHddCtx->tdls_lock);
487 EXIT();
488#endif
489}
490
Hoonki Lee387663d2013-02-05 18:08:43 -0800491static v_VOID_t wlan_hdd_tdls_update_peer_cb( v_PVOID_t userData )
Chilam NG571c65a2013-01-19 12:27:36 +0530492{
493 int i;
Hoonki Lee387663d2013-02-05 18:08:43 -0800494 struct list_head *head;
495 struct list_head *pos;
Chilam NG571c65a2013-01-19 12:27:36 +0530496 hddTdlsPeer_t *curr_peer;
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530497 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530498 hdd_context_t *pHddCtx;
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530499 v_CONTEXT_t pVosContext;
Hoonki Leebfee0342013-01-21 16:43:45 -0800500
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +0530501 ENTER();
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530502 pVosContext = vos_get_global_context(VOS_MODULE_ID_HDD, NULL);
503 if (NULL == pVosContext)
c_hpothu7f63e882013-10-02 19:13:35 +0530504 {
505 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530506 FL("pVosContext points to NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530507 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530508 }
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530509 pHddCtx = vos_get_context(VOS_MODULE_ID_HDD, pVosContext);
510 if (0 != (wlan_hdd_validate_context(pHddCtx)))
Sushant Kaushik15c4c522014-08-14 12:24:49 +0530511 {
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530512 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530513 }
Rajesh Chauhana34c6e62014-03-25 16:37:58 +0530514 mutex_lock(&pHddCtx->tdls_lock);
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530515 pHddTdlsCtx = (tdlsCtx_t *)userData;
516 if (0 != (wlan_hdd_validate_tdls_context(pHddCtx, pHddTdlsCtx)))
517 {
518 mutex_unlock(&pHddCtx->tdls_lock);
519 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
520 FL("Invalid pHddTdlsCtx context"));
521 return;
522 }
Chilam NG571c65a2013-01-19 12:27:36 +0530523 for (i = 0; i < 256; i++) {
Hoonki Lee387663d2013-02-05 18:08:43 -0800524 head = &pHddTdlsCtx->peer_list[i];
Chilam NG571c65a2013-01-19 12:27:36 +0530525
Hoonki Lee387663d2013-02-05 18:08:43 -0800526 list_for_each (pos, head) {
527 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
Chilam NG571c65a2013-01-19 12:27:36 +0530528
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530529 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee66b75f32013-04-16 18:30:07 -0700530 "%s: " MAC_ADDRESS_STR " link_status %d"
531 " tdls_support %d", __func__, MAC_ADDR_ARRAY(curr_peer->peerMac),
Gopichand Nakkala34d1b062013-03-19 15:28:33 -0700532 curr_peer->link_status, curr_peer->tdls_support);
Hoonki Lee387663d2013-02-05 18:08:43 -0800533
Ganesh Kondabattinid01c4ee2016-01-04 16:13:06 +0530534 if ((pHddCtx->tdls_mode == eTDLS_SUPPORT_DISABLED) &&
535 (eTDLS_LINK_DISCOVERING == curr_peer->link_status)) {
536 curr_peer->tdls_support = eTDLS_CAP_UNKNOWN;
537 wlan_hdd_tdls_set_peer_link_status(
538 curr_peer,
539 eTDLS_LINK_IDLE,
540 eTDLS_LINK_UNSPECIFIED);
541
542 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
543 "%s: TDLS is disabled. Resetting link_status of peer "
544 MAC_ADDRESS_STR " to %d, tdls_support %d", __func__,
545 MAC_ADDR_ARRAY(curr_peer->peerMac),
546 curr_peer->link_status, curr_peer->tdls_support);
547
548 goto next_peer;
549 }
550
Chilam NG571c65a2013-01-19 12:27:36 +0530551 if (eTDLS_CAP_SUPPORTED == curr_peer->tdls_support) {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530552 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee66b75f32013-04-16 18:30:07 -0700553 "tx %d, rx %d (thr.pkt %d/idle %d), rssi %d (thr.trig %d/hys %d/tear %d)",
554 curr_peer->tx_pkt, curr_peer->rx_pkt,
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800555 pHddTdlsCtx->threshold_config.tx_packet_n,
Hoonki Lee66b75f32013-04-16 18:30:07 -0700556 pHddTdlsCtx->threshold_config.idle_packet_n,
557 curr_peer->rssi,
558 pHddTdlsCtx->threshold_config.rssi_trigger_threshold,
559 pHddTdlsCtx->threshold_config.rssi_hysteresis,
560 pHddTdlsCtx->threshold_config.rssi_teardown_threshold);
Chilam Ng01120412013-02-19 18:32:21 -0800561
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800562 if ((eTDLS_LINK_IDLE == curr_peer->link_status) ||
563 (eTDLS_LINK_DISCOVERING == curr_peer->link_status)){
Sunil Dutt961ecbd2013-11-28 20:04:07 +0530564
565 if (pHddCtx->cfg_ini->fTDLSExternalControl &&
566 (FALSE == curr_peer->isForcedPeer)) {
Ganesh Kondabattini2d7b6a42015-09-01 18:45:18 +0530567 goto next_peer;
Sunil Dutt961ecbd2013-11-28 20:04:07 +0530568 }
569
Chilam NG571c65a2013-01-19 12:27:36 +0530570 if (curr_peer->tx_pkt >=
571 pHddTdlsCtx->threshold_config.tx_packet_n) {
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800572
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800573 if (HDD_MAX_NUM_TDLS_STA > wlan_hdd_tdlsConnectedPeers(pHddTdlsCtx->pAdapter))
Gopichand Nakkalab977a972013-02-18 19:15:09 -0800574 {
575
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530576 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
577 "Tput trigger TDLS pre-setup");
Chilam NG571c65a2013-01-19 12:27:36 +0530578#ifdef CONFIG_TDLS_IMPLICIT
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +0530579 pHddTdlsCtx->curr_candidate = curr_peer;
580 wlan_hdd_tdls_implicit_send_discovery_request(pHddTdlsCtx);
Chilam NG571c65a2013-01-19 12:27:36 +0530581#endif
Gopichand Nakkalab977a972013-02-18 19:15:09 -0800582 }
583 else
584 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530585 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800586 "%s: Maximum peer connected already! %d",
587 __func__, wlan_hdd_tdlsConnectedPeers(pHddTdlsCtx->pAdapter) );
Gopichand Nakkalab977a972013-02-18 19:15:09 -0800588 }
Hoonki Leecdd8e962013-01-20 00:45:46 -0800589 goto next_peer;
Chilam NG571c65a2013-01-19 12:27:36 +0530590 }
Hoonki Leefb8df672013-04-10 18:20:34 -0700591 }
592 else if (eTDLS_LINK_CONNECTED == curr_peer->link_status) {
Chilam Ng01120412013-02-19 18:32:21 -0800593 if ((tANI_S32)curr_peer->rssi <
594 (tANI_S32)pHddTdlsCtx->threshold_config.rssi_teardown_threshold) {
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800595
Chilam Ng01120412013-02-19 18:32:21 -0800596 VOS_TRACE( VOS_MODULE_ID_HDD,
597 VOS_TRACE_LEVEL_WARN,
598 "Tear down - low RSSI: " MAC_ADDRESS_STR "!",
599 MAC_ADDR_ARRAY(curr_peer->peerMac));
600#ifdef CONFIG_TDLS_IMPLICIT
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -0700601 wlan_hdd_tdls_indicate_teardown(pHddTdlsCtx->pAdapter,
602 curr_peer,
603 eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON);
Abhishek Singh96568922016-01-05 15:28:12 +0530604 hdd_send_wlan_tdls_teardown_event(
605 eTDLS_TEARDOWN_RSSI_THRESHOLD,
606 curr_peer->peerMac);
607
Chilam Ng01120412013-02-19 18:32:21 -0800608#endif
Hoonki Leecdd8e962013-01-20 00:45:46 -0800609 goto next_peer;
Chilam NG571c65a2013-01-19 12:27:36 +0530610 }
Chilam Ng01120412013-02-19 18:32:21 -0800611
Naresh Jayaramdb4514b2013-11-25 18:08:10 +0530612 /* Only teardown based on non zero idle packet threshold, to address a use
613 * case where this threshold does not get consider for TEAR DOWN.
614 */
615
616 if (( 0 != pHddTdlsCtx->threshold_config.idle_packet_n ) &&
617 ((curr_peer->tx_pkt <
Chilam Ng01120412013-02-19 18:32:21 -0800618 pHddTdlsCtx->threshold_config.idle_packet_n) &&
619 (curr_peer->rx_pkt <
Naresh Jayaramdb4514b2013-11-25 18:08:10 +0530620 pHddTdlsCtx->threshold_config.idle_packet_n))) {
Masti, Narayanraddie8e14622015-10-17 16:10:54 +0530621 if (!vos_timer_is_initialized(&curr_peer->peerIdleTimer))
622 {
623 v_U8_t staId = (v_U8_t)curr_peer->staId;
624 tdlsConnInfo_t *tdlsInfo;
625
626 tdlsInfo = wlan_hdd_get_conn_info(pHddCtx, staId);
627 vos_timer_init(&curr_peer->peerIdleTimer,
628 VOS_TIMER_TYPE_SW,
629 wlan_hdd_tdls_idle_cb,
630 tdlsInfo);
631 }
Chilam Ng01120412013-02-19 18:32:21 -0800632 if (VOS_TIMER_STATE_RUNNING !=
633 vos_timer_getCurrentState(&curr_peer->peerIdleTimer)) {
634 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
635 "Tx/Rx Idle timer start: " MAC_ADDRESS_STR "!",
636 MAC_ADDR_ARRAY(curr_peer->peerMac));
Gopichand Nakkala3046fc92013-03-23 13:56:43 -0700637 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
638 &curr_peer->peerIdleTimer,
639 pHddTdlsCtx->threshold_config.idle_timeout_t);
Chilam Ng01120412013-02-19 18:32:21 -0800640 }
641 } else {
Masti, Narayanraddi3c762122015-11-24 18:07:11 +0530642 if (vos_timer_is_initialized(
643 &curr_peer->peerIdleTimer) &&
644 VOS_TIMER_STATE_RUNNING ==
645 vos_timer_getCurrentState(
646 &curr_peer->peerIdleTimer)) {
Chilam Ng01120412013-02-19 18:32:21 -0800647 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
648 "Tx/Rx Idle timer stop: " MAC_ADDRESS_STR "!",
649 MAC_ADDR_ARRAY(curr_peer->peerMac));
650 vos_timer_stop( &curr_peer->peerIdleTimer);
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800651 }
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800652 }
Chilam Ng01120412013-02-19 18:32:21 -0800653
Hoonki Leecdd8e962013-01-20 00:45:46 -0800654// if (curr_peer->rssi <
655// (pHddTdlsCtx->threshold_config.rssi_hysteresis +
656// pHddTdlsCtx->ap_rssi)) {
657//
658//#ifdef CONFIG_TDLS_IMPLICIT
659// cfg80211_tdls_oper_request(pHddTdlsCtx->dev,
660// curr_peer->peerMac,
661// NL80211_TDLS_TEARDOWN, FALSE,
662// GFP_KERNEL);
663//#endif
664// }
Chilam NG571c65a2013-01-19 12:27:36 +0530665 }
Chilam Ng01120412013-02-19 18:32:21 -0800666 } else if (eTDLS_CAP_UNKNOWN == curr_peer->tdls_support) {
Sunil Dutt961ecbd2013-11-28 20:04:07 +0530667
668 if (pHddCtx->cfg_ini->fTDLSExternalControl &&
669 (FALSE == curr_peer->isForcedPeer)) {
Ganesh Kondabattini2d7b6a42015-09-01 18:45:18 +0530670 goto next_peer;
Sunil Dutt961ecbd2013-11-28 20:04:07 +0530671 }
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -0700672 if (!TDLS_IS_CONNECTED(curr_peer)) {
Chilam Ng01120412013-02-19 18:32:21 -0800673 if (curr_peer->tx_pkt >=
674 pHddTdlsCtx->threshold_config.tx_packet_n) {
Chilam Ng01120412013-02-19 18:32:21 -0800675
Sunil Duttb0d39242014-09-10 23:54:51 +0530676 /* Ignore discovery attempt if External Control is enabled, that
677 * is, peer is forced. In that case, continue discovery attempt
678 * regardless attempt count
679 */
680 if (curr_peer->isForcedPeer || curr_peer->discovery_attempt++ <
Chilam Ng01120412013-02-19 18:32:21 -0800681 pHddTdlsCtx->threshold_config.discovery_tries_n) {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530682 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
683 "TDLS UNKNOWN discover ");
Hoonki Leed37cbb32013-04-20 00:31:14 -0700684#ifdef CONFIG_TDLS_IMPLICIT
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +0530685 pHddTdlsCtx->curr_candidate = curr_peer;
686 wlan_hdd_tdls_implicit_send_discovery_request(pHddTdlsCtx);
Hoonki Leed37cbb32013-04-20 00:31:14 -0700687#endif
Chilam Ng01120412013-02-19 18:32:21 -0800688 }
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800689 else
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800690 {
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800691 curr_peer->tdls_support = eTDLS_CAP_NOT_SUPPORTED;
Atul Mittal115287b2014-07-08 13:26:33 +0530692 wlan_hdd_tdls_set_peer_link_status(
693 curr_peer,
694 eTDLS_LINK_IDLE,
695 eTDLS_LINK_NOT_SUPPORTED);
696
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800697 }
Chilam Ng01120412013-02-19 18:32:21 -0800698 }
699 }
Chilam NG571c65a2013-01-19 12:27:36 +0530700 }
701
Hoonki Leecdd8e962013-01-20 00:45:46 -0800702next_peer:
Chilam NG571c65a2013-01-19 12:27:36 +0530703 curr_peer->tx_pkt = 0;
Chilam Ng1279e232013-01-25 15:06:52 -0800704 curr_peer->rx_pkt = 0;
Hoonki Lee387663d2013-02-05 18:08:43 -0800705 }
Chilam NG571c65a2013-01-19 12:27:36 +0530706 }
707
Gopichand Nakkala3046fc92013-03-23 13:56:43 -0700708 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
709 &pHddTdlsCtx->peerUpdateTimer,
710 pHddTdlsCtx->threshold_config.tx_period_t);
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530711 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +0530712 EXIT();
Chilam NG571c65a2013-01-19 12:27:36 +0530713}
714
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700715static v_VOID_t wlan_hdd_tdls_discovery_timeout_peer_cb(v_PVOID_t userData)
716{
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700717 int i;
718 struct list_head *head;
719 hddTdlsPeer_t *tmp;
720 struct list_head *pos, *q;
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700721 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530722 hdd_context_t *pHddCtx;
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530723 v_CONTEXT_t pVosContext;
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700724
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +0530725 ENTER();
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530726 pVosContext = vos_get_global_context(VOS_MODULE_ID_HDD, NULL);
727 if (NULL == pVosContext)
c_hpothu7f63e882013-10-02 19:13:35 +0530728 {
729 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530730 FL("pVosContext points to NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530731 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530732 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530733
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530734 pHddCtx = vos_get_context(VOS_MODULE_ID_HDD, pVosContext);
735 if (0 != (wlan_hdd_validate_context(pHddCtx)))
Sushant Kaushik15c4c522014-08-14 12:24:49 +0530736 {
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530737 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530738 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530739
Rajesh Chauhana34c6e62014-03-25 16:37:58 +0530740 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700741
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +0530742 pHddTdlsCtx = (tdlsCtx_t *)userData;
743 if (0 != (wlan_hdd_validate_tdls_context(pHddCtx, pHddTdlsCtx)))
744 {
745 mutex_unlock(&pHddCtx->tdls_lock);
746 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
747 FL("Invalid pHddTdlsCtx context"));
748 return;
749 }
750
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700751 for (i = 0; i < 256; i++) {
752 head = &pHddTdlsCtx->peer_list[i];
753 list_for_each_safe (pos, q, head) {
754 tmp = list_entry(pos, hddTdlsPeer_t, node);
755 if (eTDLS_LINK_DISCOVERING == tmp->link_status)
756 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530757 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700758 "%s: " MAC_ADDRESS_STR " to idle state", __func__,
759 MAC_ADDR_ARRAY(tmp->peerMac));
Atul Mittal115287b2014-07-08 13:26:33 +0530760 wlan_hdd_tdls_set_peer_link_status(
761 tmp,
762 eTDLS_LINK_IDLE,
Atul Mittalad630e42014-10-07 19:19:14 +0530763 eTDLS_LINK_NOT_SUPPORTED);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700764 }
765 }
766 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700767
768 pHddTdlsCtx->discovery_sent_cnt = 0;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -0700769 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700770
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +0530771 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -0700772
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700773 wlan_hdd_tdls_check_bmps(pHddTdlsCtx->pAdapter);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +0530774 EXIT();
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700775 return;
776}
777
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +0530778v_VOID_t wlan_hdd_tdls_initiator_wait_cb( v_PVOID_t userData )
Hoonki Lee14621352013-04-16 17:51:19 -0700779{
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +0530780 tdlsConnInfo_t *tdlsInfo = (tdlsConnInfo_t *) userData;
Hoonki Lee14621352013-04-16 17:51:19 -0700781 tdlsCtx_t *pHddTdlsCtx;
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +0530782 hdd_context_t *pHddCtx = NULL;
783 hdd_adapter_t *pAdapter = NULL;
784 v_CONTEXT_t pVosContext = vos_get_global_context(VOS_MODULE_ID_HDD, NULL);
785 hddTdlsPeer_t *curr_peer = NULL;
Hoonki Lee14621352013-04-16 17:51:19 -0700786
Mahesh A Saptasagar4534e2b2015-03-05 20:45:41 +0530787 ENTER();
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +0530788
789 if (!tdlsInfo->staId)
c_hpothu7f63e882013-10-02 19:13:35 +0530790 {
791 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +0530792 FL("peer (staidx %u) doesn't exists"), tdlsInfo->staId);
793 return;
794 }
795 if (!pVosContext)
796 {
797 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
798 FL("pVosContext is NULL"));
Hoonki Lee14621352013-04-16 17:51:19 -0700799 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530800 }
Hoonki Lee14621352013-04-16 17:51:19 -0700801
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +0530802 pHddCtx = vos_get_context( VOS_MODULE_ID_HDD, pVosContext);
803 if (!pHddCtx)
804 {
805 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
806 FL("pHddCtx is NULL"));
807 return;
808 }
809
810 pAdapter = hdd_get_adapter_by_sme_session_id(pHddCtx, tdlsInfo->sessionId);
811
812 if (!pAdapter)
813 {
814 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
815 FL("pAdapter is NULL"));
816 return;
817 }
818
819 mutex_lock(&pHddCtx->tdls_lock);
820 curr_peer = wlan_hdd_tdls_find_peer(pAdapter,
821 (u8 *) &tdlsInfo->peerMac.bytes[0], FALSE);
822 if (curr_peer == NULL)
823 {
824 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
825 FL("peer doesn't exists"));
826 mutex_unlock(&pHddCtx->tdls_lock);
827 return;
828 }
Hoonki Lee14621352013-04-16 17:51:19 -0700829 pHddTdlsCtx = curr_peer->pHddTdlsCtx;
830
831 if ( NULL == pHddTdlsCtx )
c_hpothu7f63e882013-10-02 19:13:35 +0530832 {
Ratheesh S P36dbc932015-08-07 14:28:57 +0530833 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
c_hpothu7f63e882013-10-02 19:13:35 +0530834 FL("pHddTdlsCtx is NULL"));
Hoonki Lee14621352013-04-16 17:51:19 -0700835 return;
c_hpothu7f63e882013-10-02 19:13:35 +0530836 }
Mahesh A Saptasagar4534e2b2015-03-05 20:45:41 +0530837 if (0 != (wlan_hdd_validate_context(
838 WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter))))
839 {
840 return;
841 }
Hoonki Lee14621352013-04-16 17:51:19 -0700842 WLANTL_ResumeDataTx( (WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter))->pvosContext,
843 (v_U8_t *)&curr_peer->staId);
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +0530844 mutex_unlock(&pHddCtx->tdls_lock);
Mahesh A Saptasagar4534e2b2015-03-05 20:45:41 +0530845 EXIT();
Hoonki Lee14621352013-04-16 17:51:19 -0700846}
847
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800848static void wlan_hdd_tdls_free_list(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800849{
850 int i;
851 struct list_head *head;
852 hddTdlsPeer_t *tmp;
853 struct list_head *pos, *q;
854
c_hpothu7f63e882013-10-02 19:13:35 +0530855 if (NULL == pHddTdlsCtx)
856 {
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"));
859 return;
860 }
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800861
862 for (i = 0; i < 256; i++) {
863 head = &pHddTdlsCtx->peer_list[i];
864 list_for_each_safe (pos, q, head) {
865 tmp = list_entry(pos, hddTdlsPeer_t, node);
866 list_del(pos);
867 vos_mem_free(tmp);
Srinivas Girigowda8d2348f2013-12-12 12:14:15 -0800868 tmp = NULL;
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800869 }
870 }
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800871}
872
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530873void wlan_hdd_tdls_btCoex_cb(void *data, int indType)
874{
875 hdd_adapter_t *pAdapter;
876 hdd_context_t *pHddCtx;
877 u16 connectedTdlsPeers;
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530878 hddTdlsPeer_t *currPeer;
Bhargav Shahd0715912015-10-01 18:17:37 +0530879 tANI_U16 numCurrTdlsPeers = 0;
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530880
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +0530881 ENTER();
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530882 if ((NULL == data) || (indType < 0))
883 {
884 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
885 FL("Invalid arguments"));
886 return;
887 }
888
889 pHddCtx = (hdd_context_t *)data;
890 if (0 != (wlan_hdd_validate_context(pHddCtx)))
891 {
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530892 return;
893 }
894
895 /* if tdls is not enabled, then continue btCoex */
896 if (eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode)
897 {
898 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
899 FL("tdls is not enabled"));
900 return;
901 }
902
903 /* get pAdapter context, do we need WLAN_HDD_P2P_CLIENT */
904 pAdapter = hdd_get_adapter(pHddCtx, WLAN_HDD_INFRA_STATION);
905 if (NULL == pAdapter)
906 {
907 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
908 FL("pAdapter is not valid"));
909 return;
910 }
911
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530912 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
913 "%s: BtCoex notification type %d", __func__, indType);
914 /* BtCoex notification type enabled, Disable TDLS */
915 if (indType == SIR_COEX_IND_TYPE_TDLS_DISABLE)
916 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530917 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530918 FL("BtCoex notification, Disable TDLS"));
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530919 mutex_lock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530920 /* tdls is in progress */
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530921 currPeer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0, FALSE);
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530922 if (NULL != currPeer)
923 {
924 wlan_hdd_tdls_set_peer_link_status (currPeer,
925 eTDLS_LINK_IDLE,
926 eTDLS_LINK_UNSPECIFIED);
927 }
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530928 mutex_unlock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530929
930 /* while tdls is up */
931 if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode ||
932 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode)
933 {
934 connectedTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
935 /* disable implicit trigger logic & tdls operatoin */
Masti, Narayanraddi20494af2015-12-17 20:56:42 +0530936 wlan_hdd_tdls_set_mode(pHddCtx, eTDLS_SUPPORT_DISABLED, FALSE,
937 HDD_SET_TDLS_MODE_SOURCE_BTC);
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530938
939 /* teardown the peers on the btcoex */
940 if (connectedTdlsPeers)
941 {
942 tANI_U8 staIdx;
943 hddTdlsPeer_t *curr_peer;
944
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530945 mutex_lock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530946 for (staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++)
947 {
948 if (pHddCtx->tdlsConnInfo[staIdx].staId)
949 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530950 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
951 ("%s: indicate TDLS teardown (staId %d)"),
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530952 __func__,pHddCtx->tdlsConnInfo[staIdx].staId);
953
Abhishek Singh96568922016-01-05 15:28:12 +0530954#ifdef CONFIG_TDLS_IMPLICIT
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530955 curr_peer = wlan_hdd_tdls_find_all_peer(pHddCtx,
956 pHddCtx->tdlsConnInfo[staIdx].peerMac.bytes);
957 if(curr_peer) {
958 wlan_hdd_tdls_indicate_teardown(
959 curr_peer->pHddTdlsCtx->pAdapter, curr_peer,
960 eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON);
Abhishek Singh96568922016-01-05 15:28:12 +0530961 hdd_send_wlan_tdls_teardown_event(
962 eTDLS_TEARDOWN_BTCOEX,
963 curr_peer->peerMac);
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530964 }
Abhishek Singh96568922016-01-05 15:28:12 +0530965#endif
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530966 }
967 }
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +0530968 mutex_unlock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530969 }
970 }
Bhargav Shahd0715912015-10-01 18:17:37 +0530971 /* stop TCP delack timer if BtCoex is enable */
972 set_bit(WLAN_BTCOEX_MODE, &pHddCtx->mode);
973 hdd_manage_delack_timer(pHddCtx);
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530974 }
975 /* BtCoex notification type enabled, Enable TDLS */
976 else if (indType == SIR_COEX_IND_TYPE_TDLS_ENABLE)
977 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530978 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530979 FL("BtCoex notification, Enable TDLS"));
980 /* if tdls was enabled before btCoex, re-enable tdls mode */
981 if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode_last ||
982 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode_last)
983 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +0530984 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530985 ("%s: revert tdls mode %d"), __func__,
986 pHddCtx->tdls_mode_last);
Masti, Narayanraddi20494af2015-12-17 20:56:42 +0530987 wlan_hdd_tdls_set_mode(pHddCtx, pHddCtx->tdls_mode_last, FALSE,
988 HDD_SET_TDLS_MODE_SOURCE_BTC);
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +0530989 }
Bhargav Shahd0715912015-10-01 18:17:37 +0530990
991 clear_bit(WLAN_BTCOEX_MODE, &pHddCtx->mode);
992 numCurrTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
993 if(numCurrTdlsPeers == 0) {
994 /* start delack timer if BtCoex is disable and tdls is not present */
995 hdd_manage_delack_timer(pHddCtx);
996 }
997 }
998
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +0530999 EXIT();
Pradeep Reddy POTTETIf0569d72014-12-13 16:54:03 +05301000 return;
1001}
1002
Agarwal Ashish4b87f922014-06-18 03:03:21 +05301003/* initialize TDLS global context */
1004void wlan_hdd_tdls_init(hdd_context_t *pHddCtx )
1005{
1006 v_U8_t staIdx;
Chandrasekaran, Manishekar0de84dc2015-03-10 15:12:34 +05301007 eHalStatus status;
Sameer Thalappilbee426e2013-10-30 10:30:30 -07001008
Agarwal Ashish4b87f922014-06-18 03:03:21 +05301009 pHddCtx->connected_peer_count = 0;
1010
Masti, Narayanraddi26378462016-01-05 18:20:28 +05301011 wlan_hdd_init_deinit_defer_scan_context(&pHddCtx->scan_ctxt);
Agarwal Ashish4b87f922014-06-18 03:03:21 +05301012
1013 for (staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++)
1014 {
1015 pHddCtx->tdlsConnInfo[staIdx].staId = 0;
1016 pHddCtx->tdlsConnInfo[staIdx].sessionId = 255;
1017 vos_mem_zero(&pHddCtx->tdlsConnInfo[staIdx].peerMac,
1018 sizeof(v_MACADDR_t)) ;
1019 }
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05301020
Chandrasekaran, Manishekar0de84dc2015-03-10 15:12:34 +05301021 status = sme_RegisterBtCoexTDLSCallback(pHddCtx->hHal,
1022 wlan_hdd_tdls_btCoex_cb);
1023 if (status != eHAL_STATUS_SUCCESS) {
1024 hddLog(VOS_TRACE_LEVEL_ERROR, FL("Failed to register BT Coex TDLS callback"));
1025 }
Agarwal Ashish4b87f922014-06-18 03:03:21 +05301026
1027 if (FALSE == pHddCtx->cfg_ini->fEnableTDLSImplicitTrigger)
1028 {
1029 pHddCtx->tdls_mode = eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY;
Ratheesh S P36dbc932015-08-07 14:28:57 +05301030 hddLog(VOS_TRACE_LEVEL_INFO, "%s TDLS Implicit trigger not enabled!", __func__);
Agarwal Ashish4b87f922014-06-18 03:03:21 +05301031 }
1032 else
1033 {
1034 pHddCtx->tdls_mode = eTDLS_SUPPORT_ENABLED;
1035 }
1036}
1037
1038int wlan_hdd_sta_tdls_init(hdd_adapter_t *pAdapter)
Chilam Ng01120412013-02-19 18:32:21 -08001039{
Chilam Ng01120412013-02-19 18:32:21 -08001040 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
Hoonki Lee27511902013-03-14 18:19:06 -07001041 tdlsCtx_t *pHddTdlsCtx;
Chilam Ng01120412013-02-19 18:32:21 -08001042 int i;
Sunil Dutt66485cb2013-12-19 19:05:03 +05301043 if (NULL == pHddCtx)
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05301044 {
1045 hddLog(VOS_TRACE_LEVEL_ERROR, "%s pHddCtx is NULL", __func__);
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +05301046 return -EINVAL;
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05301047 }
Sunil Dutt66485cb2013-12-19 19:05:03 +05301048
Mahesh A Saptasagarf5b8eff2015-01-31 01:07:07 +05301049 if (test_bit(TDLS_INIT_DONE, &pAdapter->event_flags))
1050 {
1051 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +05301052 "%s: TDLS INIT DONE set to 1, no point in re-init", __func__);
1053 return -EALREADY;
Mahesh A Saptasagarf5b8eff2015-01-31 01:07:07 +05301054 }
Sunil Dutt66485cb2013-12-19 19:05:03 +05301055
Hoonki Lee27511902013-03-14 18:19:06 -07001056 if ((FALSE == pHddCtx->cfg_ini->fEnableTDLSSupport) ||
1057 (FALSE == sme_IsFeatureSupportedByFW(TDLS)))
1058 {
1059 pHddCtx->tdls_mode = eTDLS_SUPPORT_NOT_ENABLED;
1060 pAdapter->sessionCtx.station.pHddTdlsCtx = NULL;
Ratheesh S P36dbc932015-08-07 14:28:57 +05301061 hddLog(VOS_TRACE_LEVEL_INFO, "%s TDLS not enabled (%d) or FW doesn't support (%d)!",
Hoonki Lee27511902013-03-14 18:19:06 -07001062 __func__, pHddCtx->cfg_ini->fEnableTDLSSupport,
1063 sme_IsFeatureSupportedByFW(TDLS));
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +05301064 return -EINVAL;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001065 }
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +05301066 /* TDLS is supported only in STA / P2P Client modes,
1067 * hence the check for TDLS support in a specific Device mode.
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +05301068 */
1069 if (0 == WLAN_HDD_IS_TDLS_SUPPORTED_ADAPTER(pAdapter))
1070 {
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05301071 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 +05301072 return -EINVAL;
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +05301073 }
1074 /* Check for the valid pHddTdlsCtx. If valid do not further
1075 * allocate the memory, rather continue with the initialization.
1076 * If tdls_initialization would get reinvoked without tdls_exit
1077 * getting invoked (SSR) there is no point to further proceed
1078 * with the memory allocations.
1079 */
1080 if (NULL == pAdapter->sessionCtx.station.pHddTdlsCtx)
1081 {
1082 pHddTdlsCtx = vos_mem_malloc(sizeof(tdlsCtx_t));
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001083
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +05301084 if (NULL == pHddTdlsCtx) {
1085 hddLog(VOS_TRACE_LEVEL_ERROR, "%s malloc failed!", __func__);
1086 pAdapter->sessionCtx.station.pHddTdlsCtx = NULL;
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +05301087 return -ENOMEM;
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +05301088 }
1089 /* initialize TDLS pAdater context */
1090 vos_mem_zero(pHddTdlsCtx, sizeof(tdlsCtx_t));
1091#ifdef TDLS_USE_SEPARATE_DISCOVERY_TIMER
1092 vos_timer_init(&pHddTdlsCtx->peerDiscoverTimer,
1093 VOS_TIMER_TYPE_SW,
1094 wlan_hdd_tdls_discover_peer_cb,
1095 pHddTdlsCtx);
1096#endif
Hoonki Lee27511902013-03-14 18:19:06 -07001097
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +05301098 vos_timer_init(&pHddTdlsCtx->peerUpdateTimer,
1099 VOS_TIMER_TYPE_SW,
1100 wlan_hdd_tdls_update_peer_cb,
1101 pHddTdlsCtx);
1102 vos_timer_init(&pHddTdlsCtx->peerDiscoveryTimeoutTimer,
1103 VOS_TIMER_TYPE_SW,
1104 wlan_hdd_tdls_discovery_timeout_peer_cb,
1105 pHddTdlsCtx);
1106
1107 pAdapter->sessionCtx.station.pHddTdlsCtx = pHddTdlsCtx;
Hoonki Lee27511902013-03-14 18:19:06 -07001108 }
1109
Madan Mohan Koyyalamudi81746922013-07-17 14:38:51 +05301110 pHddTdlsCtx = pAdapter->sessionCtx.station.pHddTdlsCtx;
Hoonki Lee27511902013-03-14 18:19:06 -07001111
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001112 sme_SetTdlsPowerSaveProhibited(WLAN_HDD_GET_HAL_CTX(pAdapter), 0);
Hoonki Lee27511902013-03-14 18:19:06 -07001113
Hoonki Lee27511902013-03-14 18:19:06 -07001114 pHddTdlsCtx->pAdapter = pAdapter;
1115
1116 for (i = 0; i < 256; i++)
1117 {
1118 INIT_LIST_HEAD(&pHddTdlsCtx->peer_list[i]);
1119 }
1120
Hoonki Leed37cbb32013-04-20 00:31:14 -07001121 pHddTdlsCtx->curr_candidate = NULL;
1122 pHddTdlsCtx->magic = 0;
1123
Hoonki Lee27511902013-03-14 18:19:06 -07001124 /* remember configuration even if it is not used right now. it could be used later */
1125 pHddTdlsCtx->threshold_config.tx_period_t = pHddCtx->cfg_ini->fTDLSTxStatsPeriod;
1126 pHddTdlsCtx->threshold_config.tx_packet_n = pHddCtx->cfg_ini->fTDLSTxPacketThreshold;
1127 pHddTdlsCtx->threshold_config.discovery_period_t = pHddCtx->cfg_ini->fTDLSDiscoveryPeriod;
1128 pHddTdlsCtx->threshold_config.discovery_tries_n = pHddCtx->cfg_ini->fTDLSMaxDiscoveryAttempt;
1129 pHddTdlsCtx->threshold_config.idle_timeout_t = pHddCtx->cfg_ini->fTDLSIdleTimeout;
1130 pHddTdlsCtx->threshold_config.idle_packet_n = pHddCtx->cfg_ini->fTDLSIdlePacketThreshold;
1131 pHddTdlsCtx->threshold_config.rssi_hysteresis = pHddCtx->cfg_ini->fTDLSRSSIHysteresis;
1132 pHddTdlsCtx->threshold_config.rssi_trigger_threshold = pHddCtx->cfg_ini->fTDLSRSSITriggerThreshold;
1133 pHddTdlsCtx->threshold_config.rssi_teardown_threshold = pHddCtx->cfg_ini->fTDLSRSSITeardownThreshold;
Chilam NG571c65a2013-01-19 12:27:36 +05301134
Masti, Narayanraddi26378462016-01-05 18:20:28 +05301135 set_bit(TDLS_INIT_DONE, &pAdapter->event_flags);
Hoonki Lee27511902013-03-14 18:19:06 -07001136
1137 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +05301138}
1139
Pradeep Reddy POTTETI2d4d5c42015-03-03 14:34:19 +05301140void wlan_hdd_tdls_exit(hdd_adapter_t *pAdapter, tANI_BOOLEAN mutexLock)
Chilam NG571c65a2013-01-19 12:27:36 +05301141{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001142 tdlsCtx_t *pHddTdlsCtx;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07001143 hdd_context_t *pHddCtx;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001144
Chandrasekaran, Manishekar41b8e1f2015-03-10 13:30:28 +05301145 if (!pAdapter) {
1146 hddLog(VOS_TRACE_LEVEL_ERROR, FL("HDD adpater is NULL"));
1147 return;
1148 }
1149
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301150 /*
1151 * NOTE: The Callers of this function should ensure to acquire the
Mahesh A Saptasagarf5b8eff2015-01-31 01:07:07 +05301152 * tdls_lock to avoid any concurrent access to the Adapter and logp
1153 * protection has to be ensured.
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301154 */
1155
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301156 pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
Agarwal Ashish9ffa5b92014-11-18 21:07:02 +05301157
1158 if (NULL == pHddCtx || NULL == pHddCtx->cfg_ini)
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301159 {
Agarwal Ashish9ffa5b92014-11-18 21:07:02 +05301160 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1161 "%s: HDD context is Null", __func__);
1162 return ;
1163 }
Mahesh A Saptasagarf5b8eff2015-01-31 01:07:07 +05301164 if (!test_bit(TDLS_INIT_DONE, &pAdapter->event_flags))
Agarwal Ashish9ffa5b92014-11-18 21:07:02 +05301165 {
Ratheesh S P36dbc932015-08-07 14:28:57 +05301166 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Mahesh A Saptasagarf5b8eff2015-01-31 01:07:07 +05301167 "%s: TDLS INIT DONE set to 0, no point in exit", __func__);
1168 return;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301169 }
Mahesh A Saptasagarf5b8eff2015-01-31 01:07:07 +05301170 clear_bit(TDLS_INIT_DONE, &pAdapter->event_flags);
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301171
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001172 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001173 if (NULL == pHddTdlsCtx)
1174 {
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05301175 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1176 FL("pHddTdlsCtx is NULL"));
Hoonki Leebfee0342013-01-21 16:43:45 -08001177 return;
1178 }
Mahesh A Saptasagarf5b8eff2015-01-31 01:07:07 +05301179
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001180 /* must stop timer here before freeing peer list, because peerIdleTimer is
1181 part of peer list structure. */
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001182 wlan_hdd_tdls_timers_destroy(pHddTdlsCtx);
1183 wlan_hdd_tdls_free_list(pHddTdlsCtx);
Chilam Nga75d8b62013-01-29 01:35:59 -08001184
Masti, Narayanraddi26378462016-01-05 18:20:28 +05301185 wlan_hdd_init_deinit_defer_scan_context(&pHddCtx->scan_ctxt);
1186
Sushant Kaushik15c4c522014-08-14 12:24:49 +05301187 pHddTdlsCtx->magic = 0;
1188 pHddTdlsCtx->pAdapter = NULL;
Chilam Nga75d8b62013-01-29 01:35:59 -08001189 vos_mem_free(pHddTdlsCtx);
Pradeep Reddy POTTETI59c90d62014-03-24 19:45:47 +05301190 pAdapter->sessionCtx.station.pHddTdlsCtx = NULL;
Chilam Nga75d8b62013-01-29 01:35:59 -08001191 pHddTdlsCtx = NULL;
Chilam NG571c65a2013-01-19 12:27:36 +05301192}
1193
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301194/* stop all monitoring timers per Adapter */
1195static void wlan_hdd_tdls_monitor_timers_stop(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001196{
Hoonki Leed37cbb32013-04-20 00:31:14 -07001197#ifdef TDLS_USE_SEPARATE_DISCOVERY_TIMER
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001198 vos_timer_stop(&pHddTdlsCtx->peerDiscoverTimer);
Hoonki Leed37cbb32013-04-20 00:31:14 -07001199#endif
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001200 vos_timer_stop(&pHddTdlsCtx->peerUpdateTimer);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001201 vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301202}
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001203
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301204/* stop all per peer timers */
1205static void wlan_hdd_tdls_peer_timers_stop(tdlsCtx_t *pHddTdlsCtx)
1206{
1207 int i;
1208 struct list_head *head;
1209 struct list_head *pos;
1210 hddTdlsPeer_t *curr_peer;
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001211 for (i = 0; i < 256; i++)
1212 {
1213 head = &pHddTdlsCtx->peer_list[i];
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001214 list_for_each (pos, head) {
1215 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05301216 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Chilam Ng01120412013-02-19 18:32:21 -08001217 "%s: " MAC_ADDRESS_STR " -> stop idle timer",
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001218 __func__,
Chilam Ng01120412013-02-19 18:32:21 -08001219 MAC_ADDR_ARRAY(curr_peer->peerMac));
Masti, Narayanraddie8e14622015-10-17 16:10:54 +05301220 if (vos_timer_is_initialized(&curr_peer->peerIdleTimer))
1221 vos_timer_stop ( &curr_peer->peerIdleTimer );
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +05301222 if (vos_timer_is_initialized(&curr_peer->initiatorWaitTimeoutTimer))
1223 vos_timer_stop( &curr_peer->initiatorWaitTimeoutTimer );
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001224 }
1225 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001226}
1227
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301228/* stop all the tdls timers running */
1229static void wlan_hdd_tdls_timers_stop(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001230{
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301231 wlan_hdd_tdls_monitor_timers_stop(pHddTdlsCtx);
1232 wlan_hdd_tdls_peer_timers_stop(pHddTdlsCtx);
1233}
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001234
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301235static void wlan_hdd_tdls_monitor_timers_destroy(tdlsCtx_t *pHddTdlsCtx)
1236{
Hoonki Leed37cbb32013-04-20 00:31:14 -07001237#ifdef TDLS_USE_SEPARATE_DISCOVERY_TIMER
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001238 vos_timer_stop(&pHddTdlsCtx->peerDiscoverTimer);
1239 vos_timer_destroy(&pHddTdlsCtx->peerDiscoverTimer);
Hoonki Leed37cbb32013-04-20 00:31:14 -07001240#endif
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001241 vos_timer_stop(&pHddTdlsCtx->peerUpdateTimer);
1242 vos_timer_destroy(&pHddTdlsCtx->peerUpdateTimer);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001243 vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
1244 vos_timer_destroy(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301245}
1246/*Free all the timers related to the TDLS peer */
1247static void wlan_hdd_tdls_peer_timers_destroy(tdlsCtx_t *pHddTdlsCtx)
1248{
1249 int i;
1250 struct list_head *head;
1251 struct list_head *pos;
1252 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001253 for (i = 0; i < 256; i++)
1254 {
1255 head = &pHddTdlsCtx->peer_list[i];
1256
1257 list_for_each (pos, head) {
1258 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
1259
Masti, Narayanraddie8e14622015-10-17 16:10:54 +05301260 if (vos_timer_is_initialized(&curr_peer->peerIdleTimer)){
1261 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1262 "%s: " MAC_ADDRESS_STR " -> destroy idle timer",
1263 __func__,
1264 MAC_ADDR_ARRAY(curr_peer->peerMac));
1265 vos_timer_stop ( &curr_peer->peerIdleTimer );
1266 vos_timer_destroy ( &curr_peer->peerIdleTimer );
1267 }
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +05301268 if (vos_timer_is_initialized(&curr_peer->initiatorWaitTimeoutTimer))
1269 {
Masti, Narayanraddie8e14622015-10-17 16:10:54 +05301270 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1271 "%s: " MAC_ADDRESS_STR " -> destroy initiatorWaitTimeoutTimer",
1272 __func__,
1273 MAC_ADDR_ARRAY(curr_peer->peerMac));
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +05301274 vos_timer_stop(&curr_peer->initiatorWaitTimeoutTimer);
1275 vos_timer_destroy(&curr_peer->initiatorWaitTimeoutTimer);
1276 }
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001277 }
1278 }
Madan Mohan Koyyalamudi693275b2013-07-22 19:14:09 +05301279}
1280
1281/* destroy all the tdls timers running */
1282static void wlan_hdd_tdls_timers_destroy(tdlsCtx_t *pHddTdlsCtx)
1283{
1284 wlan_hdd_tdls_monitor_timers_destroy(pHddTdlsCtx);
1285 wlan_hdd_tdls_peer_timers_destroy(pHddTdlsCtx);
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001286}
1287
Hoonki Lee387663d2013-02-05 18:08:43 -08001288/* if mac address exist, return pointer
1289 if mac address doesn't exist, create a list and add, return pointer
1290 return NULL if fails to get new mac address
1291*/
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05301292hddTdlsPeer_t *wlan_hdd_tdls_get_peer(hdd_adapter_t *pAdapter,
1293#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1294 const u8 *mac
1295#else
1296 u8 *mac
1297#endif
1298 )
Chilam NG571c65a2013-01-19 12:27:36 +05301299{
Hoonki Lee387663d2013-02-05 18:08:43 -08001300 struct list_head *head;
1301 hddTdlsPeer_t *peer;
1302 u8 key;
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -07001303 tdlsCtx_t *pHddTdlsCtx;
Chandrasekaran, Manishekar41b8e1f2015-03-10 13:30:28 +05301304 hdd_context_t *pHddCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05301305
Chandrasekaran, Manishekar41b8e1f2015-03-10 13:30:28 +05301306
1307 if (!pAdapter) {
1308 hddLog(VOS_TRACE_LEVEL_ERROR, FL("HDD adpater is NULL"));
1309 return NULL;
1310 }
1311
1312 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1313 if (0 != (wlan_hdd_validate_context(pHddCtx)))
c_hpothu7f63e882013-10-02 19:13:35 +05301314 {
c_hpothu7f63e882013-10-02 19:13:35 +05301315 return 0;
1316 }
Hoonki Leebfee0342013-01-21 16:43:45 -08001317
Hoonki Lee387663d2013-02-05 18:08:43 -08001318 /* if already there, just update */
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301319 peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Hoonki Lee387663d2013-02-05 18:08:43 -08001320 if (peer != NULL)
1321 {
1322 return peer;
Chilam NG571c65a2013-01-19 12:27:36 +05301323 }
1324
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301325 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1326 FL("peer mac address %pM"), mac);
1327
Hoonki Lee387663d2013-02-05 18:08:43 -08001328 /* not found, allocate and add the list */
1329 peer = vos_mem_malloc(sizeof(hddTdlsPeer_t));
1330 if (NULL == peer) {
1331 hddLog(VOS_TRACE_LEVEL_ERROR, "%s peer malloc failed!", __func__);
1332 return NULL;
1333 }
Chilam NG571c65a2013-01-19 12:27:36 +05301334
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -07001335 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
1336
1337 if (NULL == pHddTdlsCtx)
1338 {
1339 vos_mem_free(peer);
Hema Aparna Medicharla8bb6f782015-03-09 12:35:05 +05301340 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1341 FL("pHddTdlsCtx is NULL"));
Gopichand Nakkala4ddf0192013-03-27 13:41:20 -07001342 return NULL;
1343 }
1344
1345 key = wlan_hdd_tdls_hash_key(mac);
1346 head = &pHddTdlsCtx->peer_list[key];
Chilam NG571c65a2013-01-19 12:27:36 +05301347
Hoonki Lee387663d2013-02-05 18:08:43 -08001348 vos_mem_zero(peer, sizeof(hddTdlsPeer_t));
1349 vos_mem_copy(peer->peerMac, mac, sizeof(peer->peerMac));
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001350 peer->pHddTdlsCtx = pHddTdlsCtx;
Hoonki Lee387663d2013-02-05 18:08:43 -08001351 list_add_tail(&peer->node, head);
Hoonki Lee387663d2013-02-05 18:08:43 -08001352
1353 return peer;
1354}
1355
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001356int wlan_hdd_tdls_set_cap(hdd_adapter_t *pAdapter,
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301357#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1358 const u8* mac,
1359#else
Hoonki Lee27511902013-03-14 18:19:06 -07001360 u8* mac,
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301361#endif
Hoonki Lee27511902013-03-14 18:19:06 -07001362 tTDLSCapType cap)
1363{
1364 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301365 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee27511902013-03-14 18:19:06 -07001366
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301367 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1368 return -EINVAL;
1369
1370 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001371 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee27511902013-03-14 18:19:06 -07001372 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301373 {
1374 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1375 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301376 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001377 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301378 }
Hoonki Lee27511902013-03-14 18:19:06 -07001379
1380 curr_peer->tdls_support = cap;
1381
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301382 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001383 return 0;
Hoonki Lee27511902013-03-14 18:19:06 -07001384}
1385
Atul Mittal115287b2014-07-08 13:26:33 +05301386void wlan_hdd_tdls_set_peer_link_status(hddTdlsPeer_t *curr_peer,
1387 tTDLSLinkStatus status,
1388 tTDLSLinkReason reason)
Hoonki Lee387663d2013-02-05 18:08:43 -08001389{
Atul Mittal115287b2014-07-08 13:26:33 +05301390 /*EXT TDLS*/
1391 tANI_S32 state = 0;
1392 tANI_S32 res = 0;
1393 /*EXT TDLS*/
Hoonki Lee387663d2013-02-05 18:08:43 -08001394 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301395 {
1396 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1397 "%s: curr_peer is NULL", __func__);
Hoonki Lee387663d2013-02-05 18:08:43 -08001398 return;
c_hpothu7f63e882013-10-02 19:13:35 +05301399 }
Hoonki Lee387663d2013-02-05 18:08:43 -08001400
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001401 hddLog(VOS_TRACE_LEVEL_WARN, "tdls set peer " MAC_ADDRESS_STR " link status to %u",
Chilam Ng01120412013-02-19 18:32:21 -08001402 MAC_ADDR_ARRAY(curr_peer->peerMac), status);
Chilam NG571c65a2013-01-19 12:27:36 +05301403
1404 curr_peer->link_status = status;
1405
Atul Mittal115287b2014-07-08 13:26:33 +05301406 /*EXT TDLS*/
1407 if (curr_peer->isForcedPeer && curr_peer->state_change_notification)
1408 {
1409 /*save the reason for any further query*/
1410 curr_peer->reason = reason;
1411 wlan_hdd_tdls_get_wifi_hal_state(curr_peer, &state, &res);
1412
1413 (curr_peer->state_change_notification)(
1414 curr_peer->peerMac,
1415 state,
1416 res,
1417 curr_peer->pHddTdlsCtx->pAdapter);
1418
1419 }
1420 /*EXT TDLS*/
1421
Chilam NG571c65a2013-01-19 12:27:36 +05301422}
1423
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001424void wlan_hdd_tdls_set_link_status(hdd_adapter_t *pAdapter,
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05301425#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1426 const u8 *mac,
1427#else
1428 u8 *mac,
1429#endif
Atul Mittal115287b2014-07-08 13:26:33 +05301430 tTDLSLinkStatus linkStatus,
1431 tTDLSLinkReason reason)
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001432{
Atul Mittal115287b2014-07-08 13:26:33 +05301433
1434 /*EXT TDLS*/
1435 tANI_S32 state = 0;
1436 tANI_S32 res = 0;
1437 /*EXT TDLS*/
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001438 hddTdlsPeer_t *curr_peer;
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301439 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001440
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301441 if (pHddCtx == NULL)
1442 {
1443 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1444 FL("pHddCtx is NULL"));
1445 return;
1446 }
1447
1448 mutex_lock(&pHddCtx->tdls_lock);
1449 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001450 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301451 {
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301452 mutex_unlock(&pHddCtx->tdls_lock);
c_hpothu7f63e882013-10-02 19:13:35 +05301453 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1454 "%s: curr_peer is NULL", __func__);
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001455 return;
c_hpothu7f63e882013-10-02 19:13:35 +05301456 }
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001457
1458 curr_peer->link_status= linkStatus;
1459
Atul Mittal115287b2014-07-08 13:26:33 +05301460 /*EXT TDLS*/
1461
1462 if (curr_peer->isForcedPeer && curr_peer->state_change_notification)
1463 {
1464 /*save the reason for any further query*/
1465 curr_peer->reason = reason;
1466 wlan_hdd_tdls_get_wifi_hal_state(curr_peer, &state, &res);
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301467 mutex_unlock(&pHddCtx->tdls_lock);
Atul Mittal115287b2014-07-08 13:26:33 +05301468 (*curr_peer->state_change_notification)(mac,
1469 state,
1470 res,
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301471 pAdapter);
Atul Mittal115287b2014-07-08 13:26:33 +05301472 }
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05301473 else
1474 mutex_unlock(&pHddCtx->tdls_lock);
1475
Atul Mittal115287b2014-07-08 13:26:33 +05301476 /*EXT TDLS*/
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001477 return;
1478}
1479
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001480int wlan_hdd_tdls_recv_discovery_resp(hdd_adapter_t *pAdapter, u8 *mac)
Chilam NG571c65a2013-01-19 12:27:36 +05301481{
1482 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301483 tdlsCtx_t *pHddTdlsCtx = NULL;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301484 hdd_context_t *pHddCtx;
1485
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05301486 ENTER();
1487
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301488 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1489 if (0 != wlan_hdd_validate_context(pHddCtx))
1490 return -1;
1491
1492 mutex_lock(&pHddCtx->tdls_lock);
1493
1494 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301495 if ( NULL == pHddTdlsCtx )
c_hpothu7f63e882013-10-02 19:13:35 +05301496 {
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301497 mutex_unlock(&pHddCtx->tdls_lock);
1498 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1499 FL("pHddTdlsCtx is NULL device mode = %d"),
1500 pAdapter->device_mode);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301501 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301502 }
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301503
1504 pHddCtx = WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter);
1505
c_hpothu7f63e882013-10-02 19:13:35 +05301506 if(0 != (wlan_hdd_validate_context(pHddCtx)))
1507 {
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301508 mutex_unlock(&pHddCtx->tdls_lock);
c_hpothu7f63e882013-10-02 19:13:35 +05301509 return 0;
1510 }
Chilam NG571c65a2013-01-19 12:27:36 +05301511
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001512 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001513
1514 if (NULL == curr_peer)
c_hpothu7f63e882013-10-02 19:13:35 +05301515 {
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301516 mutex_unlock(&pHddCtx->tdls_lock);
c_hpothu7f63e882013-10-02 19:13:35 +05301517 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1518 FL("curr_peer is NULL"));
Hoonki Lee387663d2013-02-05 18:08:43 -08001519 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301520 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001521
1522 if (pHddTdlsCtx->discovery_sent_cnt)
1523 pHddTdlsCtx->discovery_sent_cnt--;
1524
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301525
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07001526 wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05301527
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001528 if (0 == pHddTdlsCtx->discovery_sent_cnt)
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001529 {
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001530 vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001531 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001532
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05301533 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001534 "Discovery(%u) Response from " MAC_ADDRESS_STR " link_status %d",
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001535 pHddTdlsCtx->discovery_sent_cnt, MAC_ADDR_ARRAY(curr_peer->peerMac),
1536 curr_peer->link_status);
1537
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301538 curr_peer->tdls_support = eTDLS_CAP_SUPPORTED;
1539
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001540 if (eTDLS_LINK_DISCOVERING == curr_peer->link_status)
Gopichand Nakkala901e8922013-03-04 23:45:58 -08001541 {
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001542 /* Since we are here, it means Throughput threshold is alredy met. Make sure RSSI
1543 threshold is also met before setting up TDLS link*/
1544 if ((tANI_S32) curr_peer->rssi > (tANI_S32) pHddTdlsCtx->threshold_config.rssi_trigger_threshold)
1545 {
Atul Mittal115287b2014-07-08 13:26:33 +05301546 wlan_hdd_tdls_set_peer_link_status(curr_peer,
1547 eTDLS_LINK_DISCOVERED,
1548 eTDLS_LINK_SUCCESS);
Ganesh Kondabattinid01c4ee2016-01-04 16:13:06 +05301549
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05301550 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001551 "Rssi Threshold met: "MAC_ADDRESS_STR" rssi = %d threshold= %d" ,
1552 MAC_ADDR_ARRAY(curr_peer->peerMac), curr_peer->rssi,
1553 pHddTdlsCtx->threshold_config.rssi_trigger_threshold);
Ganesh Kondabattinid01c4ee2016-01-04 16:13:06 +05301554
1555 if (pHddCtx->tdls_mode != eTDLS_SUPPORT_DISABLED)
1556 {
1557 /* TDLS can be disabled from multiple sources like
1558 * scan, p2p-listen, p2p, btc etc ...
1559 * Dont initiate tdls setup if tdls is disabled
1560 */
1561 cfg80211_tdls_oper_request(pAdapter->dev, curr_peer->peerMac,
1562 NL80211_TDLS_SETUP, FALSE,
1563 GFP_KERNEL);
1564 }
1565 else
1566 {
1567 curr_peer->tdls_support = eTDLS_CAP_UNKNOWN;
1568 wlan_hdd_tdls_set_peer_link_status(
1569 curr_peer,
1570 eTDLS_LINK_IDLE,
1571 eTDLS_LINK_UNSPECIFIED);
1572
1573 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1574 "%s: TDLS is disabled. Resetting link_status of peer "
1575 MAC_ADDRESS_STR " to %d, tdls_support %d", __func__,
1576 MAC_ADDR_ARRAY(curr_peer->peerMac),
1577 curr_peer->link_status, curr_peer->tdls_support);
1578 }
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001579 }
1580 else
1581 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05301582 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001583 "Rssi Threshold not met: "MAC_ADDRESS_STR" rssi = %d threshold = %d ",
1584 MAC_ADDR_ARRAY(curr_peer->peerMac), curr_peer->rssi,
1585 pHddTdlsCtx->threshold_config.rssi_trigger_threshold);
Sunil Duttb0d39242014-09-10 23:54:51 +05301586
1587 /* if RSSI threshold is not met then allow further discovery
1588 * attempts by decrementing count for the last attempt
1589 */
1590 if (curr_peer->discovery_attempt)
1591 curr_peer->discovery_attempt--;
1592
Atul Mittal115287b2014-07-08 13:26:33 +05301593 wlan_hdd_tdls_set_peer_link_status(curr_peer,
1594 eTDLS_LINK_IDLE,
1595 eTDLS_LINK_UNSPECIFIED);
Shailender Karmuchi13c0d082013-03-26 14:41:39 -07001596 }
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301597 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala901e8922013-03-04 23:45:58 -08001598 }
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001599 else
1600 {
Masti, Narayanraddi4c30a092015-10-17 16:13:38 +05301601 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07001602 wlan_hdd_tdls_check_bmps(pAdapter);
1603 }
Chilam NG571c65a2013-01-19 12:27:36 +05301604
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05301605 EXIT();
Hoonki Lee387663d2013-02-05 18:08:43 -08001606 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +05301607}
1608
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301609int wlan_hdd_tdls_set_peer_caps(hdd_adapter_t *pAdapter,
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05301610#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1611 const u8 *mac,
1612#else
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301613 u8 *mac,
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05301614#endif
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301615 tCsrStaParams *StaParams,
1616 tANI_BOOLEAN isBufSta,
Masti, Narayanraddic754cdc2015-12-24 18:22:36 +05301617 tANI_BOOLEAN isOffChannelSupported,
1618 tANI_BOOLEAN isQosWmmSta)
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301619{
1620 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301621 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301622
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301623 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1624 return -EINVAL;
1625
1626 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301627 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
1628 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301629 {
1630 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1631 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301632 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301633 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301634 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301635
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301636 curr_peer->uapsdQueues = StaParams->uapsd_queues;
1637 curr_peer->maxSp = StaParams->max_sp;
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301638 curr_peer->isBufSta = isBufSta;
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301639 curr_peer->isOffChannelSupported = isOffChannelSupported;
1640
1641 vos_mem_copy(curr_peer->supported_channels,
1642 StaParams->supported_channels,
1643 StaParams->supported_channels_len);
1644
1645 curr_peer->supported_channels_len =
1646 StaParams->supported_channels_len;
1647
1648 vos_mem_copy(curr_peer->supported_oper_classes,
1649 StaParams->supported_oper_classes,
1650 StaParams->supported_oper_classes_len);
1651
1652 curr_peer->supported_oper_classes_len =
1653 StaParams->supported_oper_classes_len;
Masti, Narayanraddic754cdc2015-12-24 18:22:36 +05301654 curr_peer->qos = isQosWmmSta;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301655
1656 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301657 return 0;
1658}
1659
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301660int wlan_hdd_tdls_get_link_establish_params(hdd_adapter_t *pAdapter,
1661#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1662 const u8 *mac,
1663#else
1664 u8 *mac,
1665#endif
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301666 tCsrTdlsLinkEstablishParams* tdlsLinkEstablishParams)
1667{
1668 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301669 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301670
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301671 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1672 return -EINVAL;
1673
1674 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301675 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
1676 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301677 {
1678 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1679 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301680 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301681 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301682 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301683
1684 tdlsLinkEstablishParams->isResponder = curr_peer->is_responder;
1685 tdlsLinkEstablishParams->uapsdQueues = curr_peer->uapsdQueues;
1686 tdlsLinkEstablishParams->maxSp = curr_peer->maxSp;
1687 tdlsLinkEstablishParams->isBufSta = curr_peer->isBufSta;
Naresh Jayaram3180aa42014-02-12 21:47:26 +05301688 tdlsLinkEstablishParams->isOffChannelSupported =
1689 curr_peer->isOffChannelSupported;
1690
1691 vos_mem_copy(tdlsLinkEstablishParams->supportedChannels,
1692 curr_peer->supported_channels,
1693 curr_peer->supported_channels_len);
1694
1695 tdlsLinkEstablishParams->supportedChannelsLen =
1696 curr_peer->supported_channels_len;
1697
1698 vos_mem_copy(tdlsLinkEstablishParams->supportedOperClasses,
1699 curr_peer->supported_oper_classes,
1700 curr_peer->supported_oper_classes_len);
1701
1702 tdlsLinkEstablishParams->supportedOperClassesLen =
1703 curr_peer->supported_oper_classes_len;
Agarwal Ashish16020c42014-12-29 22:01:11 +05301704 tdlsLinkEstablishParams->qos = curr_peer->qos;
1705
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301706 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05301707 return 0;
1708}
1709
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301710int wlan_hdd_tdls_set_rssi(hdd_adapter_t *pAdapter,
1711#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1712 const u8 *mac,
1713#else
1714 u8 *mac,
1715#endif
1716 tANI_S8 rxRssi)
Chilam NG571c65a2013-01-19 12:27:36 +05301717{
1718 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05301719 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
Chilam NG571c65a2013-01-19 12:27:36 +05301720
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05301721 if (0 != (wlan_hdd_validate_context(hdd_ctx))) {
1722 return -1;
1723 }
1724
1725 mutex_lock(&hdd_ctx->tdls_lock);
1726 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Hoonki Lee387663d2013-02-05 18:08:43 -08001727 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301728 {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05301729 mutex_unlock(&hdd_ctx->tdls_lock);
1730 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1731 FL("curr_peer is NULL"));
Hoonki Lee387663d2013-02-05 18:08:43 -08001732 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301733 }
Chilam NG571c65a2013-01-19 12:27:36 +05301734
1735 curr_peer->rssi = rxRssi;
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05301736 mutex_unlock(&hdd_ctx->tdls_lock);
Chilam NG571c65a2013-01-19 12:27:36 +05301737
Hoonki Lee387663d2013-02-05 18:08:43 -08001738 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +05301739}
1740
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301741int wlan_hdd_tdls_set_responder(hdd_adapter_t *pAdapter,
1742#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1743 const u8 *mac,
1744#else
1745 u8 *mac,
1746#endif
1747 tANI_U8 responder)
Hoonki Leea34dd892013-02-05 22:56:02 -08001748{
1749 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301750 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Leea34dd892013-02-05 22:56:02 -08001751
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301752 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1753 return -EINVAL;
1754
1755 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001756 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001757 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301758 {
1759 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1760 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301761 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leea34dd892013-02-05 22:56:02 -08001762 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301763 }
Hoonki Leea34dd892013-02-05 22:56:02 -08001764
1765 curr_peer->is_responder = responder;
1766
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301767 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leea34dd892013-02-05 22:56:02 -08001768 return 0;
1769}
1770
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05301771int wlan_hdd_tdls_set_signature(hdd_adapter_t *pAdapter,
1772#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
1773 const u8 *mac,
1774#else
1775 u8 *mac,
1776#endif
1777 tANI_U8 uSignature)
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001778{
1779 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301780 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001781
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301782 if (0 != (wlan_hdd_validate_context(pHddCtx)))
1783 return -EINVAL;
1784
1785 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001786 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001787 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301788 {
1789 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1790 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301791 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001792 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05301793 }
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001794
1795 curr_peer->signature = uSignature;
1796
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301797 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08001798 return 0;
1799}
1800
Hoonki Leea34dd892013-02-05 22:56:02 -08001801
Hoonki Lee387663d2013-02-05 18:08:43 -08001802void wlan_hdd_tdls_extract_da(struct sk_buff *skb, u8 *mac)
Chilam NG571c65a2013-01-19 12:27:36 +05301803{
Chilam NG571c65a2013-01-19 12:27:36 +05301804 memcpy(mac, skb->data, 6);
Chilam NG571c65a2013-01-19 12:27:36 +05301805}
1806
Hoonki Lee387663d2013-02-05 18:08:43 -08001807void wlan_hdd_tdls_extract_sa(struct sk_buff *skb, u8 *mac)
Chilam Ng1279e232013-01-25 15:06:52 -08001808{
Chilam Ng1279e232013-01-25 15:06:52 -08001809 memcpy(mac, skb->data+6, 6);
Chilam Ng1279e232013-01-25 15:06:52 -08001810}
1811
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301812/**
1813 * wlan_hdd_tdls_is_forced_peer - function to check if peer is forced peer
1814 * @adapter: pointer to hdd apater
1815 * @mac: peer mac address
1816 *
1817 * Function identified is the peer is forced for tdls connection
1818 *
1819 * return: true: peer is forced false: peer is not forced
1820 */
1821static bool wlan_hdd_tdls_is_forced_peer(hdd_adapter_t *adapter,
1822 const u8 *mac)
1823{
1824 hddTdlsPeer_t *peer;
1825 hdd_context_t *hddctx = WLAN_HDD_GET_CTX(adapter);
1826 bool is_forced_peer;
1827
1828 mutex_lock(&hddctx->tdls_lock);
1829 peer = wlan_hdd_tdls_find_peer(adapter, mac, FALSE);
1830 if (!peer)
1831 {
1832 is_forced_peer = false;
1833 goto ret;
1834 }
1835
1836 if (!peer->isForcedPeer)
1837 {
1838 is_forced_peer = false;
1839 goto ret;
1840 }
1841 is_forced_peer = true;
1842
1843ret:
1844 mutex_unlock(&hddctx->tdls_lock);
1845 return is_forced_peer;
1846}
1847
1848/**
1849 * wlan_hdd_tdls_increment_pkt_count - function to increment tdls tx packet cnt
1850 * @pAdapter: pointer to hdd adapter
1851 * @skb: pointer to sk_buff
1852 *
1853 * Function to increment packet count if packet is destined to tdls peer
1854 *
1855 * return: None
1856 */
1857static void wlan_hdd_tdls_increment_pkt_count(hdd_adapter_t *pAdapter,
1858 struct sk_buff *skb)
Chilam NG571c65a2013-01-19 12:27:36 +05301859{
Hoonki Lee387663d2013-02-05 18:08:43 -08001860 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001861 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301862 hdd_station_ctx_t *hdd_sta_ctx;
1863 u8 mac[6];
Chilam NG571c65a2013-01-19 12:27:36 +05301864
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301865 if (0 != (wlan_hdd_validate_context(pHddCtx)))
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301866 return;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301867
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001868 if (eTDLS_SUPPORT_ENABLED != pHddCtx->tdls_mode)
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301869 goto error;
1870
1871 if (!pHddCtx->cfg_ini->fEnableTDLSImplicitTrigger)
1872 goto error;
1873
1874 wlan_hdd_tdls_extract_da(skb, mac);
1875
1876 if (pHddCtx->cfg_ini->fTDLSExternalControl)
1877 {
1878 if (!wlan_hdd_tdls_is_forced_peer(pAdapter, mac))
1879 goto error;
1880 }
1881
1882 hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
1883
1884 if (vos_is_macaddr_group((v_MACADDR_t *)mac))
1885 {
1886 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_MED,
1887 "broadcast packet, not adding to peer list");
1888 goto error;
1889 }
1890
1891 if (memcmp(hdd_sta_ctx->conn_info.bssId, mac, 6) == 0) {
1892 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_MED,
1893 "packet da is bssid, not adding to peer list");
1894 goto error;
1895 }
Hoonki Leebfee0342013-01-21 16:43:45 -08001896
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301897 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001898 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08001899 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05301900 {
c_hpothue21931b2014-09-08 14:02:14 +05301901 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1902 FL("curr_peer is NULL"));
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301903 mutex_unlock(&pHddCtx->tdls_lock);
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301904 goto error;
c_hpothu7f63e882013-10-02 19:13:35 +05301905 }
Chilam NG571c65a2013-01-19 12:27:36 +05301906
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301907 curr_peer->tx_pkt++;
Chilam NG571c65a2013-01-19 12:27:36 +05301908
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05301909 mutex_unlock(&pHddCtx->tdls_lock);
Masti, Narayanraddi63d62352015-10-01 12:52:50 +05301910
1911error:
1912 return;
1913}
1914
1915void wlan_hdd_tdls_notify_packet(hdd_adapter_t *adapter, struct sk_buff *skb)
1916{
1917 wlan_hdd_tdls_increment_pkt_count(adapter, skb);
Chilam NG571c65a2013-01-19 12:27:36 +05301918}
1919
Hoonki Lee27511902013-03-14 18:19:06 -07001920static int wlan_hdd_tdls_check_config(tdls_config_params_t *config)
1921{
1922 if (config->tdls > 2)
1923 {
1924 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 1st argument %d. <0...2>", __func__, config->tdls);
1925 return -1;
1926 }
1927 if (config->tx_period_t < CFG_TDLS_TX_STATS_PERIOD_MIN ||
1928 config->tx_period_t > CFG_TDLS_TX_STATS_PERIOD_MAX)
1929 {
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001930 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 2nd argument %d. <%d...%ld>", __func__, config->tx_period_t,
Hoonki Lee27511902013-03-14 18:19:06 -07001931 CFG_TDLS_TX_STATS_PERIOD_MIN, CFG_TDLS_TX_STATS_PERIOD_MAX);
1932 return -1;
1933 }
1934 if (config->tx_packet_n < CFG_TDLS_TX_PACKET_THRESHOLD_MIN ||
1935 config->tx_packet_n > CFG_TDLS_TX_PACKET_THRESHOLD_MAX)
1936 {
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001937 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 3rd argument %d. <%d...%ld>", __func__, config->tx_packet_n,
Hoonki Lee27511902013-03-14 18:19:06 -07001938 CFG_TDLS_TX_PACKET_THRESHOLD_MIN, CFG_TDLS_TX_PACKET_THRESHOLD_MAX);
1939 return -1;
1940 }
1941 if (config->discovery_period_t < CFG_TDLS_DISCOVERY_PERIOD_MIN ||
1942 config->discovery_period_t > CFG_TDLS_DISCOVERY_PERIOD_MAX)
1943 {
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001944 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 4th argument %d. <%d...%ld>", __func__, config->discovery_period_t,
Hoonki Lee27511902013-03-14 18:19:06 -07001945 CFG_TDLS_DISCOVERY_PERIOD_MIN, CFG_TDLS_DISCOVERY_PERIOD_MAX);
1946 return -1;
1947 }
1948 if (config->discovery_tries_n < CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MIN ||
1949 config->discovery_tries_n > CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MAX)
1950 {
1951 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 5th argument %d. <%d...%d>", __func__, config->discovery_tries_n,
1952 CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MIN, CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MAX);
1953 return -1;
1954 }
1955 if (config->idle_timeout_t < CFG_TDLS_IDLE_TIMEOUT_MIN ||
1956 config->idle_timeout_t > CFG_TDLS_IDLE_TIMEOUT_MAX)
1957 {
1958 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 6th argument %d. <%d...%d>", __func__, config->idle_timeout_t,
1959 CFG_TDLS_IDLE_TIMEOUT_MIN, CFG_TDLS_IDLE_TIMEOUT_MAX);
1960 return -1;
1961 }
1962 if (config->idle_packet_n < CFG_TDLS_IDLE_PACKET_THRESHOLD_MIN ||
1963 config->idle_packet_n > CFG_TDLS_IDLE_PACKET_THRESHOLD_MAX)
1964 {
1965 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 7th argument %d. <%d...%d>", __func__, config->idle_packet_n,
1966 CFG_TDLS_IDLE_PACKET_THRESHOLD_MIN, CFG_TDLS_IDLE_PACKET_THRESHOLD_MAX);
1967 return -1;
1968 }
1969 if (config->rssi_hysteresis < CFG_TDLS_RSSI_HYSTERESIS_MIN ||
1970 config->rssi_hysteresis > CFG_TDLS_RSSI_HYSTERESIS_MAX)
1971 {
1972 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 8th argument %d. <%d...%d>", __func__, config->rssi_hysteresis,
1973 CFG_TDLS_RSSI_HYSTERESIS_MIN, CFG_TDLS_RSSI_HYSTERESIS_MAX);
1974 return -1;
1975 }
1976 if (config->rssi_trigger_threshold < CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MIN ||
1977 config->rssi_trigger_threshold > CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MAX)
1978 {
1979 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 9th argument %d. <%d...%d>", __func__, config->rssi_trigger_threshold,
1980 CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MIN, CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MAX);
1981 return -1;
1982 }
1983 if (config->rssi_teardown_threshold < CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MIN ||
1984 config->rssi_teardown_threshold > CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MAX)
1985 {
1986 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 10th argument %d. <%d...%d>", __func__, config->rssi_teardown_threshold,
1987 CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MIN, CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MAX);
1988 return -1;
1989 }
1990 return 0;
1991}
1992
Chilam Ng01120412013-02-19 18:32:21 -08001993int wlan_hdd_tdls_set_params(struct net_device *dev, tdls_config_params_t *config)
Chilam NG571c65a2013-01-19 12:27:36 +05301994{
Chilam Ng01120412013-02-19 18:32:21 -08001995 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
1996 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001997 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Hoonki Lee27511902013-03-14 18:19:06 -07001998 eTDLSSupportMode req_tdls_mode;
Hoonki Leebfee0342013-01-21 16:43:45 -08001999
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302000 mutex_lock(&pHddCtx->tdls_lock);
Hoonki Lee27511902013-03-14 18:19:06 -07002001 if (NULL == pHddTdlsCtx)
2002 {
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302003 mutex_unlock(&pHddCtx->tdls_lock);
c_hpothu7f63e882013-10-02 19:13:35 +05302004 hddLog(VOS_TRACE_LEVEL_ERROR, FL("TDLS not enabled!"));
Hoonki Lee27511902013-03-14 18:19:06 -07002005 return -1;
Chilam Ng01120412013-02-19 18:32:21 -08002006 }
Chilam NG571c65a2013-01-19 12:27:36 +05302007
Hoonki Lee27511902013-03-14 18:19:06 -07002008 if (wlan_hdd_tdls_check_config(config) != 0)
2009 {
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302010 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee27511902013-03-14 18:19:06 -07002011 return -1;
2012 }
2013
2014 /* config->tdls is mapped to 0->1, 1->2, 2->3 */
2015 req_tdls_mode = config->tdls + 1;
2016 if (pHddCtx->tdls_mode == req_tdls_mode)
2017 {
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302018 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee27511902013-03-14 18:19:06 -07002019 hddLog(VOS_TRACE_LEVEL_ERROR, "%s already in mode %d", __func__, config->tdls);
2020 return -1;
2021 }
2022
2023 /* copy the configuration only when given tdls mode is implicit trigger enable */
2024 if (eTDLS_SUPPORT_ENABLED == req_tdls_mode)
2025 {
Chilam Ng01120412013-02-19 18:32:21 -08002026 memcpy(&pHddTdlsCtx->threshold_config, config, sizeof(tdls_config_params_t));
2027 }
Chilam NG571c65a2013-01-19 12:27:36 +05302028
Chilam Ng01120412013-02-19 18:32:21 -08002029 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2030 "iw set tdls params: %d %d %d %d %d %d %d %d %d %d",
2031 config->tdls,
2032 config->tx_period_t,
2033 config->tx_packet_n,
2034 config->discovery_period_t,
2035 config->discovery_tries_n,
2036 config->idle_timeout_t,
2037 config->idle_packet_n,
2038 config->rssi_hysteresis,
2039 config->rssi_trigger_threshold,
2040 config->rssi_teardown_threshold);
Chilam NG571c65a2013-01-19 12:27:36 +05302041
Ganesh Kondabattinicf2a58d2015-11-27 12:24:01 +05302042 mutex_unlock(&pHddCtx->tdls_lock);
2043
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302044 wlan_hdd_tdls_set_mode(pHddCtx, req_tdls_mode, TRUE,
2045 HDD_SET_TDLS_MODE_SOURCE_USER);
Chilam Ng01120412013-02-19 18:32:21 -08002046
Chilam NG571c65a2013-01-19 12:27:36 +05302047 return 0;
2048}
2049
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05302050int wlan_hdd_tdls_set_sta_id(hdd_adapter_t *pAdapter,
2051#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2052 const u8 *mac,
2053#else
2054 u8 *mac,
2055#endif
2056 u8 staId)
Kiran V1ccee932012-12-12 14:49:46 -08002057{
Hoonki Lee387663d2013-02-05 18:08:43 -08002058 hddTdlsPeer_t *curr_peer;
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302059 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Kiran V1ccee932012-12-12 14:49:46 -08002060
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302061 if (0 != (wlan_hdd_validate_context(pHddCtx)))
2062 return -EINVAL;
2063
2064 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002065 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08002066 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05302067 {
2068 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2069 "%s: curr_peer is NULL", __func__);
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302070 mutex_unlock(&pHddCtx->tdls_lock);
Chilam NG571c65a2013-01-19 12:27:36 +05302071 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05302072 }
Chilam NG571c65a2013-01-19 12:27:36 +05302073
Hoonki Lee387663d2013-02-05 18:08:43 -08002074 curr_peer->staId = staId;
Chilam NG571c65a2013-01-19 12:27:36 +05302075
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302076 mutex_unlock(&pHddCtx->tdls_lock);
Chilam NG571c65a2013-01-19 12:27:36 +05302077 return 0;
Kiran V1ccee932012-12-12 14:49:46 -08002078}
2079
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05302080int wlan_hdd_tdls_set_force_peer(hdd_adapter_t *pAdapter,
2081#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2082 const u8 *mac,
2083#else
2084 u8 *mac,
2085#endif
Naresh Jayaram937abdf2013-11-26 19:50:25 +05302086 tANI_BOOLEAN forcePeer)
Sunil Dutt41de4e22013-11-14 18:09:02 +05302087{
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +05302088 /* NOTE:
2089 * Hold mutex tdls_lock before calling this function
2090 */
Naresh Jayaram937abdf2013-11-26 19:50:25 +05302091 hddTdlsPeer_t *curr_peer;
Sunil Dutt41de4e22013-11-14 18:09:02 +05302092 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2093
2094 if ((NULL == pHddCtx)) return -1;
2095
Naresh Jayaram937abdf2013-11-26 19:50:25 +05302096 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
2097 if (curr_peer == NULL)
Sunil Dutt41de4e22013-11-14 18:09:02 +05302098 goto error;
Naresh Jayaram937abdf2013-11-26 19:50:25 +05302099 curr_peer->isForcedPeer = forcePeer;
Naresh Jayaramca7bc3a2014-02-04 23:03:04 +05302100
Naresh Jayaramca7bc3a2014-02-04 23:03:04 +05302101 return 0;
Sunil Dutt41de4e22013-11-14 18:09:02 +05302102error:
Sunil Dutt41de4e22013-11-14 18:09:02 +05302103 return -1;
2104}
2105
Hoonki Lee387663d2013-02-05 18:08:43 -08002106/* if peerMac is found, then it returns pointer to hddTdlsPeer_t
2107 otherwise, it returns NULL
2108*/
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05302109hddTdlsPeer_t *wlan_hdd_tdls_find_peer(hdd_adapter_t *pAdapter,
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05302110 const u8 *mac,
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302111 tANI_BOOLEAN mutexLock)
Kiran V1ccee932012-12-12 14:49:46 -08002112{
Hoonki Lee387663d2013-02-05 18:08:43 -08002113 u8 key;
2114 struct list_head *pos;
2115 struct list_head *head;
2116 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002117 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302118 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee387663d2013-02-05 18:08:43 -08002119
c_hpothu7f63e882013-10-02 19:13:35 +05302120 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2121 {
c_hpothu7f63e882013-10-02 19:13:35 +05302122 return 0;
2123 }
Hoonki Lee387663d2013-02-05 18:08:43 -08002124
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302125 if ( mutexLock )
Hoonki Lee387663d2013-02-05 18:08:43 -08002126 {
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302127 mutex_lock(&pHddCtx->tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -08002128 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002129 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002130 if (NULL == pHddTdlsCtx)
2131 {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302132 if ( mutexLock )
2133 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002134 return NULL;
2135 }
2136
2137 key = wlan_hdd_tdls_hash_key(mac);
2138
2139 head = &pHddTdlsCtx->peer_list[key];
Hoonki Lee387663d2013-02-05 18:08:43 -08002140
2141 list_for_each(pos, head) {
2142 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
2143 if (!memcmp(mac, curr_peer->peerMac, 6)) {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302144 if ( mutexLock )
2145 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -08002146 return curr_peer;
2147 }
2148 }
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302149 if ( mutexLock )
2150 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302151
Hoonki Lee387663d2013-02-05 18:08:43 -08002152 return NULL;
2153}
2154
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05302155hddTdlsPeer_t *wlan_hdd_tdls_find_all_peer(hdd_context_t *pHddCtx,
2156#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2157 const u8 *mac
2158#else
2159 u8 *mac
2160#endif
2161)
Hoonki Leea6d49be2013-04-05 09:43:25 -07002162{
2163 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2164 hdd_adapter_t *pAdapter = NULL;
2165 tdlsCtx_t *pHddTdlsCtx = NULL;
2166 hddTdlsPeer_t *curr_peer= NULL;
2167 VOS_STATUS status = 0;
2168
2169 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2170 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2171 {
2172 pAdapter = pAdapterNode->pAdapter;
2173
2174 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2175 if (NULL != pHddTdlsCtx)
2176 {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302177 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Hoonki Leea6d49be2013-04-05 09:43:25 -07002178 if (curr_peer)
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302179 {
Hoonki Leea6d49be2013-04-05 09:43:25 -07002180 return curr_peer;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302181 }
Hoonki Leea6d49be2013-04-05 09:43:25 -07002182 }
2183 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2184 pAdapterNode = pNext;
2185 }
2186 return curr_peer;
2187}
2188
2189
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05302190int wlan_hdd_tdls_reset_peer(hdd_adapter_t *pAdapter,
2191#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2192 const u8 *mac
2193#else
2194 u8 *mac
2195#endif
2196)
Hoonki Lee387663d2013-02-05 18:08:43 -08002197{
Chilam Ng01120412013-02-19 18:32:21 -08002198 hdd_context_t *pHddCtx;
Chilam NG571c65a2013-01-19 12:27:36 +05302199 hddTdlsPeer_t *curr_peer;
Kiran V1ccee932012-12-12 14:49:46 -08002200
Chilam Ng01120412013-02-19 18:32:21 -08002201 pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
2202
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302203 if (0 != (wlan_hdd_validate_context(pHddCtx)))
2204 return -EINVAL;
2205
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002206 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08002207 if (curr_peer == NULL)
c_hpothu7f63e882013-10-02 19:13:35 +05302208 {
2209 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2210 "%s: curr_peer is NULL", __func__);
Hoonki Lee387663d2013-02-05 18:08:43 -08002211 return -1;
c_hpothu7f63e882013-10-02 19:13:35 +05302212 }
Chilam NG571c65a2013-01-19 12:27:36 +05302213
Atul Mittal115287b2014-07-08 13:26:33 +05302214 wlan_hdd_tdls_set_peer_link_status(curr_peer,
2215 eTDLS_LINK_IDLE,
2216 eTDLS_LINK_UNSPECIFIED);
Hoonki Leecdd8e962013-01-20 00:45:46 -08002217 curr_peer->staId = 0;
Hoonki Lee387663d2013-02-05 18:08:43 -08002218
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302219 /* Throughput Monitor shall disable the split scan when
2220 * TDLS scan coexistance is disabled.At this point of time
2221 * since TDLS scan coexistance is not meeting the criteria
2222 * to be operational, explicitly make it false to enable
2223 * throughput monitor takes the control of split scan.
2224 */
2225 if (pHddCtx->isTdlsScanCoexistence == TRUE)
2226 {
2227 pHddCtx->isTdlsScanCoexistence = FALSE;
2228 }
2229
Masti, Narayanraddie8e14622015-10-17 16:10:54 +05302230 if((eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode) &&
2231 (vos_timer_is_initialized(&curr_peer->peerIdleTimer)) &&
2232 (VOS_TIMER_STATE_RUNNING ==
2233 vos_timer_getCurrentState(&curr_peer->peerIdleTimer)))
2234 {
Chilam Nga75d8b62013-01-29 01:35:59 -08002235 vos_timer_stop( &curr_peer->peerIdleTimer );
Chilam Nga75d8b62013-01-29 01:35:59 -08002236 }
Masti, Narayanraddi6dbcdbb2015-05-13 10:28:06 +05302237
Hoonki Lee387663d2013-02-05 18:08:43 -08002238 return 0;
Hoonki Leecdd8e962013-01-20 00:45:46 -08002239}
2240
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07002241/* Caller has to take the lock before calling this function */
Hoonki Lee27511902013-03-14 18:19:06 -07002242static void wlan_tdd_tdls_reset_tx_rx(tdlsCtx_t *pHddTdlsCtx)
2243{
2244 int i;
2245 struct list_head *head;
2246 hddTdlsPeer_t *tmp;
2247 struct list_head *pos, *q;
2248
Hoonki Lee27511902013-03-14 18:19:06 -07002249 for (i = 0; i < 256; i++) {
2250 head = &pHddTdlsCtx->peer_list[i];
2251 list_for_each_safe (pos, q, head) {
2252 tmp = list_entry(pos, hddTdlsPeer_t, node);
2253 tmp->tx_pkt = 0;
2254 tmp->rx_pkt = 0;
2255 }
2256 }
Hoonki Lee27511902013-03-14 18:19:06 -07002257
2258 return ;
2259}
2260
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07002261/* Caller has to take the lock before calling this function */
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002262static tANI_S32 wlan_hdd_tdls_peer_reset_discovery_processed(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002263{
2264 int i;
2265 struct list_head *head;
2266 hddTdlsPeer_t *tmp;
2267 struct list_head *pos, *q;
2268
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002269 pHddTdlsCtx->discovery_peer_cnt = 0;
2270
2271 for (i = 0; i < 256; i++) {
2272 head = &pHddTdlsCtx->peer_list[i];
2273 list_for_each_safe (pos, q, head) {
2274 tmp = list_entry(pos, hddTdlsPeer_t, node);
2275 tmp->discovery_processed = 0;
2276 }
2277 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002278
2279 return 0;
2280}
2281
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002282static tANI_S32 wlan_hdd_get_tdls_discovery_peer_cnt(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002283{
2284 int i;
2285 struct list_head *head;
2286 struct list_head *pos, *q;
2287 int discovery_peer_cnt=0;
2288 hddTdlsPeer_t *tmp;
2289
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002290 /*
2291 * This function expects the callers to acquire the Mutex.
2292 */
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002293
2294 for (i = 0; i < 256; i++) {
2295 head = &pHddTdlsCtx->peer_list[i];
2296 list_for_each_safe (pos, q, head) {
2297 tmp = list_entry(pos, hddTdlsPeer_t, node);
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302298 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Chilam Ng01120412013-02-19 18:32:21 -08002299 "%s, %d, " MAC_ADDRESS_STR, __func__, i,
2300 MAC_ADDR_ARRAY(tmp->peerMac));
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002301 discovery_peer_cnt++;
2302 }
2303 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002304 return discovery_peer_cnt;
2305}
2306
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002307tANI_U16 wlan_hdd_tdlsConnectedPeers(hdd_adapter_t *pAdapter)
Lee Hoonkic1262f22013-01-24 21:59:00 -08002308{
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302309 hdd_context_t *pHddCtx = NULL;
2310
2311 if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
2312 {
2313 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2314 FL("invalid pAdapter: %p"), pAdapter);
2315 return 0;
2316 }
2317 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002318
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302319 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05302320 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2321 {
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002322 return 0;
c_hpothu7f63e882013-10-02 19:13:35 +05302323 }
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302324 EXIT();
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002325 return pHddCtx->connected_peer_count;
Lee Hoonkic1262f22013-01-24 21:59:00 -08002326}
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002327
Pradeep Reddy POTTETIe309c152015-02-06 13:21:07 +05302328hddTdlsPeer_t *wlan_hdd_tdls_get_connected_peer(hdd_adapter_t *pAdapter)
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302329{
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +05302330 /* NOTE:
2331 * Hold mutext tdls_lock before calling this function
2332 */
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302333 int i;
2334 struct list_head *head;
2335 struct list_head *pos;
2336 hddTdlsPeer_t *curr_peer = NULL;
2337 tdlsCtx_t *pHddTdlsCtx;
2338 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2339
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302340 ENTER();
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302341 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2342 {
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302343 return NULL;
2344 }
2345
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302346 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2347 if (NULL == pHddTdlsCtx) {
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302348 return NULL;
2349 }
2350 for (i = 0; i < 256; i++) {
2351 head = &pHddTdlsCtx->peer_list[i];
2352
2353 list_for_each(pos, head) {
2354 curr_peer= list_entry (pos, hddTdlsPeer_t, node);
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05302355 if (curr_peer && (curr_peer->link_status == eTDLS_LINK_CONNECTED))
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302356 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302357 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05302358 "%s: " MAC_ADDRESS_STR " eTDLS_LINK_CONNECTED",
2359 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302360 return curr_peer;
2361 }
2362 }
2363 }
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302364
2365 EXIT();
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302366 return NULL;
2367}
2368
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002369int wlan_hdd_tdls_get_all_peers(hdd_adapter_t *pAdapter, char *buf, int buflen)
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002370{
2371 int i;
2372 int len, init_len;
Hoonki Lee387663d2013-02-05 18:08:43 -08002373 struct list_head *head;
2374 struct list_head *pos;
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002375 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002376 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302377 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2378
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302379 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05302380 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2381 {
c_hpothu7f63e882013-10-02 19:13:35 +05302382 return 0;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302383 }
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002384
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002385 init_len = buflen;
Sameer Thalappilb0a30232013-09-27 15:37:48 -07002386 len = scnprintf(buf, buflen, "\n%-18s%-3s%-4s%-3s%-5s\n",
2387 "MAC", "Id", "cap", "up", "RSSI");
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002388 buf += len;
2389 buflen -= len;
2390 /* 1234567890123456789012345678901234567 */
Sameer Thalappilb0a30232013-09-27 15:37:48 -07002391 len = scnprintf(buf, buflen, "---------------------------------\n");
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002392 buf += len;
2393 buflen -= len;
2394
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302395 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002396 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002397 if (NULL == pHddTdlsCtx) {
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302398 mutex_unlock(&pHddCtx->tdls_lock);
Sameer Thalappilb0a30232013-09-27 15:37:48 -07002399 len = scnprintf(buf, buflen, "TDLS not enabled\n");
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002400 return len;
2401 }
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002402 for (i = 0; i < 256; i++) {
Hoonki Lee387663d2013-02-05 18:08:43 -08002403 head = &pHddTdlsCtx->peer_list[i];
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002404
Hoonki Lee387663d2013-02-05 18:08:43 -08002405 list_for_each(pos, head) {
2406 curr_peer= list_entry (pos, hddTdlsPeer_t, node);
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002407
Hoonki Lee387663d2013-02-05 18:08:43 -08002408 if (buflen < 32+1)
2409 break;
Sameer Thalappilb0a30232013-09-27 15:37:48 -07002410 len = scnprintf(buf, buflen,
Chilam Ng01120412013-02-19 18:32:21 -08002411 MAC_ADDRESS_STR"%3d%4s%3s%5d\n",
2412 MAC_ADDR_ARRAY(curr_peer->peerMac),
Hoonki Lee387663d2013-02-05 18:08:43 -08002413 curr_peer->staId,
2414 (curr_peer->tdls_support == eTDLS_CAP_SUPPORTED) ? "Y":"N",
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07002415 TDLS_IS_CONNECTED(curr_peer) ? "Y":"N",
Hoonki Lee387663d2013-02-05 18:08:43 -08002416 curr_peer->rssi);
2417 buf += len;
2418 buflen -= len;
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002419 }
2420 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302421 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302422
2423 EXIT();
Chilam Ng16a2a1c2013-01-29 01:27:29 -08002424 return init_len-buflen;
2425}
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002426
2427void wlan_hdd_tdls_connection_callback(hdd_adapter_t *pAdapter)
2428{
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302429 tdlsCtx_t *pHddTdlsCtx;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302430 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08002431
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302432 if ((NULL == pHddCtx))
c_hpothu7f63e882013-10-02 19:13:35 +05302433 {
Agarwal Ashishbf98caf2014-03-25 13:29:11 +05302434 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
2435 FL("pHddCtx or pHddTdlsCtx points to NULL"));
c_hpothu7f63e882013-10-02 19:13:35 +05302436 return;
2437 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302438
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302439 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07002440
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302441 if (0 != wlan_hdd_sta_tdls_init(pAdapter))
2442 {
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302443 mutex_unlock(&pHddCtx->tdls_lock);
Hema Aparna Medicharla8bb6f782015-03-09 12:35:05 +05302444 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: wlan_hdd_sta_tdls_init failed",__func__);
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302445 return;
2446 }
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302447
2448 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2449 if ((NULL == pHddTdlsCtx))
2450 {
Hema Aparna Medicharla8bb6f782015-03-09 12:35:05 +05302451 mutex_unlock(&pHddCtx->tdls_lock);
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302452 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
2453 FL("pHddCtx or pHddTdlsCtx points to NULL device mode = %d"), pAdapter->device_mode);
Mahesh A Saptasagar36cdc802015-01-07 18:41:17 +05302454 return;
2455 }
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302456 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002457 "%s, update %d discover %d", __func__,
2458 pHddTdlsCtx->threshold_config.tx_period_t,
2459 pHddTdlsCtx->threshold_config.discovery_period_t);
2460
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08002461 if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode)
2462 {
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002463 wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002464 pHddTdlsCtx->discovery_sent_cnt = 0;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002465 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002466
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002467 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
2468 &pHddTdlsCtx->peerUpdateTimer,
2469 pHddTdlsCtx->threshold_config.tx_period_t);
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08002470 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302471 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002472
2473}
2474
2475void wlan_hdd_tdls_disconnection_callback(hdd_adapter_t *pAdapter)
2476{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002477 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302478 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2479
Deepthi Gowribfd17132014-11-14 17:59:04 +05302480 if (NULL == pHddCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302481 {
2482 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Deepthi Gowribfd17132014-11-14 17:59:04 +05302483 FL(" pHddCtx points to NULL"));
c_hpothu7f63e882013-10-02 19:13:35 +05302484 return;
2485 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002486
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302487 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"%s", __func__);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002488
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002489 if (NULL == pHddTdlsCtx)
2490 {
Ratheesh S P36dbc932015-08-07 14:28:57 +05302491 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
c_hpothu7f63e882013-10-02 19:13:35 +05302492 FL("pHddTdlsCtx is NULL"));
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002493 return;
2494 }
Masti, Narayanraddide96b992015-01-08 13:00:58 +05302495
Pradeep Reddy POTTETI2d4d5c42015-03-03 14:34:19 +05302496 mutex_lock(&pHddCtx->tdls_lock);
Masti, Narayanraddide96b992015-01-08 13:00:58 +05302497
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002498 pHddTdlsCtx->discovery_sent_cnt = 0;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002499 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002500
Pradeep Reddy POTTETI2d4d5c42015-03-03 14:34:19 +05302501 wlan_hdd_tdls_exit(pAdapter, TRUE);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08002502
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302503 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08002504}
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002505
2506void wlan_hdd_tdls_mgmt_completion_callback(hdd_adapter_t *pAdapter, tANI_U32 statusCode)
2507{
2508 pAdapter->mgmtTxCompletionStatus = statusCode;
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302509 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2510 "%s: Mgmt TX Completion %d",__func__, statusCode);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002511 complete(&pAdapter->tdls_mgmt_comp);
2512}
2513
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002514void wlan_hdd_tdls_increment_peer_count(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002515{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002516 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002517
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302518 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05302519 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2520 {
c_hpothu7f63e882013-10-02 19:13:35 +05302521 return;
2522 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002523
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302524 mutex_lock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302525
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002526 pHddCtx->connected_peer_count++;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002527 wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002528
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302529 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: %d",
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002530 __func__, pHddCtx->connected_peer_count);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302531
2532 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302533
2534 EXIT();
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002535}
2536
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002537void wlan_hdd_tdls_decrement_peer_count(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002538{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002539 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002540
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302541 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05302542 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2543 {
c_hpothu7f63e882013-10-02 19:13:35 +05302544 return;
2545 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002546
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302547 mutex_lock(&pHddCtx->tdls_lock);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302548
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002549 if (pHddCtx->connected_peer_count)
2550 pHddCtx->connected_peer_count--;
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002551 wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002552
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302553 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: %d",
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002554 __func__, pHddCtx->connected_peer_count);
2555
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302556 mutex_unlock(&pHddCtx->tdls_lock);
2557
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302558 EXIT();
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002559}
2560
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002561void wlan_hdd_tdls_check_bmps(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002562{
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302563
2564 tdlsCtx_t *pHddTdlsCtx = NULL;
2565 hdd_context_t *pHddCtx = NULL;
Hoonki Lee14621352013-04-16 17:51:19 -07002566 hddTdlsPeer_t *curr_peer;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002567
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302568 if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
2569 {
2570 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2571 FL("invalid pAdapter: %p"), pAdapter);
2572 return;
2573 }
2574
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302575 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2576
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302577 if (NULL == pHddCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302578 {
Sushant Kaushik125ae692014-11-25 17:38:48 +05302579 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302580 FL("pHddCtx points to NULL"));
c_hpothu7f63e882013-10-02 19:13:35 +05302581 return;
2582 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002583
Masti, Narayanraddifd8380e2015-10-17 16:08:37 +05302584 mutex_lock(&pHddCtx->tdls_lock);
2585 curr_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0, FALSE);
Hoonki Lee14621352013-04-16 17:51:19 -07002586 if (NULL != curr_peer)
2587 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302588 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee14621352013-04-16 17:51:19 -07002589 "%s: tdls in progress. Dont check for BMPS " MAC_ADDRESS_STR,
2590 __func__, MAC_ADDR_ARRAY (curr_peer->peerMac));
Masti, Narayanraddifd8380e2015-10-17 16:08:37 +05302591 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee14621352013-04-16 17:51:19 -07002592 return;
2593 }
2594
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302595 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2596 if (NULL == pHddTdlsCtx)
2597 {
2598 mutex_unlock(&pHddCtx->tdls_lock);
2599 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2600 FL("pHddTdlsCtx points to NULL"));
2601 return;
2602 }
Masti, Narayanraddi26378462016-01-05 18:20:28 +05302603 if ((TDLS_CTX_MAGIC != pHddCtx->scan_ctxt.magic) &&
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002604 (0 == pHddCtx->connected_peer_count) &&
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002605 (0 == pHddTdlsCtx->discovery_sent_cnt))
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002606 {
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302607 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002608 if (FALSE == sme_IsPmcBmps(WLAN_HDD_GET_HAL_CTX(pAdapter)))
2609 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302610 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002611 "%s: No TDLS peer connected/discovery sent. Enable BMPS",
2612 __func__);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002613 hdd_enable_bmps_imps(pHddCtx);
2614 }
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002615 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002616 else
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002617 {
Masti, Narayanraddia87e63d2015-10-05 18:17:39 +05302618 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002619 if (TRUE == sme_IsPmcBmps(WLAN_HDD_GET_HAL_CTX(pAdapter)))
2620 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302621 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002622 "%s: TDLS peer connected. Disable BMPS", __func__);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002623 hdd_disable_bmps_imps(pHddCtx, WLAN_HDD_INFRA_STATION);
2624 }
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002625 }
2626 return;
2627}
2628
Hoonki Leefb8df672013-04-10 18:20:34 -07002629/* return pointer to hddTdlsPeer_t if TDLS is ongoing. Otherwise return NULL.
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002630 * mac - if NULL check for all the peer list, otherwise, skip this mac when skip_self is TRUE
2631 * skip_self - if TRUE, skip this mac. otherwise, check all the peer list. if
2632 mac is NULL, this argument is ignored, and check for all the peer list.
2633 */
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05302634static hddTdlsPeer_t *wlan_hdd_tdls_find_progress_peer(hdd_adapter_t *pAdapter,
2635#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2636 const u8 *mac,
2637#else
2638 u8 *mac,
2639#endif
2640 u8 skip_self)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002641{
2642 int i;
2643 struct list_head *head;
2644 hddTdlsPeer_t *curr_peer;
2645 struct list_head *pos;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302646 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);;
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302647
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302648 if (NULL == pHddTdlsCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302649 {
Ratheesh S P36dbc932015-08-07 14:28:57 +05302650 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
c_hpothu7f63e882013-10-02 19:13:35 +05302651 FL("pHddTdlsCtx is NULL"));
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302652 return NULL;
c_hpothu7f63e882013-10-02 19:13:35 +05302653 }
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302654
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002655 for (i = 0; i < 256; i++) {
2656 head = &pHddTdlsCtx->peer_list[i];
2657 list_for_each(pos, head) {
2658 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
2659 if (skip_self && mac && !memcmp(mac, curr_peer->peerMac, 6)) {
2660 continue;
2661 }
2662 else
2663 {
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08002664 if (eTDLS_LINK_CONNECTING == curr_peer->link_status)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002665 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302666 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002667 "%s:" MAC_ADDRESS_STR " eTDLS_LINK_CONNECTING",
Gopichand Nakkalac87400e2013-03-13 18:51:00 -07002668 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
Hoonki Leefb8df672013-04-10 18:20:34 -07002669 return curr_peer;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002670 }
2671 }
2672 }
2673 }
Hoonki Leefb8df672013-04-10 18:20:34 -07002674 return NULL;
2675}
2676
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +05302677hddTdlsPeer_t *wlan_hdd_tdls_is_progress(hdd_context_t *pHddCtx,
2678#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2679 const u8 *mac,
2680#else
2681 u8 *mac,
2682#endif
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302683 u8 skip_self, tANI_BOOLEAN mutexLock)
Hoonki Leefb8df672013-04-10 18:20:34 -07002684{
2685 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2686 hdd_adapter_t *pAdapter = NULL;
2687 tdlsCtx_t *pHddTdlsCtx = NULL;
2688 hddTdlsPeer_t *curr_peer= NULL;
2689 VOS_STATUS status = 0;
2690
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302691 if (mutexLock)
2692 {
2693 mutex_lock(&pHddCtx->tdls_lock);
2694 }
Hoonki Leefb8df672013-04-10 18:20:34 -07002695 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2696 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2697 {
2698 pAdapter = pAdapterNode->pAdapter;
2699
2700 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2701 if (NULL != pHddTdlsCtx)
2702 {
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302703 curr_peer = wlan_hdd_tdls_find_progress_peer(pAdapter, mac, skip_self);
Hoonki Leefb8df672013-04-10 18:20:34 -07002704 if (curr_peer)
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302705 {
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302706 if (mutexLock)
2707 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leefb8df672013-04-10 18:20:34 -07002708 return curr_peer;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302709 }
Hoonki Leefb8df672013-04-10 18:20:34 -07002710 }
2711 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2712 pAdapterNode = pNext;
2713 }
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302714 if (mutexLock)
2715 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leefb8df672013-04-10 18:20:34 -07002716 return NULL;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08002717}
Hoonki Lee27511902013-03-14 18:19:06 -07002718
2719static void wlan_hdd_tdls_implicit_disable(tdlsCtx_t *pHddTdlsCtx)
2720{
Hoonki Lee27511902013-03-14 18:19:06 -07002721 wlan_hdd_tdls_timers_stop(pHddTdlsCtx);
Hoonki Lee27511902013-03-14 18:19:06 -07002722}
2723
2724static void wlan_hdd_tdls_implicit_enable(tdlsCtx_t *pHddTdlsCtx)
2725{
2726 wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002727 pHddTdlsCtx->discovery_sent_cnt = 0;
Hoonki Lee27511902013-03-14 18:19:06 -07002728 wlan_tdd_tdls_reset_tx_rx(pHddTdlsCtx);
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002729 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002730
Hoonki Lee27511902013-03-14 18:19:06 -07002731
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002732 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
2733 &pHddTdlsCtx->peerUpdateTimer,
2734 pHddTdlsCtx->threshold_config.tx_period_t);
Hoonki Lee27511902013-03-14 18:19:06 -07002735}
2736
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002737void wlan_hdd_tdls_set_mode(hdd_context_t *pHddCtx,
2738 eTDLSSupportMode tdls_mode,
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302739 v_BOOL_t bUpdateLast,
2740 enum tdls_disable_source source)
Hoonki Lee27511902013-03-14 18:19:06 -07002741{
2742 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2743 VOS_STATUS status;
2744 hdd_adapter_t *pAdapter;
2745 tdlsCtx_t *pHddTdlsCtx;
2746
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302747 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2748 "%s mode %d", __func__, (int)tdls_mode);
c_hpothu7f63e882013-10-02 19:13:35 +05302749
2750 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2751 {
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302752 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302753 }
Hoonki Lee27511902013-03-14 18:19:06 -07002754
Rajesh Chauhana34c6e62014-03-25 16:37:58 +05302755 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala638ebc72013-03-21 18:04:02 -07002756
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002757 if (pHddCtx->tdls_mode == tdls_mode)
2758 {
Hema Aparna Medicharla8bb6f782015-03-09 12:35:05 +05302759 mutex_unlock(&pHddCtx->tdls_lock);
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302760 hddLog(VOS_TRACE_LEVEL_INFO, "%s already in mode %d", __func__,
2761 (int)tdls_mode);
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302762
2763 if (tdls_mode == eTDLS_SUPPORT_DISABLED)
2764 {
2765 /*
2766 * TDLS is already disabled hence set source mask and return
2767 */
2768 set_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
2769 return;
2770 }
2771 if (tdls_mode == eTDLS_SUPPORT_ENABLED)
2772 {
2773 /*
2774 * TDLS is already disabled hence set source mask and return
2775 */
2776 clear_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
2777 return;
2778 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002779 return;
2780 }
2781
Hoonki Lee27511902013-03-14 18:19:06 -07002782 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2783
2784 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2785 {
2786 pAdapter = pAdapterNode->pAdapter;
Hoonki Leea6d49be2013-04-05 09:43:25 -07002787 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2788 if (NULL != pHddTdlsCtx)
Hoonki Lee27511902013-03-14 18:19:06 -07002789 {
Hoonki Leea6d49be2013-04-05 09:43:25 -07002790 if(eTDLS_SUPPORT_ENABLED == tdls_mode)
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302791 {
2792 clear_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
2793
2794 /*
2795 * Check if any TDLS source bit is set and if bitmap is
2796 * not zero then we should not enable TDLS
2797 */
2798 if (pHddCtx->tdls_source_bitmap)
2799 {
2800 mutex_unlock(&pHddCtx->tdls_lock);
2801 return;
2802 }
Hoonki Leea6d49be2013-04-05 09:43:25 -07002803 wlan_hdd_tdls_implicit_enable(pHddTdlsCtx);
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302804 }
2805 else if((eTDLS_SUPPORT_DISABLED == tdls_mode))
2806 {
2807 set_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
Hoonki Leea6d49be2013-04-05 09:43:25 -07002808 wlan_hdd_tdls_implicit_disable(pHddTdlsCtx);
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05302809 }
2810 else if ((eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == tdls_mode))
2811 {
2812 clear_bit((unsigned long)source, &pHddCtx->tdls_source_bitmap);
2813
2814 /*
2815 * Check if any TDLS source bit is set and if bitmap is
2816 * not zero then we should not enable TDLS
2817 */
2818 if (pHddCtx->tdls_source_bitmap)
2819 {
2820 mutex_unlock(&pHddCtx->tdls_lock);
2821 return;
2822 }
2823 wlan_hdd_tdls_implicit_disable(pHddTdlsCtx);
2824 }
Hoonki Lee27511902013-03-14 18:19:06 -07002825 }
2826 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2827 pAdapterNode = pNext;
2828 }
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002829 if(bUpdateLast)
2830 {
2831 pHddCtx->tdls_mode_last = tdls_mode;
2832 }
2833 else
2834 {
2835 pHddCtx->tdls_mode_last = pHddCtx->tdls_mode;
2836 }
Hoonki Lee27511902013-03-14 18:19:06 -07002837 pHddCtx->tdls_mode = tdls_mode;
Gopichand Nakkaladcbcf4e2013-03-23 14:32:39 -07002838
Madan Mohan Koyyalamudi263cec12013-10-07 10:57:50 +05302839 mutex_unlock(&pHddCtx->tdls_lock);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302840
Hoonki Lee27511902013-03-14 18:19:06 -07002841}
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002842
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302843static
2844void wlan_hdd_tdls_implicit_send_discovery_request(tdlsCtx_t * pHddTdlsCtx)
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002845{
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302846 hdd_context_t *pHddCtx = NULL;
2847 hddTdlsPeer_t *curr_peer = NULL, *temp_peer = NULL;
Hoonki Leed37cbb32013-04-20 00:31:14 -07002848
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302849 ENTER();
Hoonki Leed37cbb32013-04-20 00:31:14 -07002850 if (NULL == pHddTdlsCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05302851 {
Ratheesh S P36dbc932015-08-07 14:28:57 +05302852 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
c_hpothu7f63e882013-10-02 19:13:35 +05302853 FL("pHddTdlsCtx is NULL"));
Hoonki Leed37cbb32013-04-20 00:31:14 -07002854 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302855 }
Hoonki Leed37cbb32013-04-20 00:31:14 -07002856
Hoonki Leed37cbb32013-04-20 00:31:14 -07002857 pHddCtx = WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter);
Hoonki Leefb8df672013-04-10 18:20:34 -07002858
c_hpothu7f63e882013-10-02 19:13:35 +05302859 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2860 {
Hoonki Leefb8df672013-04-10 18:20:34 -07002861 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302862 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002863
Hoonki Leed37cbb32013-04-20 00:31:14 -07002864 curr_peer = pHddTdlsCtx->curr_candidate;
Hoonki Leed37cbb32013-04-20 00:31:14 -07002865 if (NULL == curr_peer)
c_hpothu7f63e882013-10-02 19:13:35 +05302866 {
2867 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2868 FL("curr_peer is NULL"));
2869
Hoonki Leed37cbb32013-04-20 00:31:14 -07002870 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302871 }
Hoonki Leed37cbb32013-04-20 00:31:14 -07002872
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002873 if (TRUE == sme_IsPmcBmps(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter)))
2874 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05302875 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2876 "%s: Disable BMPS", __func__);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002877 hdd_disable_bmps_imps(pHddCtx, WLAN_HDD_INFRA_STATION);
2878 }
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002879
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302880 /* This function is called in mutex_lock */
2881 temp_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0, FALSE);
Hoonki Leefb8df672013-04-10 18:20:34 -07002882 if (NULL != temp_peer)
2883 {
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302884 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2885 "%s: " MAC_ADDRESS_STR " ongoing. pre_setup ignored",
2886 __func__, MAC_ADDR_ARRAY(temp_peer->peerMac));
Hoonki Leed37cbb32013-04-20 00:31:14 -07002887 goto done;
Hoonki Leefb8df672013-04-10 18:20:34 -07002888 }
2889
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002890 if (eTDLS_CAP_UNKNOWN != curr_peer->tdls_support)
Atul Mittal115287b2014-07-08 13:26:33 +05302891 wlan_hdd_tdls_set_peer_link_status(curr_peer,
2892 eTDLS_LINK_DISCOVERING,
2893 eTDLS_LINK_SUCCESS);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002894
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302895 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2896 "%s: Implicit TDLS, Send Discovery request event", __func__);
Hoonki Leed37cbb32013-04-20 00:31:14 -07002897
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302898 cfg80211_tdls_oper_request(pHddTdlsCtx->pAdapter->dev,
2899 curr_peer->peerMac,
2900 NL80211_TDLS_DISCOVERY_REQ,
2901 FALSE,
2902 GFP_KERNEL);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002903 pHddTdlsCtx->discovery_sent_cnt++;
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302904
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002905 wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
Madan Mohan Koyyalamudi96797442013-10-08 16:04:42 +05302906
Pradeep Reddy POTTETI219ced32014-11-14 16:33:57 +05302907 wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
2908 &pHddTdlsCtx->peerDiscoveryTimeoutTimer,
2909 pHddTdlsCtx->threshold_config.tx_period_t - TDLS_DISCOVERY_TIMEOUT_BEFORE_UPDATE);
2910
Pradeep Reddy POTTETI9db32f02015-01-29 15:22:54 +05302911 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2912 "%s: discovery count %u timeout %u msec",
2913 __func__, pHddTdlsCtx->discovery_sent_cnt,
2914 pHddTdlsCtx->threshold_config.tx_period_t - TDLS_DISCOVERY_TIMEOUT_BEFORE_UPDATE);
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07002915
Hoonki Leed37cbb32013-04-20 00:31:14 -07002916done:
2917 pHddTdlsCtx->curr_candidate = NULL;
2918 pHddTdlsCtx->magic = 0;
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302919 EXIT();
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07002920 return;
2921}
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002922
2923tANI_U32 wlan_hdd_tdls_discovery_sent_cnt(hdd_context_t *pHddCtx)
2924{
2925 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2926 hdd_adapter_t *pAdapter = NULL;
2927 tdlsCtx_t *pHddTdlsCtx = NULL;
2928 VOS_STATUS status = 0;
2929 tANI_U32 count = 0;
2930
2931 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2932 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
2933 {
2934 pAdapter = pAdapterNode->pAdapter;
2935
Hoonki Leea6d49be2013-04-05 09:43:25 -07002936 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2937 if (NULL != pHddTdlsCtx)
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002938 {
Hoonki Leea6d49be2013-04-05 09:43:25 -07002939 count = count + pHddTdlsCtx->discovery_sent_cnt;
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002940 }
2941 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2942 pAdapterNode = pNext;
2943 }
2944 return count;
2945}
2946
Gopichand Nakkala34d1b062013-03-19 15:28:33 -07002947void wlan_hdd_tdls_check_power_save_prohibited(hdd_adapter_t *pAdapter)
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002948{
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302949 tdlsCtx_t *pHddTdlsCtx = NULL;
2950 hdd_context_t *pHddCtx = NULL;
Chandrasekaran, Manishekar41b8e1f2015-03-10 13:30:28 +05302951
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05302952
2953 if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
2954 {
2955 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2956 FL("invalid pAdapter: %p"), pAdapter);
Chandrasekaran, Manishekar41b8e1f2015-03-10 13:30:28 +05302957 return;
2958 }
2959
2960 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
2961 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002962
2963 if ((NULL == pHddTdlsCtx) || (NULL == pHddCtx))
c_hpothu7f63e882013-10-02 19:13:35 +05302964 {
2965 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2966 FL(" pHddCtx or pHddTdlsCtx points to NULL"));
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002967 return;
c_hpothu7f63e882013-10-02 19:13:35 +05302968 }
Gopichand Nakkalaccd3a382013-03-19 13:56:10 -07002969
2970 if ((0 == pHddCtx->connected_peer_count) &&
2971 (0 == wlan_hdd_tdls_discovery_sent_cnt(pHddCtx)))
2972 {
2973 sme_SetTdlsPowerSaveProhibited(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter), 0);
2974 return;
2975 }
2976 sme_SetTdlsPowerSaveProhibited(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter), 1);
2977 return;
2978}
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002979
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002980/* return negative = caller should stop and return error code immediately
2981 return 0 = caller should stop and return success immediately
2982 return 1 = caller can continue to scan
2983 */
2984int wlan_hdd_tdls_scan_callback (hdd_adapter_t *pAdapter,
2985 struct wiphy *wiphy,
2986#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
2987 struct net_device *dev,
2988#endif
2989 struct cfg80211_scan_request *request)
2990{
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002991 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2992 u16 connectedTdlsPeers;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302993 hddTdlsPeer_t *curr_peer, *connected_peer;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002994 unsigned long delay;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05302995 hdd_config_t *cfg_param = pHddCtx->cfg_ini;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07002996
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302997 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05302998 if(0 != (wlan_hdd_validate_context(pHddCtx)))
2999 {
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003000 return 0;
c_hpothu7f63e882013-10-02 19:13:35 +05303001 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003002
3003 /* if tdls is not enabled, then continue scan */
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303004 if ((eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode))
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003005 return 1;
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303006
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303007 mutex_lock(&pHddCtx->tdls_lock);
3008 curr_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0, FALSE);
Hoonki Leefb8df672013-04-10 18:20:34 -07003009 if (NULL != curr_peer)
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003010 {
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303011 if (pHddCtx->scan_ctxt.reject++ >= TDLS_MAX_SCAN_REJECT)
Hoonki Leefb8df672013-04-10 18:20:34 -07003012 {
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303013 pHddCtx->scan_ctxt.reject = 0;
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303014 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Leefb8df672013-04-10 18:20:34 -07003015 "%s: " MAC_ADDRESS_STR ". scan rejected %d. force it to idle",
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303016 __func__, MAC_ADDR_ARRAY (curr_peer->peerMac), pHddCtx->scan_ctxt.reject);
Hoonki Leefb8df672013-04-10 18:20:34 -07003017
Atul Mittal115287b2014-07-08 13:26:33 +05303018 wlan_hdd_tdls_set_peer_link_status (curr_peer,
3019 eTDLS_LINK_IDLE,
3020 eTDLS_LINK_UNSPECIFIED);
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303021 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leefb8df672013-04-10 18:20:34 -07003022 return 1;
3023 }
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303024 mutex_unlock(&pHddCtx->tdls_lock);
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303025 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Leefb8df672013-04-10 18:20:34 -07003026 "%s: tdls in progress. scan rejected %d",
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303027 __func__, pHddCtx->scan_ctxt.reject);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003028 return -EBUSY;
3029 }
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303030 else
3031 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003032
3033 /* tdls teardown is ongoing */
3034 if (eTDLS_SUPPORT_DISABLED == pHddCtx->tdls_mode)
3035 {
3036 connectedTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303037 if (connectedTdlsPeers && (pHddCtx->scan_ctxt.attempt < TDLS_MAX_SCAN_SCHEDULE))
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003038 {
3039 delay = (unsigned long)(TDLS_DELAY_SCAN_PER_CONNECTION*connectedTdlsPeers);
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303040 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003041 "%s: tdls disabled, but still connected_peers %d attempt %d. schedule scan %lu msec",
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303042 __func__, connectedTdlsPeers, pHddCtx->scan_ctxt.attempt, delay);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003043
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303044 wlan_hdd_defer_scan_init_work (pHddCtx, wiphy,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003045#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
3046 dev,
3047#endif
3048 request,
3049 msecs_to_jiffies(delay));
3050 /* scan should not continue */
3051 return 0;
3052 }
3053 /* no connected peer or max retry reached, scan continue */
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303054 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003055 "%s: tdls disabled. connected_peers %d attempt %d. scan allowed",
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303056 __func__, connectedTdlsPeers, pHddCtx->scan_ctxt.attempt);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003057 return 1;
3058 }
Agarwal Ashishef54a182014-12-16 15:07:31 +05303059
3060 /* if fEnableTDLSScan flag is 1 ; driverwill allow scan even if
3061 * peer station is not buffer STA capable
3062 *
3063 * RX: If there is any RX activity, device will lose RX packets,
3064 * as peer will not be aware that device is off channel.
3065 * TX: TX is stopped whenever device initiate scan.
3066 */
3067 if (pHddCtx->cfg_ini->fEnableTDLSScan == 1)
3068 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303069 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Agarwal Ashishef54a182014-12-16 15:07:31 +05303070 FL("Allow SCAN in all TDLS cases"));
3071 return 1;
3072 }
3073
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003074 /* while tdls is up, first time scan */
3075 else if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode ||
3076 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode)
3077 {
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003078 connectedTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303079
3080 /* check the TDLS link and Scan coexistance Capability */
3081 if ( (TRUE == pHddCtx->cfg_ini->fEnableTDLSScanCoexSupport) &&
3082 (TRUE == sme_IsFeatureSupportedByFW(TDLS_SCAN_COEXISTENCE)) &&
3083 (connectedTdlsPeers == 1) )
3084 {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303085 mutex_lock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303086 /* get connected peer information */
Pradeep Reddy POTTETIe309c152015-02-06 13:21:07 +05303087 connected_peer = wlan_hdd_tdls_get_connected_peer(pAdapter);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303088 if (NULL == connected_peer) {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303089 mutex_unlock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303090 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3091 "%s: Invalid connected_peer, Continue Scanning", __func__);
3092 /* scan should continue */
3093 return 1;
3094 }
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303095 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303096 ("%s: TDLS Scan Co-exist supported connectedTdlsPeers =%d buffersta =%d"),
3097 __func__,connectedTdlsPeers,connected_peer->isBufSta);
3098
3099 if (connected_peer->isBufSta)
3100 {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303101 mutex_unlock(&pHddCtx->tdls_lock);
3102 pHddCtx->isTdlsScanCoexistence = TRUE;
3103 if ((cfg_param->dynSplitscan) && (!pHddCtx->issplitscan_enabled))
3104 {
3105 pHddCtx->issplitscan_enabled = TRUE;
3106 sme_enable_disable_split_scan(
3107 WLAN_HDD_GET_HAL_CTX(pAdapter),
3108 cfg_param->nNumStaChanCombinedConc,
3109 cfg_param->nNumP2PChanCombinedConc);
3110 }
3111 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
3112 ("%s:%d TDLS Scan Co-exist supported splitscan_enabled =%d "),
3113 __func__, __LINE__, pHddCtx->issplitscan_enabled);
3114 return 1;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303115 }
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303116 else
3117 mutex_unlock(&pHddCtx->tdls_lock);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303118
3119 }
3120 else
3121 {
3122 /* Throughput Monitor shall disable the split scan when
3123 * TDLS scan coexistance is disabled.At this point of time
3124 * since TDLS scan coexistance is not meeting the criteria
3125 * to be operational, explicitly make it false to enable
3126 * throughput monitor takes the control of split scan.
3127 */
3128 pHddCtx->isTdlsScanCoexistence = FALSE;
3129 }
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303130 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303131 ("%s: TDLS Scan Co-exist not supported connectedTdlsPeers =%d"
3132 " TDLSScanCoexSupport param =%d TDLS_SCAN_COEXISTENCE =%d"),
3133 __func__, connectedTdlsPeers,
3134 pHddCtx->cfg_ini->fEnableTDLSScanCoexSupport,
3135 sme_IsFeatureSupportedByFW(TDLS_SCAN_COEXISTENCE));
3136
Atul Mittal5803b342014-09-04 15:31:19 +05303137 /* disable implicit trigger logic & tdls operatoin */
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05303138 wlan_hdd_tdls_set_mode(pHddCtx, eTDLS_SUPPORT_DISABLED, FALSE,
3139 HDD_SET_TDLS_MODE_SOURCE_SCAN);
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303140 /* fall back to the implementation of teardown the peers on the scan
3141 * when the number of connected peers are more than one. TDLS Scan
3142 * coexistance feature is exercised only when a single peer is
3143 * connected and the DUT shall not advertize the Buffer Sta capability,
3144 * so that the peer shall not go to the TDLS power save
3145 */
3146
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003147 if (connectedTdlsPeers)
3148 {
3149 tANI_U8 staIdx;
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003150 hddTdlsPeer_t *curr_peer;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003151
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +05303152 mutex_lock(&pHddCtx->tdls_lock);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003153 for (staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++)
3154 {
3155 if (pHddCtx->tdlsConnInfo[staIdx].staId)
3156 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303157 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303158 ("%s: indicate TDLS teardown (staId %d)"),
3159 __func__, pHddCtx->tdlsConnInfo[staIdx].staId) ;
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003160
3161#ifdef CONFIG_TDLS_IMPLICIT
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303162 curr_peer = wlan_hdd_tdls_find_all_peer(pHddCtx,
3163 pHddCtx->tdlsConnInfo[staIdx].peerMac.bytes);
Abhishek Singh96568922016-01-05 15:28:12 +05303164 if(curr_peer) {
Masti, Narayanraddia1bffac2015-10-17 16:01:20 +05303165 wlan_hdd_tdls_indicate_teardown(
3166 curr_peer->pHddTdlsCtx->pAdapter, curr_peer,
3167 eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON);
Abhishek Singh96568922016-01-05 15:28:12 +05303168 hdd_send_wlan_tdls_teardown_event(
3169 eTDLS_TEARDOWN_SCAN,
3170 curr_peer->peerMac);
3171 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003172#endif
3173 }
3174 }
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +05303175 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003176 /* schedule scan */
3177 delay = (unsigned long)(TDLS_DELAY_SCAN_PER_CONNECTION*connectedTdlsPeers);
3178
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303179 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003180 "%s: tdls enabled (mode %d), connected_peers %d. schedule scan %lu msec",
3181 __func__, pHddCtx->tdls_mode, wlan_hdd_tdlsConnectedPeers(pAdapter),
3182 delay);
3183
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303184 wlan_hdd_defer_scan_init_work (pHddCtx, wiphy,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003185#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
3186 dev,
3187#endif
3188 request,
3189 msecs_to_jiffies(delay));
3190 /* scan should not continue */
3191 return 0;
3192 }
3193 /* no connected peer, scan continue */
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303194 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003195 "%s: tdls_mode %d, and no tdls connection. scan allowed",
3196 __func__, pHddCtx->tdls_mode);
3197 }
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05303198 EXIT();
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003199 return 1;
3200}
3201
3202void wlan_hdd_tdls_scan_done_callback(hdd_adapter_t *pAdapter)
3203{
3204 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003205
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05303206 ENTER();
c_hpothu7f63e882013-10-02 19:13:35 +05303207 if(0 != (wlan_hdd_validate_context(pHddCtx)))
3208 {
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003209 return;
c_hpothu7f63e882013-10-02 19:13:35 +05303210 }
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003211
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303212 /* if tdls is not enabled then don't revert tdls mode */
3213 if ((eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode)) {
3214 hddLog(VOS_TRACE_LEVEL_INFO, FL("Failed to revert: Mode=%d"),
3215 pHddCtx->tdls_mode);
Pradeep Reddy POTTETIc7822df2015-02-19 20:15:41 +05303216 return;
Chandrasekaran, Manishekar0de84dc2015-03-10 15:12:34 +05303217 }
Sunil Dutt41de4e22013-11-14 18:09:02 +05303218
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003219 /* free allocated memory at scan time */
Masti, Narayanraddi26378462016-01-05 18:20:28 +05303220 wlan_hdd_init_deinit_defer_scan_context(&pHddCtx->scan_ctxt);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003221
3222 /* if tdls was enabled before scan, re-enable tdls mode */
3223 if(eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode_last ||
3224 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode_last)
3225 {
Masti, Narayanraddi34e0e562015-03-05 18:23:03 +05303226 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003227 ("%s: revert tdls mode %d"), __func__, pHddCtx->tdls_mode_last);
3228
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05303229 wlan_hdd_tdls_set_mode(pHddCtx, pHddCtx->tdls_mode_last, FALSE,
3230 HDD_SET_TDLS_MODE_SOURCE_SCAN);
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003231 }
3232 wlan_hdd_tdls_check_bmps(pAdapter);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05303233
3234 EXIT();
Hoonki Lee93e67ff2013-03-19 15:49:25 -07003235}
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07003236
3237void wlan_hdd_tdls_timer_restart(hdd_adapter_t *pAdapter,
3238 vos_timer_t *timer,
3239 v_U32_t expirationTime)
3240{
3241 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
3242
3243 if (NULL == pHddStaCtx)
c_hpothu7f63e882013-10-02 19:13:35 +05303244 {
3245 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3246 FL("pHddStaCtx is NULL"));
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07003247 return;
c_hpothu7f63e882013-10-02 19:13:35 +05303248 }
Gopichand Nakkala3046fc92013-03-23 13:56:43 -07003249
3250 /* Check whether driver load unload is in progress */
3251 if(vos_is_load_unload_in_progress( VOS_MODULE_ID_VOSS, NULL))
3252 {
3253 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3254 "%s: Driver load/unload is in progress.", __func__);
3255 return;
3256 }
3257
3258 if (hdd_connIsConnected(pHddStaCtx))
3259 {
3260 vos_timer_stop(timer);
3261 vos_timer_start(timer, expirationTime);
3262 }
3263}
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003264void wlan_hdd_tdls_indicate_teardown(hdd_adapter_t *pAdapter,
3265 hddTdlsPeer_t *curr_peer,
3266 tANI_U16 reason)
3267{
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05303268 hdd_context_t *pHddCtx;
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303269
Hanumantha Reddy Pothulada0fe362015-02-27 18:37:03 +05303270 if ((NULL == pAdapter || WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic) ||
3271 (NULL == curr_peer))
c_hpothu7f63e882013-10-02 19:13:35 +05303272 {
3273 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3274 FL("parameters passed are invalid"));
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003275 return;
c_hpothu7f63e882013-10-02 19:13:35 +05303276 }
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003277
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05303278 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3279
Masti, Narayanraddi9d275662015-08-26 13:15:12 +05303280 if ((eTDLS_LINK_CONNECTED != curr_peer->link_status) &&
3281 (eTDLS_LINK_CONNECTING != curr_peer->link_status))
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003282 return;
3283
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303284 /* Throughput Monitor shall disable the split scan when
3285 * TDLS scan coexistance is disabled.At this point of time
3286 * since TDLS scan coexistance is not meeting the criteria
3287 * to be operational, explicitly make it false to enable
3288 * throughput monitor takes the control of split scan.
3289 */
Pradeep Reddy POTTETI8a623132014-06-26 16:07:06 +05303290 if (pHddCtx && (pHddCtx->isTdlsScanCoexistence == TRUE))
Pradeep Reddy POTTETIedaeb5f2014-05-22 23:34:41 +05303291 {
3292 pHddCtx->isTdlsScanCoexistence = FALSE;
3293 }
3294
Atul Mittal115287b2014-07-08 13:26:33 +05303295 wlan_hdd_tdls_set_peer_link_status(curr_peer,
3296 eTDLS_LINK_TEARING,
Atul Mittal271a7652014-09-12 13:18:22 +05303297 eTDLS_LINK_UNSPECIFIED);
Agarwal Ashisha7ef41d2015-06-25 18:00:26 +05303298 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3299 FL("Setting NL80211_TDLS_TEARDOWN, reason %d"), reason);
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003300 cfg80211_tdls_oper_request(pAdapter->dev,
3301 curr_peer->peerMac,
3302 NL80211_TDLS_TEARDOWN,
3303 reason,
3304 GFP_KERNEL);
3305}
Atul Mittal115287b2014-07-08 13:26:33 +05303306
3307
3308/*EXT TDLS*/
3309int wlan_hdd_set_callback(hddTdlsPeer_t *curr_peer,
3310 cfg80211_exttdls_callback callback)
3311{
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +05303312 /* NOTE:
3313 * Hold mutex tdls_lock before calling this function
3314 */
Atul Mittal115287b2014-07-08 13:26:33 +05303315
3316 hdd_context_t *pHddCtx;
3317 hdd_adapter_t *pAdapter;
3318
3319 if (!curr_peer) return -1;
3320
3321 pAdapter = curr_peer->pHddTdlsCtx->pAdapter;
3322 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3323 if ((NULL == pHddCtx)) return -1;
3324
Atul Mittal115287b2014-07-08 13:26:33 +05303325 curr_peer->state_change_notification = callback;
3326
Atul Mittal115287b2014-07-08 13:26:33 +05303327 return 0;
Atul Mittal115287b2014-07-08 13:26:33 +05303328}
3329
3330void wlan_hdd_tdls_get_wifi_hal_state(hddTdlsPeer_t *curr_peer,
3331 tANI_S32 *state,
3332 tANI_S32 *reason)
3333{
3334 *reason = curr_peer->reason;
3335
3336 switch(curr_peer->link_status)
3337 {
3338 case eTDLS_LINK_IDLE:
Atul Mittal115287b2014-07-08 13:26:33 +05303339 case eTDLS_LINK_DISCOVERED:
3340 *state = WIFI_TDLS_ENABLED;
3341 break;
Atul Mittalad630e42014-10-07 19:19:14 +05303342 case eTDLS_LINK_DISCOVERING:
Atul Mittal115287b2014-07-08 13:26:33 +05303343 case eTDLS_LINK_CONNECTING:
3344 *state = WIFI_TDLS_TRYING;
3345 break;
3346 case eTDLS_LINK_CONNECTED:
Pradeep Reddy POTTETIf3148e82015-04-16 12:10:33 +05303347 if (TRUE == curr_peer->isOffChannelEstablished)
Pradeep Reddy POTTETI16d83332015-03-26 18:28:13 +05303348 {
3349 *state = WIFI_TDLS_ESTABLISHED_OFF_CHANNEL;
3350 }
3351 else
3352 {
3353 *state = WIFI_TDLS_ESTABLISHED;
3354 }
Atul Mittal115287b2014-07-08 13:26:33 +05303355 break;
3356 case eTDLS_LINK_TEARING:
3357 *state = WIFI_TDLS_DROPPED;
3358 break;
3359 }
3360
3361}
3362
3363int wlan_hdd_tdls_get_status(hdd_adapter_t *pAdapter,
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05303364#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
3365 const tANI_U8* mac,
3366#else
Atul Mittal115287b2014-07-08 13:26:33 +05303367 tANI_U8* mac,
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05303368#endif
Atul Mittal115287b2014-07-08 13:26:33 +05303369 tANI_S32 *state,
3370 tANI_S32 *reason)
3371{
3372
3373 hddTdlsPeer_t *curr_peer;
Atul Mittala75fced2014-10-06 13:59:07 +05303374 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05303375
3376 mutex_lock(&pHddCtx->tdls_lock);
3377 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
Atul Mittal115287b2014-07-08 13:26:33 +05303378 if (curr_peer == NULL)
3379 {
Atul Mittala75fced2014-10-06 13:59:07 +05303380 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Atul Mittal115287b2014-07-08 13:26:33 +05303381 FL("curr_peer is NULL"));
Atul Mittal115287b2014-07-08 13:26:33 +05303382
Atul Mittala75fced2014-10-06 13:59:07 +05303383 *state = WIFI_TDLS_DISABLED;
3384 *reason = eTDLS_LINK_UNSPECIFIED;
3385 }
3386 else
3387 {
3388 if (pHddCtx->cfg_ini->fTDLSExternalControl &&
3389 (FALSE == curr_peer->isForcedPeer))
3390 {
3391 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3392 FL("curr_peer is not Forced"));
3393 *state = WIFI_TDLS_DISABLED;
3394 *reason = eTDLS_LINK_UNSPECIFIED;
3395 }
3396 else
3397 {
3398 wlan_hdd_tdls_get_wifi_hal_state(curr_peer, state, reason);
3399 }
3400 }
Ganesh Kondabattinid5c13382016-01-05 17:55:44 +05303401 mutex_unlock(&pHddCtx->tdls_lock);
Atul Mittal115287b2014-07-08 13:26:33 +05303402 return (0);
3403}
3404
Agarwal Ashishef54a182014-12-16 15:07:31 +05303405int hdd_set_tdls_scan_type(hdd_adapter_t *pAdapter,
3406 tANI_U8 *ptr)
3407{
3408 int tdls_scan_type;
Hema Aparna Medicharla26b98042015-01-21 15:02:01 +05303409 hdd_context_t *pHddCtx;
Agarwal Ashishef54a182014-12-16 15:07:31 +05303410 if (NULL == pAdapter)
3411 {
3412 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3413 "%s: pAdapter is NULL", __func__);
3414 return -EINVAL;
3415 }
Hema Aparna Medicharla26b98042015-01-21 15:02:01 +05303416 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Agarwal Ashishef54a182014-12-16 15:07:31 +05303417 tdls_scan_type = ptr[9] - '0';
3418
3419 if (tdls_scan_type <= 2)
3420 {
3421 pHddCtx->cfg_ini->fEnableTDLSScan = tdls_scan_type;
3422 return 0;
3423 }
3424 else
3425 {
3426 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3427 " Wrong value is given for tdls_scan_type "
3428 " Making fEnableTDLSScan as 0 ");
3429 pHddCtx->cfg_ini->fEnableTDLSScan = 0;
3430 return -EINVAL;
3431 }
3432}
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +05303433int wlan_hdd_validate_tdls_context(hdd_context_t *pHddCtx,
3434 tdlsCtx_t *pHddTdlsCtx)
3435{
3436 VOS_STATUS status;
3437 int found = 0;
3438 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
3439 hdd_adapter_t *pAdapter;
Agarwal Ashishef54a182014-12-16 15:07:31 +05303440
Mahesh A Saptasagar170b5082015-02-16 18:50:54 +05303441 if (NULL == pHddTdlsCtx)
3442 {
3443 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3444 FL("TDLS context is NULL"));
3445 return -EINVAL;
3446 }
3447 status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
3448 while (NULL != pAdapterNode && VOS_STATUS_SUCCESS == status)
3449 {
3450 pAdapter = pAdapterNode->pAdapter;
3451 if (NULL != pAdapter)
3452 {
3453 if (pHddTdlsCtx == pAdapter->sessionCtx.station.pHddTdlsCtx &&
3454 (NULL != pHddTdlsCtx->pAdapter) &&
3455 (WLAN_HDD_ADAPTER_MAGIC == pHddTdlsCtx->pAdapter->magic))
3456 {
3457 found = 1;
3458 break;
3459 }
3460 }
3461 status = hdd_get_next_adapter (pHddCtx, pAdapterNode, &pNext);
3462 pAdapterNode = pNext;
3463 }
3464 if (found == 1)
3465 {
3466 return 0;
3467 }
3468 else
3469 {
3470 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3471 FL("TDLS context doesnot belongs to valid adapter"));
3472 return -EINVAL;
3473 }
3474}
Ganesh Kondabattinif3ba0972015-08-07 15:58:04 +05303475
3476
3477void wlan_hdd_tdls_update_rx_pkt_cnt_n_rssi(hdd_adapter_t *pAdapter,
3478 u8 *mac, v_S7_t rssiAvg)
3479{
3480 hddTdlsPeer_t *curr_peer;
3481 hdd_context_t *pHddCtx = NULL;
3482 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3483 mutex_lock(&pHddCtx->tdls_lock);
3484 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac, FALSE);
3485 if ((NULL != curr_peer) &&
3486 (eTDLS_LINK_CONNECTED == curr_peer->link_status))
3487 {
3488 curr_peer->rx_pkt++;
3489 curr_peer->rssi = rssiAvg;
3490 }
3491 mutex_unlock(&pHddCtx->tdls_lock);
3492 VOS_TRACE( VOS_MODULE_ID_HDD_DATA, VOS_TRACE_LEVEL_INFO,
3493 "mac : " MAC_ADDRESS_STR "rssi is %d",
3494 MAC_ADDR_ARRAY(mac), rssiAvg);
3495}
Atul Mittal115287b2014-07-08 13:26:33 +05303496
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303497/**
3498 * wlan_hdd_tdls_reenable() - Re-Enable TDLS
3499 * @hddctx: pointer to hdd context
3500 *
3501 * Function re-enable's TDLS which might be disabled during concurrency
3502 *
3503 * Return: None
3504 */
3505void wlan_hdd_tdls_reenable(hdd_context_t *pHddCtx)
3506{
3507
3508 if ((TRUE != pHddCtx->cfg_ini->fEnableTDLSSupport) ||
3509 (TRUE != sme_IsFeatureSupportedByFW(TDLS))) {
3510 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3511 FL("tdls support not enabled"));
3512 return;
3513 }
3514
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303515 /* if tdls is not enabled then don't revert tdls mode */
3516 if ((eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode)) {
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303517 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Masti, Narayanraddifd49ada2015-12-07 19:43:14 +05303518 FL("TDLS disabled so no need to enable: Mode=%d"),
3519 pHddCtx->tdls_mode);
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303520 return;
3521 }
3522
3523 if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode_last ||
3524 eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY ==
3525 pHddCtx->tdls_mode_last) {
3526 /* Enable TDLS support Once P2P session ends since
3527 * upond detection of concurrency TDLS might be disabled
3528 */
3529 hddLog(LOG1, FL("TDLS mode set to %d"), pHddCtx->tdls_mode_last);
3530 wlan_hdd_tdls_set_mode(pHddCtx, pHddCtx->tdls_mode_last,
Masti, Narayanraddi20494af2015-12-17 20:56:42 +05303531 FALSE, HDD_SET_TDLS_MODE_SOURCE_P2P);
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303532 }
3533}
Ganesh Kondabattinicbfdc392015-09-11 19:12:59 +05303534
3535tdlsConnInfo_t *wlan_hdd_get_conn_info(hdd_context_t *pHddCtx,
3536 tANI_U8 idx)
3537{
3538 tANI_U8 staIdx;
3539
3540 /* check if there is available index for this new TDLS STA */
3541 for ( staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++ )
3542 {
3543 if (idx == pHddCtx->tdlsConnInfo[staIdx].staId )
3544 {
3545 hddLog(LOG1, FL("tdls peer with staIdx %u exists"), idx );
3546 return (&pHddCtx->tdlsConnInfo[staIdx]);
3547 }
3548 }
3549 hddLog(LOGE, FL("tdls peer with staIdx %u not exists"), idx );
3550 return NULL;
3551}
Masti, Narayanraddi44b0db02015-12-22 11:54:35 +05303552
3553void wlan_hdd_change_tdls_mode(void *data)
3554{
3555 hdd_context_t *hdd_ctx = (hdd_context_t *)data;
3556
3557 wlan_hdd_tdls_set_mode(hdd_ctx, eTDLS_SUPPORT_ENABLED, FALSE,
3558 HDD_SET_TDLS_MODE_SOURCE_OFFCHANNEL);
3559}
3560
3561void wlan_hdd_start_stop_tdls_source_timer(hdd_context_t *pHddCtx,
3562 eTDLSSupportMode tdls_mode)
3563{
3564 if (VOS_TIMER_STATE_RUNNING ==
3565 vos_timer_getCurrentState(&pHddCtx->tdls_source_timer))
3566 vos_timer_stop(&pHddCtx->tdls_source_timer);
3567
3568 if (tdls_mode == eTDLS_SUPPORT_DISABLED) {
3569 wlan_hdd_tdls_set_mode(pHddCtx, tdls_mode, FALSE,
3570 HDD_SET_TDLS_MODE_SOURCE_OFFCHANNEL);
3571 }
3572
3573 vos_timer_start(&pHddCtx->tdls_source_timer,
3574 pHddCtx->cfg_ini->tdls_enable_defer_time);
3575
3576 return;
3577}
3578
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05303579/*EXT TDLS*/