| OLD | NEW |
| 1 //------------------------------------------------------------------------------ | 1 //------------------------------------------------------------------------------ |
| 2 // <copyright file="wlan_node.c" company="Atheros"> | 2 // <copyright file="wlan_node.c" company="Atheros"> |
| 3 // Copyright (c) 2004-2008 Atheros Corporation. All rights reserved. | 3 // Copyright (c) 2004-2010 Atheros Corporation. All rights reserved. |
| 4 // | 4 // |
| 5 // This program is free software; you can redistribute it and/or modify | |
| 6 // it under the terms of the GNU General Public License version 2 as | |
| 7 // published by the Free Software Foundation; | |
| 8 // | 5 // |
| 9 // Software distributed under the License is distributed on an "AS | 6 // Permission to use, copy, modify, and/or distribute this software for any |
| 10 // IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | 7 // purpose with or without fee is hereby granted, provided that the above |
| 11 // implied. See the License for the specific language governing | 8 // copyright notice and this permission notice appear in all copies. |
| 12 // rights and limitations under the License. | 9 // |
| 10 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| 11 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| 12 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
| 13 // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| 14 // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| 15 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| 16 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| 13 // | 17 // |
| 14 // | 18 // |
| 15 //------------------------------------------------------------------------------ | 19 //------------------------------------------------------------------------------ |
| 16 //============================================================================== | 20 //============================================================================== |
| 17 // IEEE 802.11 node handling support. | 21 // IEEE 802.11 node handling support. |
| 18 // | 22 // |
| 19 // Author(s): ="Atheros" | 23 // Author(s): ="Atheros" |
| 20 //============================================================================== | 24 //============================================================================== |
| 21 #include <a_config.h> | 25 #include <a_config.h> |
| 22 #include <athdefs.h> | 26 #include <athdefs.h> |
| 23 #include <a_types.h> | 27 #include <a_types.h> |
| 24 #include <a_osapi.h> | 28 #include <a_osapi.h> |
| 25 #define ATH_MODULE_NAME wlan | 29 #define ATH_MODULE_NAME wlan |
| 26 #include <a_debug.h> | 30 #include <a_debug.h> |
| 27 #include "htc.h" | 31 #include "htc.h" |
| 28 #include "htc_api.h" | 32 #include "htc_api.h" |
| 29 #include <wmi.h> | 33 #include <wmi.h> |
| 30 #include <ieee80211.h> | 34 #include <ieee80211.h> |
| 31 #include <wlan_api.h> | 35 #include <wlan_api.h> |
| 32 #include <wmi_api.h> | 36 #include <wmi_api.h> |
| 33 #include <ieee80211_node.h> | 37 #include <ieee80211_node.h> |
| 34 | 38 |
| 35 #define ATH_DEBUG_WLAN ATH_DEBUG_MAKE_MODULE_MASK(0) | 39 #define ATH_DEBUG_WLAN ATH_DEBUG_MAKE_MODULE_MASK(0) |
| 36 | 40 |
| 37 #ifdef DEBUG | 41 #ifdef ATH_DEBUG_MODULE |
| 38 | 42 |
| 39 static ATH_DEBUG_MASK_DESCRIPTION wlan_debug_desc[] = { | 43 static ATH_DEBUG_MASK_DESCRIPTION wlan_debug_desc[] = { |
| 40 { ATH_DEBUG_WLAN , "General WLAN Node Tracing"}, | 44 { ATH_DEBUG_WLAN , "General WLAN Node Tracing"}, |
| 41 }; | 45 }; |
| 42 | 46 |
| 43 ATH_DEBUG_INSTANTIATE_MODULE_VAR(wlan, | 47 ATH_DEBUG_INSTANTIATE_MODULE_VAR(wlan, |
| 44 "wlan", | 48 "wlan", |
| 45 "WLAN Node Management", | 49 "WLAN Node Management", |
| 46 ATH_DEBUG_MASK_DEFAULTS, | 50 ATH_DEBUG_MASK_DEFAULTS, |
| 47 ATH_DEBUG_DESCRIPTION_COUNT(wlan_debug_desc), | 51 ATH_DEBUG_DESCRIPTION_COUNT(wlan_debug_desc), |
| 48 wlan_debug_desc); | 52 wlan_debug_desc); |
| 49 | 53 |
| 50 #endif | 54 #endif |
| 51 | 55 |
| 56 #ifdef THREAD_X |
| 52 static void wlan_node_timeout(A_ATH_TIMER arg); | 57 static void wlan_node_timeout(A_ATH_TIMER arg); |
| 58 #endif |
| 53 | 59 |
| 54 static bss_t * _ieee80211_find_node (struct ieee80211_node_table *nt, | 60 static bss_t * _ieee80211_find_node (struct ieee80211_node_table *nt, |
| 55 const A_UINT8 *macaddr); | 61 const A_UINT8 *macaddr); |
| 56 | 62 |
| 57 bss_t * | 63 bss_t * |
| 58 wlan_node_alloc(struct ieee80211_node_table *nt, int wh_size) | 64 wlan_node_alloc(struct ieee80211_node_table *nt, int wh_size) |
| 59 { | 65 { |
| 60 bss_t *ni; | 66 bss_t *ni; |
| 61 | 67 |
| 62 ni = A_MALLOC_NOWAIT(sizeof(bss_t)); | 68 ni = A_MALLOC_NOWAIT(sizeof(bss_t)); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 int hash; | 116 int hash; |
| 111 A_UINT32 timeoutValue = 0; | 117 A_UINT32 timeoutValue = 0; |
| 112 | 118 |
| 113 A_MEMCPY(ni->ni_macaddr, macaddr, IEEE80211_ADDR_LEN); | 119 A_MEMCPY(ni->ni_macaddr, macaddr, IEEE80211_ADDR_LEN); |
| 114 hash = IEEE80211_NODE_HASH (macaddr); | 120 hash = IEEE80211_NODE_HASH (macaddr); |
| 115 ieee80211_node_initref (ni); /* mark referenced */ | 121 ieee80211_node_initref (ni); /* mark referenced */ |
| 116 | 122 |
| 117 timeoutValue = nt->nt_nodeAge; | 123 timeoutValue = nt->nt_nodeAge; |
| 118 | 124 |
| 119 ni->ni_tstamp = A_GET_MS (timeoutValue); | 125 ni->ni_tstamp = A_GET_MS (timeoutValue); |
| 126 ni->ni_actcnt = WLAN_NODE_INACT_CNT; |
| 120 | 127 |
| 121 IEEE80211_NODE_LOCK_BH(nt); | 128 IEEE80211_NODE_LOCK_BH(nt); |
| 122 | 129 |
| 123 /* Insert at the end of the node list */ | 130 /* Insert at the end of the node list */ |
| 124 ni->ni_list_next = NULL; | 131 ni->ni_list_next = NULL; |
| 125 ni->ni_list_prev = nt->nt_node_last; | 132 ni->ni_list_prev = nt->nt_node_last; |
| 126 if(nt->nt_node_last != NULL) | 133 if(nt->nt_node_last != NULL) |
| 127 { | 134 { |
| 128 nt->nt_node_last->ni_list_next = ni; | 135 nt->nt_node_last->ni_list_next = ni; |
| 129 } | 136 } |
| 130 nt->nt_node_last = ni; | 137 nt->nt_node_last = ni; |
| 131 if(nt->nt_node_first == NULL) | 138 if(nt->nt_node_first == NULL) |
| 132 { | 139 { |
| 133 nt->nt_node_first = ni; | 140 nt->nt_node_first = ni; |
| 134 } | 141 } |
| 135 | 142 |
| 136 /* Insert into the hash list i.e. the bucket */ | 143 /* Insert into the hash list i.e. the bucket */ |
| 137 if((ni->ni_hash_next = nt->nt_hash[hash]) != NULL) | 144 if((ni->ni_hash_next = nt->nt_hash[hash]) != NULL) |
| 138 { | 145 { |
| 139 nt->nt_hash[hash]->ni_hash_prev = ni; | 146 nt->nt_hash[hash]->ni_hash_prev = ni; |
| 140 } | 147 } |
| 141 ni->ni_hash_prev = NULL; | 148 ni->ni_hash_prev = NULL; |
| 142 nt->nt_hash[hash] = ni; | 149 nt->nt_hash[hash] = ni; |
| 143 | 150 |
| 151 #ifdef THREAD_X |
| 144 if (!nt->isTimerArmed) { | 152 if (!nt->isTimerArmed) { |
| 145 A_TIMEOUT_MS(&nt->nt_inact_timer, timeoutValue, 0); | 153 A_TIMEOUT_MS(&nt->nt_inact_timer, timeoutValue, 0); |
| 146 nt->isTimerArmed = TRUE; | 154 nt->isTimerArmed = TRUE; |
| 147 } | 155 } |
| 156 #endif |
| 148 | 157 |
| 149 IEEE80211_NODE_UNLOCK_BH(nt); | 158 IEEE80211_NODE_UNLOCK_BH(nt); |
| 150 } | 159 } |
| 151 | 160 |
| 152 static bss_t * | 161 static bss_t * |
| 153 _ieee80211_find_node(struct ieee80211_node_table *nt, | 162 _ieee80211_find_node(struct ieee80211_node_table *nt, |
| 154 const A_UINT8 *macaddr) | 163 const A_UINT8 *macaddr) |
| 155 { | 164 { |
| 156 bss_t *ni; | 165 bss_t *ni; |
| 157 int hash; | 166 int hash; |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 } | 279 } |
| 271 | 280 |
| 272 /* | 281 /* |
| 273 * Node table support. | 282 * Node table support. |
| 274 */ | 283 */ |
| 275 void | 284 void |
| 276 wlan_node_table_init(void *wmip, struct ieee80211_node_table *nt) | 285 wlan_node_table_init(void *wmip, struct ieee80211_node_table *nt) |
| 277 { | 286 { |
| 278 int i; | 287 int i; |
| 279 | 288 |
| 280 AR_DEBUG_PRINTF(ATH_DEBUG_WLAN, ("node table = 0x%x\n", (A_UINT32)nt)); | 289 AR_DEBUG_PRINTF(ATH_DEBUG_WLAN, ("node table = 0x%lx\n", (unsigned long)nt))
; |
| 281 IEEE80211_NODE_LOCK_INIT(nt); | 290 IEEE80211_NODE_LOCK_INIT(nt); |
| 282 | 291 |
| 283 A_REGISTER_MODULE_DEBUG_INFO(wlan); | 292 A_REGISTER_MODULE_DEBUG_INFO(wlan); |
| 284 | 293 |
| 285 nt->nt_node_first = nt->nt_node_last = NULL; | 294 nt->nt_node_first = nt->nt_node_last = NULL; |
| 286 for(i = 0; i < IEEE80211_NODE_HASHSIZE; i++) | 295 for(i = 0; i < IEEE80211_NODE_HASHSIZE; i++) |
| 287 { | 296 { |
| 288 nt->nt_hash[i] = NULL; | 297 nt->nt_hash[i] = NULL; |
| 289 } | 298 } |
| 290 | 299 |
| 300 #ifdef THREAD_X |
| 291 A_INIT_TIMER(&nt->nt_inact_timer, wlan_node_timeout, nt); | 301 A_INIT_TIMER(&nt->nt_inact_timer, wlan_node_timeout, nt); |
| 292 nt->isTimerArmed = FALSE; | 302 nt->isTimerArmed = FALSE; |
| 303 #endif |
| 293 nt->nt_wmip = wmip; | 304 nt->nt_wmip = wmip; |
| 294 nt->nt_nodeAge = WLAN_NODE_INACT_TIMEOUT_MSEC; | 305 nt->nt_nodeAge = WLAN_NODE_INACT_TIMEOUT_MSEC; |
| 295 | 306 |
| 296 // | 307 // |
| 297 // nt_scangen never initialized before and during suspend/resume of winmobil
e, | 308 // nt_scangen never initialized before and during suspend/resume of winmobil
e, |
| 298 // that some junk has been stored in this, due to this scan list didn't prop
erly updated | 309 // that some junk has been stored in this, due to this scan list didn't prop
erly updated |
| 299 // | 310 // |
| 300 nt->nt_scangen = 0; | 311 nt->nt_scangen = 0; |
| 301 | 312 |
| 302 #ifdef OS_ROAM_MANAGEMENT | 313 #ifdef OS_ROAM_MANAGEMENT |
| 303 nt->nt_si_gen = 0; | 314 nt->nt_si_gen = 0; |
| 304 #endif | 315 #endif |
| 305 } | 316 } |
| 306 | 317 |
| 307 void | 318 void |
| 308 wlan_set_nodeage(struct ieee80211_node_table *nt, A_UINT32 nodeAge) | 319 wlan_set_nodeage(struct ieee80211_node_table *nt, A_UINT32 nodeAge) |
| 309 { | 320 { |
| 310 nt->nt_nodeAge = nodeAge; | 321 nt->nt_nodeAge = nodeAge; |
| 311 return; | 322 return; |
| 312 } | 323 } |
| 324 void |
| 325 wlan_refresh_inactive_nodes (struct ieee80211_node_table *nt) |
| 326 { |
| 327 #ifdef THREAD_X |
| 328 bss_t *bss, *nextBss; |
| 329 A_UINT8 myBssid[IEEE80211_ADDR_LEN], reArmTimer = FALSE; |
| 330 |
| 331 wmi_get_current_bssid(nt->nt_wmip, myBssid); |
| 332 |
| 333 bss = nt->nt_node_first; |
| 334 while (bss != NULL) |
| 335 { |
| 336 nextBss = bss->ni_list_next; |
| 337 if (A_MEMCMP(myBssid, bss->ni_macaddr, sizeof(myBssid)) != 0) |
| 338 { |
| 339 /* |
| 340 * free up all but the current bss - if set |
| 341 */ |
| 342 wlan_node_reclaim(nt, bss); |
| 343 |
| 344 } |
| 345 bss = nextBss; |
| 346 } |
| 347 #else |
| 348 bss_t *bss, *nextBss; |
| 349 A_UINT8 myBssid[IEEE80211_ADDR_LEN]; |
| 350 A_UINT32 timeoutValue = 0; |
| 351 A_UINT32 now = A_GET_MS(0); |
| 352 timeoutValue = nt->nt_nodeAge; |
| 353 |
| 354 wmi_get_current_bssid(nt->nt_wmip, myBssid); |
| 355 |
| 356 bss = nt->nt_node_first; |
| 357 while (bss != NULL) |
| 358 { |
| 359 nextBss = bss->ni_list_next; |
| 360 if (A_MEMCMP(myBssid, bss->ni_macaddr, sizeof(myBssid)) != 0) |
| 361 { |
| 362 |
| 363 if (bss->ni_tstamp <= now || --bss->ni_actcnt == 0) |
| 364 { |
| 365 /* |
| 366 * free up all but the current bss - if set |
| 367 */ |
| 368 wlan_node_reclaim(nt, bss); |
| 369 } |
| 370 } |
| 371 bss = nextBss; |
| 372 } |
| 373 #endif |
| 374 } |
| 375 |
| 376 #ifdef THREAD_X |
| 313 static void | 377 static void |
| 314 wlan_node_timeout (A_ATH_TIMER arg) | 378 wlan_node_timeout (A_ATH_TIMER arg) |
| 315 { | 379 { |
| 316 struct ieee80211_node_table *nt = (struct ieee80211_node_table *)arg; | 380 struct ieee80211_node_table *nt = (struct ieee80211_node_table *)arg; |
| 317 bss_t *bss, *nextBss; | 381 bss_t *bss, *nextBss; |
| 318 A_UINT8 myBssid[IEEE80211_ADDR_LEN], reArmTimer = FALSE; | 382 A_UINT8 myBssid[IEEE80211_ADDR_LEN], reArmTimer = FALSE; |
| 319 A_UINT32 timeoutValue = 0; | 383 A_UINT32 timeoutValue = 0; |
| 320 | 384 |
| 321 timeoutValue = nt->nt_nodeAge; | 385 timeoutValue = nt->nt_nodeAge; |
| 322 | 386 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 346 } | 410 } |
| 347 } | 411 } |
| 348 bss = nextBss; | 412 bss = nextBss; |
| 349 } | 413 } |
| 350 | 414 |
| 351 if (reArmTimer) | 415 if (reArmTimer) |
| 352 A_TIMEOUT_MS (&nt->nt_inact_timer, timeoutValue, 0); | 416 A_TIMEOUT_MS (&nt->nt_inact_timer, timeoutValue, 0); |
| 353 | 417 |
| 354 nt->isTimerArmed = reArmTimer; | 418 nt->isTimerArmed = reArmTimer; |
| 355 } | 419 } |
| 420 #endif |
| 356 | 421 |
| 357 void | 422 void |
| 358 wlan_node_table_cleanup(struct ieee80211_node_table *nt) | 423 wlan_node_table_cleanup(struct ieee80211_node_table *nt) |
| 359 { | 424 { |
| 425 #ifdef THREAD_X |
| 360 A_UNTIMEOUT(&nt->nt_inact_timer); | 426 A_UNTIMEOUT(&nt->nt_inact_timer); |
| 361 A_DELETE_TIMER(&nt->nt_inact_timer); | 427 A_DELETE_TIMER(&nt->nt_inact_timer); |
| 428 #endif |
| 362 wlan_free_allnodes(nt); | 429 wlan_free_allnodes(nt); |
| 363 IEEE80211_NODE_LOCK_DESTROY(nt); | 430 IEEE80211_NODE_LOCK_DESTROY(nt); |
| 364 } | 431 } |
| 365 | 432 |
| 366 bss_t * | 433 bss_t * |
| 367 wlan_find_Ssidnode (struct ieee80211_node_table *nt, A_UCHAR *pSsid, | 434 wlan_find_Ssidnode (struct ieee80211_node_table *nt, A_UCHAR *pSsid, |
| 368 A_UINT32 ssidLength, A_BOOL bIsWPA2, A_BOOL bMatchSSID) | 435 A_UINT32 ssidLength, A_BOOL bIsWPA2, A_BOOL bMatchSSID) |
| 369 { | 436 { |
| 370 bss_t *ni = NULL; | 437 bss_t *ni = NULL; |
| 371 A_UCHAR *pIESsid = NULL; | 438 A_UCHAR *pIESsid = NULL; |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 560 } | 627 } |
| 561 } | 628 } |
| 562 } | 629 } |
| 563 } | 630 } |
| 564 | 631 |
| 565 IEEE80211_NODE_UNLOCK (nt); | 632 IEEE80211_NODE_UNLOCK (nt); |
| 566 | 633 |
| 567 return best_ni; | 634 return best_ni; |
| 568 } | 635 } |
| 569 | 636 |
| OLD | NEW |