blob: bf699520e31bac0655da43eff60b635ccdc3504c [file] [log] [blame]
Kiran V1ccee932012-12-12 14:49:46 -08001/*
Gopichand Nakkala0c1331e2013-01-07 22:49:07 -08002 * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
3 *
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.
20 */
Kiran V1ccee932012-12-12 14:49:46 -080021
22/**========================================================================
23
24 \file wlan_hdd_tdls.c
25
Chilam NG571c65a2013-01-19 12:27:36 +053026 \brief WLAN Host Device Driver implementation for TDLS
Kiran V1ccee932012-12-12 14:49:46 -080027
Kiran V1ccee932012-12-12 14:49:46 -080028 ========================================================================*/
29
30#include <wlan_hdd_includes.h>
31#include <wlan_hdd_hostapd.h>
32#include <net/cfg80211.h>
33#include <linux/netdevice.h>
34#include <linux/skbuff.h>
Chilam NG571c65a2013-01-19 12:27:36 +053035#include <linux/list.h>
Kiran V1ccee932012-12-12 14:49:46 -080036#include <linux/etherdevice.h>
37#include <net/ieee80211_radiotap.h>
38#include "wlan_hdd_tdls.h"
Chilam NG571c65a2013-01-19 12:27:36 +053039#include "wlan_hdd_cfg80211.h"
Kiran V1ccee932012-12-12 14:49:46 -080040
Chilam NG571c65a2013-01-19 12:27:36 +053041
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -080042static struct mutex tdls_lock;
Gopichand Nakkala4327a152013-03-04 23:22:42 -080043static tANI_S32 wlan_hdd_get_tdls_discovery_peer_cnt(tdlsCtx_t *pHddTdlsCtx);
44static tANI_S32 wlan_hdd_tdls_peer_reset_discovery_processed(tdlsCtx_t *pHddTdlsCtx);
45static void wlan_hdd_tdls_timers_destroy(tdlsCtx_t *pHddTdlsCtx);
Chilam NG571c65a2013-01-19 12:27:36 +053046
Hoonki Lee5a4b2172013-01-29 01:45:53 -080047#ifndef WLAN_FEATURE_TDLS_DEBUG
48#define TDLS_LOG_LEVEL VOS_TRACE_LEVEL_INFO
49#else
50#define TDLS_LOG_LEVEL VOS_TRACE_LEVEL_WARN
51#endif
52
Hoonki Lee387663d2013-02-05 18:08:43 -080053static u8 wlan_hdd_tdls_hash_key (u8 *mac)
Hoonki Leef63df0d2013-01-16 19:29:14 -080054{
55 int i;
Hoonki Lee387663d2013-02-05 18:08:43 -080056 u8 key = 0;
57
58 for (i = 0; i < 6; i++)
59 key ^= mac[i];
60
61 return key;
62}
63
Gopichand Nakkala4327a152013-03-04 23:22:42 -080064static v_VOID_t wlan_hdd_tdls_start_peer_discover_timer(tdlsCtx_t *pHddTdlsCtx,
65 tANI_BOOLEAN mutexLock,
66 v_U32_t discoveryExpiry)
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -080067{
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -080068 hdd_station_ctx_t *pHddStaCtx;
69
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -080070 if ( mutexLock )
71 {
72 if (mutex_lock_interruptible(&tdls_lock))
73 {
74 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
75 "%s: unable to lock list: %d", __func__, __LINE__);
76 return;
77 }
78 }
79 if (NULL == pHddTdlsCtx)
80 {
81 if ( mutexLock )
82 mutex_unlock(&tdls_lock);
83 return;
84 }
85
Gopichand Nakkala4327a152013-03-04 23:22:42 -080086 if (NULL == pHddTdlsCtx->pAdapter)
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -080087 {
88 if ( mutexLock )
89 mutex_unlock(&tdls_lock);
90 return;
91 }
92
Gopichand Nakkala4327a152013-03-04 23:22:42 -080093 pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pHddTdlsCtx->pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -080094 if (hdd_connIsConnected( pHddStaCtx ))
95 {
Gopichand Nakkala75e7b282013-03-15 18:37:13 -070096#ifdef FEATURE_WLAN_TDLS_INTERNAL
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -080097 vos_timer_start(&pHddTdlsCtx->peerDiscoverTimer, discoveryExpiry);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -070098#endif
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -080099 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "beacon rssi: %d",
100 pHddTdlsCtx->ap_rssi);
101 }
102 if ( mutexLock )
103 mutex_unlock(&tdls_lock);
104
105 return;
106}
107
Hoonki Lee387663d2013-02-05 18:08:43 -0800108static v_VOID_t wlan_hdd_tdls_discover_peer_cb( v_PVOID_t userData )
109{
110 int i;
111 struct list_head *head;
112 struct list_head *pos;
Chilam NG571c65a2013-01-19 12:27:36 +0530113 hddTdlsPeer_t *curr_peer;
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800114 hdd_station_ctx_t *pHddStaCtx;
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800115 tdlsCtx_t *pHddTdlsCtx = (tdlsCtx_t *)userData;
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800116 int discover_req_sent = 0;
117 v_U32_t discover_expiry = TDLS_SUB_DISCOVERY_PERIOD;
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800118 tANI_BOOLEAN doMutexLock = eANI_BOOLEAN_TRUE;
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800119
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800120 if (mutex_lock_interruptible(&tdls_lock))
121 {
122 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
123 "%s: unable to lock list : %d", __func__, __LINE__);
124 return;
125 }
Hoonki Leebfee0342013-01-21 16:43:45 -0800126
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800127 if (NULL == pHddTdlsCtx)
128 {
129 mutex_unlock(&tdls_lock);
130 return;
131 }
Hoonki Leebfee0342013-01-21 16:43:45 -0800132
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800133 if (NULL == pHddTdlsCtx->pAdapter)
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800134 {
135 mutex_unlock(&tdls_lock);
136 return;
137 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800138
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800139 pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pHddTdlsCtx->pAdapter);
Hoonki Leef63df0d2013-01-16 19:29:14 -0800140
Hoonki Lee387663d2013-02-05 18:08:43 -0800141 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: ", __func__);
142
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800143 if (0 == pHddTdlsCtx->discovery_peer_cnt)
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800144 pHddTdlsCtx->discovery_peer_cnt = wlan_hdd_get_tdls_discovery_peer_cnt(pHddTdlsCtx);
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800145
Chilam NG571c65a2013-01-19 12:27:36 +0530146 for (i = 0; i < 256; i++) {
Hoonki Lee387663d2013-02-05 18:08:43 -0800147 head = &pHddTdlsCtx->peer_list[i];
Chilam NG571c65a2013-01-19 12:27:36 +0530148
Hoonki Lee387663d2013-02-05 18:08:43 -0800149 list_for_each (pos, head) {
150 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
Chilam NG571c65a2013-01-19 12:27:36 +0530151
Gopichand Nakkala2a0a1572013-02-10 21:39:16 -0800152 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Chilam Ng01120412013-02-19 18:32:21 -0800153 "%d " MAC_ADDRESS_STR " %d %d, %d %d %d %d", i,
154 MAC_ADDR_ARRAY(curr_peer->peerMac),
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800155 curr_peer->discovery_processed,
156 discover_req_sent,
Gopichand Nakkala2a0a1572013-02-10 21:39:16 -0800157 curr_peer->tdls_support,
158 curr_peer->link_status,
159 curr_peer->discovery_attempt,
160 pHddTdlsCtx->threshold_config.discovery_tries_n);
Hoonki Lee387663d2013-02-05 18:08:43 -0800161
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800162 if (discover_req_sent < TDLS_MAX_DISCOVER_REQS_PER_TIMER) {
163 if (!curr_peer->discovery_processed) {
Chilam NG571c65a2013-01-19 12:27:36 +0530164
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800165 curr_peer->discovery_processed = 1;
166 discover_req_sent++;
167 pHddTdlsCtx->discovery_peer_cnt--;
168
169 if ((eTDLS_CAP_UNKNOWN == curr_peer->tdls_support) &&
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800170 (eTDLS_LINK_IDLE == curr_peer->link_status) &&
Gopichand Nakkalab88f6772013-02-27 18:12:56 -0800171 (curr_peer->tx_pkt >=
172 pHddTdlsCtx->threshold_config.tx_packet_n)) {
Gopichand Nakkala273d5a02013-02-19 15:15:09 -0800173
174 if (curr_peer->discovery_attempt <
175 pHddTdlsCtx->threshold_config.discovery_tries_n) {
176
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800177 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800178 "sme_SendTdlsMgmtFrame(%d)", pHddTdlsCtx->pAdapter->sessionId);
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800179
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800180 sme_SendTdlsMgmtFrame(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter),
181 pHddTdlsCtx->pAdapter->sessionId,
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800182 curr_peer->peerMac,
183 WLAN_TDLS_DISCOVERY_REQUEST,
184 1, 0, NULL, 0, 0);
Gopichand Nakkala273d5a02013-02-19 15:15:09 -0800185 curr_peer->discovery_attempt++;
186 }
187 else
188 {
189 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
190 "%s: Maximum Discovery retries reached", __func__);
191 curr_peer->tdls_support = eTDLS_CAP_NOT_SUPPORTED;
192 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800193
194 }
195 }
Chilam NG571c65a2013-01-19 12:27:36 +0530196 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800197 else
198 goto exit_loop;
Hoonki Lee387663d2013-02-05 18:08:43 -0800199 }
Hoonki Leef63df0d2013-01-16 19:29:14 -0800200 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800201exit_loop:
Hoonki Leef63df0d2013-01-16 19:29:14 -0800202
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800203 if (0 != pHddTdlsCtx->discovery_peer_cnt) {
204 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
205 "discovery_peer_cnt is %d , Starting SUB_DISCOVERY_TIMER",
206 pHddTdlsCtx->discovery_peer_cnt);
207 discover_expiry = TDLS_SUB_DISCOVERY_PERIOD;
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800208 doMutexLock = eANI_BOOLEAN_FALSE;
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800209 goto done;
210 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800211 discover_expiry = pHddTdlsCtx->threshold_config.discovery_period_t;
212
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800213 mutex_unlock(&tdls_lock);
214
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800215 wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
Chilam NG571c65a2013-01-19 12:27:36 +0530216
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800217 /* Commenting out the following function as it was introducing
218 * a race condition when pHddTdlsCtx is deleted. Also , this
219 * function is consuming more time in the timer callback.
220 * RSSI based trigger needs to revisit this part of the code.
221 */
222
223 /*
224 * wlan_hdd_get_rssi(pAdapter, &pHddTdlsCtx->ap_rssi);
225 */
Chilam NG571c65a2013-01-19 12:27:36 +0530226
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800227done:
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800228 wlan_hdd_tdls_start_peer_discover_timer(pHddTdlsCtx, doMutexLock, discover_expiry);
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800229
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800230 if ( !doMutexLock )
231 mutex_unlock(&tdls_lock);
232 return;
Hoonki Leef63df0d2013-01-16 19:29:14 -0800233}
Chilam NG571c65a2013-01-19 12:27:36 +0530234
Hoonki Lee387663d2013-02-05 18:08:43 -0800235static v_VOID_t wlan_hdd_tdls_update_peer_cb( v_PVOID_t userData )
Chilam NG571c65a2013-01-19 12:27:36 +0530236{
237 int i;
Hoonki Lee387663d2013-02-05 18:08:43 -0800238 struct list_head *head;
239 struct list_head *pos;
Chilam NG571c65a2013-01-19 12:27:36 +0530240 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800241 tdlsCtx_t *pHddTdlsCtx;
Hoonki Leebfee0342013-01-21 16:43:45 -0800242
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800243 if (mutex_lock_interruptible(&tdls_lock))
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800244 {
245 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
246 "%s: unable to lock list", __func__);
247 return;
248 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800249 pHddTdlsCtx = (tdlsCtx_t *)userData;
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800250 if (NULL == pHddTdlsCtx)
251 {
252 mutex_unlock(&tdls_lock);
253 return;
254 }
255
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800256 if (NULL == pHddTdlsCtx->pAdapter)
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800257 {
258 mutex_unlock(&tdls_lock);
259 return;
260 }
261
Chilam NG571c65a2013-01-19 12:27:36 +0530262 for (i = 0; i < 256; i++) {
Hoonki Lee387663d2013-02-05 18:08:43 -0800263 head = &pHddTdlsCtx->peer_list[i];
Chilam NG571c65a2013-01-19 12:27:36 +0530264
Hoonki Lee387663d2013-02-05 18:08:43 -0800265 list_for_each (pos, head) {
266 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
Chilam NG571c65a2013-01-19 12:27:36 +0530267
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800268 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
269 "hdd update cb - %d: " MAC_ADDRESS_STR " -> %d link_status -> %d"
270 "tdls_support -> %d", i,
Chilam Ng01120412013-02-19 18:32:21 -0800271 MAC_ADDR_ARRAY(curr_peer->peerMac),
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800272 curr_peer->tx_pkt, curr_peer->link_status, curr_peer->tdls_support);
Hoonki Lee387663d2013-02-05 18:08:43 -0800273
Chilam NG571c65a2013-01-19 12:27:36 +0530274 if (eTDLS_CAP_SUPPORTED == curr_peer->tdls_support) {
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800275 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Chilam Ng01120412013-02-19 18:32:21 -0800276 "%s: (tx %d, rx %d, config %d) " MAC_ADDRESS_STR " (%d) ",
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800277 __func__, curr_peer->tx_pkt, curr_peer->rx_pkt,
278 pHddTdlsCtx->threshold_config.tx_packet_n,
Chilam Ng01120412013-02-19 18:32:21 -0800279 MAC_ADDR_ARRAY(curr_peer->peerMac), curr_peer->link_status);
280
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800281 if ((eTDLS_LINK_IDLE == curr_peer->link_status) ||
282 (eTDLS_LINK_DISCOVERING == curr_peer->link_status)){
Chilam NG571c65a2013-01-19 12:27:36 +0530283 if (curr_peer->tx_pkt >=
284 pHddTdlsCtx->threshold_config.tx_packet_n) {
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800285
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800286 if (HDD_MAX_NUM_TDLS_STA > wlan_hdd_tdlsConnectedPeers(pHddTdlsCtx->pAdapter))
Gopichand Nakkalab977a972013-02-18 19:15:09 -0800287 {
288
289 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL, "-> Tput trigger TDLS SETUP");
Chilam NG571c65a2013-01-19 12:27:36 +0530290#ifdef CONFIG_TDLS_IMPLICIT
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700291 wlan_hdd_tdls_pre_setup(pHddTdlsCtx, curr_peer);
Chilam NG571c65a2013-01-19 12:27:36 +0530292#endif
Gopichand Nakkalab977a972013-02-18 19:15:09 -0800293 }
294 else
295 {
296 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800297 "%s: Maximum peer connected already! %d",
298 __func__, wlan_hdd_tdlsConnectedPeers(pHddTdlsCtx->pAdapter) );
Gopichand Nakkalab977a972013-02-18 19:15:09 -0800299 }
Hoonki Leecdd8e962013-01-20 00:45:46 -0800300 goto next_peer;
Chilam NG571c65a2013-01-19 12:27:36 +0530301 }
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800302#ifdef WLAN_FEATURE_TDLS_DEBUG
303 else {
304 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL, "-> ignored.");
305 }
306#endif
Gopichand Nakkala9f7592a2013-02-27 12:41:50 -0800307 if ((((tANI_S32)curr_peer->rssi >
Hoonki Leecdd8e962013-01-20 00:45:46 -0800308 (tANI_S32)(pHddTdlsCtx->threshold_config.rssi_hysteresis +
Gopichand Nakkala9f7592a2013-02-27 12:41:50 -0800309 pHddTdlsCtx->ap_rssi)) ||
310 ((tANI_S32)(curr_peer->rssi >
311 pHddTdlsCtx->threshold_config.rssi_trigger_threshold))) &&
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800312 (HDD_MAX_NUM_TDLS_STA > wlan_hdd_tdlsConnectedPeers(pHddTdlsCtx->pAdapter))){
Chilam NG571c65a2013-01-19 12:27:36 +0530313
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800314 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
315 "%s: RSSI (peer %d > ap %d + hysteresis %d) triggering to %02x:%02x:%02x:%02x:%02x:%02x ",
316 __func__, (tANI_S32)curr_peer->rssi,
317 pHddTdlsCtx->ap_rssi,
318 (tANI_S32)(pHddTdlsCtx->threshold_config.rssi_hysteresis),
319 curr_peer->peerMac[0], curr_peer->peerMac[1], curr_peer->peerMac[2],
320 curr_peer->peerMac[3], curr_peer->peerMac[4], curr_peer->peerMac[5]);
Chilam NG571c65a2013-01-19 12:27:36 +0530321
322#ifdef CONFIG_TDLS_IMPLICIT
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800323 cfg80211_tdls_oper_request(pHddTdlsCtx->pAdapter->dev,
Chilam NG571c65a2013-01-19 12:27:36 +0530324 curr_peer->peerMac,
325 NL80211_TDLS_SETUP, FALSE,
326 GFP_KERNEL);
327#endif
328 }
329 } else {
Chilam Ng01120412013-02-19 18:32:21 -0800330 if ((tANI_S32)curr_peer->rssi <
331 (tANI_S32)pHddTdlsCtx->threshold_config.rssi_teardown_threshold) {
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800332
Chilam Ng01120412013-02-19 18:32:21 -0800333 VOS_TRACE( VOS_MODULE_ID_HDD,
334 VOS_TRACE_LEVEL_WARN,
335 "Tear down - low RSSI: " MAC_ADDRESS_STR "!",
336 MAC_ADDR_ARRAY(curr_peer->peerMac));
337#ifdef CONFIG_TDLS_IMPLICIT
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800338 cfg80211_tdls_oper_request(pHddTdlsCtx->pAdapter->dev,
Chilam Ng01120412013-02-19 18:32:21 -0800339 curr_peer->peerMac,
340 NL80211_TDLS_TEARDOWN, FALSE,
341 GFP_KERNEL);
342#endif
Hoonki Leecdd8e962013-01-20 00:45:46 -0800343 goto next_peer;
Chilam NG571c65a2013-01-19 12:27:36 +0530344 }
Chilam Ng01120412013-02-19 18:32:21 -0800345
346 if ((curr_peer->tx_pkt <
347 pHddTdlsCtx->threshold_config.idle_packet_n) &&
348 (curr_peer->rx_pkt <
349 pHddTdlsCtx->threshold_config.idle_packet_n)) {
350 if (VOS_TIMER_STATE_RUNNING !=
351 vos_timer_getCurrentState(&curr_peer->peerIdleTimer)) {
352 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
353 "Tx/Rx Idle timer start: " MAC_ADDRESS_STR "!",
354 MAC_ADDR_ARRAY(curr_peer->peerMac));
355 vos_timer_start( &curr_peer->peerIdleTimer,
356 pHddTdlsCtx->threshold_config.idle_timeout_t );
357 }
358 } else {
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800359 if (VOS_TIMER_STATE_RUNNING ==
360 vos_timer_getCurrentState(&curr_peer->peerIdleTimer)) {
Chilam Ng01120412013-02-19 18:32:21 -0800361 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
362 "Tx/Rx Idle timer stop: " MAC_ADDRESS_STR "!",
363 MAC_ADDR_ARRAY(curr_peer->peerMac));
364 vos_timer_stop( &curr_peer->peerIdleTimer);
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800365 }
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800366 }
Chilam Ng01120412013-02-19 18:32:21 -0800367
Hoonki Leecdd8e962013-01-20 00:45:46 -0800368// if (curr_peer->rssi <
369// (pHddTdlsCtx->threshold_config.rssi_hysteresis +
370// pHddTdlsCtx->ap_rssi)) {
371//
372//#ifdef CONFIG_TDLS_IMPLICIT
373// cfg80211_tdls_oper_request(pHddTdlsCtx->dev,
374// curr_peer->peerMac,
375// NL80211_TDLS_TEARDOWN, FALSE,
376// GFP_KERNEL);
377//#endif
378// }
Chilam NG571c65a2013-01-19 12:27:36 +0530379 }
Chilam Ng01120412013-02-19 18:32:21 -0800380 } else if (eTDLS_CAP_UNKNOWN == curr_peer->tdls_support) {
381 if (eTDLS_LINK_CONNECTED != curr_peer->link_status) {
382 if (curr_peer->tx_pkt >=
383 pHddTdlsCtx->threshold_config.tx_packet_n) {
Chilam Ng01120412013-02-19 18:32:21 -0800384
385 if (++curr_peer->discovery_attempt <
386 pHddTdlsCtx->threshold_config.discovery_tries_n) {
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800387
388 sme_SendTdlsMgmtFrame(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter),
389 pHddTdlsCtx->pAdapter->sessionId,
Gopichand Nakkalab88f6772013-02-27 18:12:56 -0800390 curr_peer->peerMac,
391 WLAN_TDLS_DISCOVERY_REQUEST,
392 1, 0, NULL, 0, 0);
Chilam Ng01120412013-02-19 18:32:21 -0800393 }
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800394 else
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800395 {
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800396 curr_peer->tdls_support = eTDLS_CAP_NOT_SUPPORTED;
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800397 curr_peer->link_status = eTDLS_LINK_IDLE;
398 }
Chilam Ng01120412013-02-19 18:32:21 -0800399
400 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
401 "Tput triggering TDLS discovery: " MAC_ADDRESS_STR "!",
402 MAC_ADDR_ARRAY(curr_peer->peerMac));
403 }
404 }
Chilam NG571c65a2013-01-19 12:27:36 +0530405 }
406
Hoonki Leecdd8e962013-01-20 00:45:46 -0800407next_peer:
Chilam NG571c65a2013-01-19 12:27:36 +0530408 curr_peer->tx_pkt = 0;
Chilam Ng1279e232013-01-25 15:06:52 -0800409 curr_peer->rx_pkt = 0;
Hoonki Lee387663d2013-02-05 18:08:43 -0800410 }
Chilam NG571c65a2013-01-19 12:27:36 +0530411 }
412
413 vos_timer_start( &pHddTdlsCtx->peerUpdateTimer,
414 pHddTdlsCtx->threshold_config.tx_period_t );
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800415 mutex_unlock(&tdls_lock);
Chilam NG571c65a2013-01-19 12:27:36 +0530416}
417
Chilam Ng1279e232013-01-25 15:06:52 -0800418static v_VOID_t wlan_hdd_tdls_idle_cb( v_PVOID_t userData )
419{
Lee Hoonkic1262f22013-01-24 21:59:00 -0800420#ifdef CONFIG_TDLS_IMPLICIT
Chilam Ng1279e232013-01-25 15:06:52 -0800421 hddTdlsPeer_t *curr_peer = (hddTdlsPeer_t *)userData;
422
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800423 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Chilam Ng01120412013-02-19 18:32:21 -0800424 "%s: Tx/Rx Idle " MAC_ADDRESS_STR " trigger teardown",
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800425 __func__,
Chilam Ng01120412013-02-19 18:32:21 -0800426 MAC_ADDR_ARRAY(curr_peer->peerMac));
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800427 if (mutex_lock_interruptible(&tdls_lock))
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800428 {
429 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
430 "%s: unable to lock list", __func__);
431 return;
432 }
Hoonki Lee5a4b2172013-01-29 01:45:53 -0800433
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800434 cfg80211_tdls_oper_request(curr_peer->pHddTdlsCtx->pAdapter->dev,
Chilam Ng1279e232013-01-25 15:06:52 -0800435 curr_peer->peerMac,
Hoonki Leea34dd892013-02-05 22:56:02 -0800436 NL80211_TDLS_TEARDOWN,
437 eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON,
Chilam Ng1279e232013-01-25 15:06:52 -0800438 GFP_KERNEL);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800439 mutex_unlock(&tdls_lock);
Chilam Ng1279e232013-01-25 15:06:52 -0800440#endif
441}
442
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700443static v_VOID_t wlan_hdd_tdls_discovery_timeout_peer_cb(v_PVOID_t userData)
444{
445 tdlsCtx_t *pHddTdlsCtx;
446
447 pHddTdlsCtx = (tdlsCtx_t *)userData;
448 if (NULL == pHddTdlsCtx)
449 return;
450
451 pHddTdlsCtx->discovery_sent_cnt = 0;
452 wlan_hdd_tdls_check_bmps(pHddTdlsCtx->pAdapter);
453
454 return;
455}
456
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800457static void wlan_hdd_tdls_free_list(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800458{
459 int i;
460 struct list_head *head;
461 hddTdlsPeer_t *tmp;
462 struct list_head *pos, *q;
463
464 if (NULL == pHddTdlsCtx) return;
465
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800466
467 for (i = 0; i < 256; i++) {
468 head = &pHddTdlsCtx->peer_list[i];
469 list_for_each_safe (pos, q, head) {
470 tmp = list_entry(pos, hddTdlsPeer_t, node);
471 list_del(pos);
472 vos_mem_free(tmp);
473 }
474 }
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800475}
476
Hoonki Lee27511902013-03-14 18:19:06 -0700477int wlan_hdd_tdls_init(hdd_adapter_t *pAdapter)
Chilam Ng01120412013-02-19 18:32:21 -0800478{
Chilam Ng01120412013-02-19 18:32:21 -0800479 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
Hoonki Lee27511902013-03-14 18:19:06 -0700480 tdlsCtx_t *pHddTdlsCtx;
Chilam Ng01120412013-02-19 18:32:21 -0800481 int i;
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800482 v_U8_t staIdx;
Chilam Ng01120412013-02-19 18:32:21 -0800483
Hoonki Lee27511902013-03-14 18:19:06 -0700484 mutex_init(&tdls_lock);
Chilam Ng01120412013-02-19 18:32:21 -0800485
Hoonki Lee27511902013-03-14 18:19:06 -0700486 if ((FALSE == pHddCtx->cfg_ini->fEnableTDLSSupport) ||
487 (FALSE == sme_IsFeatureSupportedByFW(TDLS)))
488 {
489 pHddCtx->tdls_mode = eTDLS_SUPPORT_NOT_ENABLED;
490 pAdapter->sessionCtx.station.pHddTdlsCtx = NULL;
491 hddLog(VOS_TRACE_LEVEL_ERROR, "%s TDLS not enabled (%d) or FW doesn't support (%d)!",
492 __func__, pHddCtx->cfg_ini->fEnableTDLSSupport,
493 sme_IsFeatureSupportedByFW(TDLS));
494 return 0;
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800495 }
496
Hoonki Lee27511902013-03-14 18:19:06 -0700497 pHddTdlsCtx = vos_mem_malloc(sizeof(tdlsCtx_t));
498
499 if (NULL == pHddTdlsCtx) {
500 hddLog(VOS_TRACE_LEVEL_ERROR, "%s malloc failed!", __func__);
501 pAdapter->sessionCtx.station.pHddTdlsCtx = NULL;
502 return -1;
503 }
504
505 pAdapter->sessionCtx.station.pHddTdlsCtx = pHddTdlsCtx;
506
507 /* initialize TDLS global context */
508 pHddCtx->connected_peer_count = 0;
509
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800510 for (staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++)
511 {
512 pHddCtx->tdlsConnInfo[staIdx].staId = 0;
513 pHddCtx->tdlsConnInfo[staIdx].sessionId = 255;
514 vos_mem_zero(&pHddCtx->tdlsConnInfo[staIdx].peerMac,
515 sizeof(v_MACADDR_t)) ;
Chilam Ng01120412013-02-19 18:32:21 -0800516 }
517
Hoonki Lee27511902013-03-14 18:19:06 -0700518 /* initialize TDLS pAdater context */
519 vos_mem_zero(pHddTdlsCtx, sizeof(tdlsCtx_t));
520
521 pHddTdlsCtx->pAdapter = pAdapter;
522
523 for (i = 0; i < 256; i++)
524 {
525 INIT_LIST_HEAD(&pHddTdlsCtx->peer_list[i]);
526 }
527
Chilam Ng01120412013-02-19 18:32:21 -0800528 vos_timer_init(&pHddTdlsCtx->peerDiscoverTimer,
529 VOS_TIMER_TYPE_SW,
530 wlan_hdd_tdls_discover_peer_cb,
531 pHddTdlsCtx);
532
533 vos_timer_init(&pHddTdlsCtx->peerUpdateTimer,
534 VOS_TIMER_TYPE_SW,
535 wlan_hdd_tdls_update_peer_cb,
536 pHddTdlsCtx);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700537 vos_timer_init(&pHddTdlsCtx->peerDiscoveryTimeoutTimer,
538 VOS_TIMER_TYPE_SW,
539 wlan_hdd_tdls_discovery_timeout_peer_cb,
540 pHddTdlsCtx);
Chilam Ng01120412013-02-19 18:32:21 -0800541
Hoonki Lee27511902013-03-14 18:19:06 -0700542 /* remember configuration even if it is not used right now. it could be used later */
543 pHddTdlsCtx->threshold_config.tx_period_t = pHddCtx->cfg_ini->fTDLSTxStatsPeriod;
544 pHddTdlsCtx->threshold_config.tx_packet_n = pHddCtx->cfg_ini->fTDLSTxPacketThreshold;
545 pHddTdlsCtx->threshold_config.discovery_period_t = pHddCtx->cfg_ini->fTDLSDiscoveryPeriod;
546 pHddTdlsCtx->threshold_config.discovery_tries_n = pHddCtx->cfg_ini->fTDLSMaxDiscoveryAttempt;
547 pHddTdlsCtx->threshold_config.idle_timeout_t = pHddCtx->cfg_ini->fTDLSIdleTimeout;
548 pHddTdlsCtx->threshold_config.idle_packet_n = pHddCtx->cfg_ini->fTDLSIdlePacketThreshold;
549 pHddTdlsCtx->threshold_config.rssi_hysteresis = pHddCtx->cfg_ini->fTDLSRSSIHysteresis;
550 pHddTdlsCtx->threshold_config.rssi_trigger_threshold = pHddCtx->cfg_ini->fTDLSRSSITriggerThreshold;
551 pHddTdlsCtx->threshold_config.rssi_teardown_threshold = pHddCtx->cfg_ini->fTDLSRSSITeardownThreshold;
Chilam NG571c65a2013-01-19 12:27:36 +0530552
Chilam Ng01120412013-02-19 18:32:21 -0800553 if (FALSE == pHddCtx->cfg_ini->fEnableTDLSImplicitTrigger)
Hoonki Lee387663d2013-02-05 18:08:43 -0800554 {
Chilam Ng01120412013-02-19 18:32:21 -0800555 pHddCtx->tdls_mode = eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY;
Hoonki Leebf870f32013-01-19 15:53:30 +0530556 hddLog(VOS_TRACE_LEVEL_ERROR, "%s TDLS Implicit trigger not enabled!", __func__);
Hoonki Leebf870f32013-01-19 15:53:30 +0530557 }
Hoonki Lee27511902013-03-14 18:19:06 -0700558 else
559 {
560 pHddCtx->tdls_mode = eTDLS_SUPPORT_ENABLED;
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700561#ifdef FEATURE_WLAN_TDLS_INTERNAL
Hoonki Lee27511902013-03-14 18:19:06 -0700562 vos_timer_start( &pHddTdlsCtx->peerDiscoverTimer,
563 pHddTdlsCtx->threshold_config.discovery_period_t );
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700564#endif
Chilam NG571c65a2013-01-19 12:27:36 +0530565
Hoonki Lee27511902013-03-14 18:19:06 -0700566 vos_timer_start( &pHddTdlsCtx->peerUpdateTimer,
567 pHddTdlsCtx->threshold_config.tx_period_t );
568 }
569
570 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +0530571}
572
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800573void wlan_hdd_tdls_exit(hdd_adapter_t *pAdapter)
Chilam NG571c65a2013-01-19 12:27:36 +0530574{
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800575 tdlsCtx_t *pHddTdlsCtx;
576
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800577 if (mutex_lock_interruptible(&tdls_lock))
578 {
579 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
580 "%s: unable to lock list", __func__);
581 return;
582 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800583
584 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800585 if (NULL == pHddTdlsCtx)
586 {
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800587 mutex_unlock(&tdls_lock);
Hoonki Leebfee0342013-01-21 16:43:45 -0800588 hddLog(VOS_TRACE_LEVEL_WARN, "%s TDLS not enabled, exiting!", __func__);
589 return;
590 }
591
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800592 /* must stop timer here before freeing peer list, because peerIdleTimer is
593 part of peer list structure. */
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800594 wlan_hdd_tdls_timers_destroy(pHddTdlsCtx);
595 wlan_hdd_tdls_free_list(pHddTdlsCtx);
Chilam Nga75d8b62013-01-29 01:35:59 -0800596
597 vos_mem_free(pHddTdlsCtx);
598 pHddTdlsCtx = NULL;
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800599 mutex_unlock(&tdls_lock);
Chilam NG571c65a2013-01-19 12:27:36 +0530600}
601
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800602/* stop all the tdls timers running */
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800603static void wlan_hdd_tdls_timers_stop(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800604{
605 int i;
606 struct list_head *head;
607 struct list_head *pos;
608 hddTdlsPeer_t *curr_peer;
609
610 vos_timer_stop(&pHddTdlsCtx->peerDiscoverTimer);
611 vos_timer_stop(&pHddTdlsCtx->peerUpdateTimer);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700612 vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800613
614 for (i = 0; i < 256; i++)
615 {
616 head = &pHddTdlsCtx->peer_list[i];
617
618 list_for_each (pos, head) {
619 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
620
621 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Chilam Ng01120412013-02-19 18:32:21 -0800622 "%s: " MAC_ADDRESS_STR " -> stop idle timer",
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800623 __func__,
Chilam Ng01120412013-02-19 18:32:21 -0800624 MAC_ADDR_ARRAY(curr_peer->peerMac));
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800625 vos_timer_stop ( &curr_peer->peerIdleTimer );
626 }
627 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -0800628}
629
630/* destroy all the tdls timers running */
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800631static void wlan_hdd_tdls_timers_destroy(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800632{
633 int i;
634 struct list_head *head;
635 struct list_head *pos;
636 hddTdlsPeer_t *curr_peer;
637
638 vos_timer_stop(&pHddTdlsCtx->peerDiscoverTimer);
639 vos_timer_destroy(&pHddTdlsCtx->peerDiscoverTimer);
640 vos_timer_stop(&pHddTdlsCtx->peerUpdateTimer);
641 vos_timer_destroy(&pHddTdlsCtx->peerUpdateTimer);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700642 vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
643 vos_timer_destroy(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800644
645 for (i = 0; i < 256; i++)
646 {
647 head = &pHddTdlsCtx->peer_list[i];
648
649 list_for_each (pos, head) {
650 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
651
652 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Chilam Ng01120412013-02-19 18:32:21 -0800653 "%s: " MAC_ADDRESS_STR " -> destroy idle timer",
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800654 __func__,
Chilam Ng01120412013-02-19 18:32:21 -0800655 MAC_ADDR_ARRAY(curr_peer->peerMac));
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800656 vos_timer_stop ( &curr_peer->peerIdleTimer );
657 vos_timer_destroy ( &curr_peer->peerIdleTimer );
658 }
659 }
660}
661
Hoonki Lee387663d2013-02-05 18:08:43 -0800662/* if mac address exist, return pointer
663 if mac address doesn't exist, create a list and add, return pointer
664 return NULL if fails to get new mac address
665*/
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800666hddTdlsPeer_t *wlan_hdd_tdls_get_peer(hdd_adapter_t *pAdapter, u8 *mac)
Chilam NG571c65a2013-01-19 12:27:36 +0530667{
Hoonki Lee387663d2013-02-05 18:08:43 -0800668 struct list_head *head;
669 hddTdlsPeer_t *peer;
670 u8 key;
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800671 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Chilam NG571c65a2013-01-19 12:27:36 +0530672
Hoonki Lee387663d2013-02-05 18:08:43 -0800673 if (NULL == pHddTdlsCtx)
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800674 {
675 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
676 "%s: pHddTdlsCtx is NULL", __func__);
Hoonki Lee387663d2013-02-05 18:08:43 -0800677 return NULL;
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800678 }
Hoonki Leebfee0342013-01-21 16:43:45 -0800679
Hoonki Lee387663d2013-02-05 18:08:43 -0800680 /* if already there, just update */
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800681 peer = wlan_hdd_tdls_find_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -0800682 if (peer != NULL)
683 {
684 return peer;
Chilam NG571c65a2013-01-19 12:27:36 +0530685 }
686
Hoonki Lee387663d2013-02-05 18:08:43 -0800687 /* not found, allocate and add the list */
688 peer = vos_mem_malloc(sizeof(hddTdlsPeer_t));
689 if (NULL == peer) {
690 hddLog(VOS_TRACE_LEVEL_ERROR, "%s peer malloc failed!", __func__);
691 return NULL;
692 }
Chilam NG571c65a2013-01-19 12:27:36 +0530693
Hoonki Lee387663d2013-02-05 18:08:43 -0800694 key = wlan_hdd_tdls_hash_key(mac);
695 head = &pHddTdlsCtx->peer_list[key];
Chilam NG571c65a2013-01-19 12:27:36 +0530696
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800697 if (mutex_lock_interruptible(&tdls_lock))
Hoonki Lee387663d2013-02-05 18:08:43 -0800698 {
699 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
700 "%s: unable to lock list", __func__);
701 return NULL;
702 }
Chilam NG571c65a2013-01-19 12:27:36 +0530703
Hoonki Lee387663d2013-02-05 18:08:43 -0800704 vos_mem_zero(peer, sizeof(hddTdlsPeer_t));
705 vos_mem_copy(peer->peerMac, mac, sizeof(peer->peerMac));
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800706 peer->pHddTdlsCtx = pHddTdlsCtx;
Hoonki Lee387663d2013-02-05 18:08:43 -0800707
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800708 vos_timer_init(&peer->peerIdleTimer,
709 VOS_TIMER_TYPE_SW,
710 wlan_hdd_tdls_idle_cb,
711 peer);
712
Hoonki Lee387663d2013-02-05 18:08:43 -0800713 list_add_tail(&peer->node, head);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -0800714 mutex_unlock(&tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -0800715
716 return peer;
717}
718
Hoonki Lee27511902013-03-14 18:19:06 -0700719void wlan_hdd_tdls_set_cap(hdd_adapter_t *pAdapter,
720 u8* mac,
721 tTDLSCapType cap)
722{
723 hddTdlsPeer_t *curr_peer;
724
725 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac);
726 if (curr_peer == NULL)
727 return;
728
729 curr_peer->tdls_support = cap;
730
731 return;
732}
733
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800734void wlan_hdd_tdls_set_peer_link_status(hddTdlsPeer_t *curr_peer, tTDLSLinkStatus status)
Hoonki Lee387663d2013-02-05 18:08:43 -0800735{
736 if (curr_peer == NULL)
737 return;
738
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800739 hddLog(VOS_TRACE_LEVEL_WARN, "tdls set peer " MAC_ADDRESS_STR " link status to %u",
Chilam Ng01120412013-02-19 18:32:21 -0800740 MAC_ADDR_ARRAY(curr_peer->peerMac), status);
Chilam NG571c65a2013-01-19 12:27:36 +0530741
742 curr_peer->link_status = status;
743
Chilam NG571c65a2013-01-19 12:27:36 +0530744}
745
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800746void wlan_hdd_tdls_set_link_status(hdd_adapter_t *pAdapter,
747 u8* mac,
748 tTDLSLinkStatus linkStatus)
749{
750 hddTdlsPeer_t *curr_peer;
751
752 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac);
753 if (curr_peer == NULL)
754 return;
755
756 curr_peer->link_status= linkStatus;
757
758 return;
759}
760
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800761int wlan_hdd_tdls_recv_discovery_resp(hdd_adapter_t *pAdapter, u8 *mac)
Chilam NG571c65a2013-01-19 12:27:36 +0530762{
763 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700764 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Chilam NG571c65a2013-01-19 12:27:36 +0530765
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800766 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700767
768 if (NULL == curr_peer)
Hoonki Lee387663d2013-02-05 18:08:43 -0800769 return -1;
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700770
771 if (pHddTdlsCtx->discovery_sent_cnt)
772 pHddTdlsCtx->discovery_sent_cnt--;
773
774 if (0 == pHddTdlsCtx->discovery_sent_cnt)
775 vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
776 wlan_hdd_tdls_check_bmps(pAdapter);
777
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800778 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700779 "Discovery(%lu) Response from " MAC_ADDRESS_STR " link_status %d",
780 pHddTdlsCtx->discovery_sent_cnt, MAC_ADDR_ARRAY(curr_peer->peerMac),
781 curr_peer->link_status);
782
Gopichand Nakkala8b00c632013-03-08 19:47:52 -0800783 if (eTDLS_LINK_DISCOVERING == curr_peer->link_status)
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800784 {
Gopichand Nakkala75e7b282013-03-15 18:37:13 -0700785 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
786 "Indicating Set-Up to supplicant");
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800787 cfg80211_tdls_oper_request(pAdapter->dev,
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800788 curr_peer->peerMac,
789 NL80211_TDLS_SETUP, FALSE,
790 GFP_KERNEL);
Gopichand Nakkala05922802013-03-14 12:23:19 -0700791 curr_peer->link_status = eTDLS_LINK_DISCOVERED;
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800792 }
Chilam NG571c65a2013-01-19 12:27:36 +0530793
Gopichand Nakkala901e8922013-03-04 23:45:58 -0800794 curr_peer->tdls_support = eTDLS_CAP_SUPPORTED;
Hoonki Lee387663d2013-02-05 18:08:43 -0800795 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +0530796}
797
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800798int wlan_hdd_tdls_set_rssi(hdd_adapter_t *pAdapter, u8 *mac, tANI_S8 rxRssi)
Chilam NG571c65a2013-01-19 12:27:36 +0530799{
800 hddTdlsPeer_t *curr_peer;
Chilam NG571c65a2013-01-19 12:27:36 +0530801
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800802 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -0800803 if (curr_peer == NULL)
804 return -1;
Chilam NG571c65a2013-01-19 12:27:36 +0530805
806 curr_peer->rssi = rxRssi;
807
Hoonki Lee387663d2013-02-05 18:08:43 -0800808 return 0;
Chilam NG571c65a2013-01-19 12:27:36 +0530809}
810
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800811int wlan_hdd_tdls_set_responder(hdd_adapter_t *pAdapter, u8 *mac, tANI_U8 responder)
Hoonki Leea34dd892013-02-05 22:56:02 -0800812{
813 hddTdlsPeer_t *curr_peer;
814
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800815 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800816 if (curr_peer == NULL)
Hoonki Leea34dd892013-02-05 22:56:02 -0800817 return -1;
818
819 curr_peer->is_responder = responder;
820
821 return 0;
822}
823
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800824int wlan_hdd_tdls_get_responder(hdd_adapter_t *pAdapter, u8 *mac)
Hoonki Leea34dd892013-02-05 22:56:02 -0800825{
826 hddTdlsPeer_t *curr_peer;
827
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800828 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, mac);
Gopichand Nakkala91b09262013-02-10 14:27:02 -0800829 if (curr_peer == NULL)
Hoonki Leea34dd892013-02-05 22:56:02 -0800830 return -1;
831
832 return (curr_peer->is_responder);
833}
834
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800835int wlan_hdd_tdls_set_signature(hdd_adapter_t *pAdapter, u8 *mac, tANI_U8 uSignature)
Hoonki Lee11f7dda2013-02-14 16:55:44 -0800836{
837 hddTdlsPeer_t *curr_peer;
838
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800839 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee11f7dda2013-02-14 16:55:44 -0800840 if (curr_peer == NULL)
841 return -1;
842
843 curr_peer->signature = uSignature;
844
845 return 0;
846}
847
Hoonki Leea34dd892013-02-05 22:56:02 -0800848
Hoonki Lee387663d2013-02-05 18:08:43 -0800849void wlan_hdd_tdls_extract_da(struct sk_buff *skb, u8 *mac)
Chilam NG571c65a2013-01-19 12:27:36 +0530850{
Chilam NG571c65a2013-01-19 12:27:36 +0530851 memcpy(mac, skb->data, 6);
Chilam NG571c65a2013-01-19 12:27:36 +0530852}
853
Hoonki Lee387663d2013-02-05 18:08:43 -0800854void wlan_hdd_tdls_extract_sa(struct sk_buff *skb, u8 *mac)
Chilam Ng1279e232013-01-25 15:06:52 -0800855{
Chilam Ng1279e232013-01-25 15:06:52 -0800856 memcpy(mac, skb->data+6, 6);
Chilam Ng1279e232013-01-25 15:06:52 -0800857}
858
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800859int wlan_hdd_tdls_increment_pkt_count(hdd_adapter_t *pAdapter, u8 *mac, u8 tx)
Chilam NG571c65a2013-01-19 12:27:36 +0530860{
Hoonki Lee387663d2013-02-05 18:08:43 -0800861 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800862 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Chilam NG571c65a2013-01-19 12:27:36 +0530863
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800864 if (eTDLS_SUPPORT_ENABLED != pHddCtx->tdls_mode)
865 return -1;
Hoonki Leebfee0342013-01-21 16:43:45 -0800866
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800867 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -0800868 if (curr_peer == NULL)
Chilam NG571c65a2013-01-19 12:27:36 +0530869 return -1;
Chilam NG571c65a2013-01-19 12:27:36 +0530870
Chilam Ng1279e232013-01-25 15:06:52 -0800871 if (tx)
872 curr_peer->tx_pkt++;
873 else
874 curr_peer->rx_pkt++;
Chilam NG571c65a2013-01-19 12:27:36 +0530875
Chilam NG571c65a2013-01-19 12:27:36 +0530876 return 0;
877}
878
Hoonki Lee27511902013-03-14 18:19:06 -0700879static int wlan_hdd_tdls_check_config(tdls_config_params_t *config)
880{
881 if (config->tdls > 2)
882 {
883 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 1st argument %d. <0...2>", __func__, config->tdls);
884 return -1;
885 }
886 if (config->tx_period_t < CFG_TDLS_TX_STATS_PERIOD_MIN ||
887 config->tx_period_t > CFG_TDLS_TX_STATS_PERIOD_MAX)
888 {
889 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 2nd argument %d. <%d...%d>", __func__, config->tx_period_t,
890 CFG_TDLS_TX_STATS_PERIOD_MIN, CFG_TDLS_TX_STATS_PERIOD_MAX);
891 return -1;
892 }
893 if (config->tx_packet_n < CFG_TDLS_TX_PACKET_THRESHOLD_MIN ||
894 config->tx_packet_n > CFG_TDLS_TX_PACKET_THRESHOLD_MAX)
895 {
896 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 3rd argument %d. <%d...%d>", __func__, config->tx_packet_n,
897 CFG_TDLS_TX_PACKET_THRESHOLD_MIN, CFG_TDLS_TX_PACKET_THRESHOLD_MAX);
898 return -1;
899 }
900 if (config->discovery_period_t < CFG_TDLS_DISCOVERY_PERIOD_MIN ||
901 config->discovery_period_t > CFG_TDLS_DISCOVERY_PERIOD_MAX)
902 {
903 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 4th argument %d. <%d...%d>", __func__, config->discovery_period_t,
904 CFG_TDLS_DISCOVERY_PERIOD_MIN, CFG_TDLS_DISCOVERY_PERIOD_MAX);
905 return -1;
906 }
907 if (config->discovery_tries_n < CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MIN ||
908 config->discovery_tries_n > CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MAX)
909 {
910 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 5th argument %d. <%d...%d>", __func__, config->discovery_tries_n,
911 CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MIN, CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MAX);
912 return -1;
913 }
914 if (config->idle_timeout_t < CFG_TDLS_IDLE_TIMEOUT_MIN ||
915 config->idle_timeout_t > CFG_TDLS_IDLE_TIMEOUT_MAX)
916 {
917 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 6th argument %d. <%d...%d>", __func__, config->idle_timeout_t,
918 CFG_TDLS_IDLE_TIMEOUT_MIN, CFG_TDLS_IDLE_TIMEOUT_MAX);
919 return -1;
920 }
921 if (config->idle_packet_n < CFG_TDLS_IDLE_PACKET_THRESHOLD_MIN ||
922 config->idle_packet_n > CFG_TDLS_IDLE_PACKET_THRESHOLD_MAX)
923 {
924 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 7th argument %d. <%d...%d>", __func__, config->idle_packet_n,
925 CFG_TDLS_IDLE_PACKET_THRESHOLD_MIN, CFG_TDLS_IDLE_PACKET_THRESHOLD_MAX);
926 return -1;
927 }
928 if (config->rssi_hysteresis < CFG_TDLS_RSSI_HYSTERESIS_MIN ||
929 config->rssi_hysteresis > CFG_TDLS_RSSI_HYSTERESIS_MAX)
930 {
931 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 8th argument %d. <%d...%d>", __func__, config->rssi_hysteresis,
932 CFG_TDLS_RSSI_HYSTERESIS_MIN, CFG_TDLS_RSSI_HYSTERESIS_MAX);
933 return -1;
934 }
935 if (config->rssi_trigger_threshold < CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MIN ||
936 config->rssi_trigger_threshold > CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MAX)
937 {
938 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 9th argument %d. <%d...%d>", __func__, config->rssi_trigger_threshold,
939 CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MIN, CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MAX);
940 return -1;
941 }
942 if (config->rssi_teardown_threshold < CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MIN ||
943 config->rssi_teardown_threshold > CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MAX)
944 {
945 hddLog(VOS_TRACE_LEVEL_ERROR, "%s invalid 10th argument %d. <%d...%d>", __func__, config->rssi_teardown_threshold,
946 CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MIN, CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MAX);
947 return -1;
948 }
949 return 0;
950}
951
Chilam Ng01120412013-02-19 18:32:21 -0800952int wlan_hdd_tdls_set_params(struct net_device *dev, tdls_config_params_t *config)
Chilam NG571c65a2013-01-19 12:27:36 +0530953{
Chilam Ng01120412013-02-19 18:32:21 -0800954 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
955 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
Gopichand Nakkala4327a152013-03-04 23:22:42 -0800956 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Hoonki Lee27511902013-03-14 18:19:06 -0700957 eTDLSSupportMode req_tdls_mode;
Hoonki Leebfee0342013-01-21 16:43:45 -0800958
Hoonki Lee27511902013-03-14 18:19:06 -0700959 if (NULL == pHddTdlsCtx)
960 {
961 hddLog(VOS_TRACE_LEVEL_ERROR, "%s TDLS not enabled!", __func__);
962 return -1;
Chilam Ng01120412013-02-19 18:32:21 -0800963 }
Chilam NG571c65a2013-01-19 12:27:36 +0530964
Hoonki Lee27511902013-03-14 18:19:06 -0700965 if (wlan_hdd_tdls_check_config(config) != 0)
966 {
967 return -1;
968 }
969
970 /* config->tdls is mapped to 0->1, 1->2, 2->3 */
971 req_tdls_mode = config->tdls + 1;
972 if (pHddCtx->tdls_mode == req_tdls_mode)
973 {
974 hddLog(VOS_TRACE_LEVEL_ERROR, "%s already in mode %d", __func__, config->tdls);
975 return -1;
976 }
977
978 /* copy the configuration only when given tdls mode is implicit trigger enable */
979 if (eTDLS_SUPPORT_ENABLED == req_tdls_mode)
980 {
Chilam Ng01120412013-02-19 18:32:21 -0800981 memcpy(&pHddTdlsCtx->threshold_config, config, sizeof(tdls_config_params_t));
982 }
Chilam NG571c65a2013-01-19 12:27:36 +0530983
Chilam Ng01120412013-02-19 18:32:21 -0800984 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
985 "iw set tdls params: %d %d %d %d %d %d %d %d %d %d",
986 config->tdls,
987 config->tx_period_t,
988 config->tx_packet_n,
989 config->discovery_period_t,
990 config->discovery_tries_n,
991 config->idle_timeout_t,
992 config->idle_packet_n,
993 config->rssi_hysteresis,
994 config->rssi_trigger_threshold,
995 config->rssi_teardown_threshold);
Chilam NG571c65a2013-01-19 12:27:36 +0530996
Hoonki Lee27511902013-03-14 18:19:06 -0700997 wlan_hdd_tdls_set_mode(pHddCtx, req_tdls_mode);
Chilam Ng01120412013-02-19 18:32:21 -0800998
Chilam NG571c65a2013-01-19 12:27:36 +0530999 return 0;
1000}
1001
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001002int wlan_hdd_tdls_set_sta_id(hdd_adapter_t *pAdapter, u8 *mac, u8 staId)
Kiran V1ccee932012-12-12 14:49:46 -08001003{
Hoonki Lee387663d2013-02-05 18:08:43 -08001004 hddTdlsPeer_t *curr_peer;
Kiran V1ccee932012-12-12 14:49:46 -08001005
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001006 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08001007 if (curr_peer == NULL)
Chilam NG571c65a2013-01-19 12:27:36 +05301008 return -1;
Chilam NG571c65a2013-01-19 12:27:36 +05301009
Hoonki Lee387663d2013-02-05 18:08:43 -08001010 curr_peer->staId = staId;
Chilam NG571c65a2013-01-19 12:27:36 +05301011
1012 return 0;
Kiran V1ccee932012-12-12 14:49:46 -08001013}
1014
Hoonki Lee387663d2013-02-05 18:08:43 -08001015/* if peerMac is found, then it returns pointer to hddTdlsPeer_t
1016 otherwise, it returns NULL
1017*/
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001018hddTdlsPeer_t *wlan_hdd_tdls_find_peer(hdd_adapter_t *pAdapter, u8 *mac)
Kiran V1ccee932012-12-12 14:49:46 -08001019{
Hoonki Lee387663d2013-02-05 18:08:43 -08001020 u8 key;
1021 struct list_head *pos;
1022 struct list_head *head;
1023 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001024 tdlsCtx_t *pHddTdlsCtx;
Hoonki Lee387663d2013-02-05 18:08:43 -08001025
Hoonki Lee387663d2013-02-05 18:08:43 -08001026
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001027 if (mutex_lock_interruptible(&tdls_lock))
Hoonki Lee387663d2013-02-05 18:08:43 -08001028 {
1029 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1030 "%s: unable to lock list", __func__);
1031 return NULL;
1032 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001033 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001034 if (NULL == pHddTdlsCtx)
1035 {
1036 mutex_unlock(&tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001037 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1038 "%s: pHddTdlsCtx is NULL", __func__);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001039 return NULL;
1040 }
1041
1042 key = wlan_hdd_tdls_hash_key(mac);
1043
1044 head = &pHddTdlsCtx->peer_list[key];
Hoonki Lee387663d2013-02-05 18:08:43 -08001045
1046 list_for_each(pos, head) {
1047 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
1048 if (!memcmp(mac, curr_peer->peerMac, 6)) {
1049 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1050 "findTdlsPeer: found staId %d", curr_peer->staId);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001051 mutex_unlock(&tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -08001052 return curr_peer;
1053 }
1054 }
1055
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001056 mutex_unlock(&tdls_lock);
Hoonki Lee387663d2013-02-05 18:08:43 -08001057 return NULL;
1058}
1059
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001060int wlan_hdd_tdls_reset_peer(hdd_adapter_t *pAdapter, u8 *mac)
Hoonki Lee387663d2013-02-05 18:08:43 -08001061{
Chilam Ng01120412013-02-19 18:32:21 -08001062 hdd_context_t *pHddCtx;
Chilam NG571c65a2013-01-19 12:27:36 +05301063 hddTdlsPeer_t *curr_peer;
Kiran V1ccee932012-12-12 14:49:46 -08001064
Chilam Ng01120412013-02-19 18:32:21 -08001065 pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
1066
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001067 curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
Hoonki Lee387663d2013-02-05 18:08:43 -08001068 if (curr_peer == NULL)
1069 return -1;
Chilam NG571c65a2013-01-19 12:27:36 +05301070
Gopichand Nakkala901e8922013-03-04 23:45:58 -08001071 curr_peer->link_status = eTDLS_LINK_IDLE;
Hoonki Leecdd8e962013-01-20 00:45:46 -08001072 curr_peer->staId = 0;
Hoonki Lee387663d2013-02-05 18:08:43 -08001073
Chilam Ng01120412013-02-19 18:32:21 -08001074 if(eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode) {
Chilam Nga75d8b62013-01-29 01:35:59 -08001075 vos_timer_stop( &curr_peer->peerIdleTimer );
Chilam Nga75d8b62013-01-29 01:35:59 -08001076 }
Hoonki Lee387663d2013-02-05 18:08:43 -08001077 return 0;
Hoonki Leecdd8e962013-01-20 00:45:46 -08001078}
1079
Hoonki Lee27511902013-03-14 18:19:06 -07001080static void wlan_tdd_tdls_reset_tx_rx(tdlsCtx_t *pHddTdlsCtx)
1081{
1082 int i;
1083 struct list_head *head;
1084 hddTdlsPeer_t *tmp;
1085 struct list_head *pos, *q;
1086
1087 if (mutex_lock_interruptible(&tdls_lock))
1088 {
1089 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1090 "%s: unable to lock list", __func__);
1091 return ;
1092 }
1093 if ( NULL == pHddTdlsCtx )
1094 {
1095 mutex_unlock(&tdls_lock);
1096 return ;
1097 }
1098
1099 for (i = 0; i < 256; i++) {
1100 head = &pHddTdlsCtx->peer_list[i];
1101 list_for_each_safe (pos, q, head) {
1102 tmp = list_entry(pos, hddTdlsPeer_t, node);
1103 tmp->tx_pkt = 0;
1104 tmp->rx_pkt = 0;
1105 }
1106 }
1107 mutex_unlock(&tdls_lock);
1108
1109 return ;
1110}
1111
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001112static tANI_S32 wlan_hdd_tdls_peer_reset_discovery_processed(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001113{
1114 int i;
1115 struct list_head *head;
1116 hddTdlsPeer_t *tmp;
1117 struct list_head *pos, *q;
1118
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001119 if (mutex_lock_interruptible(&tdls_lock))
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001120 {
1121 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1122 "%s: unable to lock list", __func__);
1123 return -1;
1124 }
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001125 if ( NULL == pHddTdlsCtx )
1126 {
1127 mutex_unlock(&tdls_lock);
1128 return -1;
1129 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001130
1131 pHddTdlsCtx->discovery_peer_cnt = 0;
1132
1133 for (i = 0; i < 256; i++) {
1134 head = &pHddTdlsCtx->peer_list[i];
1135 list_for_each_safe (pos, q, head) {
1136 tmp = list_entry(pos, hddTdlsPeer_t, node);
1137 tmp->discovery_processed = 0;
1138 }
1139 }
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001140 mutex_unlock(&tdls_lock);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001141
1142 return 0;
1143}
1144
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001145static tANI_S32 wlan_hdd_get_tdls_discovery_peer_cnt(tdlsCtx_t *pHddTdlsCtx)
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001146{
1147 int i;
1148 struct list_head *head;
1149 struct list_head *pos, *q;
1150 int discovery_peer_cnt=0;
1151 hddTdlsPeer_t *tmp;
1152
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001153 /*
1154 * This function expects the callers to acquire the Mutex.
1155 */
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001156
1157 for (i = 0; i < 256; i++) {
1158 head = &pHddTdlsCtx->peer_list[i];
1159 list_for_each_safe (pos, q, head) {
1160 tmp = list_entry(pos, hddTdlsPeer_t, node);
1161 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
Chilam Ng01120412013-02-19 18:32:21 -08001162 "%s, %d, " MAC_ADDRESS_STR, __func__, i,
1163 MAC_ADDR_ARRAY(tmp->peerMac));
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001164 discovery_peer_cnt++;
1165 }
1166 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001167 return discovery_peer_cnt;
1168}
1169
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001170tANI_U16 wlan_hdd_tdlsConnectedPeers(hdd_adapter_t *pAdapter)
Lee Hoonkic1262f22013-01-24 21:59:00 -08001171{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001172 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1173
1174 if (NULL == pHddCtx)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001175 return 0;
Lee Hoonkic1262f22013-01-24 21:59:00 -08001176
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001177 return pHddCtx->connected_peer_count;
Lee Hoonkic1262f22013-01-24 21:59:00 -08001178}
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001179
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001180int wlan_hdd_tdls_get_all_peers(hdd_adapter_t *pAdapter, char *buf, int buflen)
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001181{
1182 int i;
1183 int len, init_len;
Hoonki Lee387663d2013-02-05 18:08:43 -08001184 struct list_head *head;
1185 struct list_head *pos;
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001186 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001187 tdlsCtx_t *pHddTdlsCtx;
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001188
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001189
1190 init_len = buflen;
1191 len = snprintf(buf, buflen, "\n%-18s%-3s%-4s%-3s%-5s\n", "MAC", "Id", "cap", "up", "RSSI");
1192 buf += len;
1193 buflen -= len;
1194 /* 1234567890123456789012345678901234567 */
1195 len = snprintf(buf, buflen, "---------------------------------\n");
1196 buf += len;
1197 buflen -= len;
1198
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001199 if (mutex_lock_interruptible(&tdls_lock))
Gopichand Nakkala91b09262013-02-10 14:27:02 -08001200 {
1201 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1202 "%s: unable to lock list", __func__);
1203 return init_len-buflen;
1204 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001205 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001206 if (NULL == pHddTdlsCtx) {
1207 mutex_unlock(&tdls_lock);
1208 len = snprintf(buf, buflen, "TDLS not enabled\n");
1209 return len;
1210 }
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001211 for (i = 0; i < 256; i++) {
Hoonki Lee387663d2013-02-05 18:08:43 -08001212 head = &pHddTdlsCtx->peer_list[i];
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001213
Hoonki Lee387663d2013-02-05 18:08:43 -08001214 list_for_each(pos, head) {
1215 curr_peer= list_entry (pos, hddTdlsPeer_t, node);
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001216
Hoonki Lee387663d2013-02-05 18:08:43 -08001217 if (buflen < 32+1)
1218 break;
1219 len = snprintf(buf, buflen,
Chilam Ng01120412013-02-19 18:32:21 -08001220 MAC_ADDRESS_STR"%3d%4s%3s%5d\n",
1221 MAC_ADDR_ARRAY(curr_peer->peerMac),
Hoonki Lee387663d2013-02-05 18:08:43 -08001222 curr_peer->staId,
1223 (curr_peer->tdls_support == eTDLS_CAP_SUPPORTED) ? "Y":"N",
1224 (curr_peer->link_status == eTDLS_LINK_CONNECTED) ? "Y":"N",
1225 curr_peer->rssi);
1226 buf += len;
1227 buflen -= len;
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001228 }
1229 }
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001230 mutex_unlock(&tdls_lock);
Chilam Ng16a2a1c2013-01-29 01:27:29 -08001231 return init_len-buflen;
1232}
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001233
1234void wlan_hdd_tdls_connection_callback(hdd_adapter_t *pAdapter)
1235{
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08001236 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001237 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08001238
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001239 if (NULL == pHddTdlsCtx) return;
1240
1241 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
1242 "%s, update %d discover %d", __func__,
1243 pHddTdlsCtx->threshold_config.tx_period_t,
1244 pHddTdlsCtx->threshold_config.discovery_period_t);
1245
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08001246 if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode)
1247 {
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001248 wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001249 pHddTdlsCtx->discovery_sent_cnt = 0;
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001250
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001251#ifdef FEATURE_WLAN_TDLS_INTERNAL
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08001252 vos_timer_start(&pHddTdlsCtx->peerDiscoverTimer,
1253 pHddTdlsCtx->threshold_config.discovery_period_t);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001254#endif
Gopichand Nakkala9d76a9b2013-02-28 15:38:37 -08001255 vos_timer_start(&pHddTdlsCtx->peerUpdateTimer,
1256 pHddTdlsCtx->threshold_config.tx_period_t);
1257 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001258
1259}
1260
1261void wlan_hdd_tdls_disconnection_callback(hdd_adapter_t *pAdapter)
1262{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001263 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001264
1265 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,"%s", __func__);
1266
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001267 if (mutex_lock_interruptible(&tdls_lock))
1268 {
1269 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1270 "%s: unable to lock list", __func__);
1271 return;
1272 }
1273 if (NULL == pHddTdlsCtx)
1274 {
1275 mutex_unlock(&tdls_lock);
1276 return;
1277 }
1278
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001279 wlan_hdd_tdls_timers_stop(pHddTdlsCtx);
1280 wlan_hdd_tdls_free_list(pHddTdlsCtx);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001281
1282 mutex_unlock(&tdls_lock);
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001283}
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001284
1285void wlan_hdd_tdls_mgmt_completion_callback(hdd_adapter_t *pAdapter, tANI_U32 statusCode)
1286{
1287 pAdapter->mgmtTxCompletionStatus = statusCode;
1288 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,"%s: Mgmt TX Completion %d",
1289 __func__, statusCode);
1290 complete(&pAdapter->tdls_mgmt_comp);
1291}
1292
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001293void wlan_hdd_tdls_increment_peer_count(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001294{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001295 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001296
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001297 if (NULL == pHddCtx) return;
1298
1299 pHddCtx->connected_peer_count++;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001300}
1301
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001302void wlan_hdd_tdls_decrement_peer_count(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001303{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001304 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001305
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001306 if (NULL == pHddCtx) return;
1307
1308 if (pHddCtx->connected_peer_count)
1309 pHddCtx->connected_peer_count--;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001310}
1311
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001312void wlan_hdd_tdls_check_bmps(hdd_adapter_t *pAdapter)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001313{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001314 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001315 tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001316
Gopichand Nakkala16c02842013-03-18 12:31:35 -07001317 if ((NULL == pHddCtx) || (NULL == pHddTdlsCtx)) return;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001318
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001319 if ((0 == pHddCtx->connected_peer_count) &&
1320 (0 == pHddTdlsCtx->discovery_sent_cnt))
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001321 {
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001322 if (FALSE == sme_IsPmcBmps(WLAN_HDD_GET_HAL_CTX(pAdapter)))
1323 {
1324 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
1325 "No TDLS peer connected/discovery sent. Enable BMPS");
1326 hdd_enable_bmps_imps(pHddCtx);
1327 }
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001328 }
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001329 else
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001330 {
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001331 if (TRUE == sme_IsPmcBmps(WLAN_HDD_GET_HAL_CTX(pAdapter)))
1332 {
1333 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,"TDLS peer connected. Disable BMPS");
1334 hdd_disable_bmps_imps(pHddCtx, WLAN_HDD_INFRA_STATION);
1335 }
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001336 }
1337 return;
1338}
1339
1340/* return TRUE if TDLS is ongoing
1341 * mac - if NULL check for all the peer list, otherwise, skip this mac when skip_self is TRUE
1342 * skip_self - if TRUE, skip this mac. otherwise, check all the peer list. if
1343 mac is NULL, this argument is ignored, and check for all the peer list.
1344 */
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001345u8 wlan_hdd_tdls_is_progress(hdd_adapter_t *pAdapter, u8 *mac, u8 skip_self)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001346{
1347 int i;
1348 struct list_head *head;
1349 hddTdlsPeer_t *curr_peer;
1350 struct list_head *pos;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001351 tdlsCtx_t *pHddTdlsCtx;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001352
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001353 if (mutex_lock_interruptible(&tdls_lock))
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001354 {
1355 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1356 "%s: unable to lock list", __func__);
1357 return FALSE;
1358 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08001359 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001360 if (NULL == pHddTdlsCtx)
1361 {
1362 mutex_unlock(&tdls_lock);
1363 return FALSE;
1364 }
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001365
1366 for (i = 0; i < 256; i++) {
1367 head = &pHddTdlsCtx->peer_list[i];
1368 list_for_each(pos, head) {
1369 curr_peer = list_entry (pos, hddTdlsPeer_t, node);
1370 if (skip_self && mac && !memcmp(mac, curr_peer->peerMac, 6)) {
1371 continue;
1372 }
1373 else
1374 {
Gopichand Nakkala8b00c632013-03-08 19:47:52 -08001375 if (eTDLS_LINK_CONNECTING == curr_peer->link_status)
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001376 {
Gopichand Nakkalac87400e2013-03-13 18:51:00 -07001377 VOS_TRACE(VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
1378 "%s:" MAC_ADDRESS_STR "is in eTDLS_LINK_CONNECTING",
1379 __func__, MAC_ADDR_ARRAY(curr_peer->peerMac));
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001380 mutex_unlock(&tdls_lock);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001381 return TRUE;
1382 }
1383 }
1384 }
1385 }
1386
Gopichand Nakkalaeb69b602013-02-27 11:40:31 -08001387 mutex_unlock(&tdls_lock);
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001388 return FALSE;
1389}
Hoonki Lee27511902013-03-14 18:19:06 -07001390
1391static void wlan_hdd_tdls_implicit_disable(tdlsCtx_t *pHddTdlsCtx)
1392{
1393 if (mutex_lock_interruptible(&tdls_lock))
1394 {
1395 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1396 "%s: unable to lock list", __func__);
1397 return;
1398 }
1399
1400 wlan_hdd_tdls_timers_stop(pHddTdlsCtx);
1401
1402 mutex_unlock(&tdls_lock);
1403}
1404
1405static void wlan_hdd_tdls_implicit_enable(tdlsCtx_t *pHddTdlsCtx)
1406{
1407 wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001408 pHddTdlsCtx->discovery_sent_cnt = 0;
Hoonki Lee27511902013-03-14 18:19:06 -07001409 wlan_tdd_tdls_reset_tx_rx(pHddTdlsCtx);
1410
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001411#ifdef FEATURE_WLAN_TDLS_INTERNAL
Hoonki Lee27511902013-03-14 18:19:06 -07001412 vos_timer_start(&pHddTdlsCtx->peerDiscoverTimer,
1413 pHddTdlsCtx->threshold_config.discovery_period_t);
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001414#endif
Hoonki Lee27511902013-03-14 18:19:06 -07001415
1416 vos_timer_start(&pHddTdlsCtx->peerUpdateTimer,
1417 pHddTdlsCtx->threshold_config.tx_period_t);
1418}
1419
1420void wlan_hdd_tdls_set_mode(hdd_context_t *pHddCtx, eTDLSSupportMode tdls_mode)
1421{
1422 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
1423 VOS_STATUS status;
1424 hdd_adapter_t *pAdapter;
1425 tdlsCtx_t *pHddTdlsCtx;
1426
1427 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,"%s mode %d", __func__, (int)tdls_mode);
1428
1429 status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
1430
1431 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
1432 {
1433 pAdapter = pAdapterNode->pAdapter;
1434 pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
1435 if (NULL != pHddTdlsCtx)
1436 {
1437 if(eTDLS_SUPPORT_ENABLED == tdls_mode)
1438 wlan_hdd_tdls_implicit_enable(pHddTdlsCtx);
1439 else if((eTDLS_SUPPORT_DISABLED == tdls_mode) ||
1440 (eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == tdls_mode))
1441 wlan_hdd_tdls_implicit_disable(pHddTdlsCtx);
1442 }
1443 status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
1444 pAdapterNode = pNext;
1445 }
1446 pHddCtx->tdls_mode_last = pHddCtx->tdls_mode;
1447 pHddCtx->tdls_mode = tdls_mode;
1448}
Gopichand Nakkala75e7b282013-03-15 18:37:13 -07001449
1450void wlan_hdd_tdls_pre_setup(tdlsCtx_t *pHddTdlsCtx,
1451 hddTdlsPeer_t *curr_peer)
1452{
1453 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter);
1454
1455 if (TRUE == sme_IsPmcBmps(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter)))
1456 {
1457 hdd_disable_bmps_imps(pHddCtx, WLAN_HDD_INFRA_STATION);
1458 }
1459 curr_peer->link_status = eTDLS_LINK_DISCOVERING;
1460 sme_SendTdlsMgmtFrame(WLAN_HDD_GET_HAL_CTX(pHddTdlsCtx->pAdapter),
1461 pHddTdlsCtx->pAdapter->sessionId,
1462 curr_peer->peerMac,
1463 WLAN_TDLS_DISCOVERY_REQUEST,
1464 1, 0, NULL, 0, 0);
1465 pHddTdlsCtx->discovery_sent_cnt++;
1466 VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL, "%s: discovery count %lu",
1467 __func__, pHddTdlsCtx->discovery_sent_cnt);
1468 vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
1469 vos_timer_start(&pHddTdlsCtx->peerDiscoveryTimeoutTimer, TDLS_DISCOVERY_TIMEOUT);
1470
1471 return;
1472}