1 // SPDX-License-Identifier: GPL-2.0 2 /****************************************************************************** 3 * 4 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. 5 * 6 ******************************************************************************/ 7 #include <linux/etherdevice.h> 8 #include <drv_types.h> 9 #include <hal_btcoex.h> 10 #include <linux/jiffies.h> 11 12 static void _dynamic_check_timer_handler(struct timer_list *t) 13 { 14 struct adapter *adapter = 15 timer_container_of(adapter, t, mlmepriv.dynamic_chk_timer); 16 17 rtw_dynamic_check_timer_handler(adapter); 18 19 _set_timer(&adapter->mlmepriv.dynamic_chk_timer, 2000); 20 } 21 22 static void _rtw_set_scan_deny_timer_hdl(struct timer_list *t) 23 { 24 struct adapter *adapter = 25 timer_container_of(adapter, t, mlmepriv.set_scan_deny_timer); 26 27 rtw_clear_scan_deny(adapter); 28 } 29 30 static void rtw_init_mlme_timer(struct adapter *padapter) 31 { 32 struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 33 34 timer_setup(&pmlmepriv->assoc_timer, _rtw_join_timeout_handler, 0); 35 timer_setup(&pmlmepriv->scan_to_timer, rtw_scan_timeout_handler, 0); 36 timer_setup(&pmlmepriv->dynamic_chk_timer, 37 _dynamic_check_timer_handler, 0); 38 timer_setup(&pmlmepriv->set_scan_deny_timer, 39 _rtw_set_scan_deny_timer_hdl, 0); 40 } 41 42 int rtw_init_mlme_priv(struct adapter *padapter) 43 { 44 int i; 45 u8 *pbuf; 46 struct wlan_network *pnetwork; 47 struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 48 int res = _SUCCESS; 49 50 pmlmepriv->nic_hdl = (u8 *)padapter; 51 52 pmlmepriv->pscanned = NULL; 53 pmlmepriv->fw_state = WIFI_STATION_STATE; /* Must sync with rtw_wdev_alloc() */ 54 pmlmepriv->cur_network.network.infrastructure_mode = Ndis802_11AutoUnknown; 55 pmlmepriv->scan_mode = SCAN_ACTIVE;/* 1: active, 0: passive. Maybe someday we should rename this varable to "active_mode" (Jeff) */ 56 57 spin_lock_init(&pmlmepriv->lock); 58 INIT_LIST_HEAD(&pmlmepriv->free_bss_pool.queue); 59 spin_lock_init(&pmlmepriv->free_bss_pool.lock); 60 INIT_LIST_HEAD(&pmlmepriv->scanned_queue.queue); 61 spin_lock_init(&pmlmepriv->scanned_queue.lock); 62 63 memset(&pmlmepriv->assoc_ssid, 0, sizeof(struct ndis_802_11_ssid)); 64 65 pbuf = vzalloc(array_size(MAX_BSS_CNT, sizeof(struct wlan_network))); 66 67 if (!pbuf) { 68 res = _FAIL; 69 goto exit; 70 } 71 pmlmepriv->free_bss_buf = pbuf; 72 73 pnetwork = (struct wlan_network *)pbuf; 74 75 for (i = 0; i < MAX_BSS_CNT; i++) { 76 INIT_LIST_HEAD(&pnetwork->list); 77 78 list_add_tail(&pnetwork->list, &pmlmepriv->free_bss_pool.queue); 79 80 pnetwork++; 81 } 82 83 /* allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf */ 84 85 rtw_clear_scan_deny(padapter); 86 87 #define RTW_ROAM_SCAN_RESULT_EXP_MS 5000 88 #define RTW_ROAM_RSSI_DIFF_TH 10 89 #define RTW_ROAM_SCAN_INTERVAL_MS 10000 90 91 pmlmepriv->roam_flags = 0 92 | RTW_ROAM_ON_EXPIRED 93 | RTW_ROAM_ON_RESUME 94 ; 95 96 pmlmepriv->roam_scanr_exp_ms = RTW_ROAM_SCAN_RESULT_EXP_MS; 97 pmlmepriv->roam_rssi_diff_th = RTW_ROAM_RSSI_DIFF_TH; 98 pmlmepriv->roam_scan_int_ms = RTW_ROAM_SCAN_INTERVAL_MS; 99 100 rtw_init_mlme_timer(padapter); 101 102 exit: 103 104 return res; 105 } 106 107 static void rtw_free_mlme_ie_data(u8 **ppie, u32 *plen) 108 { 109 if (*ppie) { 110 kfree(*ppie); 111 *plen = 0; 112 *ppie = NULL; 113 } 114 } 115 116 void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv) 117 { 118 rtw_buf_free(&pmlmepriv->assoc_req, &pmlmepriv->assoc_req_len); 119 rtw_buf_free(&pmlmepriv->assoc_rsp, &pmlmepriv->assoc_rsp_len); 120 rtw_free_mlme_ie_data(&pmlmepriv->wps_beacon_ie, &pmlmepriv->wps_beacon_ie_len); 121 rtw_free_mlme_ie_data(&pmlmepriv->wps_probe_req_ie, &pmlmepriv->wps_probe_req_ie_len); 122 rtw_free_mlme_ie_data(&pmlmepriv->wps_probe_resp_ie, &pmlmepriv->wps_probe_resp_ie_len); 123 rtw_free_mlme_ie_data(&pmlmepriv->wps_assoc_resp_ie, &pmlmepriv->wps_assoc_resp_ie_len); 124 125 rtw_free_mlme_ie_data(&pmlmepriv->p2p_beacon_ie, &pmlmepriv->p2p_beacon_ie_len); 126 rtw_free_mlme_ie_data(&pmlmepriv->p2p_probe_req_ie, &pmlmepriv->p2p_probe_req_ie_len); 127 rtw_free_mlme_ie_data(&pmlmepriv->p2p_probe_resp_ie, &pmlmepriv->p2p_probe_resp_ie_len); 128 rtw_free_mlme_ie_data(&pmlmepriv->p2p_go_probe_resp_ie, &pmlmepriv->p2p_go_probe_resp_ie_len); 129 rtw_free_mlme_ie_data(&pmlmepriv->p2p_assoc_req_ie, &pmlmepriv->p2p_assoc_req_ie_len); 130 } 131 132 void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv) 133 { 134 if (pmlmepriv) { 135 rtw_free_mlme_priv_ie_data(pmlmepriv); 136 vfree(pmlmepriv->free_bss_buf); 137 } 138 } 139 140 struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv) 141 { 142 struct wlan_network *pnetwork; 143 struct __queue *free_queue = &pmlmepriv->free_bss_pool; 144 struct list_head *plist = NULL; 145 146 spin_lock_bh(&free_queue->lock); 147 148 if (list_empty(&free_queue->queue)) { 149 pnetwork = NULL; 150 goto exit; 151 } 152 plist = get_next(&free_queue->queue); 153 154 pnetwork = container_of(plist, struct wlan_network, list); 155 156 list_del_init(&pnetwork->list); 157 158 pnetwork->network_type = 0; 159 pnetwork->fixed = false; 160 pnetwork->last_scanned = jiffies; 161 pnetwork->aid = 0; 162 pnetwork->join_res = 0; 163 164 exit: 165 spin_unlock_bh(&free_queue->lock); 166 167 return pnetwork; 168 } 169 170 void _rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 isfreeall) 171 { 172 unsigned int delta_time; 173 u32 lifetime = SCANQUEUE_LIFETIME; 174 struct __queue *free_queue = &pmlmepriv->free_bss_pool; 175 176 if (!pnetwork) 177 return; 178 179 if (pnetwork->fixed) 180 return; 181 182 if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) || 183 check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) 184 lifetime = 1; 185 186 if (!isfreeall) { 187 delta_time = jiffies_to_msecs(jiffies - pnetwork->last_scanned); 188 if (delta_time < lifetime)/* unit:msec */ 189 return; 190 } 191 192 spin_lock_bh(&free_queue->lock); 193 194 list_del_init(&pnetwork->list); 195 196 list_add_tail(&pnetwork->list, &free_queue->queue); 197 198 spin_unlock_bh(&free_queue->lock); 199 } 200 201 void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork) 202 { 203 struct __queue *free_queue = &pmlmepriv->free_bss_pool; 204 205 if (!pnetwork) 206 return; 207 208 if (pnetwork->fixed) 209 return; 210 211 list_del_init(&pnetwork->list); 212 213 list_add_tail(&pnetwork->list, get_list_head(free_queue)); 214 } 215 216 /* 217 * return the wlan_network with the matching addr 218 * 219 * Shall be called under atomic context... to avoid possible racing condition... 220 */ 221 struct wlan_network *_rtw_find_network(struct __queue *scanned_queue, u8 *addr) 222 { 223 struct list_head *phead, *plist; 224 struct wlan_network *pnetwork = NULL; 225 226 if (is_zero_ether_addr(addr)) { 227 pnetwork = NULL; 228 goto exit; 229 } 230 231 phead = get_list_head(scanned_queue); 232 list_for_each(plist, phead) { 233 pnetwork = list_entry(plist, struct wlan_network, list); 234 235 if (!memcmp(addr, pnetwork->network.mac_address, ETH_ALEN)) 236 break; 237 } 238 239 if (plist == phead) 240 pnetwork = NULL; 241 242 exit: 243 return pnetwork; 244 } 245 246 void rtw_free_network_queue(struct adapter *padapter, u8 isfreeall) 247 { 248 struct list_head *phead, *plist, *tmp; 249 struct wlan_network *pnetwork; 250 struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 251 struct __queue *scanned_queue = &pmlmepriv->scanned_queue; 252 253 spin_lock_bh(&scanned_queue->lock); 254 255 phead = get_list_head(scanned_queue); 256 list_for_each_safe(plist, tmp, phead) { 257 pnetwork = list_entry(plist, struct wlan_network, list); 258 259 _rtw_free_network(pmlmepriv, pnetwork, isfreeall); 260 } 261 262 spin_unlock_bh(&scanned_queue->lock); 263 } 264 265 bool rtw_if_up(struct adapter *padapter) 266 { 267 if (padapter->bDriverStopped || padapter->bSurpriseRemoved || 268 !check_fwstate(&padapter->mlmepriv, _FW_LINKED)) 269 return false; 270 271 return true; 272 } 273 274 void rtw_generate_random_ibss(u8 *pibss) 275 { 276 unsigned long curtime = jiffies; 277 278 pibss[0] = 0x02; /* in ad-hoc mode bit1 must set to 1 */ 279 pibss[1] = 0x11; 280 pibss[2] = 0x87; 281 pibss[3] = (u8)(curtime & 0xff) ;/* p[0]; */ 282 pibss[4] = (u8)((curtime >> 8) & 0xff) ;/* p[1]; */ 283 pibss[5] = (u8)((curtime >> 16) & 0xff) ;/* p[2]; */ 284 } 285 286 u8 *rtw_get_capability_from_ie(u8 *ie) 287 { 288 return ie + 8 + 2; 289 } 290 291 u16 rtw_get_capability(struct wlan_bssid_ex *bss) 292 { 293 __le16 val; 294 295 memcpy((u8 *)&val, rtw_get_capability_from_ie(bss->ies), 2); 296 297 return le16_to_cpu(val); 298 } 299 300 u8 *rtw_get_beacon_interval_from_ie(u8 *ie) 301 { 302 return ie + 8; 303 } 304 305 void rtw_free_mlme_priv(struct mlme_priv *pmlmepriv) 306 { 307 _rtw_free_mlme_priv(pmlmepriv); 308 } 309 310 void rtw_free_network_nolock(struct adapter *padapter, struct wlan_network *pnetwork); 311 void rtw_free_network_nolock(struct adapter *padapter, struct wlan_network *pnetwork) 312 { 313 _rtw_free_network_nolock(&padapter->mlmepriv, pnetwork); 314 rtw_cfg80211_unlink_bss(padapter, pnetwork); 315 } 316 317 /* 318 * return the wlan_network with the matching addr 319 * 320 * Shall be called under atomic context... to avoid possible racing condition... 321 */ 322 struct wlan_network *rtw_find_network(struct __queue *scanned_queue, u8 *addr) 323 { 324 struct wlan_network *pnetwork = _rtw_find_network(scanned_queue, addr); 325 326 return pnetwork; 327 } 328 329 bool rtw_is_same_ibss(struct adapter *adapter, struct wlan_network *pnetwork) 330 { 331 struct security_priv *psecuritypriv = &adapter->securitypriv; 332 333 if ((psecuritypriv->dot11PrivacyAlgrthm != _NO_PRIVACY_) && 334 (pnetwork->network.privacy == 0)) 335 return false; 336 else if ((psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_) && 337 (pnetwork->network.privacy == 1)) 338 return false; 339 340 return true; 341 } 342 343 inline int is_same_ess(struct wlan_bssid_ex *a, struct wlan_bssid_ex *b) 344 { 345 return (a->ssid.ssid_length == b->ssid.ssid_length) 346 && !memcmp(a->ssid.ssid, b->ssid.ssid, a->ssid.ssid_length); 347 } 348 349 int is_same_network(struct wlan_bssid_ex *src, struct wlan_bssid_ex *dst, u8 feature) 350 { 351 u16 s_cap, d_cap; 352 __le16 tmps, tmpd; 353 354 if (rtw_bug_check(dst, src, &s_cap, &d_cap) == false) 355 return false; 356 357 memcpy((u8 *)&tmps, rtw_get_capability_from_ie(src->ies), 2); 358 memcpy((u8 *)&tmpd, rtw_get_capability_from_ie(dst->ies), 2); 359 360 s_cap = le16_to_cpu(tmps); 361 d_cap = le16_to_cpu(tmpd); 362 363 return (src->ssid.ssid_length == dst->ssid.ssid_length) && 364 ((!memcmp(src->mac_address, dst->mac_address, ETH_ALEN))) && 365 ((!memcmp(src->ssid.ssid, dst->ssid.ssid, src->ssid.ssid_length))) && 366 ((s_cap & WLAN_CAPABILITY_IBSS) == 367 (d_cap & WLAN_CAPABILITY_IBSS)) && 368 ((s_cap & WLAN_CAPABILITY_ESS) == 369 (d_cap & WLAN_CAPABILITY_ESS)); 370 } 371 372 struct wlan_network *_rtw_find_same_network(struct __queue *scanned_queue, struct wlan_network *network) 373 { 374 struct list_head *phead, *plist; 375 struct wlan_network *found = NULL; 376 377 phead = get_list_head(scanned_queue); 378 list_for_each(plist, phead) { 379 found = list_entry(plist, struct wlan_network, list); 380 381 if (is_same_network(&network->network, &found->network, 0)) 382 break; 383 } 384 385 if (plist == phead) 386 found = NULL; 387 388 return found; 389 } 390 391 struct wlan_network *rtw_get_oldest_wlan_network(struct __queue *scanned_queue) 392 { 393 struct list_head *plist, *phead; 394 395 struct wlan_network *pwlan = NULL; 396 struct wlan_network *oldest = NULL; 397 398 phead = get_list_head(scanned_queue); 399 400 list_for_each(plist, phead) { 401 pwlan = list_entry(plist, struct wlan_network, list); 402 403 if (!pwlan->fixed) { 404 if (!oldest || time_after(oldest->last_scanned, pwlan->last_scanned)) 405 oldest = pwlan; 406 } 407 } 408 return oldest; 409 } 410 411 void update_network(struct wlan_bssid_ex *dst, struct wlan_bssid_ex *src, 412 struct adapter *padapter, bool update_ie) 413 { 414 long rssi_ori = dst->rssi; 415 416 u8 sq_smp = src->phy_info.signal_quality; 417 418 u8 ss_final; 419 u8 sq_final; 420 long rssi_final; 421 422 /* The rule below is 1/5 for sample value, 4/5 for history value */ 423 if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&padapter->mlmepriv.cur_network.network, src, 0)) { 424 /* Take the recvpriv's value for the connected AP*/ 425 ss_final = padapter->recvpriv.signal_strength; 426 sq_final = padapter->recvpriv.signal_qual; 427 /* the rssi value here is undecorated, and will be used for antenna diversity */ 428 if (sq_smp != 101) /* from the right channel */ 429 rssi_final = (src->rssi + dst->rssi * 4) / 5; 430 else 431 rssi_final = rssi_ori; 432 } else { 433 if (sq_smp != 101) { /* from the right channel */ 434 ss_final = ((u32)(src->phy_info.signal_strength) + (u32)(dst->phy_info.signal_strength) * 4) / 5; 435 sq_final = ((u32)(src->phy_info.signal_quality) + (u32)(dst->phy_info.signal_quality) * 4) / 5; 436 rssi_final = (src->rssi + dst->rssi * 4) / 5; 437 } else { 438 /* bss info not receiving from the right channel, use the original RX signal infos */ 439 ss_final = dst->phy_info.signal_strength; 440 sq_final = dst->phy_info.signal_quality; 441 rssi_final = dst->rssi; 442 } 443 } 444 445 if (update_ie) { 446 dst->reserved[0] = src->reserved[0]; 447 dst->reserved[1] = src->reserved[1]; 448 memcpy((u8 *)dst, (u8 *)src, get_wlan_bssid_ex_sz(src)); 449 } 450 451 dst->phy_info.signal_strength = ss_final; 452 dst->phy_info.signal_quality = sq_final; 453 dst->rssi = rssi_final; 454 } 455 456 static void update_current_network(struct adapter *adapter, struct wlan_bssid_ex *pnetwork) 457 { 458 struct mlme_priv *pmlmepriv = &adapter->mlmepriv; 459 460 rtw_bug_check(&pmlmepriv->cur_network.network, 461 &pmlmepriv->cur_network.network, 462 &pmlmepriv->cur_network.network, 463 &pmlmepriv->cur_network.network); 464 465 if (check_fwstate(pmlmepriv, _FW_LINKED) && (is_same_network(&pmlmepriv->cur_network.network, pnetwork, 0))) { 466 update_network(&pmlmepriv->cur_network.network, pnetwork, adapter, true); 467 rtw_update_protection(adapter, (pmlmepriv->cur_network.network.ies) + sizeof(struct ndis_802_11_fix_ie), 468 pmlmepriv->cur_network.network.ie_length); 469 } 470 } 471 472 /* Caller must hold pmlmepriv->lock first. */ 473 void rtw_update_scanned_network(struct adapter *adapter, struct wlan_bssid_ex *target) 474 { 475 struct list_head *plist, *phead; 476 u32 bssid_ex_sz; 477 struct mlme_priv *pmlmepriv = &adapter->mlmepriv; 478 struct __queue *queue = &pmlmepriv->scanned_queue; 479 struct wlan_network *pnetwork = NULL; 480 struct wlan_network *oldest = NULL; 481 int target_find = 0; 482 u8 feature = 0; 483 484 spin_lock_bh(&queue->lock); 485 phead = get_list_head(queue); 486 list_for_each(plist, phead) { 487 pnetwork = list_entry(plist, struct wlan_network, list); 488 489 rtw_bug_check(pnetwork, pnetwork, pnetwork, pnetwork); 490 491 if (is_same_network(&pnetwork->network, target, feature)) { 492 target_find = 1; 493 break; 494 } 495 496 if (rtw_roam_flags(adapter)) { 497 /* TODO: don't select network in the same ess as oldest if it's new enough*/ 498 } 499 500 if (!oldest || time_after(oldest->last_scanned, pnetwork->last_scanned)) 501 oldest = pnetwork; 502 } 503 504 /* 505 * If we didn't find a match, then get a new network slot to initialize 506 * with this beacon's information 507 */ 508 if (!target_find) { 509 if (list_empty(&pmlmepriv->free_bss_pool.queue)) { 510 /* If there are no more slots, expire the oldest */ 511 /* list_del_init(&oldest->list); */ 512 pnetwork = oldest; 513 if (!pnetwork) 514 goto exit; 515 516 memcpy(&pnetwork->network, target, get_wlan_bssid_ex_sz(target)); 517 /* variable initialize */ 518 pnetwork->fixed = false; 519 pnetwork->last_scanned = jiffies; 520 521 pnetwork->network_type = 0; 522 pnetwork->aid = 0; 523 pnetwork->join_res = 0; 524 525 /* bss info not receiving from the right channel */ 526 if (pnetwork->network.phy_info.signal_quality == 101) 527 pnetwork->network.phy_info.signal_quality = 0; 528 } else { 529 /* Otherwise just pull from the free list */ 530 531 pnetwork = rtw_alloc_network(pmlmepriv); /* will update scan_time */ 532 533 if (!pnetwork) 534 goto exit; 535 536 bssid_ex_sz = get_wlan_bssid_ex_sz(target); 537 target->length = bssid_ex_sz; 538 memcpy(&pnetwork->network, target, bssid_ex_sz); 539 540 pnetwork->last_scanned = jiffies; 541 542 /* bss info not receiving from the right channel */ 543 if (pnetwork->network.phy_info.signal_quality == 101) 544 pnetwork->network.phy_info.signal_quality = 0; 545 546 list_add_tail(&pnetwork->list, &queue->queue); 547 } 548 } else { 549 /* we have an entry and we are going to update it. But this entry may 550 * be already expired. In this case we do the same as we found a new 551 * net and call the new_net handler 552 */ 553 bool update_ie = true; 554 555 pnetwork->last_scanned = jiffies; 556 557 /* target.reserved[0]== 1, means that scanned network is a bcn frame. */ 558 if (pnetwork->network.ie_length > target->ie_length && target->reserved[0] == 1) 559 update_ie = false; 560 561 /* probe resp(3) > beacon(1) > probe req(2) */ 562 if (target->reserved[0] != 2 && 563 target->reserved[0] >= pnetwork->network.reserved[0]) { 564 update_ie = true; 565 } else { 566 update_ie = false; 567 } 568 569 update_network(&pnetwork->network, target, adapter, update_ie); 570 } 571 572 exit: 573 spin_unlock_bh(&queue->lock); 574 } 575 576 void rtw_add_network(struct adapter *adapter, struct wlan_bssid_ex *pnetwork); 577 void rtw_add_network(struct adapter *adapter, struct wlan_bssid_ex *pnetwork) 578 { 579 update_current_network(adapter, pnetwork); 580 rtw_update_scanned_network(adapter, pnetwork); 581 } 582 583 /* select the desired network based on the capability of the (i)bss. 584 * check items: 585 * (1) security 586 * (2) network_type 587 * (3) WMM 588 * (4) HT 589 * (5) others 590 */ 591 static bool rtw_is_desired_network(struct adapter *adapter, struct wlan_network *pnetwork) 592 { 593 struct security_priv *psecuritypriv = &adapter->securitypriv; 594 struct mlme_priv *pmlmepriv = &adapter->mlmepriv; 595 u32 desired_encmode; 596 u32 privacy; 597 uint wps_ielen; 598 bool bselected = true; 599 600 desired_encmode = psecuritypriv->ndisencryptstatus; 601 privacy = pnetwork->network.privacy; 602 603 if (check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) { 604 if (rtw_get_wps_ie(pnetwork->network.ies + _FIXED_IE_LENGTH_, pnetwork->network.ie_length - _FIXED_IE_LENGTH_, NULL, &wps_ielen)) 605 return true; 606 else 607 return false; 608 } 609 if (adapter->registrypriv.wifi_spec == 1) { /* for correct flow of 8021X to do.... */ 610 u8 *p = NULL; 611 uint ie_len = 0; 612 613 if ((desired_encmode == Ndis802_11EncryptionDisabled) && (privacy != 0)) 614 bselected = false; 615 616 if (psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPA2PSK) { 617 p = rtw_get_ie(pnetwork->network.ies + _BEACON_IE_OFFSET_, WLAN_EID_RSN, &ie_len, (pnetwork->network.ie_length - _BEACON_IE_OFFSET_)); 618 if (p && ie_len > 0) 619 bselected = true; 620 else 621 bselected = false; 622 } 623 } 624 625 if ((desired_encmode != Ndis802_11EncryptionDisabled) && (privacy == 0)) 626 bselected = false; 627 628 if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) { 629 if (pnetwork->network.infrastructure_mode != pmlmepriv->cur_network.network.infrastructure_mode) 630 bselected = false; 631 } 632 633 return bselected; 634 } 635 636 /* TODO: Perry : For Power Management */ 637 void rtw_atimdone_event_callback(struct adapter *adapter, u8 *pbuf) 638 { 639 } 640 641 void rtw_survey_event_callback(struct adapter *adapter, u8 *pbuf) 642 { 643 u32 len; 644 struct wlan_bssid_ex *pnetwork; 645 struct mlme_priv *pmlmepriv = &adapter->mlmepriv; 646 647 pnetwork = (struct wlan_bssid_ex *)pbuf; 648 649 len = get_wlan_bssid_ex_sz(pnetwork); 650 if (len > (sizeof(struct wlan_bssid_ex))) 651 return; 652 653 spin_lock_bh(&pmlmepriv->lock); 654 655 /* update IBSS_network 's timestamp */ 656 if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) { 657 if (!memcmp(&pmlmepriv->cur_network.network.mac_address, pnetwork->mac_address, ETH_ALEN)) { 658 struct wlan_network *ibss_wlan = NULL; 659 660 memcpy(pmlmepriv->cur_network.network.ies, pnetwork->ies, 8); 661 spin_lock_bh(&pmlmepriv->scanned_queue.lock); 662 ibss_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->mac_address); 663 if (ibss_wlan) { 664 memcpy(ibss_wlan->network.ies, pnetwork->ies, 8); 665 spin_unlock_bh(&pmlmepriv->scanned_queue.lock); 666 goto exit; 667 } 668 spin_unlock_bh(&pmlmepriv->scanned_queue.lock); 669 } 670 } 671 672 /* lock pmlmepriv->lock when you accessing network_q */ 673 if (!check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) { 674 if (pnetwork->ssid.ssid[0] == 0) 675 pnetwork->ssid.ssid_length = 0; 676 rtw_add_network(adapter, pnetwork); 677 } 678 679 exit: 680 681 spin_unlock_bh(&pmlmepriv->lock); 682 } 683 684 void rtw_surveydone_event_callback(struct adapter *adapter, u8 *pbuf) 685 { 686 struct mlme_priv *pmlmepriv = &adapter->mlmepriv; 687 688 spin_lock_bh(&pmlmepriv->lock); 689 if (pmlmepriv->wps_probe_req_ie) { 690 pmlmepriv->wps_probe_req_ie_len = 0; 691 kfree(pmlmepriv->wps_probe_req_ie); 692 pmlmepriv->wps_probe_req_ie = NULL; 693 } 694 695 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) { 696 spin_unlock_bh(&pmlmepriv->lock); 697 timer_delete_sync(&pmlmepriv->scan_to_timer); 698 spin_lock_bh(&pmlmepriv->lock); 699 _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); 700 } 701 702 rtw_set_signal_stat_timer(&adapter->recvpriv); 703 704 if (pmlmepriv->to_join) { 705 if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) { 706 if (!check_fwstate(pmlmepriv, _FW_LINKED)) { 707 set_fwstate(pmlmepriv, _FW_UNDER_LINKING); 708 709 if (rtw_select_and_join_from_scanned_queue(pmlmepriv) == _SUCCESS) { 710 _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); 711 } else { 712 u8 ret = _SUCCESS; 713 struct wlan_bssid_ex *pdev_network = &adapter->registrypriv.dev_network; 714 u8 *pibss = adapter->registrypriv.dev_network.mac_address; 715 716 /* pmlmepriv->fw_state ^= _FW_UNDER_SURVEY;because don't set assoc_timer */ 717 _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); 718 719 memcpy(&pdev_network->ssid, &pmlmepriv->assoc_ssid, sizeof(struct ndis_802_11_ssid)); 720 721 rtw_update_registrypriv_dev_network(adapter); 722 rtw_generate_random_ibss(pibss); 723 724 pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE; 725 726 pmlmepriv->to_join = false; 727 728 ret = rtw_createbss_cmd(adapter); 729 if (ret != _SUCCESS) 730 goto unlock; 731 } 732 } 733 } else { 734 int s_ret; 735 736 set_fwstate(pmlmepriv, _FW_UNDER_LINKING); 737 pmlmepriv->to_join = false; 738 s_ret = rtw_select_and_join_from_scanned_queue(pmlmepriv); 739 if (s_ret == _SUCCESS) { 740 _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); 741 } else if (s_ret == 2) {/* there is no need to wait for join */ 742 _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); 743 rtw_indicate_connect(adapter); 744 } else { 745 if (rtw_to_roam(adapter) != 0) { 746 if (rtw_dec_to_roam(adapter) == 0 747 || _SUCCESS != rtw_sitesurvey_cmd(adapter, &pmlmepriv->assoc_ssid, 1, NULL, 0) 748 ) { 749 rtw_set_to_roam(adapter, 0); 750 rtw_free_assoc_resources(adapter, 1); 751 rtw_indicate_disconnect(adapter); 752 } else { 753 pmlmepriv->to_join = true; 754 } 755 } else 756 rtw_indicate_disconnect(adapter); 757 758 _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); 759 } 760 } 761 } else { 762 if (rtw_chk_roam_flags(adapter, RTW_ROAM_ACTIVE)) { 763 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) 764 && check_fwstate(pmlmepriv, _FW_LINKED)) { 765 if (rtw_select_roaming_candidate(pmlmepriv) == _SUCCESS) { 766 receive_disconnect(adapter, pmlmepriv->cur_network.network.mac_address 767 , WLAN_REASON_ACTIVE_ROAM); 768 } 769 } 770 } 771 } 772 773 unlock: 774 spin_unlock_bh(&pmlmepriv->lock); 775 776 rtw_os_xmit_schedule(adapter); 777 778 rtw_cfg80211_surveydone_event_callback(adapter); 779 780 rtw_indicate_scan_done(adapter, false); 781 } 782 783 void rtw_dummy_event_callback(struct adapter *adapter, u8 *pbuf) 784 { 785 } 786 787 void rtw_fwdbg_event_callback(struct adapter *adapter, u8 *pbuf) 788 { 789 } 790 791 static void free_scanqueue(struct mlme_priv *pmlmepriv) 792 { 793 struct __queue *free_queue = &pmlmepriv->free_bss_pool; 794 struct __queue *scan_queue = &pmlmepriv->scanned_queue; 795 struct list_head *plist, *phead, *ptemp; 796 797 spin_lock_bh(&scan_queue->lock); 798 spin_lock_bh(&free_queue->lock); 799 800 phead = get_list_head(scan_queue); 801 plist = get_next(phead); 802 803 while (plist != phead) { 804 ptemp = get_next(plist); 805 list_del_init(plist); 806 list_add_tail(plist, &free_queue->queue); 807 plist = ptemp; 808 } 809 810 spin_unlock_bh(&free_queue->lock); 811 spin_unlock_bh(&scan_queue->lock); 812 } 813 814 static void find_network(struct adapter *adapter) 815 { 816 struct wlan_network *pwlan = NULL; 817 struct mlme_priv *pmlmepriv = &adapter->mlmepriv; 818 struct wlan_network *tgt_network = &pmlmepriv->cur_network; 819 820 pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.mac_address); 821 if (!pwlan) 822 return; 823 824 pwlan->fixed = false; 825 826 if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) && 827 (adapter->stapriv.asoc_sta_count == 1)) 828 rtw_free_network_nolock(adapter, pwlan); 829 } 830 831 /* rtw_free_assoc_resources: the caller has to lock pmlmepriv->lock */ 832 void rtw_free_assoc_resources(struct adapter *adapter, int lock_scanned_queue) 833 { 834 struct mlme_priv *pmlmepriv = &adapter->mlmepriv; 835 struct wlan_network *tgt_network = &pmlmepriv->cur_network; 836 837 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_AP_STATE)) { 838 struct sta_info *psta; 839 840 psta = rtw_get_stainfo(&adapter->stapriv, tgt_network->network.mac_address); 841 rtw_free_stainfo(adapter, psta); 842 } 843 844 if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE | WIFI_AP_STATE)) { 845 struct sta_info *psta; 846 847 rtw_free_all_stainfo(adapter); 848 849 psta = rtw_get_bcmc_stainfo(adapter); 850 rtw_free_stainfo(adapter, psta); 851 852 rtw_init_bcmc_stainfo(adapter); 853 } 854 855 find_network(adapter); 856 857 if (lock_scanned_queue) 858 adapter->securitypriv.key_mask = 0; 859 } 860 861 /* rtw_indicate_connect: the caller has to lock pmlmepriv->lock */ 862 void rtw_indicate_connect(struct adapter *padapter) 863 { 864 struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 865 866 pmlmepriv->to_join = false; 867 868 if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED)) { 869 set_fwstate(pmlmepriv, _FW_LINKED); 870 871 if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) || 872 check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) 873 rtw_cfg80211_ibss_indicate_connect(padapter); 874 else 875 rtw_cfg80211_indicate_connect(padapter); 876 877 netif_carrier_on(padapter->pnetdev); 878 879 if (padapter->pid[2] != 0) 880 rtw_signal_process(padapter->pid[2], SIGALRM); 881 } 882 883 rtw_set_to_roam(padapter, 0); 884 rtw_set_scan_deny(padapter, 3000); 885 } 886 887 /* rtw_indicate_disconnect: the caller has to lock pmlmepriv->lock */ 888 void rtw_indicate_disconnect(struct adapter *padapter) 889 { 890 struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 891 892 _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING | WIFI_UNDER_WPS); 893 894 if (rtw_to_roam(padapter) > 0) 895 _clr_fwstate_(pmlmepriv, _FW_LINKED); 896 897 if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) || rtw_to_roam(padapter) <= 0) { 898 /* Do it first for tx broadcast pkt after disconnection issue! */ 899 netif_carrier_off(padapter->pnetdev); 900 901 rtw_cfg80211_indicate_disconnect(padapter); 902 903 /* modify for CONFIG_IEEE80211W, none 11w also can use the same command */ 904 rtw_reset_securitypriv_cmd(padapter); 905 906 /* set ips_deny_time to avoid enter IPS before LPS leave */ 907 rtw_set_ips_deny(padapter, 3000); 908 909 _clr_fwstate_(pmlmepriv, _FW_LINKED); 910 911 rtw_clear_scan_deny(padapter); 912 } 913 914 rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 1); 915 } 916 917 inline void rtw_indicate_scan_done(struct adapter *padapter, bool aborted) 918 { 919 rtw_cfg80211_indicate_scan_done(padapter, aborted); 920 921 if ((!adapter_to_pwrctl(padapter)->bInSuspend) && 922 (!check_fwstate(&padapter->mlmepriv, 923 WIFI_ASOC_STATE | WIFI_UNDER_LINKING))) { 924 rtw_set_ips_deny(padapter, 0); 925 _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 1); 926 } 927 } 928 929 void rtw_scan_abort(struct adapter *adapter) 930 { 931 unsigned long start; 932 struct mlme_priv *pmlmepriv = &adapter->mlmepriv; 933 struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; 934 935 start = jiffies; 936 pmlmeext->scan_abort = true; 937 while (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) 938 && jiffies_to_msecs(start) <= 200) { 939 if (adapter->bDriverStopped || adapter->bSurpriseRemoved) 940 break; 941 942 msleep(20); 943 } 944 945 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) 946 rtw_indicate_scan_done(adapter, true); 947 948 pmlmeext->scan_abort = false; 949 } 950 951 static struct sta_info *rtw_joinbss_update_stainfo(struct adapter *padapter, struct wlan_network *pnetwork) 952 { 953 int i; 954 struct sta_info *bmc_sta, *psta = NULL; 955 struct recv_reorder_ctrl *preorder_ctrl; 956 struct sta_priv *pstapriv = &padapter->stapriv; 957 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; 958 959 psta = rtw_get_stainfo(pstapriv, pnetwork->network.mac_address); 960 if (!psta) 961 psta = rtw_alloc_stainfo(pstapriv, pnetwork->network.mac_address); 962 963 if (psta) { /* update ptarget_sta */ 964 965 psta->aid = pnetwork->join_res; 966 967 update_sta_info(padapter, psta); 968 969 /* update station supportRate */ 970 psta->bssratelen = rtw_get_rateset_len(pnetwork->network.supported_rates); 971 memcpy(psta->bssrateset, pnetwork->network.supported_rates, psta->bssratelen); 972 rtw_hal_update_sta_rate_mask(padapter, psta); 973 974 psta->wireless_mode = pmlmeext->cur_wireless_mode; 975 psta->raid = networktype_to_raid_ex(padapter, psta); 976 977 /* sta mode */ 978 rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, true); 979 980 /* security related */ 981 if (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) { 982 padapter->securitypriv.binstallGrpkey = false; 983 padapter->securitypriv.busetkipkey = false; 984 padapter->securitypriv.bgrpkey_handshake = false; 985 986 psta->ieee8021x_blocked = true; 987 psta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; 988 989 memset((u8 *)&psta->dot118021x_UncstKey, 0, sizeof(union Keytype)); 990 991 memset((u8 *)&psta->dot11tkiprxmickey, 0, sizeof(union Keytype)); 992 memset((u8 *)&psta->dot11tkiptxmickey, 0, sizeof(union Keytype)); 993 994 memset((u8 *)&psta->dot11txpn, 0, sizeof(union pn48)); 995 psta->dot11txpn.val = psta->dot11txpn.val + 1; 996 memset((u8 *)&psta->dot11wtxpn, 0, sizeof(union pn48)); 997 memset((u8 *)&psta->dot11rxpn, 0, sizeof(union pn48)); 998 } 999 1000 /* When doing the WPS, the wps_ie_len won't equal to 0 */ 1001 /* And the Wi-Fi driver shouldn't allow the data packet to be transmitted. */ 1002 if (padapter->securitypriv.wps_ie_len != 0) { 1003 psta->ieee8021x_blocked = true; 1004 padapter->securitypriv.wps_ie_len = 0; 1005 } 1006 1007 /* for A-MPDU Rx reordering buffer control for bmc_sta & sta_info */ 1008 /* if A-MPDU Rx is enabled, resetting rx_ordering_ctrl wstart_b(indicate_seq) to default value = 0xffff */ 1009 /* todo: check if AP can send A-MPDU packets */ 1010 for (i = 0; i < 16 ; i++) { 1011 preorder_ctrl = &psta->recvreorder_ctrl[i]; 1012 preorder_ctrl->enable = false; 1013 preorder_ctrl->indicate_seq = 0xffff; 1014 preorder_ctrl->wend_b = 0xffff; 1015 preorder_ctrl->wsize_b = 64;/* max_ampdu_sz;ex. 32(kbytes) -> wsize_b =32 */ 1016 } 1017 1018 bmc_sta = rtw_get_bcmc_stainfo(padapter); 1019 if (bmc_sta) { 1020 for (i = 0; i < 16 ; i++) { 1021 preorder_ctrl = &bmc_sta->recvreorder_ctrl[i]; 1022 preorder_ctrl->enable = false; 1023 preorder_ctrl->indicate_seq = 0xffff; 1024 preorder_ctrl->wend_b = 0xffff; 1025 preorder_ctrl->wsize_b = 64;/* max_ampdu_sz;ex. 32(kbytes) -> wsize_b =32 */ 1026 } 1027 } 1028 } 1029 1030 return psta; 1031 } 1032 1033 /* pnetwork : returns from rtw_joinbss_event_callback */ 1034 /* ptarget_wlan: found from scanned_queue */ 1035 static void rtw_joinbss_update_network(struct adapter *padapter, struct wlan_network *ptarget_wlan, struct wlan_network *pnetwork) 1036 { 1037 struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 1038 struct wlan_network *cur_network = &pmlmepriv->cur_network; 1039 1040 /* why not use ptarget_wlan?? */ 1041 memcpy(&cur_network->network, &pnetwork->network, pnetwork->network.length); 1042 /* some ies in pnetwork is wrong, so we should use ptarget_wlan ies */ 1043 cur_network->network.ie_length = ptarget_wlan->network.ie_length; 1044 memcpy(&cur_network->network.ies[0], &ptarget_wlan->network.ies[0], MAX_IE_SZ); 1045 1046 cur_network->aid = pnetwork->join_res; 1047 1048 rtw_set_signal_stat_timer(&padapter->recvpriv); 1049 1050 padapter->recvpriv.signal_strength = ptarget_wlan->network.phy_info.signal_strength; 1051 padapter->recvpriv.signal_qual = ptarget_wlan->network.phy_info.signal_quality; 1052 /* the ptarget_wlan->network.rssi is raw data, we use ptarget_wlan->network.phy_info.signal_strength instead (has scaled) */ 1053 padapter->recvpriv.rssi = translate_percentage_to_dbm(ptarget_wlan->network.phy_info.signal_strength); 1054 1055 rtw_set_signal_stat_timer(&padapter->recvpriv); 1056 1057 /* update fw_state will clr _FW_UNDER_LINKING here indirectly */ 1058 switch (pnetwork->network.infrastructure_mode) { 1059 case Ndis802_11Infrastructure: 1060 1061 if (pmlmepriv->fw_state & WIFI_UNDER_WPS) 1062 pmlmepriv->fw_state = WIFI_STATION_STATE | WIFI_UNDER_WPS; 1063 else 1064 pmlmepriv->fw_state = WIFI_STATION_STATE; 1065 1066 break; 1067 case Ndis802_11IBSS: 1068 pmlmepriv->fw_state = WIFI_ADHOC_STATE; 1069 break; 1070 default: 1071 pmlmepriv->fw_state = WIFI_NULL_STATE; 1072 break; 1073 } 1074 1075 rtw_update_protection(padapter, (cur_network->network.ies) + sizeof(struct ndis_802_11_fix_ie), 1076 (cur_network->network.ie_length)); 1077 1078 rtw_update_ht_cap(padapter, cur_network->network.ies, cur_network->network.ie_length, (u8) cur_network->network.configuration.ds_config); 1079 } 1080 1081 static struct rt_pmkid_list backupPMKIDList[NUM_PMKID_CACHE]; 1082 void rtw_reset_securitypriv(struct adapter *adapter) 1083 { 1084 u8 backupPMKIDIndex = 0; 1085 u8 backupTKIPCountermeasure = 0x00; 1086 u32 backupTKIPcountermeasure_time = 0; 1087 /* add for CONFIG_IEEE80211W, none 11w also can use */ 1088 struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; 1089 1090 spin_lock_bh(&adapter->security_key_mutex); 1091 1092 if (adapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) { 1093 /* 802.1x */ 1094 /* Added by Albert 2009/02/18 */ 1095 /* We have to backup the PMK information for WiFi PMK Caching test item. */ 1096 /* */ 1097 /* Backup the btkip_countermeasure information. */ 1098 /* When the countermeasure is trigger, the driver have to disconnect with AP for 60 seconds. */ 1099 1100 memcpy(&backupPMKIDList[0], &adapter->securitypriv.PMKIDList[0], sizeof(struct rt_pmkid_list) * NUM_PMKID_CACHE); 1101 backupPMKIDIndex = adapter->securitypriv.PMKIDIndex; 1102 backupTKIPCountermeasure = adapter->securitypriv.btkip_countermeasure; 1103 backupTKIPcountermeasure_time = adapter->securitypriv.btkip_countermeasure_time; 1104 1105 /* reset RX BIP packet number */ 1106 pmlmeext->mgnt_80211w_IPN_rx = 0; 1107 1108 memset((unsigned char *)&adapter->securitypriv, 0, sizeof(struct security_priv)); 1109 1110 /* Added by Albert 2009/02/18 */ 1111 /* Restore the PMK information to securitypriv structure for the following connection. */ 1112 memcpy(&adapter->securitypriv.PMKIDList[0], &backupPMKIDList[0], sizeof(struct rt_pmkid_list) * NUM_PMKID_CACHE); 1113 adapter->securitypriv.PMKIDIndex = backupPMKIDIndex; 1114 adapter->securitypriv.btkip_countermeasure = backupTKIPCountermeasure; 1115 adapter->securitypriv.btkip_countermeasure_time = backupTKIPcountermeasure_time; 1116 1117 adapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen; 1118 adapter->securitypriv.ndisencryptstatus = Ndis802_11WEPDisabled; 1119 1120 } else { 1121 /* reset values in securitypriv */ 1122 /* if (adapter->mlmepriv.fw_state & WIFI_STATION_STATE) */ 1123 /* */ 1124 struct security_priv *psec_priv = &adapter->securitypriv; 1125 1126 psec_priv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; /* open system */ 1127 psec_priv->dot11PrivacyAlgrthm = _NO_PRIVACY_; 1128 psec_priv->dot11PrivacyKeyIndex = 0; 1129 1130 psec_priv->dot118021XGrpPrivacy = _NO_PRIVACY_; 1131 psec_priv->dot118021XGrpKeyid = 1; 1132 1133 psec_priv->ndisauthtype = Ndis802_11AuthModeOpen; 1134 psec_priv->ndisencryptstatus = Ndis802_11WEPDisabled; 1135 /* */ 1136 } 1137 /* add for CONFIG_IEEE80211W, none 11w also can use */ 1138 spin_unlock_bh(&adapter->security_key_mutex); 1139 } 1140 1141 /* Notes: the function could be > passive_level (the same context as Rx tasklet) */ 1142 /* pnetwork : returns from rtw_joinbss_event_callback */ 1143 /* ptarget_wlan: found from scanned_queue */ 1144 /* if join_res > 0, for (fw_state ==WIFI_STATION_STATE), we check if "ptarget_sta" & "ptarget_wlan" exist. */ 1145 /* if join_res > 0, for (fw_state ==WIFI_ADHOC_STATE), we only check if "ptarget_wlan" exist. */ 1146 /* if join_res > 0, update "cur_network->network" from "pnetwork->network" if (ptarget_wlan != NULL). */ 1147 /* */ 1148 void rtw_joinbss_event_prehandle(struct adapter *adapter, u8 *pbuf) 1149 { 1150 struct sta_info *ptarget_sta = NULL, *pcur_sta = NULL; 1151 struct sta_priv *pstapriv = &adapter->stapriv; 1152 struct mlme_priv *pmlmepriv = &adapter->mlmepriv; 1153 struct wlan_network *pnetwork = (struct wlan_network *)pbuf; 1154 struct wlan_network *cur_network = &pmlmepriv->cur_network; 1155 struct wlan_network *pcur_wlan = NULL, *ptarget_wlan = NULL; 1156 unsigned int the_same_macaddr = false; 1157 1158 the_same_macaddr = !memcmp(pnetwork->network.mac_address, cur_network->network.mac_address, ETH_ALEN); 1159 1160 pnetwork->network.length = get_wlan_bssid_ex_sz(&pnetwork->network); 1161 if (pnetwork->network.length > sizeof(struct wlan_bssid_ex)) 1162 return; 1163 1164 spin_lock_bh(&pmlmepriv->lock); 1165 1166 pmlmepriv->link_detect_info.traffic_transition_count = 0; 1167 pmlmepriv->link_detect_info.low_power_transition_count = 0; 1168 1169 if (pnetwork->join_res == -4) { 1170 rtw_reset_securitypriv(adapter); 1171 _set_timer(&pmlmepriv->assoc_timer, 1); 1172 1173 if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) 1174 _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); 1175 1176 spin_unlock_bh(&pmlmepriv->lock); 1177 return; 1178 } 1179 1180 if (pnetwork->join_res <= 0) { /* if join_res < 0 (join fails), then try again */ 1181 _set_timer(&pmlmepriv->assoc_timer, 1); 1182 _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); 1183 spin_unlock_bh(&pmlmepriv->lock); 1184 return; 1185 } 1186 1187 spin_lock_bh(&pmlmepriv->scanned_queue.lock); 1188 1189 if (!check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) { 1190 spin_unlock_bh(&pmlmepriv->scanned_queue.lock); 1191 spin_unlock_bh(&pmlmepriv->lock); 1192 return; 1193 } 1194 1195 /* s1. find ptarget_wlan */ 1196 if (check_fwstate(pmlmepriv, _FW_LINKED)) { 1197 if (the_same_macaddr) { 1198 ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.mac_address); 1199 } else { 1200 pcur_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.mac_address); 1201 if (pcur_wlan) 1202 pcur_wlan->fixed = false; 1203 1204 pcur_sta = rtw_get_stainfo(pstapriv, cur_network->network.mac_address); 1205 if (pcur_sta) 1206 rtw_free_stainfo(adapter, pcur_sta); 1207 1208 ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.mac_address); 1209 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { 1210 if (ptarget_wlan) 1211 ptarget_wlan->fixed = true; 1212 } 1213 } 1214 } else { 1215 ptarget_wlan = _rtw_find_same_network(&pmlmepriv->scanned_queue, pnetwork); 1216 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { 1217 if (ptarget_wlan) 1218 ptarget_wlan->fixed = true; 1219 } 1220 } 1221 1222 /* s2. update cur_network */ 1223 if (!ptarget_wlan) { 1224 netdev_dbg(adapter->pnetdev, 1225 "Can't find ptarget_wlan when joinbss_event callback\n"); 1226 spin_unlock_bh(&pmlmepriv->scanned_queue.lock); 1227 spin_unlock_bh(&pmlmepriv->lock); 1228 return; 1229 } 1230 1231 rtw_joinbss_update_network(adapter, ptarget_wlan, pnetwork); 1232 1233 /* s3. find ptarget_sta & update ptarget_sta after update cur_network only for station mode */ 1234 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { 1235 ptarget_sta = rtw_joinbss_update_stainfo(adapter, pnetwork); 1236 if (!ptarget_sta) { 1237 spin_unlock_bh(&pmlmepriv->scanned_queue.lock); 1238 spin_unlock_bh(&pmlmepriv->lock); 1239 return; 1240 } 1241 } 1242 1243 /* s4. indicate connect */ 1244 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { 1245 pmlmepriv->cur_network_scanned = ptarget_wlan; 1246 rtw_indicate_connect(adapter); 1247 } 1248 1249 spin_unlock_bh(&pmlmepriv->scanned_queue.lock); 1250 1251 spin_unlock_bh(&pmlmepriv->lock); 1252 /* s5. Cancel assoc_timer */ 1253 timer_delete_sync(&pmlmepriv->assoc_timer); 1254 } 1255 1256 void rtw_joinbss_event_callback(struct adapter *adapter, u8 *pbuf) 1257 { 1258 struct wlan_network *pnetwork = (struct wlan_network *)pbuf; 1259 1260 mlmeext_joinbss_event_callback(adapter, pnetwork->join_res); 1261 1262 rtw_os_xmit_schedule(adapter); 1263 } 1264 1265 /* FOR STA, AP , AD-HOC mode */ 1266 void rtw_sta_media_status_rpt(struct adapter *adapter, struct sta_info *psta, u32 mstatus) 1267 { 1268 u16 media_status_rpt; 1269 1270 if (!psta) 1271 return; 1272 1273 media_status_rpt = (u16)((psta->mac_id << 8) | mstatus); /* MACID|OPMODE:1 connect */ 1274 rtw_hal_set_hwreg(adapter, HW_VAR_H2C_MEDIA_STATUS_RPT, (u8 *)&media_status_rpt); 1275 } 1276 1277 void rtw_stassoc_event_callback(struct adapter *adapter, u8 *pbuf) 1278 { 1279 struct sta_info *psta; 1280 struct mlme_priv *pmlmepriv = &adapter->mlmepriv; 1281 struct stassoc_event *pstassoc = (struct stassoc_event *)pbuf; 1282 struct wlan_network *cur_network = &pmlmepriv->cur_network; 1283 struct wlan_network *ptarget_wlan = NULL; 1284 1285 if (rtw_access_ctrl(adapter, pstassoc->macaddr) == false) 1286 return; 1287 1288 if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { 1289 psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); 1290 if (psta) { 1291 u8 *passoc_req = NULL; 1292 u32 assoc_req_len = 0; 1293 1294 rtw_sta_media_status_rpt(adapter, psta, 1); 1295 1296 ap_sta_info_defer_update(adapter, psta); 1297 1298 /* report to upper layer */ 1299 spin_lock_bh(&psta->lock); 1300 if (psta->passoc_req && psta->assoc_req_len > 0) { 1301 passoc_req = kmemdup(psta->passoc_req, psta->assoc_req_len, GFP_ATOMIC); 1302 if (passoc_req) { 1303 assoc_req_len = psta->assoc_req_len; 1304 1305 kfree(psta->passoc_req); 1306 psta->passoc_req = NULL; 1307 psta->assoc_req_len = 0; 1308 } 1309 } 1310 spin_unlock_bh(&psta->lock); 1311 1312 if (passoc_req && assoc_req_len > 0) { 1313 rtw_cfg80211_indicate_sta_assoc(adapter, passoc_req, assoc_req_len); 1314 1315 kfree(passoc_req); 1316 } 1317 } 1318 return; 1319 } 1320 1321 /* for AD-HOC mode */ 1322 psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); 1323 if (psta) { 1324 /* the sta have been in sta_info_queue => do nothing */ 1325 1326 return; /* between drv has received this event before and fw have not yet to set key to CAM_ENTRY) */ 1327 } 1328 1329 psta = rtw_alloc_stainfo(&adapter->stapriv, pstassoc->macaddr); 1330 if (!psta) 1331 return; 1332 1333 /* to do : init sta_info variable */ 1334 psta->qos_option = 0; 1335 psta->mac_id = (uint)pstassoc->cam_id; 1336 1337 /* for ad-hoc mode */ 1338 rtw_hal_set_odm_var(adapter, HAL_ODM_STA_INFO, psta, true); 1339 1340 rtw_sta_media_status_rpt(adapter, psta, 1); 1341 1342 if (adapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) 1343 psta->dot118021XPrivacy = adapter->securitypriv.dot11PrivacyAlgrthm; 1344 1345 psta->ieee8021x_blocked = false; 1346 1347 spin_lock_bh(&pmlmepriv->lock); 1348 1349 if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) || 1350 check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) { 1351 if (adapter->stapriv.asoc_sta_count == 2) { 1352 spin_lock_bh(&pmlmepriv->scanned_queue.lock); 1353 ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.mac_address); 1354 pmlmepriv->cur_network_scanned = ptarget_wlan; 1355 if (ptarget_wlan) 1356 ptarget_wlan->fixed = true; 1357 spin_unlock_bh(&pmlmepriv->scanned_queue.lock); 1358 /* a sta + bc/mc_stainfo (not Ibss_stainfo) */ 1359 rtw_indicate_connect(adapter); 1360 } 1361 } 1362 1363 spin_unlock_bh(&pmlmepriv->lock); 1364 1365 mlmeext_sta_add_event_callback(adapter, psta); 1366 } 1367 1368 void rtw_stadel_event_callback(struct adapter *adapter, u8 *pbuf) 1369 { 1370 int mac_id = (-1); 1371 struct sta_info *psta; 1372 struct wlan_network *pwlan = NULL; 1373 struct wlan_bssid_ex *pdev_network = NULL; 1374 u8 *pibss = NULL; 1375 struct mlme_priv *pmlmepriv = &adapter->mlmepriv; 1376 struct stadel_event *pstadel = (struct stadel_event *)pbuf; 1377 struct wlan_network *tgt_network = &pmlmepriv->cur_network; 1378 struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; 1379 struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; 1380 1381 psta = rtw_get_stainfo(&adapter->stapriv, pstadel->macaddr); 1382 if (psta) 1383 mac_id = psta->mac_id; 1384 else 1385 mac_id = pstadel->mac_id; 1386 1387 if (mac_id >= 0) { 1388 u16 media_status; 1389 1390 media_status = (mac_id << 8) | 0; /* MACID|OPMODE:0 means disconnect */ 1391 /* for STA, AP, ADHOC mode, report disconnect stauts to FW */ 1392 rtw_hal_set_hwreg(adapter, HW_VAR_H2C_MEDIA_STATUS_RPT, (u8 *)&media_status); 1393 } 1394 1395 /* if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) */ 1396 if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) 1397 return; 1398 1399 mlmeext_sta_del_event_callback(adapter); 1400 1401 spin_lock_bh(&pmlmepriv->lock); 1402 1403 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { 1404 u16 reason = *((unsigned short *)(pstadel->rsvd)); 1405 bool roam = false; 1406 struct wlan_network *roam_target = NULL; 1407 1408 if (adapter->registrypriv.wifi_spec == 1) { 1409 roam = false; 1410 } else if (reason == WLAN_REASON_EXPIRATION_CHK && rtw_chk_roam_flags(adapter, RTW_ROAM_ON_EXPIRED)) { 1411 roam = true; 1412 } else if (reason == WLAN_REASON_ACTIVE_ROAM && rtw_chk_roam_flags(adapter, RTW_ROAM_ACTIVE)) { 1413 roam = true; 1414 roam_target = pmlmepriv->roam_network; 1415 } 1416 1417 if (roam) { 1418 if (rtw_to_roam(adapter) > 0) 1419 rtw_dec_to_roam(adapter); /* this stadel_event is caused by roaming, decrease to_roam */ 1420 else if (rtw_to_roam(adapter) == 0) 1421 rtw_set_to_roam(adapter, adapter->registrypriv.max_roaming_times); 1422 } else { 1423 rtw_set_to_roam(adapter, 0); 1424 } 1425 1426 rtw_free_uc_swdec_pending_queue(adapter); 1427 1428 rtw_free_assoc_resources(adapter, 1); 1429 rtw_indicate_disconnect(adapter); 1430 1431 spin_lock_bh(&pmlmepriv->scanned_queue.lock); 1432 /* remove the network entry in scanned_queue */ 1433 pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.mac_address); 1434 if (pwlan) { 1435 pwlan->fixed = false; 1436 rtw_free_network_nolock(adapter, pwlan); 1437 } 1438 spin_unlock_bh(&pmlmepriv->scanned_queue.lock); 1439 1440 _rtw_roaming(adapter, roam_target); 1441 } 1442 1443 if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) || 1444 check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) { 1445 rtw_free_stainfo(adapter, psta); 1446 1447 if (adapter->stapriv.asoc_sta_count == 1) {/* a sta + bc/mc_stainfo (not Ibss_stainfo) */ 1448 u8 ret = _SUCCESS; 1449 1450 spin_lock_bh(&pmlmepriv->scanned_queue.lock); 1451 /* free old ibss network */ 1452 pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.mac_address); 1453 if (pwlan) { 1454 pwlan->fixed = false; 1455 rtw_free_network_nolock(adapter, pwlan); 1456 } 1457 spin_unlock_bh(&pmlmepriv->scanned_queue.lock); 1458 /* re-create ibss */ 1459 pdev_network = &adapter->registrypriv.dev_network; 1460 pibss = adapter->registrypriv.dev_network.mac_address; 1461 1462 memcpy(pdev_network, &tgt_network->network, get_wlan_bssid_ex_sz(&tgt_network->network)); 1463 1464 memcpy(&pdev_network->ssid, &pmlmepriv->assoc_ssid, sizeof(struct ndis_802_11_ssid)); 1465 1466 rtw_update_registrypriv_dev_network(adapter); 1467 1468 rtw_generate_random_ibss(pibss); 1469 1470 if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) { 1471 set_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE); 1472 _clr_fwstate_(pmlmepriv, WIFI_ADHOC_STATE); 1473 } 1474 1475 ret = rtw_createbss_cmd(adapter); 1476 if (ret != _SUCCESS) 1477 goto unlock; 1478 } 1479 } 1480 1481 unlock: 1482 spin_unlock_bh(&pmlmepriv->lock); 1483 } 1484 1485 void rtw_cpwm_event_callback(struct adapter *padapter, u8 *pbuf) 1486 { 1487 struct reportpwrstate_parm *preportpwrstate; 1488 1489 preportpwrstate = (struct reportpwrstate_parm *)pbuf; 1490 preportpwrstate->state |= (u8)(adapter_to_pwrctl(padapter)->cpwm_tog + 0x80); 1491 cpwm_int_hdl(padapter, preportpwrstate); 1492 } 1493 1494 void rtw_wmm_event_callback(struct adapter *padapter, u8 *pbuf) 1495 { 1496 WMMOnAssocRsp(padapter); 1497 } 1498 1499 /* 1500 * _rtw_join_timeout_handler - Timeout/failure handler for CMD JoinBss 1501 * @adapter: pointer to struct adapter structure 1502 */ 1503 void _rtw_join_timeout_handler(struct timer_list *t) 1504 { 1505 struct adapter *adapter = timer_container_of(adapter, t, 1506 mlmepriv.assoc_timer); 1507 struct mlme_priv *pmlmepriv = &adapter->mlmepriv; 1508 1509 if (adapter->bDriverStopped || adapter->bSurpriseRemoved) 1510 return; 1511 1512 spin_lock_bh(&pmlmepriv->lock); 1513 1514 if (rtw_to_roam(adapter) > 0) { /* join timeout caused by roaming */ 1515 while (1) { 1516 rtw_dec_to_roam(adapter); 1517 if (rtw_to_roam(adapter) != 0) { /* try another */ 1518 int do_join_r; 1519 1520 do_join_r = rtw_do_join(adapter); 1521 if (do_join_r != _SUCCESS) 1522 continue; 1523 1524 break; 1525 } 1526 1527 rtw_indicate_disconnect(adapter); 1528 break; 1529 } 1530 1531 } else { 1532 rtw_indicate_disconnect(adapter); 1533 free_scanqueue(pmlmepriv);/* */ 1534 1535 /* indicate disconnect for the case that join_timeout and check_fwstate != FW_LINKED */ 1536 rtw_cfg80211_indicate_disconnect(adapter); 1537 } 1538 1539 spin_unlock_bh(&pmlmepriv->lock); 1540 } 1541 1542 /* 1543 * rtw_scan_timeout_handler - Timeout/Failure handler for CMD SiteSurvey 1544 * @adapter: pointer to struct adapter structure 1545 */ 1546 void rtw_scan_timeout_handler(struct timer_list *t) 1547 { 1548 struct adapter *adapter = timer_container_of(adapter, t, 1549 mlmepriv.scan_to_timer); 1550 struct mlme_priv *pmlmepriv = &adapter->mlmepriv; 1551 1552 spin_lock_bh(&pmlmepriv->lock); 1553 1554 _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); 1555 1556 spin_unlock_bh(&pmlmepriv->lock); 1557 1558 rtw_indicate_scan_done(adapter, true); 1559 } 1560 1561 void rtw_mlme_reset_auto_scan_int(struct adapter *adapter) 1562 { 1563 struct mlme_priv *mlme = &adapter->mlmepriv; 1564 struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; 1565 struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; 1566 1567 if (pmlmeinfo->VHT_enable) /* disable auto scan when connect to 11AC AP */ 1568 mlme->auto_scan_int_ms = 0; 1569 else if (adapter->registrypriv.wifi_spec && is_client_associated_to_ap(adapter) == true) 1570 mlme->auto_scan_int_ms = 60 * 1000; 1571 else if (rtw_chk_roam_flags(adapter, RTW_ROAM_ACTIVE)) { 1572 if (check_fwstate(mlme, WIFI_STATION_STATE) && check_fwstate(mlme, _FW_LINKED)) 1573 mlme->auto_scan_int_ms = mlme->roam_scan_int_ms; 1574 } else 1575 mlme->auto_scan_int_ms = 0; /* disabled */ 1576 } 1577 1578 static void rtw_auto_scan_handler(struct adapter *padapter) 1579 { 1580 struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 1581 1582 rtw_mlme_reset_auto_scan_int(padapter); 1583 1584 if (pmlmepriv->auto_scan_int_ms != 0 1585 && jiffies_to_msecs(jiffies - pmlmepriv->scan_start_time) > pmlmepriv->auto_scan_int_ms) { 1586 if (!padapter->registrypriv.wifi_spec) { 1587 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING)) 1588 goto exit; 1589 1590 if (pmlmepriv->link_detect_info.busy_traffic) 1591 goto exit; 1592 } 1593 1594 rtw_set_802_11_bssid_list_scan(padapter, NULL, 0); 1595 } 1596 1597 exit: 1598 return; 1599 } 1600 1601 void rtw_dynamic_check_timer_handler(struct adapter *adapter) 1602 { 1603 if (!adapter) 1604 return; 1605 1606 if (!adapter->hw_init_completed) 1607 return; 1608 1609 if (adapter->bDriverStopped || adapter->bSurpriseRemoved) 1610 return; 1611 1612 if (adapter->net_closed) 1613 return; 1614 1615 if ((adapter_to_pwrctl(adapter)->fw_current_in_ps_mode) 1616 && !(hal_btcoex_IsBtControlLps(adapter)) 1617 ) { 1618 bool should_enter_ps; 1619 1620 linked_status_chk(adapter); 1621 1622 should_enter_ps = traffic_status_watchdog(adapter, true); 1623 if (should_enter_ps) { 1624 /* rtw_lps_ctrl_wk_cmd(adapter, LPS_CTRL_ENTER, 1); */ 1625 rtw_hal_dm_watchdog_in_lps(adapter); 1626 } else { 1627 /* call rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE, 1) in traffic_status_watchdog() */ 1628 } 1629 1630 } else { 1631 rtw_dynamic_chk_wk_cmd(adapter); 1632 } 1633 1634 /* auto site survey */ 1635 rtw_auto_scan_handler(adapter); 1636 } 1637 1638 inline bool rtw_is_scan_deny(struct adapter *adapter) 1639 { 1640 struct mlme_priv *mlmepriv = &adapter->mlmepriv; 1641 1642 return (atomic_read(&mlmepriv->set_scan_deny) != 0) ? true : false; 1643 } 1644 1645 inline void rtw_clear_scan_deny(struct adapter *adapter) 1646 { 1647 struct mlme_priv *mlmepriv = &adapter->mlmepriv; 1648 1649 atomic_set(&mlmepriv->set_scan_deny, 0); 1650 } 1651 1652 void rtw_set_scan_deny(struct adapter *adapter, u32 ms) 1653 { 1654 struct mlme_priv *mlmepriv = &adapter->mlmepriv; 1655 1656 atomic_set(&mlmepriv->set_scan_deny, 1); 1657 _set_timer(&mlmepriv->set_scan_deny_timer, ms); 1658 } 1659 1660 /* 1661 * Select a new roaming candidate from the original @param candidate and @param competitor 1662 * @return true: candidate is updated 1663 * @return false: candidate is not updated 1664 */ 1665 static int rtw_check_roaming_candidate(struct mlme_priv *mlme 1666 , struct wlan_network **candidate, struct wlan_network *competitor) 1667 { 1668 int updated = false; 1669 struct adapter *adapter = container_of(mlme, struct adapter, mlmepriv); 1670 1671 if (is_same_ess(&competitor->network, &mlme->cur_network.network) == false) 1672 goto exit; 1673 1674 if (rtw_is_desired_network(adapter, competitor) == false) 1675 goto exit; 1676 1677 /* got specific addr to roam */ 1678 if (!is_zero_ether_addr(mlme->roam_tgt_addr)) { 1679 if (!memcmp(mlme->roam_tgt_addr, competitor->network.mac_address, ETH_ALEN)) 1680 goto update; 1681 else 1682 goto exit; 1683 } 1684 if (jiffies_to_msecs(jiffies - competitor->last_scanned) >= mlme->roam_scanr_exp_ms) 1685 goto exit; 1686 1687 if (competitor->network.rssi - mlme->cur_network_scanned->network.rssi < mlme->roam_rssi_diff_th) 1688 goto exit; 1689 1690 if (*candidate && (*candidate)->network.rssi >= competitor->network.rssi) 1691 goto exit; 1692 1693 update: 1694 *candidate = competitor; 1695 updated = true; 1696 1697 exit: 1698 return updated; 1699 } 1700 1701 int rtw_select_roaming_candidate(struct mlme_priv *mlme) 1702 { 1703 int ret = _FAIL; 1704 struct list_head *phead; 1705 struct __queue *queue = &mlme->scanned_queue; 1706 struct wlan_network *pnetwork = NULL; 1707 struct wlan_network *candidate = NULL; 1708 1709 if (!mlme->cur_network_scanned) { 1710 rtw_warn_on(1); 1711 return ret; 1712 } 1713 1714 spin_lock_bh(&mlme->scanned_queue.lock); 1715 phead = get_list_head(queue); 1716 1717 list_for_each(mlme->pscanned, phead) { 1718 pnetwork = list_entry(mlme->pscanned, struct wlan_network, 1719 list); 1720 1721 rtw_check_roaming_candidate(mlme, &candidate, pnetwork); 1722 } 1723 1724 if (!candidate) { 1725 ret = _FAIL; 1726 goto exit; 1727 } else { 1728 mlme->roam_network = candidate; 1729 1730 if (!memcmp(candidate->network.mac_address, mlme->roam_tgt_addr, ETH_ALEN)) 1731 eth_zero_addr(mlme->roam_tgt_addr); 1732 } 1733 1734 ret = _SUCCESS; 1735 exit: 1736 spin_unlock_bh(&mlme->scanned_queue.lock); 1737 1738 return ret; 1739 } 1740 1741 /* 1742 * Select a new join candidate from the original @param candidate and @param competitor 1743 * @return true: candidate is updated 1744 * @return false: candidate is not updated 1745 */ 1746 static int rtw_check_join_candidate(struct mlme_priv *mlme 1747 , struct wlan_network **candidate, struct wlan_network *competitor) 1748 { 1749 int updated = false; 1750 struct adapter *adapter = container_of(mlme, struct adapter, mlmepriv); 1751 1752 /* check bssid, if needed */ 1753 if (mlme->assoc_by_bssid) { 1754 if (memcmp(competitor->network.mac_address, mlme->assoc_bssid, ETH_ALEN)) 1755 goto exit; 1756 } 1757 1758 /* check ssid, if needed */ 1759 if (mlme->assoc_ssid.ssid[0] && mlme->assoc_ssid.ssid_length) { 1760 if (competitor->network.ssid.ssid_length != mlme->assoc_ssid.ssid_length 1761 || memcmp(competitor->network.ssid.ssid, mlme->assoc_ssid.ssid, mlme->assoc_ssid.ssid_length) 1762 ) 1763 goto exit; 1764 } 1765 1766 if (rtw_is_desired_network(adapter, competitor) == false) 1767 goto exit; 1768 1769 if (rtw_to_roam(adapter) > 0) { 1770 if (jiffies_to_msecs(jiffies - competitor->last_scanned) >= mlme->roam_scanr_exp_ms 1771 || is_same_ess(&competitor->network, &mlme->cur_network.network) == false 1772 ) 1773 goto exit; 1774 } 1775 1776 if (!*candidate || (*candidate)->network.rssi < competitor->network.rssi) { 1777 *candidate = competitor; 1778 updated = true; 1779 } 1780 1781 exit: 1782 return updated; 1783 } 1784 1785 /* 1786 * Calling context: 1787 * The caller of the sub-routine will be in critical section... 1788 * The caller must hold the following spinlock 1789 * pmlmepriv->lock 1790 */ 1791 1792 int rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv) 1793 { 1794 int ret; 1795 struct list_head *phead; 1796 struct adapter *adapter; 1797 struct __queue *queue = &pmlmepriv->scanned_queue; 1798 struct wlan_network *pnetwork = NULL; 1799 struct wlan_network *candidate = NULL; 1800 1801 adapter = (struct adapter *)pmlmepriv->nic_hdl; 1802 1803 spin_lock_bh(&pmlmepriv->scanned_queue.lock); 1804 1805 if (pmlmepriv->roam_network) { 1806 candidate = pmlmepriv->roam_network; 1807 pmlmepriv->roam_network = NULL; 1808 goto candidate_exist; 1809 } 1810 1811 phead = get_list_head(queue); 1812 list_for_each(pmlmepriv->pscanned, phead) { 1813 pnetwork = list_entry(pmlmepriv->pscanned, 1814 struct wlan_network, list); 1815 1816 rtw_check_join_candidate(pmlmepriv, &candidate, pnetwork); 1817 } 1818 1819 if (!candidate) { 1820 ret = _FAIL; 1821 goto exit; 1822 } else { 1823 goto candidate_exist; 1824 } 1825 1826 candidate_exist: 1827 1828 /* check for situation of _FW_LINKED */ 1829 if (check_fwstate(pmlmepriv, _FW_LINKED)) { 1830 rtw_disassoc_cmd(adapter, 0, true); 1831 rtw_indicate_disconnect(adapter); 1832 rtw_free_assoc_resources(adapter, 0); 1833 } 1834 1835 set_fwstate(pmlmepriv, _FW_UNDER_LINKING); 1836 ret = rtw_joinbss_cmd(adapter, candidate); 1837 1838 exit: 1839 spin_unlock_bh(&pmlmepriv->scanned_queue.lock); 1840 return ret; 1841 } 1842 1843 signed int rtw_set_auth(struct adapter *adapter, struct security_priv *psecuritypriv) 1844 { 1845 struct cmd_obj *pcmd; 1846 struct setauth_parm *psetauthparm; 1847 struct cmd_priv *pcmdpriv = &adapter->cmdpriv; 1848 signed int res = _SUCCESS; 1849 1850 pcmd = kzalloc_obj(*pcmd); 1851 if (!pcmd) { 1852 res = _FAIL; /* try again */ 1853 goto exit; 1854 } 1855 1856 psetauthparm = kzalloc_obj(*psetauthparm); 1857 if (!psetauthparm) { 1858 kfree(pcmd); 1859 res = _FAIL; 1860 goto exit; 1861 } 1862 1863 psetauthparm->mode = (unsigned char)psecuritypriv->dot11AuthAlgrthm; 1864 1865 pcmd->cmdcode = _SetAuth_CMD_; 1866 pcmd->parmbuf = (unsigned char *)psetauthparm; 1867 pcmd->cmdsz = (sizeof(struct setauth_parm)); 1868 pcmd->rsp = NULL; 1869 pcmd->rspsz = 0; 1870 1871 INIT_LIST_HEAD(&pcmd->list); 1872 1873 res = rtw_enqueue_cmd(pcmdpriv, pcmd); 1874 1875 exit: 1876 return res; 1877 } 1878 1879 signed int rtw_set_key(struct adapter *adapter, struct security_priv *psecuritypriv, signed int keyid, u8 set_tx, bool enqueue) 1880 { 1881 u8 keylen; 1882 struct cmd_obj *pcmd; 1883 struct setkey_parm *psetkeyparm; 1884 struct cmd_priv *pcmdpriv = &adapter->cmdpriv; 1885 signed int res = _SUCCESS; 1886 1887 psetkeyparm = kzalloc_obj(*psetkeyparm); 1888 if (!psetkeyparm) { 1889 res = _FAIL; 1890 goto exit; 1891 } 1892 1893 if (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) 1894 psetkeyparm->algorithm = (unsigned char)psecuritypriv->dot118021XGrpPrivacy; 1895 else 1896 psetkeyparm->algorithm = (u8)psecuritypriv->dot11PrivacyAlgrthm; 1897 1898 psetkeyparm->keyid = (u8)keyid;/* 0~3 */ 1899 psetkeyparm->set_tx = set_tx; 1900 if (is_wep_enc(psetkeyparm->algorithm)) 1901 adapter->securitypriv.key_mask |= BIT(psetkeyparm->keyid); 1902 1903 switch (psetkeyparm->algorithm) { 1904 case _WEP40_: 1905 keylen = 5; 1906 memcpy(&psetkeyparm->key[0], &psecuritypriv->dot11DefKey[keyid].skey[0], keylen); 1907 break; 1908 case _WEP104_: 1909 keylen = 13; 1910 memcpy(&psetkeyparm->key[0], &psecuritypriv->dot11DefKey[keyid].skey[0], keylen); 1911 break; 1912 case _TKIP_: 1913 keylen = 16; 1914 memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen); 1915 psetkeyparm->grpkey = 1; 1916 break; 1917 case _AES_: 1918 keylen = 16; 1919 memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen); 1920 psetkeyparm->grpkey = 1; 1921 break; 1922 default: 1923 res = _FAIL; 1924 kfree(psetkeyparm); 1925 goto exit; 1926 } 1927 1928 if (enqueue) { 1929 pcmd = kzalloc_obj(*pcmd); 1930 if (!pcmd) { 1931 kfree(psetkeyparm); 1932 res = _FAIL; /* try again */ 1933 goto exit; 1934 } 1935 1936 pcmd->cmdcode = _SetKey_CMD_; 1937 pcmd->parmbuf = (u8 *)psetkeyparm; 1938 pcmd->cmdsz = (sizeof(struct setkey_parm)); 1939 pcmd->rsp = NULL; 1940 pcmd->rspsz = 0; 1941 1942 INIT_LIST_HEAD(&pcmd->list); 1943 1944 res = rtw_enqueue_cmd(pcmdpriv, pcmd); 1945 } else { 1946 setkey_hdl(adapter, (u8 *)psetkeyparm); 1947 kfree(psetkeyparm); 1948 } 1949 exit: 1950 return res; 1951 } 1952 1953 /* adjust ies for rtw_joinbss_cmd in WMM */ 1954 int rtw_restruct_wmm_ie(struct adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_len, uint initial_out_len) 1955 { 1956 unsigned int ielength = 0; 1957 unsigned int i, j; 1958 1959 i = 12; /* after the fixed IE */ 1960 while (i < in_len) { 1961 ielength = initial_out_len; 1962 1963 if (i + 5 < in_len && 1964 in_ie[i] == 0xDD && in_ie[i + 2] == 0x00 && 1965 in_ie[i + 3] == 0x50 && in_ie[i + 4] == 0xF2 && 1966 in_ie[i + 5] == 0x02) { 1967 for (j = i; j < i + 9; j++) { 1968 out_ie[ielength] = in_ie[j]; 1969 ielength++; 1970 } 1971 out_ie[initial_out_len + 1] = 0x07; 1972 out_ie[initial_out_len + 6] = 0x00; 1973 out_ie[initial_out_len + 8] = 0x00; 1974 1975 break; 1976 } 1977 1978 i += (in_ie[i + 1] + 2); /* to the next IE element */ 1979 } 1980 1981 return ielength; 1982 } 1983 1984 /* Ported from 8185: IsInPreAuthKeyList(). 1985 * (Renamed from SecIsInPreAuthKeyList(), 2006-10-13.) 1986 * Added by Annie, 2006-05-07. 1987 * 1988 * Search by BSSID, 1989 * 1990 * Return Value: 1991 * -1: if there is no pre-auth key in the table 1992 * >=0: if there is pre-auth key, and return the entry id 1993 */ 1994 static int SecIsInPMKIDList(struct adapter *Adapter, u8 *bssid) 1995 { 1996 struct security_priv *p = &Adapter->securitypriv; 1997 int i; 1998 1999 for (i = 0; i < NUM_PMKID_CACHE; i++) 2000 if ((p->PMKIDList[i].bUsed) && 2001 (!memcmp(p->PMKIDList[i].Bssid, bssid, ETH_ALEN))) 2002 return i; 2003 return -1; 2004 } 2005 2006 /* */ 2007 /* Check the RSN IE length */ 2008 /* If the RSN IE length <= 20, the RSN IE didn't include the PMKID information */ 2009 /* 0-11th element in the array are the fixed IE */ 2010 /* 12th element in the array is the IE */ 2011 /* 13th element in the array is the IE length */ 2012 /* */ 2013 2014 static int rtw_append_pmkid(struct adapter *Adapter, int iEntry, u8 *ie, uint ie_len) 2015 { 2016 struct security_priv *psecuritypriv = &Adapter->securitypriv; 2017 2018 if (ie[13] <= 20) { 2019 /* The RSN IE didn't include the PMK ID, append the PMK information */ 2020 ie[ie_len] = 1; 2021 ie_len++; 2022 ie[ie_len] = 0; /* PMKID count = 0x0100 */ 2023 ie_len++; 2024 memcpy(&ie[ie_len], &psecuritypriv->PMKIDList[iEntry].PMKID, 16); 2025 ie_len += 16; 2026 ie[13] += 18;/* PMKID length = 2+16 */ 2027 } 2028 return ie_len; 2029 } 2030 2031 static void rtw_report_sec_ie(struct adapter *adapter, u8 authmode, u8 *sec_ie) 2032 { 2033 uint len; 2034 u8 *buff, *p; 2035 union iwreq_data wrqu; 2036 2037 buff = NULL; 2038 if (authmode == WLAN_EID_VENDOR_SPECIFIC) { 2039 buff = kzalloc(IW_CUSTOM_MAX, GFP_ATOMIC); 2040 if (!buff) 2041 return; 2042 2043 p = buff; 2044 2045 p += scnprintf(p, IW_CUSTOM_MAX - (p - buff), "ASSOCINFO(ReqIEs ="); 2046 2047 len = sec_ie[1] + 2; 2048 len = (len < IW_CUSTOM_MAX) ? len : IW_CUSTOM_MAX; 2049 2050 p += scnprintf(p, IW_CUSTOM_MAX - (p - buff), " %*ph", len, sec_ie); 2051 2052 p += scnprintf(p, IW_CUSTOM_MAX - (p - buff), ")"); 2053 2054 memset(&wrqu, 0, sizeof(wrqu)); 2055 2056 wrqu.data.length = p - buff; 2057 2058 wrqu.data.length = (wrqu.data.length < IW_CUSTOM_MAX) ? wrqu.data.length : IW_CUSTOM_MAX; 2059 2060 kfree(buff); 2061 } 2062 } 2063 2064 signed int rtw_restruct_sec_ie(struct adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_len) 2065 { 2066 u8 authmode = 0x0; 2067 uint ielength; 2068 int iEntry; 2069 2070 struct mlme_priv *pmlmepriv = &adapter->mlmepriv; 2071 struct security_priv *psecuritypriv = &adapter->securitypriv; 2072 uint ndisauthmode = psecuritypriv->ndisauthtype; 2073 2074 /* copy fixed ie only */ 2075 memcpy(out_ie, in_ie, 12); 2076 ielength = 12; 2077 if ((ndisauthmode == Ndis802_11AuthModeWPA) || (ndisauthmode == Ndis802_11AuthModeWPAPSK)) 2078 authmode = WLAN_EID_VENDOR_SPECIFIC; 2079 if ((ndisauthmode == Ndis802_11AuthModeWPA2) || (ndisauthmode == Ndis802_11AuthModeWPA2PSK)) 2080 authmode = WLAN_EID_RSN; 2081 2082 if (check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) { 2083 memcpy(out_ie + ielength, psecuritypriv->wps_ie, psecuritypriv->wps_ie_len); 2084 2085 ielength += psecuritypriv->wps_ie_len; 2086 } else if ((authmode == WLAN_EID_VENDOR_SPECIFIC) || (authmode == WLAN_EID_RSN)) { 2087 /* copy RSN or SSN */ 2088 memcpy(&out_ie[ielength], &psecuritypriv->supplicant_ie[0], psecuritypriv->supplicant_ie[1] + 2); 2089 ielength += psecuritypriv->supplicant_ie[1] + 2; 2090 rtw_report_sec_ie(adapter, authmode, psecuritypriv->supplicant_ie); 2091 } 2092 2093 iEntry = SecIsInPMKIDList(adapter, pmlmepriv->assoc_bssid); 2094 if (iEntry < 0) 2095 return ielength; 2096 2097 if (authmode == WLAN_EID_RSN) 2098 ielength = rtw_append_pmkid(adapter, iEntry, out_ie, ielength); 2099 2100 return ielength; 2101 } 2102 2103 void rtw_init_registrypriv_dev_network(struct adapter *adapter) 2104 { 2105 struct registry_priv *pregistrypriv = &adapter->registrypriv; 2106 struct eeprom_priv *peepriv = &adapter->eeprompriv; 2107 struct wlan_bssid_ex *pdev_network = &pregistrypriv->dev_network; 2108 u8 *myhwaddr = myid(peepriv); 2109 2110 memcpy(pdev_network->mac_address, myhwaddr, ETH_ALEN); 2111 2112 memcpy(&pdev_network->ssid, &pregistrypriv->ssid, sizeof(struct ndis_802_11_ssid)); 2113 2114 pdev_network->configuration.length = sizeof(struct ndis_802_11_conf); 2115 pdev_network->configuration.beacon_period = 100; 2116 } 2117 2118 void rtw_update_registrypriv_dev_network(struct adapter *adapter) 2119 { 2120 int sz = 0; 2121 struct registry_priv *pregistrypriv = &adapter->registrypriv; 2122 struct wlan_bssid_ex *pdev_network = &pregistrypriv->dev_network; 2123 struct security_priv *psecuritypriv = &adapter->securitypriv; 2124 struct wlan_network *cur_network = &adapter->mlmepriv.cur_network; 2125 2126 pdev_network->privacy = (psecuritypriv->dot11PrivacyAlgrthm > 0 ? 1 : 0) ; /* adhoc no 802.1x */ 2127 2128 pdev_network->rssi = 0; 2129 2130 switch (pregistrypriv->wireless_mode) { 2131 case WIRELESS_11B: 2132 pdev_network->network_type_in_use = (Ndis802_11DS); 2133 break; 2134 case WIRELESS_11G: 2135 case WIRELESS_11BG: 2136 case WIRELESS_11_24N: 2137 case WIRELESS_11G_24N: 2138 case WIRELESS_11BG_24N: 2139 pdev_network->network_type_in_use = (Ndis802_11OFDM24); 2140 break; 2141 default: 2142 /* TODO */ 2143 break; 2144 } 2145 2146 pdev_network->configuration.ds_config = (pregistrypriv->channel); 2147 2148 if (cur_network->network.infrastructure_mode == Ndis802_11IBSS) 2149 pdev_network->configuration.atim_window = (0); 2150 2151 pdev_network->infrastructure_mode = (cur_network->network.infrastructure_mode); 2152 2153 /* 1. Supported rates */ 2154 /* 2. IE */ 2155 2156 /* rtw_set_supported_rate(pdev_network->supported_rates, pregistrypriv->wireless_mode) ; will be called in rtw_generate_ie */ 2157 sz = rtw_generate_ie(pregistrypriv); 2158 2159 pdev_network->ie_length = sz; 2160 2161 pdev_network->length = get_wlan_bssid_ex_sz((struct wlan_bssid_ex *)pdev_network); 2162 2163 /* notes: translate ie_length & length after assign the length to cmdsz in createbss_cmd(); */ 2164 /* pdev_network->ie_length = cpu_to_le32(sz); */ 2165 } 2166 2167 /* the function is at passive_level */ 2168 void rtw_joinbss_reset(struct adapter *padapter) 2169 { 2170 u8 threshold; 2171 struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 2172 2173 struct ht_priv *phtpriv = &pmlmepriv->htpriv; 2174 2175 /* todo: if you want to do something io/reg/hw setting before join_bss, please add code here */ 2176 2177 pmlmepriv->num_FortyMHzIntolerant = 0; 2178 2179 pmlmepriv->num_sta_no_ht = 0; 2180 2181 phtpriv->ampdu_enable = false;/* reset to disabled */ 2182 2183 /* TH = 1 => means that invalidate usb rx aggregation */ 2184 /* TH = 0 => means that validate usb rx aggregation, use init value. */ 2185 if (phtpriv->ht_option) { 2186 if (padapter->registrypriv.wifi_spec == 1) 2187 threshold = 1; 2188 else 2189 threshold = 0; 2190 rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); 2191 } else { 2192 threshold = 1; 2193 rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); 2194 } 2195 } 2196 2197 void rtw_ht_use_default_setting(struct adapter *padapter) 2198 { 2199 struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 2200 struct ht_priv *phtpriv = &pmlmepriv->htpriv; 2201 struct registry_priv *pregistrypriv = &padapter->registrypriv; 2202 bool bHwLDPCSupport = false, bHwSTBCSupport = false; 2203 bool bHwSupportBeamformer = false, bHwSupportBeamformee = false; 2204 2205 if (pregistrypriv->wifi_spec) 2206 phtpriv->bss_coexist = 1; 2207 else 2208 phtpriv->bss_coexist = 0; 2209 2210 phtpriv->sgi_40m = TEST_FLAG(pregistrypriv->short_gi, BIT1) ? true : false; 2211 phtpriv->sgi_20m = TEST_FLAG(pregistrypriv->short_gi, BIT0) ? true : false; 2212 2213 /* LDPC support */ 2214 rtw_hal_get_def_var(padapter, HAL_DEF_RX_LDPC, (u8 *)&bHwLDPCSupport); 2215 CLEAR_FLAGS(phtpriv->ldpc_cap); 2216 if (bHwLDPCSupport) { 2217 if (TEST_FLAG(pregistrypriv->ldpc_cap, BIT4)) 2218 SET_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_RX); 2219 } 2220 rtw_hal_get_def_var(padapter, HAL_DEF_TX_LDPC, (u8 *)&bHwLDPCSupport); 2221 if (bHwLDPCSupport) { 2222 if (TEST_FLAG(pregistrypriv->ldpc_cap, BIT5)) 2223 SET_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_TX); 2224 } 2225 2226 /* STBC */ 2227 rtw_hal_get_def_var(padapter, HAL_DEF_TX_STBC, (u8 *)&bHwSTBCSupport); 2228 CLEAR_FLAGS(phtpriv->stbc_cap); 2229 if (bHwSTBCSupport) { 2230 if (TEST_FLAG(pregistrypriv->stbc_cap, BIT5)) 2231 SET_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX); 2232 } 2233 rtw_hal_get_def_var(padapter, HAL_DEF_RX_STBC, (u8 *)&bHwSTBCSupport); 2234 if (bHwSTBCSupport) { 2235 if (TEST_FLAG(pregistrypriv->stbc_cap, BIT4)) 2236 SET_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_RX); 2237 } 2238 2239 /* Beamforming setting */ 2240 rtw_hal_get_def_var(padapter, HAL_DEF_EXPLICIT_BEAMFORMER, (u8 *)&bHwSupportBeamformer); 2241 rtw_hal_get_def_var(padapter, HAL_DEF_EXPLICIT_BEAMFORMEE, (u8 *)&bHwSupportBeamformee); 2242 CLEAR_FLAGS(phtpriv->beamform_cap); 2243 if (TEST_FLAG(pregistrypriv->beamform_cap, BIT4) && bHwSupportBeamformer) 2244 SET_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE); 2245 2246 if (TEST_FLAG(pregistrypriv->beamform_cap, BIT5) && bHwSupportBeamformee) 2247 SET_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE); 2248 } 2249 2250 void rtw_build_wmm_ie_ht(struct adapter *padapter, u8 *out_ie, uint *pout_len) 2251 { 2252 unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; 2253 int out_len; 2254 2255 if (padapter->mlmepriv.qospriv.qos_option == 0) { 2256 out_len = *pout_len; 2257 rtw_set_ie(out_ie + out_len, WLAN_EID_VENDOR_SPECIFIC, 2258 _WMM_IE_Length_, WMM_IE, pout_len); 2259 2260 padapter->mlmepriv.qospriv.qos_option = 1; 2261 } 2262 } 2263 2264 /* the function is >= passive_level */ 2265 unsigned int rtw_restructure_ht_ie(struct adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len, u8 channel) 2266 { 2267 u32 ielen, out_len; 2268 enum ieee80211_max_ampdu_length_exp max_rx_ampdu_factor; 2269 unsigned char *p; 2270 struct ieee80211_ht_cap ht_capie; 2271 u8 cbw40_enable = 0, stbc_rx_enable = 0, operation_bw = 0; 2272 struct registry_priv *pregistrypriv = &padapter->registrypriv; 2273 struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 2274 struct ht_priv *phtpriv = &pmlmepriv->htpriv; 2275 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; 2276 2277 phtpriv->ht_option = false; 2278 2279 out_len = *pout_len; 2280 2281 memset(&ht_capie, 0, sizeof(struct ieee80211_ht_cap)); 2282 2283 ht_capie.cap_info = cpu_to_le16(IEEE80211_HT_CAP_DSSSCCK40); 2284 2285 if (phtpriv->sgi_20m) 2286 ht_capie.cap_info |= cpu_to_le16(IEEE80211_HT_CAP_SGI_20); 2287 2288 /* Get HT BW */ 2289 if (!in_ie) { 2290 /* TDLS: TODO 20/40 issue */ 2291 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { 2292 operation_bw = padapter->mlmeextpriv.cur_bwmode; 2293 if (operation_bw > CHANNEL_WIDTH_40) 2294 operation_bw = CHANNEL_WIDTH_40; 2295 } else 2296 /* TDLS: TODO 40? */ 2297 operation_bw = CHANNEL_WIDTH_40; 2298 } else { 2299 p = rtw_get_ie(in_ie, WLAN_EID_HT_OPERATION, &ielen, in_len); 2300 if (p && (ielen == sizeof(struct ieee80211_ht_addt_info))) { 2301 struct HT_info_element *pht_info = (struct HT_info_element *)(p + 2); 2302 2303 if (pht_info->infos[0] & BIT(2)) { 2304 switch (pht_info->infos[0] & 0x3) { 2305 case 1: 2306 case 3: 2307 operation_bw = CHANNEL_WIDTH_40; 2308 break; 2309 default: 2310 operation_bw = CHANNEL_WIDTH_20; 2311 break; 2312 } 2313 } else { 2314 operation_bw = CHANNEL_WIDTH_20; 2315 } 2316 } 2317 } 2318 2319 /* to disable 40M Hz support while gd_bw_40MHz_en = 0 */ 2320 if ((pregistrypriv->bw_mode & 0x0f) > 0) 2321 cbw40_enable = 1; 2322 2323 if ((cbw40_enable == 1) && (operation_bw == CHANNEL_WIDTH_40)) { 2324 ht_capie.cap_info |= cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH); 2325 if (phtpriv->sgi_40m) 2326 ht_capie.cap_info |= cpu_to_le16(IEEE80211_HT_CAP_SGI_40); 2327 } 2328 2329 if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX)) 2330 ht_capie.cap_info |= cpu_to_le16(IEEE80211_HT_CAP_TX_STBC); 2331 2332 /* todo: disable SM power save mode */ 2333 ht_capie.cap_info |= cpu_to_le16(IEEE80211_HT_CAP_SM_PS); 2334 2335 if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_RX)) { 2336 if ((channel <= 14 && pregistrypriv->rx_stbc == 0x1) || /* enable for 2.4GHz */ 2337 (pregistrypriv->wifi_spec == 1)) 2338 stbc_rx_enable = 1; 2339 } 2340 2341 /* fill default supported_mcs_set */ 2342 memcpy(&ht_capie.mcs, pmlmeext->default_supported_mcs_set, 16); 2343 2344 /* update default supported_mcs_set */ 2345 if (stbc_rx_enable) 2346 ht_capie.cap_info |= cpu_to_le16(IEEE80211_HT_CAP_RX_STBC_1R);/* RX STBC One spatial stream */ 2347 2348 set_mcs_rate_by_mask(ht_capie.mcs.rx_mask, MCS_RATE_1R); 2349 2350 { 2351 u32 rx_packet_offset, max_recvbuf_sz; 2352 2353 rtw_hal_get_def_var(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); 2354 rtw_hal_get_def_var(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); 2355 } 2356 2357 if (padapter->driver_rx_ampdu_factor != 0xFF) 2358 max_rx_ampdu_factor = 2359 (enum ieee80211_max_ampdu_length_exp)padapter->driver_rx_ampdu_factor; 2360 else 2361 rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, 2362 &max_rx_ampdu_factor); 2363 2364 ht_capie.ampdu_params_info = (max_rx_ampdu_factor & 0x03); 2365 2366 if (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_) 2367 ht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY & (0x07 << 2)); 2368 else 2369 ht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY & 0x00); 2370 2371 rtw_set_ie(out_ie + out_len, WLAN_EID_HT_CAPABILITY, 2372 sizeof(struct ieee80211_ht_cap), (unsigned char *)&ht_capie, pout_len); 2373 2374 phtpriv->ht_option = true; 2375 2376 if (in_ie) { 2377 p = rtw_get_ie(in_ie, WLAN_EID_HT_OPERATION, &ielen, in_len); 2378 if (p && (ielen == sizeof(struct ieee80211_ht_addt_info))) { 2379 out_len = *pout_len; 2380 rtw_set_ie(out_ie + out_len, WLAN_EID_HT_OPERATION, ielen, p + 2, pout_len); 2381 } 2382 } 2383 2384 return phtpriv->ht_option; 2385 } 2386 2387 /* the function is > passive_level (in critical_section) */ 2388 void rtw_update_ht_cap(struct adapter *padapter, u8 *pie, uint ie_len, u8 channel) 2389 { 2390 u8 *p, max_ampdu_sz; 2391 int len; 2392 struct ieee80211_ht_cap *pht_capie; 2393 struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 2394 struct ht_priv *phtpriv = &pmlmepriv->htpriv; 2395 struct registry_priv *pregistrypriv = &padapter->registrypriv; 2396 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; 2397 struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; 2398 u8 cbw40_enable = 0; 2399 2400 if (!phtpriv->ht_option) 2401 return; 2402 2403 if ((!pmlmeinfo->HT_info_enable) || (!pmlmeinfo->HT_caps_enable)) 2404 return; 2405 2406 /* maybe needs check if ap supports rx ampdu. */ 2407 if (!(phtpriv->ampdu_enable) && pregistrypriv->ampdu_enable == 1) 2408 phtpriv->ampdu_enable = true; 2409 2410 /* check Max Rx A-MPDU Size */ 2411 len = 0; 2412 p = rtw_get_ie(pie + sizeof(struct ndis_802_11_fix_ie), WLAN_EID_HT_CAPABILITY, &len, ie_len - sizeof(struct ndis_802_11_fix_ie)); 2413 if (p && len > 0) { 2414 pht_capie = (struct ieee80211_ht_cap *)(p + 2); 2415 max_ampdu_sz = (pht_capie->ampdu_params_info & IEEE80211_HT_CAP_AMPDU_FACTOR); 2416 max_ampdu_sz = 1 << (max_ampdu_sz + 3); /* max_ampdu_sz (kbytes); */ 2417 2418 phtpriv->rx_ampdu_maxlen = max_ampdu_sz; 2419 } 2420 2421 len = 0; 2422 p = rtw_get_ie(pie + sizeof(struct ndis_802_11_fix_ie), WLAN_EID_HT_OPERATION, &len, ie_len - sizeof(struct ndis_802_11_fix_ie)); 2423 if (p && len > 0) { 2424 /* todo: */ 2425 } 2426 2427 if ((pregistrypriv->bw_mode & 0x0f) > 0) 2428 cbw40_enable = 1; 2429 2430 /* update cur_bwmode & cur_ch_offset */ 2431 if ((cbw40_enable) && 2432 (le16_to_cpu(pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info) & 2433 BIT(1)) && (pmlmeinfo->HT_info.infos[0] & BIT(2))) { 2434 int i; 2435 2436 /* update the MCS set */ 2437 for (i = 0; i < 16; i++) 2438 pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= pmlmeext->default_supported_mcs_set[i]; 2439 2440 /* update the MCS rates */ 2441 set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_1R); 2442 2443 /* switch to the 40M Hz mode according to the AP */ 2444 /* pmlmeext->cur_bwmode = CHANNEL_WIDTH_40; */ 2445 switch ((pmlmeinfo->HT_info.infos[0] & 0x3)) { 2446 case EXTCHNL_OFFSET_UPPER: 2447 pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; 2448 break; 2449 2450 case EXTCHNL_OFFSET_LOWER: 2451 pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; 2452 break; 2453 2454 default: 2455 pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; 2456 break; 2457 } 2458 } 2459 2460 /* */ 2461 /* Config SM Power Save setting */ 2462 /* */ 2463 pmlmeinfo->SM_PS = 2464 (le16_to_cpu(pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info) & 2465 0x0C) >> 2; 2466 2467 /* */ 2468 /* Config current HT Protection mode. */ 2469 /* */ 2470 pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3; 2471 } 2472 2473 void rtw_issue_addbareq_cmd(struct adapter *padapter, struct xmit_frame *pxmitframe) 2474 { 2475 u8 issued; 2476 int priority; 2477 struct sta_info *psta; 2478 struct ht_priv *phtpriv; 2479 struct pkt_attrib *pattrib = &pxmitframe->attrib; 2480 s32 bmcst = is_multicast_ether_addr(pattrib->ra); 2481 2482 if (bmcst || (padapter->mlmepriv.link_detect_info.num_tx_ok_in_period < 100)) 2483 return; 2484 2485 priority = pattrib->priority; 2486 2487 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); 2488 if (pattrib->psta != psta) 2489 return; 2490 2491 if (!psta) 2492 return; 2493 2494 if (!(psta->state & _FW_LINKED)) 2495 return; 2496 2497 phtpriv = &psta->htpriv; 2498 2499 if (phtpriv->ht_option && phtpriv->ampdu_enable) { 2500 issued = (phtpriv->agg_enable_bitmap >> priority) & 0x1; 2501 issued |= (phtpriv->candidate_tid_bitmap >> priority) & 0x1; 2502 2503 if (issued == 0) { 2504 psta->htpriv.candidate_tid_bitmap |= BIT((u8)priority); 2505 rtw_addbareq_cmd(padapter, (u8) priority, pattrib->ra); 2506 } 2507 } 2508 } 2509 2510 void rtw_append_exented_cap(struct adapter *padapter, u8 *out_ie, uint *pout_len) 2511 { 2512 struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 2513 struct ht_priv *phtpriv = &pmlmepriv->htpriv; 2514 u8 cap_content[8] = {0}; 2515 2516 if (phtpriv->bss_coexist) 2517 SET_EXT_CAPABILITY_ELE_BSS_COEXIST(cap_content, 1); 2518 2519 rtw_set_ie(out_ie + *pout_len, WLAN_EID_EXT_CAPABILITY, 8, cap_content, pout_len); 2520 } 2521 2522 inline void rtw_set_to_roam(struct adapter *adapter, u8 to_roam) 2523 { 2524 if (to_roam == 0) 2525 adapter->mlmepriv.to_join = false; 2526 adapter->mlmepriv.to_roam = to_roam; 2527 } 2528 2529 inline u8 rtw_dec_to_roam(struct adapter *adapter) 2530 { 2531 adapter->mlmepriv.to_roam--; 2532 return adapter->mlmepriv.to_roam; 2533 } 2534 2535 inline u8 rtw_to_roam(struct adapter *adapter) 2536 { 2537 return adapter->mlmepriv.to_roam; 2538 } 2539 2540 void rtw_roaming(struct adapter *padapter, struct wlan_network *tgt_network) 2541 { 2542 struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 2543 2544 spin_lock_bh(&pmlmepriv->lock); 2545 _rtw_roaming(padapter, tgt_network); 2546 spin_unlock_bh(&pmlmepriv->lock); 2547 } 2548 2549 void _rtw_roaming(struct adapter *padapter, struct wlan_network *tgt_network) 2550 { 2551 struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 2552 struct wlan_network *cur_network = &pmlmepriv->cur_network; 2553 2554 if (rtw_to_roam(padapter) > 0) { 2555 memcpy(&pmlmepriv->assoc_ssid, &cur_network->network.ssid, sizeof(struct ndis_802_11_ssid)); 2556 2557 pmlmepriv->assoc_by_bssid = false; 2558 2559 while (rtw_do_join(padapter) != _SUCCESS) { 2560 rtw_dec_to_roam(padapter); 2561 if (rtw_to_roam(padapter) <= 0) { 2562 rtw_indicate_disconnect(padapter); 2563 break; 2564 } 2565 } 2566 } 2567 } 2568 2569 bool rtw_linked_check(struct adapter *padapter) 2570 { 2571 if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) || 2572 check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE)) { 2573 if (padapter->stapriv.asoc_sta_count > 2) 2574 return true; 2575 } else { /* Station mode */ 2576 if (check_fwstate(&padapter->mlmepriv, _FW_LINKED)) 2577 return true; 2578 } 2579 return false; 2580 } 2581