diff options
Diffstat (limited to 'drivers/net/wireless/rtl8723as/core/rtw_mlme.c')
-rwxr-xr-x | drivers/net/wireless/rtl8723as/core/rtw_mlme.c | 311 |
1 files changed, 204 insertions, 107 deletions
diff --git a/drivers/net/wireless/rtl8723as/core/rtw_mlme.c b/drivers/net/wireless/rtl8723as/core/rtw_mlme.c index a827c0221b36..b5e1807c69d7 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_mlme.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_mlme.c @@ -119,7 +119,7 @@ static void rtw_free_mlme_ie_data(u8 **ppie, u32 *plen) { if(*ppie) { - _rtw_mfree(*ppie, *plen); + rtw_mfree(*ppie, *plen); *plen = 0; *ppie=NULL; } @@ -628,7 +628,7 @@ inline int is_same_ess(WLAN_BSSID_EX *a, WLAN_BSSID_EX *b) && _rtw_memcmp(a->Ssid.Ssid, b->Ssid.Ssid, a->Ssid.SsidLength)==_TRUE; } -int is_same_network(WLAN_BSSID_EX *src, WLAN_BSSID_EX *dst) +int is_same_network(WLAN_BSSID_EX *src, WLAN_BSSID_EX *dst, u8 feature) { u16 s_cap, d_cap; @@ -658,6 +658,14 @@ _func_enter_; _func_exit_; +#ifdef CONFIG_P2P + if ((feature == 1) && // 1: P2P supported + (_rtw_memcmp(src->MacAddress, dst->MacAddress, ETH_ALEN) == _TRUE) + ) { + return _TRUE; + } +#endif + return ((src->Ssid.SsidLength == dst->Ssid.SsidLength) && // (src->Configuration.DSConfig == dst->Configuration.DSConfig) && ( (_rtw_memcmp(src->MacAddress, dst->MacAddress, ETH_ALEN)) == _TRUE) && @@ -723,10 +731,10 @@ _func_enter_; rtw_hal_antdiv_rssi_compared(padapter, dst, src); //this will update src.Rssi, need consider again #endif - #if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1 + #if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) && 1 if(strcmp(dst->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) { - DBG_871X("%s %s("MAC_FMT", ch%u) ss_ori:%3u, sq_ori:%3u, rssi_ori:%3ld, ss_smp:%3u, sq_smp:%3u, rssi_smp:%3ld\n" - , __FUNCTION__ + DBG_871X(FUNC_ADPT_FMT" %s("MAC_FMT", ch%u) ss_ori:%3u, sq_ori:%3u, rssi_ori:%3ld, ss_smp:%3u, sq_smp:%3u, rssi_smp:%3ld\n" + , FUNC_ADPT_ARG(padapter) , src->Ssid.Ssid, MAC_ARG(src->MacAddress), src->Configuration.DSConfig ,ss_ori, sq_ori, rssi_ori ,ss_smp, sq_smp, rssi_smp @@ -735,7 +743,7 @@ _func_enter_; #endif /* The rule below is 1/5 for sample value, 4/5 for history value */ - if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src)) { + if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src, 0)) { /* Take the recvpriv's value for the connected AP*/ ss_final = padapter->recvpriv.signal_strength; sq_final = padapter->recvpriv.signal_qual; @@ -759,24 +767,27 @@ _func_enter_; } - if (update_ie) + if (update_ie) { + dst->Reserved[0] = src->Reserved[0]; + dst->Reserved[1] = src->Reserved[1]; _rtw_memcpy((u8 *)dst, (u8 *)src, get_WLAN_BSSID_EX_sz(src)); + } dst->PhyInfo.SignalStrength = ss_final; dst->PhyInfo.SignalQuality = sq_final; dst->Rssi = rssi_final; - #if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1 + #if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) && 1 if(strcmp(dst->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) { - DBG_871X("%s %s("MAC_FMT"), SignalStrength:%u, SignalQuality:%u, RawRSSI:%ld\n" - , __FUNCTION__ + DBG_871X(FUNC_ADPT_FMT" %s("MAC_FMT"), SignalStrength:%u, SignalQuality:%u, RawRSSI:%ld\n" + , FUNC_ADPT_ARG(padapter) , dst->Ssid.Ssid, MAC_ARG(dst->MacAddress), dst->PhyInfo.SignalStrength, dst->PhyInfo.SignalQuality, dst->Rssi); } #endif #if 0 // old codes, may be useful one day... // DBG_871X("update_network: rssi=0x%lx dst->Rssi=%d ,dst->Rssi=0x%lx , src->Rssi=0x%lx",(dst->Rssi+src->Rssi)/2,dst->Rssi,dst->Rssi,src->Rssi); - if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src)) + if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src, 0)) { //DBG_871X("b:ssid=%s update_network: src->rssi=0x%d padapter->recvpriv.ui_rssi=%d\n",src->Ssid.Ssid,src->Rssi,padapter->recvpriv.signal); @@ -825,7 +836,7 @@ _func_enter_; } #endif - if ( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (is_same_network(&(pmlmepriv->cur_network.network), pnetwork))) + if ( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (is_same_network(&(pmlmepriv->cur_network.network), pnetwork, 0))) { //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"Same Network\n"); @@ -854,9 +865,13 @@ void rtw_update_scanned_network(_adapter *adapter, WLAN_BSSID_EX *target) _list *plist, *phead; ULONG bssid_ex_sz; struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct wifidirect_info *pwdinfo= &(adapter->wdinfo); _queue *queue = &(pmlmepriv->scanned_queue); struct wlan_network *pnetwork = NULL; struct wlan_network *oldest = NULL; + int target_find = 0; + u8 feature = 0; _func_enter_; @@ -864,6 +879,11 @@ _func_enter_; phead = get_list_head(queue); plist = get_next(phead); +#ifdef CONFIG_P2P + if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + feature = 1; // p2p enable +#endif + while(1) { if (rtw_end_of_queue_search(phead,plist)== _TRUE) @@ -878,8 +898,10 @@ _func_enter_; #endif } - if (is_same_network(&(pnetwork->network), target)) + if (is_same_network(&(pnetwork->network), target, feature)) { + target_find = 1; break; + } if ((oldest == ((struct wlan_network *)0)) || time_after(oldest->last_scanned, pnetwork->last_scanned)) @@ -892,7 +914,8 @@ _func_enter_; /* If we didn't find a match, then get a new network slot to initialize * with this beacon's information */ - if (rtw_end_of_queue_search(phead,plist)== _TRUE) { + //if (rtw_end_of_queue_search(phead,plist)== _TRUE) { + if (!target_find) { if (_rtw_queue_empty(&(pmlmepriv->free_bss_pool)) == _TRUE) { /* If there are no more slots, expire the oldest */ @@ -955,8 +978,15 @@ _func_enter_; pnetwork->last_scanned = rtw_get_current_time(); //target.Reserved[0]==1, means that scaned network is a bcn frame. - if((pnetwork->network.IELength>target->IELength) && (target->Reserved[0]==1)) + // probe resp(3) > beacon(1) > probe req(2) + if ((target->Reserved[0] != 2) && + (target->Reserved[0] >= pnetwork->network.Reserved[0]) + ) { + update_ie = _TRUE; + } + else { update_ie = _FALSE; + } update_network(&(pnetwork->network), target,adapter, update_ie); } @@ -1026,8 +1056,20 @@ int rtw_is_desired_network(_adapter *adapter, struct wlan_network *pnetwork) } if (adapter->registrypriv.wifi_spec == 1) //for correct flow of 8021X to do.... { + u8 *p=NULL; + uint ie_len=0; + if ((desired_encmode == Ndis802_11EncryptionDisabled) && (privacy != 0)) bselected = _FALSE; + + if ( psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPA2PSK) { + p = rtw_get_ie(pnetwork->network.IEs + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pnetwork->network.IELength - _BEACON_IE_OFFSET_)); + if (p && ie_len>0) { + bselected = _TRUE; + } else { + bselected = _FALSE; + } + } } @@ -1129,7 +1171,7 @@ _func_enter_; pnetwork->Ssid.SsidLength = 0; } rtw_add_network(adapter, pnetwork); - } + } exit: @@ -1145,6 +1187,7 @@ _func_exit_; void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf) { _irqL irqL; + u8 timer_cancelled = _FALSE; struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); #ifdef CONFIG_MLME_EXT @@ -1156,7 +1199,6 @@ void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf) _func_enter_; _enter_critical_bh(&pmlmepriv->lock, &irqL); - if(pmlmepriv->wps_probe_req_ie) { u32 free_len = pmlmepriv->wps_probe_req_ie_len; @@ -1169,9 +1211,10 @@ _func_enter_; if (check_fwstate(pmlmepriv,_FW_UNDER_SURVEY)) { - u8 timer_cancelled; - - _cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled); + //u8 timer_cancelled; + + timer_cancelled = _TRUE; + //_cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled); _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); } @@ -1179,6 +1222,13 @@ _func_enter_; RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("nic status =%x, survey done event comes too late!\n", get_fwstate(pmlmepriv))); } + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + if(timer_cancelled) + _cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled); + + + _enter_critical_bh(&pmlmepriv->lock, &irqL); #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS rtw_set_signal_stat_timer(&adapter->recvpriv); @@ -1293,7 +1343,7 @@ _func_enter_; { struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; if(pmlmeext->sitesurvey_res.bss_cnt == 0){ - rtw_hal_sreset_reset(adapter); + //rtw_hal_sreset_reset(adapter); } } #endif @@ -1413,6 +1463,32 @@ _func_enter_; if(pwlan) { pwlan->fixed = _FALSE; +#ifdef CONFIG_P2P + if(!rtw_p2p_chk_state(&adapter->wdinfo, P2P_STATE_NONE)) + { + u32 p2p_ielen=0; + u8 *p2p_ie; + //u16 capability; + u8 *pcap = NULL; + u32 capability_len=0; + + //DBG_871X("free disconnecting network\n"); + //rtw_free_network_nolock(pmlmepriv, pwlan); + + if((p2p_ie=rtw_get_p2p_ie(pwlan->network.IEs+_FIXED_IE_LENGTH_, pwlan->network.IELength-_FIXED_IE_LENGTH_, NULL, &p2p_ielen))) + { + pcap = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, NULL, &capability_len); + if(pcap && capability_len==2) + { + u16 cap = *(u16*)pcap ; + *(u16*)pcap = cap&0x00ff;//clear group capability when free this network + } + } + + rtw_set_scan_deny(adapter, 2000); + //rtw_clear_scan_deny(adapter); + } +#endif //CONFIG_P2P } else { @@ -1429,7 +1505,7 @@ _func_enter_; if(lock_scanned_queue) _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - pmlmepriv->key_mask = 0; + adapter->securitypriv.key_mask = 0; _func_exit_; @@ -1536,7 +1612,7 @@ _func_enter_; rtw_os_indicate_disconnect(padapter); //set ips_deny_time to avoid enter IPS before LPS leave - padapter->pwrctrlpriv.ips_deny_time = rtw_get_current_time() + rtw_ms_to_systime(3000); + adapter_to_pwrctl(padapter)->ips_deny_time = rtw_get_current_time() + rtw_ms_to_systime(3000); _clr_fwstate_(pmlmepriv, _FW_LINKED); @@ -1551,9 +1627,6 @@ _func_enter_; #endif // CONFIG_P2P_PS #ifdef CONFIG_LPS -#ifdef CONFIG_WOWLAN - if(padapter->pwrctrlpriv.wowlan_mode==_FALSE) -#endif //CONFIG_WOWLAN rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 1); #endif @@ -1587,7 +1660,7 @@ void rtw_scan_abort(_adapter *adapter) if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) { if (!adapter->bDriverStopped && !adapter->bSurpriseRemoved) DBG_871X(FUNC_NDEV_FMT"waiting for scan_abort time out!\n", FUNC_NDEV_ARG(adapter->pnetdev)); - #ifdef CONFIG_PLATFORM_MSTAR_TITANIA12 + #ifdef CONFIG_PLATFORM_MSTAR //_clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); set_survey_timer(pmlmeext, 0); _set_timer(&pmlmepriv->scan_to_timer, 50); @@ -1642,7 +1715,10 @@ static struct sta_info *rtw_joinbss_update_stainfo(_adapter *padapter, struct wl _rtw_memset((u8 *)&psta->dot11tkiprxmickey, 0, sizeof (union Keytype)); _rtw_memset((u8 *)&psta->dot11tkiptxmickey, 0, sizeof (union Keytype)); - _rtw_memset((u8 *)&psta->dot11txpn, 0, sizeof (union pn48)); + _rtw_memset((u8 *)&psta->dot11txpn, 0, sizeof (union pn48)); +#ifdef CONFIG_IEEE80211W + _rtw_memset((u8 *)&psta->dot11wtxpn, 0, sizeof (union pn48)); +#endif //CONFIG_IEEE80211W _rtw_memset((u8 *)&psta->dot11rxpn, 0, sizeof (union pn48)); } @@ -1732,9 +1808,9 @@ static void rtw_joinbss_update_network(_adapter *padapter, struct wlan_network * //the ptarget_wlan->network.Rssi is raw data, we use ptarget_wlan->network.PhyInfo.SignalStrength instead (has scaled) padapter->recvpriv.rssi = translate_percentage_to_dbm(ptarget_wlan->network.PhyInfo.SignalStrength); #if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1 - DBG_871X("%s signal_strength:%3u, rssi:%3d, signal_qual:%3u" + DBG_871X(FUNC_ADPT_FMT" signal_strength:%3u, rssi:%3d, signal_qual:%3u" "\n" - , __FUNCTION__ + , FUNC_ADPT_ARG(padapter) , padapter->recvpriv.signal_strength , padapter->recvpriv.rssi , padapter->recvpriv.signal_qual @@ -1911,15 +1987,16 @@ _func_enter_; } //s4. indicate connect - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - { - rtw_indicate_connect(adapter); - } - else - { - //adhoc mode will rtw_indicate_connect when rtw_stassoc_event_callback - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("adhoc mode, fw_state:%x", get_fwstate(pmlmepriv))); - } + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + { + pmlmepriv->cur_network_scanned = ptarget_wlan; + rtw_indicate_connect(adapter); + } + else + { + //adhoc mode will rtw_indicate_connect when rtw_stassoc_event_callback + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("adhoc mode, fw_state:%x", get_fwstate(pmlmepriv))); + } //s5. Cancle assoc_timer @@ -2057,10 +2134,10 @@ u8 search_max_mac_id(_adapter *padapter) } -//FOR AP ,AD-HOC mode -void rtw_stassoc_hw_rpt(_adapter *adapter,struct sta_info *psta) +//FOR STA, AP ,AD-HOC mode +void rtw_sta_media_status_rpt(_adapter *adapter,struct sta_info *psta, u32 mstatus) { - u16 media_status; + u16 media_status_rpt; if(psta==NULL) return; @@ -2070,8 +2147,8 @@ void rtw_stassoc_hw_rpt(_adapter *adapter,struct sta_info *psta) rtw_hal_set_hwreg(adapter,HW_VAR_TX_RPT_MAX_MACID, (u8*)&macid); } #endif - media_status = (psta->mac_id<<8)|1; // MACID|OPMODE:1 connect - rtw_hal_set_hwreg(adapter,HW_VAR_H2C_MEDIA_STATUS_RPT,(u8 *)&media_status); + media_status_rpt = (u16)((psta->mac_id<<8)|mstatus); // MACID|OPMODE:1 connect + rtw_hal_set_hwreg(adapter,HW_VAR_H2C_MEDIA_STATUS_RPT,(u8 *)&media_status_rpt); } void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf) @@ -2094,13 +2171,18 @@ _func_enter_; psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); if(psta) { -#ifdef CONFIG_IOCTL_CFG80211 - #ifdef COMPAT_KERNEL_RELEASE - - #elif (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) || defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) u8 *passoc_req = NULL; - u32 assoc_req_len; + u32 assoc_req_len = 0; + + rtw_sta_media_status_rpt(adapter, psta, 1); + +#ifndef CONFIG_AUTO_AP_MODE + + ap_sta_info_defer_update(adapter, psta); + //report to upper layer + DBG_871X("indicate_sta_assoc_event to upper layer - hostapd\n"); +#ifdef CONFIG_IOCTL_CFG80211 _enter_critical_bh(&psta->lock, &irqL); if(psta->passoc_req && psta->assoc_req_len>0) { @@ -2110,7 +2192,7 @@ _func_enter_; assoc_req_len = psta->assoc_req_len; _rtw_memcpy(passoc_req, psta->passoc_req, assoc_req_len); - _rtw_mfree(psta->passoc_req , psta->assoc_req_len); + rtw_mfree(psta->passoc_req , psta->assoc_req_len); psta->passoc_req = NULL; psta->assoc_req_len = 0; } @@ -2120,23 +2202,18 @@ _func_enter_; if(passoc_req && assoc_req_len>0) { rtw_cfg80211_indicate_sta_assoc(adapter, passoc_req, assoc_req_len); - - _rtw_mfree(passoc_req, assoc_req_len); - } - #endif //(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) || defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) -#endif //CONFIG_IOCTL_CFG80211 - - //bss_cap_update_on_sta_join(adapter, psta); - //sta_info_update(adapter, psta); - ap_sta_info_defer_update(adapter, psta); - - rtw_stassoc_hw_rpt(adapter,psta); - - } + rtw_mfree(passoc_req, assoc_req_len); + } +#else //!CONFIG_IOCTL_CFG80211 + rtw_indicate_sta_assoc_event(adapter, psta); +#endif //!CONFIG_IOCTL_CFG80211 +#endif //!CONFIG_AUTO_AP_MODE + } goto exit; } -#endif +#endif //defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) + //for AD-HOC mode psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); if( psta != NULL) @@ -2162,7 +2239,7 @@ _func_enter_; //for ad-hoc mode rtw_hal_set_odm_var(adapter,HAL_ODM_STA_INFO,psta,_TRUE); - rtw_stassoc_hw_rpt(adapter,psta); + rtw_sta_media_status_rpt(adapter, psta, 1); if(adapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X) psta->dot118021XPrivacy = adapter->securitypriv.dot11PrivacyAlgrthm; @@ -2193,7 +2270,7 @@ _func_enter_; #ifdef CONFIG_RTL8711 //submit SetStaKey_cmd to tell fw, fw will allocate an CAM entry for this sta - rtw_setstakey_cmd(adapter, (unsigned char*)psta, _FALSE); + rtw_setstakey_cmd(adapter, (unsigned char*)psta, _FALSE, _TRUE); #endif exit: @@ -2253,7 +2330,9 @@ _func_enter_; if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) ) { #ifdef CONFIG_LAYER2_ROAMING - if (rtw_to_roaming(adapter) > 0) + if(adapter->registrypriv.wifi_spec==1) + rtw_set_roaming(adapter, 0); /* don't roam */ + else if (rtw_to_roaming(adapter) > 0) pmlmepriv->to_roaming--; /* this stadel_event is caused by roaming, decrease to_roaming */ else if (rtw_to_roaming(adapter) == 0) rtw_set_roaming(adapter, adapter->registrypriv.max_roaming_times); @@ -2357,7 +2436,7 @@ _func_enter_; RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("+rtw_cpwm_event_callback !!!\n")); #ifdef CONFIG_LPS_LCLK preportpwrstate = (struct reportpwrstate_parm*)pbuf; - preportpwrstate->state |= (u8)(padapter->pwrctrlpriv.cpwm_tog + 0x80); + preportpwrstate->state |= (u8)(adapter_to_pwrctl(padapter)->cpwm_tog + 0x80); cpwm_int_hdl(padapter, preportpwrstate); #endif @@ -2489,7 +2568,7 @@ void rtw_scan_timeout_handler (_adapter *adapter) static void rtw_auto_scan_handler(_adapter *padapter) { struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter); //auto site survey per 60sec if(pmlmepriv->scan_interval >0) @@ -2549,7 +2628,12 @@ void rtw_dynamic_check_timer_handlder(_adapter *adapter) return; #if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST) if(adapter->HalFunc.hal_checke_bt_hang) - adapter->HalFunc.hal_checke_bt_hang(adapter); + { +#ifdef CONFIG_CONCURRENT_MODE + if (adapter->adapter_type == PRIMARY_ADAPTER) +#endif + adapter->HalFunc.hal_checke_bt_hang(adapter); + } #endif if(adapter->hw_init_completed == _FALSE) return; @@ -2678,6 +2762,13 @@ void rtw_set_scan_deny(_adapter *adapter, u32 ms) } #endif +#ifdef CONFIG_DETECT_C2H_BY_POLLING +void rtw_event_polling_timer_hdl(_adapter *adapter) +{ + rtw_event_polling_cmd(adapter); +} +#endif + #if defined(IEEE80211_SCAN_RESULT_EXPIRE) #define RTW_SCAN_RESULT_EXPIRE IEEE80211_SCAN_RESULT_EXPIRE/HZ*1000 -1000 //3000 -1000 #else @@ -2953,7 +3044,7 @@ _func_enter_; if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { - if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) + if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network), 0) { //DBG_871X("select_and_join(1): _FW_LINKED and is same network, it needn't join again\n"); @@ -2987,7 +3078,7 @@ _func_enter_; if( (roaming_candidate == NULL ||roaming_candidate->network.Rssi<pnetwork->network.Rssi ) && is_same_ess(&pnetwork->network, &pmlmepriv->cur_network.network) - //&&(!is_same_network(&pnetwork->network, &pmlmepriv->cur_network.network)) + //&&(!is_same_network(&pnetwork->network, &pmlmepriv->cur_network.network, 0)) && rtw_get_time_interval_ms((u32)pnetwork->last_scanned,cur_time) < 5000 ) { roaming_candidate = pnetwork; @@ -3030,7 +3121,7 @@ _func_enter_; if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { #if 0 - if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) + if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)) { DBG_871X("select_and_join(2): _FW_LINKED and is same network, it needn't join again\n"); @@ -3141,7 +3232,7 @@ _func_exit_; } -sint rtw_set_key(_adapter * adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx) +sint rtw_set_key(_adapter * adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx, bool enqueue) { u8 keylen; struct cmd_obj *pcmd; @@ -3151,19 +3242,12 @@ sint rtw_set_key(_adapter * adapter,struct security_priv *psecuritypriv,sint key sint res=_SUCCESS; _func_enter_; - - pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pcmd==NULL){ - res= _FAIL; //try again - goto exit; - } + psetkeyparm=(struct setkey_parm*)rtw_zmalloc(sizeof(struct setkey_parm)); - if(psetkeyparm==NULL){ - rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); + if(psetkeyparm==NULL){ res= _FAIL; goto exit; } - _rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm)); if(psecuritypriv->dot11AuthAlgrthm ==dot11AuthAlgrthm_8021X){ @@ -3178,20 +3262,13 @@ _func_enter_; psetkeyparm->keyid = (u8)keyid;//0~3 psetkeyparm->set_tx = set_tx; if (is_wep_enc(psetkeyparm->algorithm)) - pmlmepriv->key_mask |= BIT(psetkeyparm->keyid); + psecuritypriv->key_mask |= BIT(psetkeyparm->keyid); -#ifdef CONFIG_AUTOSUSPEND - if( _TRUE == adapter->pwrctrlpriv.bInternalAutoSuspend) - { - adapter->pwrctrlpriv.wepkeymask = pmlmepriv->key_mask; - DBG_871X("....AutoSuspend pwrctrlpriv.wepkeymask(%x)\n",adapter->pwrctrlpriv.wepkeymask); - } -#endif - DBG_871X("==> rtw_set_key algorithm(%x),keyid(%x),key_mask(%x)\n",psetkeyparm->algorithm,psetkeyparm->keyid,pmlmepriv->key_mask); + DBG_871X("==> rtw_set_key algorithm(%x),keyid(%x),key_mask(%x)\n",psetkeyparm->algorithm,psetkeyparm->keyid, psecuritypriv->key_mask); RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key: psetkeyparm->algorithm=%d psetkeyparm->keyid=(u8)keyid=%d \n",psetkeyparm->algorithm, keyid)); switch(psetkeyparm->algorithm){ - + case _WEP40_: keylen=5; _rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen); @@ -3201,7 +3278,7 @@ _func_enter_; _rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen); break; case _TKIP_: - keylen=16; + keylen=16; _rtw_memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen); psetkeyparm->grpkey=1; break; @@ -3213,23 +3290,35 @@ _func_enter_; default: RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key:psecuritypriv->dot11PrivacyAlgrthm = %x (must be 1 or 2 or 4 or 5)\n",psecuritypriv->dot11PrivacyAlgrthm)); res= _FAIL; + rtw_mfree((unsigned char *)psetkeyparm, sizeof(struct setkey_parm)); goto exit; } + + + if(enqueue){ + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(pcmd==NULL){ + rtw_mfree((unsigned char *)psetkeyparm, sizeof(struct setkey_parm)); + res= _FAIL; //try again + goto exit; + } + + pcmd->cmdcode = _SetKey_CMD_; + pcmd->parmbuf = (u8 *)psetkeyparm; + pcmd->cmdsz = (sizeof(struct setkey_parm)); + pcmd->rsp = NULL; + pcmd->rspsz = 0; - - pcmd->cmdcode = _SetKey_CMD_; - pcmd->parmbuf = (u8 *)psetkeyparm; - pcmd->cmdsz = (sizeof(struct setkey_parm)); - pcmd->rsp = NULL; - pcmd->rspsz = 0; - - - _rtw_init_listhead(&pcmd->list); - - //_rtw_init_sema(&(pcmd->cmd_sem), 0); + _rtw_init_listhead(&pcmd->list); - res = rtw_enqueue_cmd(pcmdpriv, pcmd); + //_rtw_init_sema(&(pcmd->cmd_sem), 0); + res = rtw_enqueue_cmd(pcmdpriv, pcmd); + } + else{ + setkey_hdl(adapter, (u8 *)psetkeyparm); + rtw_mfree((u8 *) psetkeyparm, sizeof(struct setkey_parm)); + } exit: _func_exit_; return res; @@ -3389,6 +3478,14 @@ _func_enter_; { //copy RSN or SSN _rtw_memcpy(&out_ie[ielength], &psecuritypriv->supplicant_ie[0], psecuritypriv->supplicant_ie[1]+2); + /* debug for CONFIG_IEEE80211W + { + int jj; + printk("supplicant_ie_length=%d &&&&&&&&&&&&&&&&&&&\n", psecuritypriv->supplicant_ie[1]+2); + for(jj=0; jj < psecuritypriv->supplicant_ie[1]+2; jj++) + printk(" %02x ", psecuritypriv->supplicant_ie[jj]); + printk("\n"); + }*/ ielength+=psecuritypriv->supplicant_ie[1]+2; rtw_report_sec_ie(adapter, authmode, psecuritypriv->supplicant_ie); @@ -3655,7 +3752,7 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui p = rtw_get_ie(in_ie+12, _HT_ADD_INFO_IE_, &ielen, in_len-12); if(p && (ielen==sizeof(struct ieee80211_ht_addt_info))) { - out_len = *pout_len; + out_len = *pout_len; pframe = rtw_set_ie(out_ie+out_len, _HT_ADD_INFO_IE_, ielen, p+2 , pout_len); } |