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