diff --git a/Makefile b/Makefile index 9341eed..4ca1b30 100644 --- a/Makefile +++ b/Makefile @@ -76,7 +76,6 @@ endif HCI_NAME = usb _OS_INTFS_FILES := \ - os_dep/ioctl_cfg80211.o \ os_dep/ioctl_linux.o \ os_dep/mlme_linux.o \ os_dep/os_intfs.o \ diff --git a/core/rtw_ap.c b/core/rtw_ap.c index 42177f0..2a74176 100644 --- a/core/rtw_ap.c +++ b/core/rtw_ap.c @@ -1970,20 +1970,7 @@ u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reaso psta->state &= ~_FW_LINKED; _exit_critical_bh(&psta->lock, &irqL); - #ifdef CONFIG_IOCTL_CFG80211 - if (1) { - #ifdef COMPAT_KERNEL_RELEASE - rtw_cfg80211_indicate_sta_disassoc(padapter, psta->hwaddr, reason); - #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - rtw_cfg80211_indicate_sta_disassoc(padapter, psta->hwaddr, reason); - #else /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) */ - /* will call rtw_cfg80211_indicate_sta_disassoc() in cmd_thread for old API context */ - #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) */ - } else - #endif /* CONFIG_IOCTL_CFG80211 */ - { - rtw_indicate_sta_disassoc_event(padapter, psta); - } + rtw_indicate_sta_disassoc_event(padapter, psta); report_del_sta_event(padapter, psta->hwaddr, reason); @@ -1993,9 +1980,7 @@ u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reaso rtw_free_stainfo(padapter, psta); _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - return beacon_updated; - } int rtw_ap_inform_ch_switch (_adapter *padapter, u8 new_ch, u8 ch_offset) diff --git a/core/rtw_mlme.c b/core/rtw_mlme.c index a53014d..8161276 100644 --- a/core/rtw_mlme.c +++ b/core/rtw_mlme.c @@ -136,15 +136,6 @@ void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv) rtw_free_mlme_ie_data(&pmlmepriv->p2p_go_probe_resp_ie, &pmlmepriv->p2p_go_probe_resp_ie_len); rtw_free_mlme_ie_data(&pmlmepriv->p2p_assoc_req_ie, &pmlmepriv->p2p_assoc_req_ie_len); #endif - -#if defined(CONFIG_WFD) && defined(CONFIG_IOCTL_CFG80211) - rtw_free_mlme_ie_data(&pmlmepriv->wfd_beacon_ie, &pmlmepriv->wfd_beacon_ie_len); - rtw_free_mlme_ie_data(&pmlmepriv->wfd_probe_req_ie, &pmlmepriv->wfd_probe_req_ie_len); - rtw_free_mlme_ie_data(&pmlmepriv->wfd_probe_resp_ie, &pmlmepriv->wfd_probe_resp_ie_len); - rtw_free_mlme_ie_data(&pmlmepriv->wfd_go_probe_resp_ie, &pmlmepriv->wfd_go_probe_resp_ie_len); - rtw_free_mlme_ie_data(&pmlmepriv->wfd_assoc_req_ie, &pmlmepriv->wfd_assoc_req_ie_len); -#endif - } void _rtw_free_mlme_priv (struct mlme_priv *pmlmepriv) @@ -1106,10 +1097,6 @@ _func_enter_; } } -#ifdef CONFIG_IOCTL_CFG80211 - rtw_cfg80211_surveydone_event_callback(adapter); -#endif /* CONFIG_IOCTL_CFG80211 */ - _func_exit_; } @@ -1747,38 +1734,6 @@ _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; - - _enter_critical_bh(&psta->lock, &irqL); - if (psta->passoc_req && psta->assoc_req_len>0) - { - passoc_req = rtw_zmalloc(psta->assoc_req_len); - if (passoc_req) - { - 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); - psta->passoc_req = NULL; - psta->assoc_req_len = 0; - } - } - _exit_critical_bh(&psta->lock, &irqL); - - 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); @@ -1881,18 +1836,7 @@ _func_enter_; } if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) - { -#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) - rtw_cfg80211_indicate_sta_disassoc(adapter, pstadel->macaddr, *(u16*)pstadel->rsvd); - #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) || defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) */ -#endif /* CONFIG_IOCTL_CFG80211 */ - return; - } - mlmeext_sta_del_event_callback(adapter); @@ -2152,34 +2096,6 @@ void rtw_dynamic_check_timer_handlder(_adapter *adapter) #endif /* (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35)) */ } -#ifdef CONFIG_SET_SCAN_DENY_TIMER -inline bool rtw_is_scan_deny(_adapter *adapter) -{ - struct mlme_priv *mlmepriv = &adapter->mlmepriv; - return (ATOMIC_READ(&mlmepriv->set_scan_deny) != 0) ? true : false; -} - -inline void rtw_clear_scan_deny(_adapter *adapter) -{ - struct mlme_priv *mlmepriv = &adapter->mlmepriv; - ATOMIC_SET(&mlmepriv->set_scan_deny, 0); - if (0) - DBG_88E(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter)); -} - -void rtw_set_scan_deny_timer_hdl(_adapter *adapter) -{ - rtw_clear_scan_deny(adapter); -} - -void rtw_set_scan_deny(_adapter *adapter, u32 ms) -{ - struct mlme_priv *mlmepriv = &adapter->mlmepriv; - ATOMIC_SET(&mlmepriv->set_scan_deny, 1); - _set_timer(&mlmepriv->set_scan_deny_timer, ms); -} -#endif - #if defined(IEEE80211_SCAN_RESULT_EXPIRE) #define RTW_SCAN_RESULT_EXPIRE IEEE80211_SCAN_RESULT_EXPIRE/HZ*1000 -1000 /* 3000 -1000 */ #else diff --git a/core/rtw_mlme_ext.c b/core/rtw_mlme_ext.c index ceba6e1..ef604a1 100644 --- a/core/rtw_mlme_ext.c +++ b/core/rtw_mlme_ext.c @@ -658,26 +658,11 @@ static u32 p2p_listen_state_process(_adapter *padapter, unsigned char *da) { bool response = true; -#ifdef CONFIG_IOCTL_CFG80211 - if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled == false - || padapter->mlmepriv.wps_probe_resp_ie == NULL - || padapter->mlmepriv.p2p_probe_resp_ie == NULL - ) - { - DBG_88E("DON'T issue_probersp_p2p: p2p_enabled:%d, wps_probe_resp_ie:%p, p2p_probe_resp_ie:%p\n", - wdev_to_priv(padapter->rtw_wdev)->p2p_enabled, - padapter->mlmepriv.wps_probe_resp_ie, - padapter->mlmepriv.p2p_probe_resp_ie); - response = false; - } -#else - /* do nothing if the device name is empty */ if ( !padapter->wdinfo.device_name_len ) { response = false; } -#endif if (response == true) issue_probersp_p2p( padapter, da); @@ -732,10 +717,8 @@ unsigned int OnProbeReq(_adapter *padapter, union recv_frame *precv_frame) { if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE)) { -#ifndef CONFIG_IOCTL_CFG80211 /* FIXME */ report_survey_event(padapter, precv_frame); -#endif p2p_listen_state_process( padapter, get_sa(pframe)); return _SUCCESS; @@ -1790,35 +1773,7 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) /* 2 - report to upper layer */ DBG_88E("indicate_sta_join_event to upper layer - hostapd\n"); - #ifdef CONFIG_IOCTL_CFG80211 - if (1) { - #ifdef COMPAT_KERNEL_RELEASE - rtw_cfg80211_indicate_sta_assoc(padapter, pframe, pkt_len); - #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - rtw_cfg80211_indicate_sta_assoc(padapter, pframe, pkt_len); - #else /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) */ - _enter_critical_bh(&pstat->lock, &irqL); - if (pstat->passoc_req) - { - rtw_mfree(pstat->passoc_req, pstat->assoc_req_len); - pstat->passoc_req = NULL; - pstat->assoc_req_len = 0; - } - - pstat->passoc_req = rtw_zmalloc(pkt_len); - if (pstat->passoc_req) - { - _rtw_memcpy(pstat->passoc_req, pframe, pkt_len); - pstat->assoc_req_len = pkt_len; - } - _exit_critical_bh(&pstat->lock, &irqL); - #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) */ - } - else - #endif /* CONFIG_IOCTL_CFG80211 */ - { - rtw_indicate_sta_assoc_event(padapter, pstat); - } + rtw_indicate_sta_assoc_event(padapter, pstat); /* 3-(1) report sta add event */ report_add_sta_event(padapter, pstat->hwaddr, pstat->aid); @@ -4032,11 +3987,6 @@ void issue_probersp_p2p(_adapter *padapter, unsigned char *da) #ifdef CONFIG_WFD u32 wfdielen = 0; #endif /* CONFIG_WFD */ -#ifdef CONFIG_IOCTL_CFG80211 - struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; - struct ieee80211_channel *ieee_ch = &pcfg80211_wdinfo->remain_on_ch_channel; - u8 listen_channel = (u8) ieee80211_frequency_to_channel(ieee_ch->center_freq); -#endif /* CONFIG_IOCTL_CFG80211 */ if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) return; @@ -4095,234 +4045,189 @@ void issue_probersp_p2p(_adapter *padapter, unsigned char *da) pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen); /* DS parameter set */ -#ifdef CONFIG_IOCTL_CFG80211 - if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && listen_channel !=0 ) - { - pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&listen_channel, &pattrib->pktlen); - } - else -#endif /* CONFIG_IOCTL_CFG80211 */ { pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&pwdinfo->listen_channel, &pattrib->pktlen); } + /* Todo: WPS IE */ + /* Noted by Albert 20100907 */ + /* According to the WPS specification, all the WPS attribute is presented by Big Endian. */ -#ifdef CONFIG_IOCTL_CFG80211 - if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) + wpsielen = 0; + /* WPS OUI */ + *(__be32 *) ( wpsie ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + /* WPS version */ + /* Type: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + wpsielen += 2; + + /* Length: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + /* Value: */ + wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */ + + /* WiFi Simple Config State */ + /* Type: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SIMPLE_CONF_STATE ); + wpsielen += 2; + + /* Length: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + /* Value: */ + wpsie[wpsielen++] = WPS_WSC_STATE_NOT_CONFIG; /* Not Configured. */ + + /* Response Type */ + /* Type: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_RESP_TYPE ); + wpsielen += 2; + + /* Length: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + /* Value: */ + wpsie[wpsielen++] = WPS_RESPONSE_TYPE_8021X; + + /* UUID-E */ + /* Type: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_UUID_E ); + wpsielen += 2; + + /* Length: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0010 ); + wpsielen += 2; + + /* Value: */ + _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + wpsielen += 0x10; + + /* Manufacturer */ + /* Type: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MANUFACTURER ); + wpsielen += 2; + + /* Length: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0007 ); + wpsielen += 2; + + /* Value: */ + _rtw_memcpy( wpsie + wpsielen, "Realtek", 7 ); + wpsielen += 7; + + /* Model Name */ + /* Type: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NAME ); + wpsielen += 2; + + /* Length: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0006 ); + wpsielen += 2; + + /* Value: */ + _rtw_memcpy( wpsie + wpsielen, "8192CU", 6 ); + wpsielen += 6; + + /* Model Number */ + /* Type: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NUMBER ); + wpsielen += 2; + + /* Length: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + /* Value: */ + wpsie[ wpsielen++ ] = 0x31; /* character 1 */ + + /* Serial Number */ + /* Type: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SERIAL_NUMBER ); + wpsielen += 2; + + /* Length: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( ETH_ALEN ); + wpsielen += 2; + + /* Value: */ + _rtw_memcpy( wpsie + wpsielen, "123456" , ETH_ALEN ); + wpsielen += ETH_ALEN; + + /* Primary Device Type */ + /* Type: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); + wpsielen += 2; + + /* Length: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 ); + wpsielen += 2; + + /* Value: */ + /* Category ID */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); + wpsielen += 2; + + /* OUI */ + *(__be32 *) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + /* Sub Category ID */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); + wpsielen += 2; + + /* Device Name */ + /* Type: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + wpsielen += 2; + + /* Length: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len ); + wpsielen += 2; + + /* Value: */ + if (pwdinfo->device_name_len) { - if ( pmlmepriv->wps_probe_resp_ie != NULL && pmlmepriv->p2p_probe_resp_ie != NULL ) - { - /* WPS IE */ - _rtw_memcpy(pframe, pmlmepriv->wps_probe_resp_ie, pmlmepriv->wps_probe_resp_ie_len); - pattrib->pktlen += pmlmepriv->wps_probe_resp_ie_len; - pframe += pmlmepriv->wps_probe_resp_ie_len; - - /* P2P IE */ - _rtw_memcpy(pframe, pmlmepriv->p2p_probe_resp_ie, pmlmepriv->p2p_probe_resp_ie_len); - pattrib->pktlen += pmlmepriv->p2p_probe_resp_ie_len; - pframe += pmlmepriv->p2p_probe_resp_ie_len; - } + _rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len ); + wpsielen += pwdinfo->device_name_len; } - else -#endif /* CONFIG_IOCTL_CFG80211 */ - { - /* Todo: WPS IE */ - /* Noted by Albert 20100907 */ - /* According to the WPS specification, all the WPS attribute is presented by Big Endian. */ + /* Config Method */ + /* Type: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); + wpsielen += 2; - wpsielen = 0; - /* WPS OUI */ - *(__be32 *) ( wpsie ) = cpu_to_be32( WPSOUI ); - wpsielen += 4; + /* Length: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + wpsielen += 2; - /* WPS version */ - /* Type: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); - wpsielen += 2; - - /* Length: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); - wpsielen += 2; - - /* Value: */ - wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */ - - /* WiFi Simple Config State */ - /* Type: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SIMPLE_CONF_STATE ); - wpsielen += 2; - - /* Length: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); - wpsielen += 2; - - /* Value: */ - wpsie[wpsielen++] = WPS_WSC_STATE_NOT_CONFIG; /* Not Configured. */ - - /* Response Type */ - /* Type: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_RESP_TYPE ); - wpsielen += 2; - - /* Length: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); - wpsielen += 2; - - /* Value: */ - wpsie[wpsielen++] = WPS_RESPONSE_TYPE_8021X; - - /* UUID-E */ - /* Type: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_UUID_E ); - wpsielen += 2; - - /* Length: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0010 ); - wpsielen += 2; - - /* Value: */ - _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN ); - wpsielen += 0x10; - - /* Manufacturer */ - /* Type: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MANUFACTURER ); - wpsielen += 2; - - /* Length: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0007 ); - wpsielen += 2; - - /* Value: */ - _rtw_memcpy( wpsie + wpsielen, "Realtek", 7 ); - wpsielen += 7; - - /* Model Name */ - /* Type: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NAME ); - wpsielen += 2; - - /* Length: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0006 ); - wpsielen += 2; - - /* Value: */ - _rtw_memcpy( wpsie + wpsielen, "8192CU", 6 ); - wpsielen += 6; - - /* Model Number */ - /* Type: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NUMBER ); - wpsielen += 2; - - /* Length: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); - wpsielen += 2; - - /* Value: */ - wpsie[ wpsielen++ ] = 0x31; /* character 1 */ - - /* Serial Number */ - /* Type: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SERIAL_NUMBER ); - wpsielen += 2; - - /* Length: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( ETH_ALEN ); - wpsielen += 2; - - /* Value: */ - _rtw_memcpy( wpsie + wpsielen, "123456" , ETH_ALEN ); - wpsielen += ETH_ALEN; - - /* Primary Device Type */ - /* Type: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); - wpsielen += 2; - - /* Length: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 ); - wpsielen += 2; - - /* Value: */ - /* Category ID */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); - wpsielen += 2; - - /* OUI */ - *(__be32 *) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI ); - wpsielen += 4; - - /* Sub Category ID */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); - wpsielen += 2; - - /* Device Name */ - /* Type: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); - wpsielen += 2; - - /* Length: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len ); - wpsielen += 2; - - /* Value: */ - if (pwdinfo->device_name_len) - { - _rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len ); - wpsielen += pwdinfo->device_name_len; - } - - /* Config Method */ - /* Type: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); - wpsielen += 2; - - /* Length: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); - wpsielen += 2; - - /* Value: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); - wpsielen += 2; + /* Value: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); + wpsielen += 2; - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); - p2pielen = build_probe_resp_p2p_ie(pwdinfo, pframe); - pframe += p2pielen; - pattrib->pktlen += p2pielen; - } + p2pielen = build_probe_resp_p2p_ie(pwdinfo, pframe); + pframe += p2pielen; + pattrib->pktlen += p2pielen; #ifdef CONFIG_WFD -#ifdef CONFIG_IOCTL_CFG80211 - if ( true == pwdinfo->wfd_info->wfd_enable ) -#endif /* CONFIG_IOCTL_CFG80211 */ - { - wfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 0); - pframe += wfdielen; - pattrib->pktlen += wfdielen; - } -#ifdef CONFIG_IOCTL_CFG80211 - else if (pmlmepriv->wfd_probe_resp_ie != NULL && pmlmepriv->wfd_probe_resp_ie_len>0) - { - /* WFD IE */ - _rtw_memcpy(pframe, pmlmepriv->wfd_probe_resp_ie, pmlmepriv->wfd_probe_resp_ie_len); - pattrib->pktlen += pmlmepriv->wfd_probe_resp_ie_len; - pframe += pmlmepriv->wfd_probe_resp_ie_len; - } -#endif /* CONFIG_IOCTL_CFG80211 */ + wfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 0); + pframe += wfdielen; + pattrib->pktlen += wfdielen; #endif /* CONFIG_WFD */ pattrib->last_txcmdsz = pattrib->pktlen; - dump_mgntframe(padapter, pmgntframe); return; - } static int _issue_probereq_p2p(_adapter *padapter, u8 *da, int wait_ack) @@ -4407,114 +4312,46 @@ static int _issue_probereq_p2p(_adapter *padapter, u8 *da, int wait_ack) /* Use the OFDM rate in the P2P probe request frame. ( 6(B), 9(B), 12(B), 24(B), 36, 48, 54 ) */ pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen); -#ifdef CONFIG_IOCTL_CFG80211 - if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) + + /* WPS IE */ + /* Noted by Albert 20110221 */ + /* According to the WPS specification, all the WPS attribute is presented by Big Endian. */ + + wpsielen = 0; + /* WPS OUI */ + *(__be32 *) ( wpsie ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + /* WPS version */ + /* Type: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + wpsielen += 2; + + /* Length: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + /* Value: */ + wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */ + + if ( pmlmepriv->wps_probe_req_ie == NULL ) { - if ( pmlmepriv->wps_probe_req_ie != NULL && pmlmepriv->p2p_probe_req_ie != NULL ) - { - /* WPS IE */ - _rtw_memcpy(pframe, pmlmepriv->wps_probe_req_ie, pmlmepriv->wps_probe_req_ie_len); - pattrib->pktlen += pmlmepriv->wps_probe_req_ie_len; - pframe += pmlmepriv->wps_probe_req_ie_len; - - /* P2P IE */ - _rtw_memcpy(pframe, pmlmepriv->p2p_probe_req_ie, pmlmepriv->p2p_probe_req_ie_len); - pattrib->pktlen += pmlmepriv->p2p_probe_req_ie_len; - pframe += pmlmepriv->p2p_probe_req_ie_len; - } - } - else -#endif /* CONFIG_IOCTL_CFG80211 */ - { - - /* WPS IE */ - /* Noted by Albert 20110221 */ - /* According to the WPS specification, all the WPS attribute is presented by Big Endian. */ - - wpsielen = 0; - /* WPS OUI */ - *(__be32 *) ( wpsie ) = cpu_to_be32( WPSOUI ); - wpsielen += 4; - - /* WPS version */ + /* UUID-E */ /* Type: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_UUID_E ); wpsielen += 2; /* Length: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0010 ); wpsielen += 2; /* Value: */ - wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */ + _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + wpsielen += 0x10; - if ( pmlmepriv->wps_probe_req_ie == NULL ) - { - /* UUID-E */ - /* Type: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_UUID_E ); - wpsielen += 2; - - /* Length: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0010 ); - wpsielen += 2; - - /* Value: */ - _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN ); - wpsielen += 0x10; - - /* Config Method */ - /* Type: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); - wpsielen += 2; - - /* Length: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); - wpsielen += 2; - - /* Value: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); - wpsielen += 2; - } - - /* Device Name */ + /* Config Method */ /* Type: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); - wpsielen += 2; - - /* Length: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len ); - wpsielen += 2; - - /* Value: */ - _rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len ); - wpsielen += pwdinfo->device_name_len; - - /* Primary Device Type */ - /* Type: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); - wpsielen += 2; - - /* Length: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 ); - wpsielen += 2; - - /* Value: */ - /* Category ID */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); - wpsielen += 2; - - /* OUI */ - *(__be32 *) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI ); - wpsielen += 4; - - /* Sub Category ID */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); - wpsielen += 2; - - /* Device Password ID */ - /* Type: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID ); + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); wpsielen += 2; /* Length: */ @@ -4522,47 +4359,139 @@ static int _issue_probereq_p2p(_adapter *padapter, u8 *da, int wait_ack) wpsielen += 2; /* Value: */ - *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC ); /* Registrar-specified */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); wpsielen += 2; + } - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + /* Device Name */ + /* Type: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + wpsielen += 2; - /* P2P OUI */ - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; /* WFA P2P v1.0 */ + /* Length: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len ); + wpsielen += 2; - /* Commented by Albert 20110221 */ - /* According to the P2P Specification, the probe request frame should contain 5 P2P attributes */ - /* 1. P2P Capability */ - /* 2. P2P Device ID if this probe request wants to find the specific P2P device */ - /* 3. Listen Channel */ - /* 4. Extended Listen Timing */ - /* 5. Operating Channel if this WiFi is working as the group owner now */ + /* Value: */ + _rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len ); + wpsielen += pwdinfo->device_name_len; - /* P2P Capability */ + /* Primary Device Type */ + /* Type: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); + wpsielen += 2; + + /* Length: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 ); + wpsielen += 2; + + /* Value: */ + /* Category ID */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + wpsielen += 2; + + /* OUI */ + *(__be32 *) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + /* Sub Category ID */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + wpsielen += 2; + + /* Device Password ID */ + /* Type: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID ); + wpsielen += 2; + + /* Length: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + wpsielen += 2; + + /* Value: */ + *(__be16 *) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC ); /* Registrar-specified */ + wpsielen += 2; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + + /* P2P OUI */ + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; /* WFA P2P v1.0 */ + + /* Commented by Albert 20110221 */ + /* According to the P2P Specification, the probe request frame should contain 5 P2P attributes */ + /* 1. P2P Capability */ + /* 2. P2P Device ID if this probe request wants to find the specific P2P device */ + /* 3. Listen Channel */ + /* 4. Extended Listen Timing */ + /* 5. Operating Channel if this WiFi is working as the group owner now */ + + /* P2P Capability */ + /* Type: */ + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + + /* Length: */ + *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + /* Value: */ + /* Device Capability Bitmap, 1 byte */ + p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT; + + /* Group Capability Bitmap, 1 byte */ + if ( pwdinfo->persistent_supported ) + p2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT; + else + p2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT; + + /* Listen Channel */ + /* Type: */ + p2pie[ p2pielen++ ] = P2P_ATTR_LISTEN_CH; + + /* Length: */ + *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); + p2pielen += 2; + + /* Value: */ + /* Country String */ + p2pie[ p2pielen++ ] = 'X'; + p2pie[ p2pielen++ ] = 'X'; + + /* The third byte should be set to 0x04. */ + /* Described in the "Operating Channel Attribute" section. */ + p2pie[ p2pielen++ ] = 0x04; + + /* Operating Class */ + p2pie[ p2pielen++ ] = 0x51; /* Copy from SD7 */ + + /* Channel Number */ + p2pie[ p2pielen++ ] = pwdinfo->listen_channel; /* listen channel */ + + + /* Extended Listen Timing */ + /* Type: */ + p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; + + /* Length: */ + *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); + p2pielen += 2; + + /* Value: */ + /* Availability Period */ + *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + p2pielen += 2; + + /* Availability Interval */ + *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + p2pielen += 2; + + if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) ) + { + /* Operating Channel (if this WiFi is working as the group owner now) */ /* Type: */ - p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; - - /* Length: */ - *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - p2pielen += 2; - - /* Value: */ - /* Device Capability Bitmap, 1 byte */ - p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT; - - /* Group Capability Bitmap, 1 byte */ - if ( pwdinfo->persistent_supported ) - p2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT; - else - p2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT; - - /* Listen Channel */ - /* Type: */ - p2pie[ p2pielen++ ] = P2P_ATTR_LISTEN_CH; + p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; /* Length: */ *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); @@ -4581,82 +4510,24 @@ static int _issue_probereq_p2p(_adapter *padapter, u8 *da, int wait_ack) p2pie[ p2pielen++ ] = 0x51; /* Copy from SD7 */ /* Channel Number */ - p2pie[ p2pielen++ ] = pwdinfo->listen_channel; /* listen channel */ + p2pie[ p2pielen++ ] = pwdinfo->operating_channel; /* operating channel number */ + } - /* Extended Listen Timing */ - /* Type: */ - p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); - /* Length: */ - *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); - p2pielen += 2; - - /* Value: */ - /* Availability Period */ - *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); - p2pielen += 2; - - /* Availability Interval */ - *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); - p2pielen += 2; - - if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) ) - { - /* Operating Channel (if this WiFi is working as the group owner now) */ - /* Type: */ - p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; - - /* Length: */ - *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); - p2pielen += 2; - - /* Value: */ - /* Country String */ - p2pie[ p2pielen++ ] = 'X'; - p2pie[ p2pielen++ ] = 'X'; - - /* The third byte should be set to 0x04. */ - /* Described in the "Operating Channel Attribute" section. */ - p2pie[ p2pielen++ ] = 0x04; - - /* Operating Class */ - p2pie[ p2pielen++ ] = 0x51; /* Copy from SD7 */ - - /* Channel Number */ - p2pie[ p2pielen++ ] = pwdinfo->operating_channel; /* operating channel number */ - - } - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); - - if ( pmlmepriv->wps_probe_req_ie != NULL ) - { - /* WPS IE */ - _rtw_memcpy(pframe, pmlmepriv->wps_probe_req_ie, pmlmepriv->wps_probe_req_ie_len); - pattrib->pktlen += pmlmepriv->wps_probe_req_ie_len; - pframe += pmlmepriv->wps_probe_req_ie_len; - } + if ( pmlmepriv->wps_probe_req_ie != NULL ) + { + /* WPS IE */ + _rtw_memcpy(pframe, pmlmepriv->wps_probe_req_ie, pmlmepriv->wps_probe_req_ie_len); + pattrib->pktlen += pmlmepriv->wps_probe_req_ie_len; + pframe += pmlmepriv->wps_probe_req_ie_len; } #ifdef CONFIG_WFD -#ifdef CONFIG_IOCTL_CFG80211 - if ( true == pwdinfo->wfd_info->wfd_enable ) -#endif - { - wfdielen = build_probe_req_wfd_ie(pwdinfo, pframe); - pframe += wfdielen; - pattrib->pktlen += wfdielen; - } -#ifdef CONFIG_IOCTL_CFG80211 - else if (pmlmepriv->wfd_probe_req_ie != NULL && pmlmepriv->wfd_probe_req_ie_len>0) - { - /* WFD IE */ - _rtw_memcpy(pframe, pmlmepriv->wfd_probe_req_ie, pmlmepriv->wfd_probe_req_ie_len); - pattrib->pktlen += pmlmepriv->wfd_probe_req_ie_len; - pframe += pmlmepriv->wfd_probe_req_ie_len; - } -#endif /* CONFIG_IOCTL_CFG80211 */ + wfdielen = build_probe_req_wfd_ie(pwdinfo, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; #endif /* CONFIG_WFD */ pattrib->last_txcmdsz = pattrib->pktlen; @@ -4780,101 +4651,64 @@ static unsigned int on_action_public_p2p(union recv_frame *precv_frame) #ifdef CONFIG_P2P _cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey ); -#ifdef CONFIG_IOCTL_CFG80211 - if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) - { - rtw_cfg80211_rx_p2p_action_public(padapter, pframe, len); - } - else -#endif /* CONFIG_IOCTL_CFG80211 */ - { - /* Do nothing if the driver doesn't enable the P2P function. */ - if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) - return _SUCCESS; + /* Do nothing if the driver doesn't enable the P2P function. */ + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) + return _SUCCESS; - len -= sizeof(struct rtw_ieee80211_hdr_3addr); + len -= sizeof(struct rtw_ieee80211_hdr_3addr); - switch ( frame_body[ 6 ] )/* OUI Subtype */ + switch ( frame_body[ 6 ] )/* OUI Subtype */ + { + case P2P_GO_NEGO_REQ: { - case P2P_GO_NEGO_REQ: + DBG_88E( "[%s] Got GO Nego Req Frame\n", __func__); + _rtw_memset( &pwdinfo->groupid_info, 0x00, sizeof( struct group_id_info ) ); + + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ)) { - DBG_88E( "[%s] Got GO Nego Req Frame\n", __func__); - _rtw_memset( &pwdinfo->groupid_info, 0x00, sizeof( struct group_id_info ) ); - - if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ)) - { - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); - } - - if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL)) - { - /* Commented by Albert 20110526 */ - /* In this case, this means the previous nego fail doesn't be reset yet. */ - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - /* Restore the previous p2p state */ - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); - DBG_88E( "[%s] Restore the previous p2p state to %d\n", __func__, rtw_p2p_state(pwdinfo) ); - } - - /* Commented by Kurt 20110902 */ - /* Add if statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered. */ - if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) - rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); - - /* Commented by Kurt 20120113 */ - /* Get peer_dev_addr here if peer doesn't issue prov_disc frame. */ - if (_rtw_memcmp(pwdinfo->rx_prov_disc_info.peerDevAddr, empty_addr, ETH_ALEN)) - _rtw_memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN); - - result = process_p2p_group_negotation_req( pwdinfo, frame_body, len ); - issue_p2p_GO_response( padapter, GetAddr2Ptr(pframe), frame_body, len, result ); - - /* Commented by Albert 20110718 */ - /* No matter negotiating or negotiation failure, the driver should set up the restore P2P state timer. */ - _set_timer( &pwdinfo->restore_p2p_state_timer, 5000 ); - break; + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); } - case P2P_GO_NEGO_RESP: + + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL)) { - DBG_88E( "[%s] Got GO Nego Resp Frame\n", __func__); - - if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) - { - /* Commented by Albert 20110425 */ - /* The restore timer is enabled when issuing the nego request frame of rtw_p2p_connect function. */ - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - pwdinfo->nego_req_info.benable = false; - result = process_p2p_group_negotation_resp( pwdinfo, frame_body, len); - issue_p2p_GO_confirm( pwdinfo->padapter, GetAddr2Ptr(pframe), result); - if ( P2P_STATUS_SUCCESS == result ) - { - if ( rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT ) - { - pwdinfo->p2p_info.operation_ch[ 0 ] = pwdinfo->peer_operating_ch; - pwdinfo->p2p_info.scan_op_ch_only = 1; - _set_timer( &pwdinfo->reset_ch_sitesurvey2, P2P_RESET_SCAN_CH ); - } - } - - /* Reset the dialog token for group negotiation frames. */ - pwdinfo->negotiation_dialog_token = 1; - - if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL)) - { - _set_timer( &pwdinfo->restore_p2p_state_timer, 5000 ); - } - } - else - { - DBG_88E( "[%s] Skipped GO Nego Resp Frame (p2p_state != P2P_STATE_GONEGO_ING)\n", __func__); - } - - break; + /* Commented by Albert 20110526 */ + /* In this case, this means the previous nego fail doesn't be reset yet. */ + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); + /* Restore the previous p2p state */ + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); + DBG_88E( "[%s] Restore the previous p2p state to %d\n", __func__, rtw_p2p_state(pwdinfo) ); } - case P2P_GO_NEGO_CONF: + + /* Commented by Kurt 20110902 */ + /* Add if statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered. */ + if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); + + /* Commented by Kurt 20120113 */ + /* Get peer_dev_addr here if peer doesn't issue prov_disc frame. */ + if (_rtw_memcmp(pwdinfo->rx_prov_disc_info.peerDevAddr, empty_addr, ETH_ALEN)) + _rtw_memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN); + + result = process_p2p_group_negotation_req( pwdinfo, frame_body, len ); + issue_p2p_GO_response( padapter, GetAddr2Ptr(pframe), frame_body, len, result ); + + /* Commented by Albert 20110718 */ + /* No matter negotiating or negotiation failure, the driver should set up the restore P2P state timer. */ + _set_timer( &pwdinfo->restore_p2p_state_timer, 5000 ); + break; + } + case P2P_GO_NEGO_RESP: + { + DBG_88E( "[%s] Got GO Nego Resp Frame\n", __func__); + + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) { - DBG_88E( "[%s] Got GO Nego Confirm Frame\n", __func__); - result = process_p2p_group_negotation_confirm( pwdinfo, frame_body, len); + /* Commented by Albert 20110425 */ + /* The restore timer is enabled when issuing the nego request frame of rtw_p2p_connect function. */ + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); + pwdinfo->nego_req_info.benable = false; + result = process_p2p_group_negotation_resp( pwdinfo, frame_body, len); + issue_p2p_GO_confirm( pwdinfo->padapter, GetAddr2Ptr(pframe), result); if ( P2P_STATUS_SUCCESS == result ) { if ( rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT ) @@ -4884,189 +4718,212 @@ static unsigned int on_action_public_p2p(union recv_frame *precv_frame) _set_timer( &pwdinfo->reset_ch_sitesurvey2, P2P_RESET_SCAN_CH ); } } - break; - } - case P2P_INVIT_REQ: - { - /* Added by Albert 2010/10/05 */ - /* Received the P2P Invite Request frame. */ - DBG_88E( "[%s] Got invite request frame!\n", __func__ ); - if ( (p2p_ie=rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)) ) + /* Reset the dialog token for group negotiation frames. */ + pwdinfo->negotiation_dialog_token = 1; + + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL)) { - /* Parse the necessary information from the P2P Invitation Request frame. */ - /* For example: The MAC address of sending this P2P Invitation Request frame. */ - u32 attr_contentlen = 0; - u8 status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; - struct group_id_info group_id; - u8 invitation_flag = 0; + _set_timer( &pwdinfo->restore_p2p_state_timer, 5000 ); + } + } + else + { + DBG_88E( "[%s] Skipped GO Nego Resp Frame (p2p_state != P2P_STATE_GONEGO_ING)\n", __func__); + } + + break; + } + case P2P_GO_NEGO_CONF: + { + DBG_88E( "[%s] Got GO Nego Confirm Frame\n", __func__); + result = process_p2p_group_negotation_confirm( pwdinfo, frame_body, len); + if ( P2P_STATUS_SUCCESS == result ) + { + if ( rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT ) + { + pwdinfo->p2p_info.operation_ch[ 0 ] = pwdinfo->peer_operating_ch; + pwdinfo->p2p_info.scan_op_ch_only = 1; + _set_timer( &pwdinfo->reset_ch_sitesurvey2, P2P_RESET_SCAN_CH ); + } + } + break; + } + case P2P_INVIT_REQ: + { + /* Added by Albert 2010/10/05 */ + /* Received the P2P Invite Request frame. */ + + DBG_88E( "[%s] Got invite request frame!\n", __func__ ); + if ( (p2p_ie=rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)) ) + { + /* Parse the necessary information from the P2P Invitation Request frame. */ + /* For example: The MAC address of sending this P2P Invitation Request frame. */ + u32 attr_contentlen = 0; + u8 status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; + struct group_id_info group_id; + u8 invitation_flag = 0; + + rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_INVITATION_FLAGS, &invitation_flag, &attr_contentlen); + if ( attr_contentlen ) + { + + rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_BSSID, pwdinfo->p2p_peer_interface_addr, &attr_contentlen); + /* Commented by Albert 20120510 */ + /* Copy to the pwdinfo->p2p_peer_interface_addr. */ + /* So that the WFD UI ( or Sigma ) can get the peer interface address by using the following command. */ + /* #> iwpriv wlan0 p2p_get peer_ifa */ + /* After having the peer interface address, the sigma can find the correct conf file for wpa_supplicant. */ - rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_INVITATION_FLAGS, &invitation_flag, &attr_contentlen); if ( attr_contentlen ) { + DBG_88E( "[%s] GO's BSSID = %.2X %.2X %.2X %.2X %.2X %.2X\n", __func__, + pwdinfo->p2p_peer_interface_addr[0], pwdinfo->p2p_peer_interface_addr[1], + pwdinfo->p2p_peer_interface_addr[2], pwdinfo->p2p_peer_interface_addr[3], + pwdinfo->p2p_peer_interface_addr[4], pwdinfo->p2p_peer_interface_addr[5] ); + } - rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_BSSID, pwdinfo->p2p_peer_interface_addr, &attr_contentlen); - /* Commented by Albert 20120510 */ - /* Copy to the pwdinfo->p2p_peer_interface_addr. */ - /* So that the WFD UI ( or Sigma ) can get the peer interface address by using the following command. */ - /* #> iwpriv wlan0 p2p_get peer_ifa */ - /* After having the peer interface address, the sigma can find the correct conf file for wpa_supplicant. */ + if ( invitation_flag & P2P_INVITATION_FLAGS_PERSISTENT ) + { + /* Re-invoke the persistent group. */ + _rtw_memset( &group_id, 0x00, sizeof( struct group_id_info ) ); + rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, ( u8* ) &group_id, &attr_contentlen); if ( attr_contentlen ) { - DBG_88E( "[%s] GO's BSSID = %.2X %.2X %.2X %.2X %.2X %.2X\n", __func__, - pwdinfo->p2p_peer_interface_addr[0], pwdinfo->p2p_peer_interface_addr[1], - pwdinfo->p2p_peer_interface_addr[2], pwdinfo->p2p_peer_interface_addr[3], - pwdinfo->p2p_peer_interface_addr[4], pwdinfo->p2p_peer_interface_addr[5] ); - } - - if ( invitation_flag & P2P_INVITATION_FLAGS_PERSISTENT ) - { - /* Re-invoke the persistent group. */ - - _rtw_memset( &group_id, 0x00, sizeof( struct group_id_info ) ); - rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, ( u8* ) &group_id, &attr_contentlen); - if ( attr_contentlen ) + if ( _rtw_memcmp( group_id.go_device_addr, myid( &padapter->eeprompriv ), ETH_ALEN ) ) { - if ( _rtw_memcmp( group_id.go_device_addr, myid( &padapter->eeprompriv ), ETH_ALEN ) ) + /* The p2p device sending this p2p invitation request wants this Wi-Fi device to be the persistent GO. */ + rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_GO ); + rtw_p2p_set_role( pwdinfo, P2P_ROLE_GO ); + status_code = P2P_STATUS_SUCCESS; + } + else + { + /* The p2p device sending this p2p invitation request wants to be the persistent GO. */ + if ( is_matched_in_profilelist( pwdinfo->p2p_peer_interface_addr, &pwdinfo->profileinfo[ 0 ] ) ) { - /* The p2p device sending this p2p invitation request wants this Wi-Fi device to be the persistent GO. */ - rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_GO ); - rtw_p2p_set_role( pwdinfo, P2P_ROLE_GO ); - status_code = P2P_STATUS_SUCCESS; - } - else - { - /* The p2p device sending this p2p invitation request wants to be the persistent GO. */ - if ( is_matched_in_profilelist( pwdinfo->p2p_peer_interface_addr, &pwdinfo->profileinfo[ 0 ] ) ) + u8 operatingch_info[5] = { 0x00 }; + if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen) ) { - u8 operatingch_info[5] = { 0x00 }; - if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen) ) + if ( rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, (u32)operatingch_info[4] ) ) { - if ( rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, (u32)operatingch_info[4] ) ) - { - /* The operating channel is acceptable for this device. */ - pwdinfo->rx_invitereq_info.operation_ch[0]= operatingch_info[4]; - pwdinfo->rx_invitereq_info.scan_op_ch_only = 1; - _set_timer( &pwdinfo->reset_ch_sitesurvey, P2P_RESET_SCAN_CH ); - rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH ); - rtw_p2p_set_role( pwdinfo, P2P_ROLE_CLIENT ); - status_code = P2P_STATUS_SUCCESS; - } - else - { - /* The operating channel isn't supported by this device. */ - rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH ); - rtw_p2p_set_role( pwdinfo, P2P_ROLE_DEVICE ); - status_code = P2P_STATUS_FAIL_NO_COMMON_CH; - _set_timer( &pwdinfo->restore_p2p_state_timer, 3000 ); - } - } - else - { - /* Commented by Albert 20121130 */ - /* Intel will use the different P2P IE to store the operating channel information */ - /* Workaround for Intel WiDi 3.5 */ + /* The operating channel is acceptable for this device. */ + pwdinfo->rx_invitereq_info.operation_ch[0]= operatingch_info[4]; + pwdinfo->rx_invitereq_info.scan_op_ch_only = 1; + _set_timer( &pwdinfo->reset_ch_sitesurvey, P2P_RESET_SCAN_CH ); rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH ); rtw_p2p_set_role( pwdinfo, P2P_ROLE_CLIENT ); status_code = P2P_STATUS_SUCCESS; + } + else + { + /* The operating channel isn't supported by this device. */ + rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH ); + rtw_p2p_set_role( pwdinfo, P2P_ROLE_DEVICE ); + status_code = P2P_STATUS_FAIL_NO_COMMON_CH; + _set_timer( &pwdinfo->restore_p2p_state_timer, 3000 ); } } else { - rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH ); - status_code = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP; + /* Commented by Albert 20121130 */ + /* Intel will use the different P2P IE to store the operating channel information */ + /* Workaround for Intel WiDi 3.5 */ + rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH ); + rtw_p2p_set_role( pwdinfo, P2P_ROLE_CLIENT ); + status_code = P2P_STATUS_SUCCESS; } } - } - else - { - DBG_88E( "[%s] P2P Group ID Attribute NOT FOUND!\n", __func__ ); - status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; + else + { + rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH ); + status_code = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP; + } } } else { - /* Received the invitation to join a P2P group. */ - - _rtw_memset( &group_id, 0x00, sizeof( struct group_id_info ) ); - rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, ( u8* ) &group_id, &attr_contentlen); - if ( attr_contentlen ) - { - if ( _rtw_memcmp( group_id.go_device_addr, myid( &padapter->eeprompriv ), ETH_ALEN ) ) - { - /* In this case, the GO can't be myself. */ - rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH ); - status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; - } - else - { - /* The p2p device sending this p2p invitation request wants to join an existing P2P group */ - /* Commented by Albert 2012/06/28 */ - /* In this case, this Wi-Fi device should use the iwpriv command to get the peer device address. */ - /* The peer device address should be the destination address for the provisioning discovery request. */ - /* Then, this Wi-Fi device should use the iwpriv command to get the peer interface address. */ - /* The peer interface address should be the address for WPS mac address */ - _rtw_memcpy( pwdinfo->p2p_peer_device_addr, group_id.go_device_addr , ETH_ALEN ); - rtw_p2p_set_role( pwdinfo, P2P_ROLE_CLIENT ); - rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_JOIN ); - status_code = P2P_STATUS_SUCCESS; - } - } - else - { - DBG_88E( "[%s] P2P Group ID Attribute NOT FOUND!\n", __func__ ); - status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; - } + DBG_88E( "[%s] P2P Group ID Attribute NOT FOUND!\n", __func__ ); + status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; } } else { - DBG_88E( "[%s] P2P Invitation Flags Attribute NOT FOUND!\n", __func__ ); - status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; - } + /* Received the invitation to join a P2P group. */ - DBG_88E( "[%s] status_code = %d\n", __func__, status_code ); - - pwdinfo->inviteresp_info.token = frame_body[ 7 ]; - issue_p2p_invitation_response( padapter, GetAddr2Ptr(pframe), pwdinfo->inviteresp_info.token, status_code ); - } - break; - } - case P2P_INVIT_RESP: - { - u8 attr_content = 0x00; - u32 attr_contentlen = 0; - - DBG_88E( "[%s] Got invite response frame!\n", __func__ ); - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - if ( (p2p_ie=rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)) ) - { - rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen); - - if ( attr_contentlen == 1 ) - { - DBG_88E( "[%s] Status = %d\n", __func__, attr_content ); - pwdinfo->invitereq_info.benable = false; - - if ( attr_content == P2P_STATUS_SUCCESS ) + _rtw_memset( &group_id, 0x00, sizeof( struct group_id_info ) ); + rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, ( u8* ) &group_id, &attr_contentlen); + if ( attr_contentlen ) { - if ( _rtw_memcmp( pwdinfo->invitereq_info.go_bssid, myid( &padapter->eeprompriv ), ETH_ALEN )) + if ( _rtw_memcmp( group_id.go_device_addr, myid( &padapter->eeprompriv ), ETH_ALEN ) ) { - rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO ); + /* In this case, the GO can't be myself. */ + rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH ); + status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; } else { - rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); + /* The p2p device sending this p2p invitation request wants to join an existing P2P group */ + /* Commented by Albert 2012/06/28 */ + /* In this case, this Wi-Fi device should use the iwpriv command to get the peer device address. */ + /* The peer device address should be the destination address for the provisioning discovery request. */ + /* Then, this Wi-Fi device should use the iwpriv command to get the peer interface address. */ + /* The peer interface address should be the address for WPS mac address */ + _rtw_memcpy( pwdinfo->p2p_peer_device_addr, group_id.go_device_addr , ETH_ALEN ); + rtw_p2p_set_role( pwdinfo, P2P_ROLE_CLIENT ); + rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_JOIN ); + status_code = P2P_STATUS_SUCCESS; } - rtw_p2p_set_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_OK ); } else { - rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); - rtw_p2p_set_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL ); + DBG_88E( "[%s] P2P Group ID Attribute NOT FOUND!\n", __func__ ); + status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; } } + } + else + { + DBG_88E( "[%s] P2P Invitation Flags Attribute NOT FOUND!\n", __func__ ); + status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; + } + + DBG_88E( "[%s] status_code = %d\n", __func__, status_code ); + + pwdinfo->inviteresp_info.token = frame_body[ 7 ]; + issue_p2p_invitation_response( padapter, GetAddr2Ptr(pframe), pwdinfo->inviteresp_info.token, status_code ); + } + break; + } + case P2P_INVIT_RESP: + { + u8 attr_content = 0x00; + u32 attr_contentlen = 0; + + DBG_88E( "[%s] Got invite response frame!\n", __func__ ); + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); + if ( (p2p_ie=rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)) ) + { + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen); + + if ( attr_contentlen == 1 ) + { + DBG_88E( "[%s] Status = %d\n", __func__, attr_content ); + pwdinfo->invitereq_info.benable = false; + + if ( attr_content == P2P_STATUS_SUCCESS ) + { + if ( _rtw_memcmp( pwdinfo->invitereq_info.go_bssid, myid( &padapter->eeprompriv ), ETH_ALEN )) + { + rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO ); + } + else + { + rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); + } + rtw_p2p_set_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_OK ); + } else { rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); @@ -5078,52 +4935,57 @@ static unsigned int on_action_public_p2p(union recv_frame *precv_frame) rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); rtw_p2p_set_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL ); } - - if ( rtw_p2p_chk_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL ) ) - { - _set_timer( &pwdinfo->restore_p2p_state_timer, 5000 ); - } - break; } - case P2P_DEVDISC_REQ: - - process_p2p_devdisc_req(pwdinfo, pframe, len); - - break; - - case P2P_DEVDISC_RESP: - - process_p2p_devdisc_resp(pwdinfo, pframe, len); - - break; - - case P2P_PROVISION_DISC_REQ: - DBG_88E( "[%s] Got Provisioning Discovery Request Frame\n", __func__ ); - process_p2p_provdisc_req(pwdinfo, pframe, len); - _rtw_memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN); - - /* 20110902 Kurt */ - /* Add the following statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered. */ - if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ)) - rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); - - rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ); - _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT ); - break; - - case P2P_PROVISION_DISC_RESP: - /* Commented by Albert 20110707 */ - /* Should we check the pwdinfo->tx_prov_disc_info.bsent flag here?? */ - DBG_88E( "[%s] Got Provisioning Discovery Response Frame\n", __func__ ); - /* Commented by Albert 20110426 */ - /* The restore timer is enabled when issuing the provisioing request frame in rtw_p2p_prov_disc function. */ - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_RSP); - process_p2p_provdisc_resp(pwdinfo, pframe); - _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT ); - break; + else + { + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); + rtw_p2p_set_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL ); + } + if ( rtw_p2p_chk_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL ) ) + { + _set_timer( &pwdinfo->restore_p2p_state_timer, 5000 ); + } + break; } + case P2P_DEVDISC_REQ: + + process_p2p_devdisc_req(pwdinfo, pframe, len); + + break; + + case P2P_DEVDISC_RESP: + + process_p2p_devdisc_resp(pwdinfo, pframe, len); + + break; + + case P2P_PROVISION_DISC_REQ: + DBG_88E( "[%s] Got Provisioning Discovery Request Frame\n", __func__ ); + process_p2p_provdisc_req(pwdinfo, pframe, len); + _rtw_memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN); + + /* 20110902 Kurt */ + /* Add the following statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered. */ + if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ)) + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); + + rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ); + _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT ); + break; + + case P2P_PROVISION_DISC_RESP: + /* Commented by Albert 20110707 */ + /* Should we check the pwdinfo->tx_prov_disc_info.bsent flag here?? */ + DBG_88E( "[%s] Got Provisioning Discovery Response Frame\n", __func__ ); + /* Commented by Albert 20110426 */ + /* The restore timer is enabled when issuing the provisioing request frame in rtw_p2p_prov_disc function. */ + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); + rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_RSP); + process_p2p_provdisc_resp(pwdinfo, pframe); + _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT ); + break; + } #endif /* CONFIG_P2P */ @@ -5160,11 +5022,6 @@ static unsigned int on_action_public_default(union recv_frame *precv_frame, u8 a if (rtw_action_public_decache(precv_frame, token) == _FAIL) goto exit; - #ifdef CONFIG_IOCTL_CFG80211 - cnt += sprintf((msg+cnt), "%s(token:%u)", action_public_str(action), token); - rtw_cfg80211_rx_action(adapter, pframe, frame_len, msg); - #endif - ret = _SUCCESS; exit: @@ -5236,32 +5093,23 @@ unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame) if (be32_to_cpu(*((__be32 * )(frame_body + 1))) != P2POUI) return _SUCCESS; -#ifdef CONFIG_IOCTL_CFG80211 - if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) { - rtw_cfg80211_rx_action_p2p(padapter, pframe, len); - return _SUCCESS; - } else -#endif /* CONFIG_IOCTL_CFG80211 */ - { - len -= sizeof(struct rtw_ieee80211_hdr_3addr); - OUI_Subtype = frame_body[5]; + len -= sizeof(struct rtw_ieee80211_hdr_3addr); + OUI_Subtype = frame_body[5]; - switch (OUI_Subtype) { - case P2P_NOTICE_OF_ABSENCE: - break; - case P2P_PRESENCE_REQUEST: - process_p2p_presence_req(pwdinfo, pframe, len); - break; - case P2P_PRESENCE_RESPONSE: - break; - case P2P_GO_DISC_REQUEST: - break; - default: - break; - } + switch (OUI_Subtype) { + case P2P_NOTICE_OF_ABSENCE: + break; + case P2P_PRESENCE_REQUEST: + process_p2p_presence_req(pwdinfo, pframe, len); + break; + case P2P_PRESENCE_RESPONSE: + break; + case P2P_GO_DISC_REQUEST: + break; + default: + break; } #endif /* CONFIG_P2P */ - return _SUCCESS; } @@ -5546,89 +5394,60 @@ void issue_beacon(_adapter *padapter, int timeout_ms) remainder_ielen = cur_network->IELength - wps_offset - wpsielen; -#ifdef CONFIG_IOCTL_CFG80211 - if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) - { - if (pmlmepriv->wps_beacon_ie && pmlmepriv->wps_beacon_ie_len>0) - { - _rtw_memcpy(pframe, cur_network->IEs, wps_offset); - pframe += wps_offset; - pattrib->pktlen += wps_offset; + pframe_wscie = pframe + wps_offset; + _rtw_memcpy(pframe, cur_network->IEs, wps_offset+wpsielen); + pframe += (wps_offset + wpsielen); + pattrib->pktlen += (wps_offset + wpsielen); - _rtw_memcpy(pframe, pmlmepriv->wps_beacon_ie, pmlmepriv->wps_beacon_ie_len); - pframe += pmlmepriv->wps_beacon_ie_len; - pattrib->pktlen += pmlmepriv->wps_beacon_ie_len; + /* now pframe is end of wsc ie, insert Primary Device Type & Device Name */ + /* Primary Device Type */ + /* Type: */ + *(__be16 *) ( pframe + insert_len) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); + insert_len += 2; - /* copy remainder_ie to pframe */ - _rtw_memcpy(pframe, premainder_ie, remainder_ielen); - pframe += remainder_ielen; - pattrib->pktlen += remainder_ielen; - } - else - { - _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); - pframe += cur_network->IELength; - pattrib->pktlen += cur_network->IELength; - } - } - else -#endif /* CONFIG_IOCTL_CFG80211 */ - { - pframe_wscie = pframe + wps_offset; - _rtw_memcpy(pframe, cur_network->IEs, wps_offset+wpsielen); - pframe += (wps_offset + wpsielen); - pattrib->pktlen += (wps_offset + wpsielen); + /* Length: */ + *(__be16 *) ( pframe + insert_len ) = cpu_to_be16( 0x0008 ); + insert_len += 2; - /* now pframe is end of wsc ie, insert Primary Device Type & Device Name */ - /* Primary Device Type */ - /* Type: */ - *(__be16 *) ( pframe + insert_len) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); - insert_len += 2; + /* Value: */ + /* Category ID */ + *(__be16 *) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); + insert_len += 2; - /* Length: */ - *(__be16 *) ( pframe + insert_len ) = cpu_to_be16( 0x0008 ); - insert_len += 2; + /* OUI */ + *(__be32 *) ( pframe + insert_len ) = cpu_to_be32( WPSOUI ); + insert_len += 4; - /* Value: */ - /* Category ID */ - *(__be16 *) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); - insert_len += 2; - - /* OUI */ - *(__be32 *) ( pframe + insert_len ) = cpu_to_be32( WPSOUI ); - insert_len += 4; - - /* Sub Category ID */ - *(__be16 *) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); - insert_len += 2; + /* Sub Category ID */ + *(__be16 *) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); + insert_len += 2; - /* Device Name */ - /* Type: */ - *(__be16 *) ( pframe + insert_len ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); - insert_len += 2; + /* Device Name */ + /* Type: */ + *(__be16 *) ( pframe + insert_len ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + insert_len += 2; - /* Length: */ - *(__be16 *) ( pframe + insert_len ) = cpu_to_be16( pwdinfo->device_name_len ); - insert_len += 2; + /* Length: */ + *(__be16 *) ( pframe + insert_len ) = cpu_to_be16( pwdinfo->device_name_len ); + insert_len += 2; - /* Value: */ - _rtw_memcpy( pframe + insert_len, pwdinfo->device_name, pwdinfo->device_name_len ); - insert_len += pwdinfo->device_name_len; + /* Value: */ + _rtw_memcpy( pframe + insert_len, pwdinfo->device_name, pwdinfo->device_name_len ); + insert_len += pwdinfo->device_name_len; - /* update wsc ie length */ - *(pframe_wscie+1) = (wpsielen -2) + insert_len; + /* update wsc ie length */ + *(pframe_wscie+1) = (wpsielen -2) + insert_len; - /* pframe move to end */ - pframe+=insert_len; - pattrib->pktlen += insert_len; + /* pframe move to end */ + pframe+=insert_len; + pattrib->pktlen += insert_len; - /* copy remainder_ie to pframe */ - _rtw_memcpy(pframe, premainder_ie, remainder_ielen); - pframe += remainder_ielen; - pattrib->pktlen += remainder_ielen; - } + /* copy remainder_ie to pframe */ + _rtw_memcpy(pframe, premainder_ie, remainder_ielen); + pframe += remainder_ielen; + pattrib->pktlen += remainder_ielen; } else #endif /* CONFIG_P2P */ @@ -5663,39 +5482,12 @@ void issue_beacon(_adapter *padapter, int timeout_ms) if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { u32 len; -#ifdef CONFIG_IOCTL_CFG80211 - if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) - { - len = pmlmepriv->p2p_beacon_ie_len; - if (pmlmepriv->p2p_beacon_ie && len>0) - _rtw_memcpy(pframe, pmlmepriv->p2p_beacon_ie, len); - } - else -#endif /* CONFIG_IOCTL_CFG80211 */ - { - len = build_beacon_p2p_ie(pwdinfo, pframe); - } + len = build_beacon_p2p_ie(pwdinfo, pframe); pframe += len; pattrib->pktlen += len; #ifdef CONFIG_WFD -#ifdef CONFIG_IOCTL_CFG80211 - if (true == pwdinfo->wfd_info->wfd_enable) -#endif /* CONFIG_IOCTL_CFG80211 */ - { - len = build_beacon_wfd_ie( pwdinfo, pframe ); - } -#ifdef CONFIG_IOCTL_CFG80211 - else - { - len = 0; - if (pmlmepriv->wfd_beacon_ie && pmlmepriv->wfd_beacon_ie_len>0) - { - len = pmlmepriv->wfd_beacon_ie_len; - _rtw_memcpy(pframe, pmlmepriv->wfd_beacon_ie, len); - } - } -#endif /* CONFIG_IOCTL_CFG80211 */ + len = build_beacon_wfd_ie( pwdinfo, pframe ); pframe += len; pattrib->pktlen += len; #endif /* CONFIG_WFD */ @@ -5954,41 +5746,13 @@ void issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probe if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && is_valid_p2p_probereq) { u32 len; -#ifdef CONFIG_IOCTL_CFG80211 - if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) - { - /* if pwdinfo->role == P2P_ROLE_DEVICE will call issue_probersp_p2p() */ - len = pmlmepriv->p2p_go_probe_resp_ie_len; - if (pmlmepriv->p2p_go_probe_resp_ie && len>0) - _rtw_memcpy(pframe, pmlmepriv->p2p_go_probe_resp_ie, len); - } - else -#endif /* CONFIG_IOCTL_CFG80211 */ - { - len = build_probe_resp_p2p_ie(pwdinfo, pframe); - } + len = build_probe_resp_p2p_ie(pwdinfo, pframe); pframe += len; pattrib->pktlen += len; #ifdef CONFIG_WFD -#ifdef CONFIG_IOCTL_CFG80211 - if (true == pwdinfo->wfd_info->wfd_enable) -#endif /* CONFIG_IOCTL_CFG80211 */ - { - len = build_probe_resp_wfd_ie(pwdinfo, pframe, 0); - } -#ifdef CONFIG_IOCTL_CFG80211 - else - { - len = 0; - if (pmlmepriv->wfd_probe_resp_ie && pmlmepriv->wfd_probe_resp_ie_len>0) - { - len = pmlmepriv->wfd_probe_resp_ie_len; - _rtw_memcpy(pframe, pmlmepriv->wfd_probe_resp_ie, len); - } - } -#endif /* CONFIG_IOCTL_CFG80211 */ + len = build_probe_resp_wfd_ie(pwdinfo, pframe, 0); pframe += len; pattrib->pktlen += len; #endif /* CONFIG_WFD */ @@ -6430,7 +6194,6 @@ void issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *p } #ifdef CONFIG_P2P -#ifndef CONFIG_IOCTL_CFG80211 if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && (pstat->is_p2p_device == true)) { u32 len; @@ -6439,14 +6202,8 @@ void issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *p pframe += len; pattrib->pktlen += len; } -#endif /* CONFIG_IOCTL_CFG80211 */ #ifdef CONFIG_WFD - if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) -#ifdef CONFIG_IOCTL_CFG80211 - && (true == pwdinfo->wfd_info->wfd_enable) -#endif /* CONFIG_IOCTL_CFG80211 */ - ) - { + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { wfdielen = build_assoc_resp_wfd_ie(pwdinfo, pframe); pframe += wfdielen; pattrib->pktlen += wfdielen; @@ -6683,174 +6440,143 @@ void issue_assocreq(_adapter *padapter) #ifdef CONFIG_P2P -#ifdef CONFIG_IOCTL_CFG80211 - if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) { - if (pmlmepriv->p2p_assoc_req_ie && pmlmepriv->p2p_assoc_req_ie_len > 0) { - _rtw_memcpy(pframe, pmlmepriv->p2p_assoc_req_ie, pmlmepriv->p2p_assoc_req_ie_len); - pframe += pmlmepriv->p2p_assoc_req_ie_len; - pattrib->pktlen += pmlmepriv->p2p_assoc_req_ie_len; + if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) { + /* Should add the P2P IE in the association request frame. */ + /* P2P OUI */ + + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; /* WFA P2P v1.0 */ + + /* Commented by Albert 20101109 */ + /* According to the P2P Specification, the association request frame should contain 3 P2P attributes */ + /* 1. P2P Capability */ + /* 2. Extended Listen Timing */ + /* 3. Device Info */ + /* Commented by Albert 20110516 */ + /* 4. P2P Interface */ + + /* P2P Capability */ + /* Type: */ + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + + /* Length: */ + *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + /* Value: */ + /* Device Capability Bitmap, 1 byte */ + p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT; + + /* Group Capability Bitmap, 1 byte */ + if ( pwdinfo->persistent_supported ) + p2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT; + else + p2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT; + + /* Extended Listen Timing */ + /* Type: */ + p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; + + /* Length: */ + *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); + p2pielen += 2; + + /* Value: */ + /* Availability Period */ + *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + p2pielen += 2; + + /* Availability Interval */ + *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + p2pielen += 2; + + /* Device Info */ + /* Type: */ + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; + + /* Length: */ + /* 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */ + /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */ + *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); + p2pielen += 2; + + /* Value: */ + /* P2P Device Address */ + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + p2pielen += ETH_ALEN; + + /* Config Method */ + /* This field should be big endian. Noted by P2P specification. */ + if ( ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN ) || + ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN ) ) + { + *(__be16 *) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY ); } - } else -#endif /* CONFIG_IOCTL_CFG80211 */ - { - if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) { - /* Should add the P2P IE in the association request frame. */ - /* P2P OUI */ - - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; /* WFA P2P v1.0 */ - - /* Commented by Albert 20101109 */ - /* According to the P2P Specification, the association request frame should contain 3 P2P attributes */ - /* 1. P2P Capability */ - /* 2. Extended Listen Timing */ - /* 3. Device Info */ - /* Commented by Albert 20110516 */ - /* 4. P2P Interface */ - - /* P2P Capability */ - /* Type: */ - p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; - - /* Length: */ - *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - p2pielen += 2; - - /* Value: */ - /* Device Capability Bitmap, 1 byte */ - p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT; - - /* Group Capability Bitmap, 1 byte */ - if ( pwdinfo->persistent_supported ) - p2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT; - else - p2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT; - - /* Extended Listen Timing */ - /* Type: */ - p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; - - /* Length: */ - *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); - p2pielen += 2; - - /* Value: */ - /* Availability Period */ - *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); - p2pielen += 2; - - /* Availability Interval */ - *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); - p2pielen += 2; - - /* Device Info */ - /* Type: */ - p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; - - /* Length: */ - /* 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */ - /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */ - *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); - p2pielen += 2; - - /* Value: */ - /* P2P Device Address */ - _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); - p2pielen += ETH_ALEN; - - /* Config Method */ - /* This field should be big endian. Noted by P2P specification. */ - if ( ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN ) || - ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN ) ) - { - *(__be16 *) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY ); - } - else - { - *(__be16 *) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_PBC ); - } - - p2pielen += 2; - - /* Primary Device Type */ - /* Category ID */ - *(__be16 *) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); - p2pielen += 2; - - /* OUI */ - *(__be32 *) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); - p2pielen += 4; - - /* Sub Category ID */ - *(__be16 *) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); - p2pielen += 2; - - /* Number of Secondary Device Types */ - p2pie[ p2pielen++ ] = 0x00; /* No Secondary Device Type List */ - - /* Device Name */ - /* Type: */ - *(__be16 *) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); - p2pielen += 2; - - /* Length: */ - *(__be16 *) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); - p2pielen += 2; - - /* Value: */ - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len ); - p2pielen += pwdinfo->device_name_len; - - /* P2P Interface */ - /* Type: */ - p2pie[ p2pielen++ ] = P2P_ATTR_INTERFACE; - - /* Length: */ - *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0x000D ); - p2pielen += 2; - - /* Value: */ - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); /* P2P Device Address */ - p2pielen += ETH_ALEN; - - p2pie[ p2pielen++ ] = 1; /* P2P Interface Address Count */ - - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); /* P2P Interface Address List */ - p2pielen += ETH_ALEN; - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); - -#ifdef CONFIG_WFD - /* wfdielen = build_assoc_req_wfd_ie(pwdinfo, pframe); */ - /* pframe += wfdielen; */ - /* pattrib->pktlen += wfdielen; */ -#endif /* CONFIG_WFD */ + else + { + *(__be16 *) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_PBC ); } + + p2pielen += 2; + + /* Primary Device Type */ + /* Category ID */ + *(__be16 *) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); + p2pielen += 2; + + /* OUI */ + *(__be32 *) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + p2pielen += 4; + + /* Sub Category ID */ + *(__be16 *) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); + p2pielen += 2; + + /* Number of Secondary Device Types */ + p2pie[ p2pielen++ ] = 0x00; /* No Secondary Device Type List */ + + /* Device Name */ + /* Type: */ + *(__be16 *) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + p2pielen += 2; + + /* Length: */ + *(__be16 *) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); + p2pielen += 2; + + /* Value: */ + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len ); + p2pielen += pwdinfo->device_name_len; + + /* P2P Interface */ + /* Type: */ + p2pie[ p2pielen++ ] = P2P_ATTR_INTERFACE; + + /* Length: */ + *(__le16 *) ( p2pie + p2pielen ) = cpu_to_le16( 0x000D ); + p2pielen += 2; + + /* Value: */ + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); /* P2P Device Address */ + p2pielen += ETH_ALEN; + + p2pie[ p2pielen++ ] = 1; /* P2P Interface Address Count */ + + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); /* P2P Interface Address List */ + p2pielen += ETH_ALEN; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); } #endif /* CONFIG_P2P */ #ifdef CONFIG_WFD -#ifdef CONFIG_IOCTL_CFG80211 - if ( true == pwdinfo->wfd_info->wfd_enable ) -#endif /* CONFIG_IOCTL_CFG80211 */ - { - wfdielen = build_assoc_req_wfd_ie(pwdinfo, pframe); - pframe += wfdielen; - pattrib->pktlen += wfdielen; - } -#ifdef CONFIG_IOCTL_CFG80211 - else if (pmlmepriv->wfd_assoc_req_ie != NULL && pmlmepriv->wfd_assoc_req_ie_len>0) - { - /* WFD IE */ - _rtw_memcpy(pframe, pmlmepriv->wfd_assoc_req_ie, pmlmepriv->wfd_assoc_req_ie_len); - pattrib->pktlen += pmlmepriv->wfd_assoc_req_ie_len; - pframe += pmlmepriv->wfd_assoc_req_ie_len; - } -#endif /* CONFIG_IOCTL_CFG80211 */ + wfdielen = build_assoc_req_wfd_ie(pwdinfo, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; #endif /* CONFIG_WFD */ pattrib->last_txcmdsz = pattrib->pktlen; @@ -7939,16 +7665,12 @@ void site_survey(_adapter *padapter) /* switch back to the original channel */ /* SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset); */ + if ( rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN) ) { -#ifndef CONFIG_IOCTL_CFG80211 - if ( rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN) ) - { - set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - } - else -#endif /* CONFIG_IOCTL_CFG80211 */ - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); } + else + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); /* flush 4-AC Queue after site_survey */ /* val8 = 0; */ @@ -9896,14 +9618,6 @@ u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf) Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, false); /* config the initial gain under scaning, need to write the BB registers */ -#ifdef CONFIG_IOCTL_CFG80211 - if ((wdev_to_priv(padapter->rtw_wdev))->p2p_enabled == true) - { - initialgain = 0x30; - } - else - initialgain = 0x1E; -#else /* go through the WEXT interface CONFIG_IOCTL_CFG80211 */ #ifdef CONFIG_P2P if ( rtw_p2p_chk_state( pwdinfo, P2P_STATE_NONE ) ) initialgain = 0x1E; @@ -9912,7 +9626,6 @@ u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf) #else /* CONFIG_P2P */ initialgain = 0x1E; #endif /* CONFIG_P2P */ -#endif /* CONFIG_IOCTL_CFG80211 */ rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); diff --git a/core/rtw_p2p.c b/core/rtw_p2p.c index b483007..8274359 100644 --- a/core/rtw_p2p.c +++ b/core/rtw_p2p.c @@ -3183,404 +3183,28 @@ _func_enter_; _func_exit_; } -#ifdef CONFIG_IOCTL_CFG80211 -static void ro_ch_handler( _adapter* padapter ) -{ - struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; -_func_enter_; - - { - if ( pcfg80211_wdinfo->restore_channel != pmlmeext->cur_channel ) - { - if ( !check_fwstate(&padapter->mlmepriv, _FW_LINKED ) ) - pmlmeext->cur_channel = pcfg80211_wdinfo->restore_channel; - - set_channel_bwmode(padapter, pmlmeext->cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - } - - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); -#ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); -#endif - } - - pcfg80211_wdinfo->is_ro_ch = false; - - DBG_88E("cfg80211_remain_on_channel_expired\n"); - - cfg80211_remain_on_channel_expired(pcfg80211_wdinfo->remain_on_ch_dev, - pcfg80211_wdinfo->remain_on_ch_cookie, - &pcfg80211_wdinfo->remain_on_ch_channel, - pcfg80211_wdinfo->remain_on_ch_type, GFP_KERNEL); -_func_exit_; -} - -static void ro_ch_timer_process (void *FunctionContext) -{ - _adapter *adapter = (_adapter *)FunctionContext; - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(adapter->rtw_wdev); - - p2p_protocol_wk_cmd( adapter, P2P_RO_CH_WK); -} - -static void rtw_cfg80211_adjust_p2pie_channel(_adapter *padapter, const u8 *frame_body, u32 len) -{ -} - -#ifdef CONFIG_WFD -void rtw_append_wfd_ie(_adapter *padapter, u8 *buf, u32* len) -{ - unsigned char *frame_body; - u8 category, action, OUI_Subtype, dialogToken=0; - u32 wfdielen = 0; - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - - frame_body = (unsigned char *)(buf + sizeof(struct rtw_ieee80211_hdr_3addr)); - category = frame_body[0]; - - if (category == RTW_WLAN_CATEGORY_PUBLIC) - { - action = frame_body[1]; - if (action == ACT_PUBLIC_VENDOR - && _rtw_memcmp(frame_body+2, P2P_OUI, 4) == true - ) - { - OUI_Subtype = frame_body[6]; - dialogToken = frame_body[7]; - switch ( OUI_Subtype )/* OUI Subtype */ - { - case P2P_GO_NEGO_REQ: - { - wfdielen = build_nego_req_wfd_ie( &padapter->wdinfo, buf + ( *len ) ); - (*len) += wfdielen; - break; - } - case P2P_GO_NEGO_RESP: - { - wfdielen = build_nego_resp_wfd_ie( &padapter->wdinfo, buf + ( *len ) ); - (*len) += wfdielen; - break; - } - case P2P_GO_NEGO_CONF: - { - wfdielen = build_nego_confirm_wfd_ie( &padapter->wdinfo, buf + ( *len ) ); - (*len) += wfdielen; - break; - } - case P2P_INVIT_REQ: - { - wfdielen = build_invitation_req_wfd_ie( &padapter->wdinfo, buf + ( *len ) ); - (*len) += wfdielen; - break; - } - case P2P_INVIT_RESP: - { - wfdielen = build_invitation_resp_wfd_ie( &padapter->wdinfo, buf + ( *len ) ); - (*len) += wfdielen; - break; - } - case P2P_DEVDISC_REQ: - break; - case P2P_DEVDISC_RESP: - - break; - case P2P_PROVISION_DISC_REQ: - { - wfdielen = build_provdisc_req_wfd_ie( &padapter->wdinfo, buf + ( *len ) ); - (*len) += wfdielen; - break; - } - case P2P_PROVISION_DISC_RESP: - { - wfdielen = build_provdisc_resp_wfd_ie( &padapter->wdinfo, buf + ( *len ) ); - (*len) += wfdielen; - break; - } - default: - - break; - } - - } - - } - else if (category == RTW_WLAN_CATEGORY_P2P) - { - OUI_Subtype = frame_body[5]; - dialogToken = frame_body[6]; - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("ACTION_CATEGORY_P2P: OUI=0x%x, OUI_Subtype=%d, dialogToken=%d\n", - cpu_to_be32( *( ( u32* ) ( frame_body + 1 ) ) ), OUI_Subtype, dialogToken); -#endif - - switch (OUI_Subtype) - { - case P2P_NOTICE_OF_ABSENCE: - - break; - case P2P_PRESENCE_REQUEST: - - break; - case P2P_PRESENCE_RESPONSE: - - break; - case P2P_GO_DISC_REQUEST: - - break; - default: - - break; - } - - } - else - { - DBG_88E("%s, action frame category=%d\n", __func__, category); - /* is_p2p_frame = (-1); */ - } - - return; -} -#endif - -int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx) -{ - int is_p2p_frame = (-1); - unsigned char *frame_body; - u8 category, action, OUI_Subtype, dialogToken=0; - u8 *p2p_ie = NULL; - uint p2p_ielen = 0; - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - - frame_body = (unsigned char *)(buf + sizeof(struct rtw_ieee80211_hdr_3addr)); - category = frame_body[0]; - /* just for check */ - if (category == RTW_WLAN_CATEGORY_PUBLIC) - { - action = frame_body[1]; - if (action == ACT_PUBLIC_VENDOR - && _rtw_memcmp(frame_body+2, P2P_OUI, 4) == true - ) - { - OUI_Subtype = frame_body[6]; - dialogToken = frame_body[7]; - is_p2p_frame = OUI_Subtype; - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("ACTION_CATEGORY_PUBLIC: ACT_PUBLIC_VENDOR, OUI=0x%x, OUI_Subtype=%d, dialogToken=%d\n", - cpu_to_be32( *( ( u32* ) ( frame_body + 2 ) ) ), OUI_Subtype, dialogToken); - #endif - - p2p_ie = rtw_get_p2p_ie( - (u8 *)buf+sizeof(struct rtw_ieee80211_hdr_3addr)+_PUBLIC_ACTION_IE_OFFSET_, - len-sizeof(struct rtw_ieee80211_hdr_3addr)-_PUBLIC_ACTION_IE_OFFSET_, - NULL, &p2p_ielen); - - switch ( OUI_Subtype )/* OUI Subtype */ - { - u8 *cont; - uint cont_len; - case P2P_GO_NEGO_REQ: - DBG_88E("RTW_%s:P2P_GO_NEGO_REQ, dialogToken=%d\n", (tx==true)?"Tx":"Rx", dialogToken); - - if (tx) - { -#ifdef CONFIG_DRV_ISSUE_PROV_REQ /* IOT FOR S2 */ - if (pwdev_priv->provdisc_req_issued == false) - rtw_cfg80211_issue_p2p_provision_request(padapter, buf, len); -#endif /* CONFIG_DRV_ISSUE_PROV_REQ */ - } - - break; - case P2P_GO_NEGO_RESP: - cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len); - DBG_88E("RTW_%s:P2P_GO_NEGO_RESP, dialogToken=%d, status:%d\n", (tx==true)?"Tx":"Rx", dialogToken, cont?*cont:-1); - - if (!tx) - pwdev_priv->provdisc_req_issued = false; - break; - case P2P_GO_NEGO_CONF: - cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len); - DBG_88E("RTW_%s:P2P_GO_NEGO_CONF, dialogToken=%d, status:%d\n", (tx==true)?"Tx":"Rx", dialogToken, cont?*cont:-1); - break; - case P2P_INVIT_REQ: - { - struct rtw_wdev_invit_info* invit_info = &pwdev_priv->invit_info; - int flags = -1; - int op_ch = 0; - - if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_INVITATION_FLAGS, NULL, &cont_len))) - flags = *cont; - if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len))) - op_ch = *(cont+4); - - if (invit_info->token != dialogToken) - rtw_wdev_invit_info_init(invit_info); - - invit_info->token = dialogToken; - invit_info->flags = (flags==-1) ? 0x0 : flags; - invit_info->req_op_ch= op_ch; - - DBG_88E("RTW_%s:P2P_INVIT_REQ, dialogToken=%d, flags:0x%02x, op_ch:%d\n", (tx==true)?"Tx":"Rx", dialogToken, flags, op_ch); - break; - } - case P2P_INVIT_RESP: - { - struct rtw_wdev_invit_info* invit_info = &pwdev_priv->invit_info; - int status = -1; - int op_ch = 0; - - if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len))) - status = *cont; - if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len))) - op_ch = *(cont+4); - - if (invit_info->token != dialogToken) { - rtw_wdev_invit_info_init(invit_info); - } else { - invit_info->token = 0; - invit_info->status = (status==-1) ? 0xff : status; - invit_info->rsp_op_ch= op_ch; - } - - DBG_88E("RTW_%s:P2P_INVIT_RESP, dialogToken=%d, status:%d, op_ch:%d\n", (tx==true)?"Tx":"Rx", dialogToken, status, op_ch); - break; - } - case P2P_DEVDISC_REQ: - DBG_88E("RTW_%s:P2P_DEVDISC_REQ, dialogToken=%d\n", (tx==true)?"Tx":"Rx", dialogToken); - break; - case P2P_DEVDISC_RESP: - cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len); - DBG_88E("RTW_%s:P2P_DEVDISC_RESP, dialogToken=%d, status:%d\n", (tx==true)?"Tx":"Rx", dialogToken, cont?*cont:-1); - break; - case P2P_PROVISION_DISC_REQ: - { - size_t frame_body_len = len - sizeof(struct rtw_ieee80211_hdr_3addr); - u8 *p2p_ie; - uint p2p_ielen = 0; - uint contentlen = 0; - - DBG_88E("RTW_%s:P2P_PROVISION_DISC_REQ, dialogToken=%d\n", (tx==true)?"Tx":"Rx", dialogToken); - - /* if (tx) */ - { - pwdev_priv->provdisc_req_issued = false; - - if ( (p2p_ie=rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen))) - { - - if (rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, NULL, &contentlen)) - { - pwdev_priv->provdisc_req_issued = false;/* case: p2p_client join p2p GO */ - } - else - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("provdisc_req_issued is true\n"); - #endif /* CONFIG_DEBUG_CFG80211 */ - pwdev_priv->provdisc_req_issued = true;/* case: p2p_devices connection before Nego req. */ - } - - } - } - } - break; - case P2P_PROVISION_DISC_RESP: - DBG_88E("RTW_%s:P2P_PROVISION_DISC_RESP, dialogToken=%d\n", (tx==true)?"Tx":"Rx", dialogToken); - break; - default: - DBG_88E("RTW_%s:OUI_Subtype=%d, dialogToken=%d\n", (tx==true)?"Tx":"Rx", OUI_Subtype, dialogToken); - break; - } - - } - - } - else if (category == RTW_WLAN_CATEGORY_P2P) - { - OUI_Subtype = frame_body[5]; - dialogToken = frame_body[6]; - - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("ACTION_CATEGORY_P2P: OUI=0x%x, OUI_Subtype=%d, dialogToken=%d\n", - cpu_to_be32( *( ( u32* ) ( frame_body + 1 ) ) ), OUI_Subtype, dialogToken); - #endif - - is_p2p_frame = OUI_Subtype; - - switch (OUI_Subtype) - { - case P2P_NOTICE_OF_ABSENCE: - DBG_88E("RTW_%s:P2P_NOTICE_OF_ABSENCE, dialogToken=%d\n", (tx==true)?"TX":"RX", dialogToken); - break; - case P2P_PRESENCE_REQUEST: - DBG_88E("RTW_%s:P2P_PRESENCE_REQUEST, dialogToken=%d\n", (tx==true)?"TX":"RX", dialogToken); - break; - case P2P_PRESENCE_RESPONSE: - DBG_88E("RTW_%s:P2P_PRESENCE_RESPONSE, dialogToken=%d\n", (tx==true)?"TX":"RX", dialogToken); - break; - case P2P_GO_DISC_REQUEST: - DBG_88E("RTW_%s:P2P_GO_DISC_REQUEST, dialogToken=%d\n", (tx==true)?"TX":"RX", dialogToken); - break; - default: - DBG_88E("RTW_%s:OUI_Subtype=%d, dialogToken=%d\n", (tx==true)?"TX":"RX", OUI_Subtype, dialogToken); - break; - } - - } - else - { - DBG_88E("RTW_%s:action frame category=%d\n", (tx==true)?"TX":"RX", category); - /* is_p2p_frame = (-1); */ - } - - return is_p2p_frame; -} - -void rtw_init_cfg80211_wifidirect_info( _adapter* padapter) -{ - struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; - - _rtw_memset(pcfg80211_wdinfo, 0x00, sizeof(struct cfg80211_wifidirect_info) ); - - _init_timer( &pcfg80211_wdinfo->remain_on_ch_timer, padapter->pnetdev, ro_ch_timer_process, padapter ); -} -#endif /* CONFIG_IOCTL_CFG80211 */ - void p2p_protocol_wk_hdl(_adapter *padapter, int intCmdType) { struct wifidirect_info *pwdinfo= &(padapter->wdinfo); _func_enter_; - switch (intCmdType) - { - case P2P_FIND_PHASE_WK: - find_phase_handler( padapter ); - break; - case P2P_RESTORE_STATE_WK: - restore_p2p_state_handler( padapter ); - break; - case P2P_PRE_TX_PROVDISC_PROCESS_WK: - pre_tx_provdisc_handler( padapter ); - break; - case P2P_PRE_TX_INVITEREQ_PROCESS_WK: - pre_tx_invitereq_handler( padapter ); - break; - case P2P_PRE_TX_NEGOREQ_PROCESS_WK: - pre_tx_negoreq_handler( padapter ); - break; -#ifdef CONFIG_IOCTL_CFG80211 - case P2P_RO_CH_WK: - { - ro_ch_handler( padapter ); - break; - } -#endif /* CONFIG_IOCTL_CFG80211 */ - + switch (intCmdType) { + case P2P_FIND_PHASE_WK: + find_phase_handler( padapter ); + break; + case P2P_RESTORE_STATE_WK: + restore_p2p_state_handler( padapter ); + break; + case P2P_PRE_TX_PROVDISC_PROCESS_WK: + pre_tx_provdisc_handler( padapter ); + break; + case P2P_PRE_TX_INVITEREQ_PROCESS_WK: + pre_tx_invitereq_handler( padapter ); + break; + case P2P_PRE_TX_NEGOREQ_PROCESS_WK: + pre_tx_negoreq_handler( padapter ); + break; } _func_exit_; diff --git a/core/rtw_pwrctrl.c b/core/rtw_pwrctrl.c index dd00cc8..3a1332b 100644 --- a/core/rtw_pwrctrl.c +++ b/core/rtw_pwrctrl.c @@ -137,9 +137,6 @@ static bool rtw_pwr_unassociated_idle(_adapter *adapter) struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); #ifdef CONFIG_P2P struct wifidirect_info *pwdinfo = &(adapter->wdinfo); -#ifdef CONFIG_IOCTL_CFG80211 - struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &adapter->cfg80211_wdinfo; -#endif #endif bool ret = false; @@ -153,9 +150,7 @@ static bool rtw_pwr_unassociated_idle(_adapter *adapter) || check_fwstate(pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS) || check_fwstate(pmlmepriv, WIFI_AP_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE) - #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) && defined(CONFIG_P2P_IPS) - || pcfg80211_wdinfo->is_ro_ch - #elif defined(CONFIG_P2P) + #if defined(CONFIG_P2P) || !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) #endif ) { @@ -167,18 +162,13 @@ static bool rtw_pwr_unassociated_idle(_adapter *adapter) struct mlme_priv *b_pmlmepriv = &(buddy->mlmepriv); #ifdef CONFIG_P2P struct wifidirect_info *b_pwdinfo = &(buddy->wdinfo); - #ifdef CONFIG_IOCTL_CFG80211 - struct cfg80211_wifidirect_info *b_pcfg80211_wdinfo = &buddy->cfg80211_wdinfo; - #endif #endif if (check_fwstate(b_pmlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR) || check_fwstate(b_pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS) || check_fwstate(b_pmlmepriv, WIFI_AP_STATE) || check_fwstate(b_pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE) - #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) && defined(CONFIG_P2P_IPS) - || b_pcfg80211_wdinfo->is_ro_ch - #elif defined(CONFIG_P2P) + #if defined(CONFIG_P2P) || !rtw_p2p_chk_state(b_pwdinfo, P2P_STATE_NONE) #endif ) { @@ -426,11 +416,6 @@ u8 PS_RDY_CHECK(_adapter * padapter) DBG_88E("Group handshake still in progress !!!\n"); return false; } -#ifdef CONFIG_IOCTL_CFG80211 - if (!rtw_cfg80211_pwr_mgmt(padapter)) - return false; -#endif - return true; } diff --git a/include/autoconf.h b/include/autoconf.h index ba8907f..9f55b33 100644 --- a/include/autoconf.h +++ b/include/autoconf.h @@ -32,16 +32,10 @@ #define CONFIG_RTL8188E -#ifdef CONFIG_IOCTL_CFG80211 - #define CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER - #define CONFIG_SET_SCAN_DENY_TIMER -#endif - /* * Internal General Config */ - #define CONFIG_EMBEDDED_FWIMG #define CONFIG_80211N_HT diff --git a/include/drv_types.h b/include/drv_types.h index 406923c..1b9c372 100644 --- a/include/drv_types.h +++ b/include/drv_types.h @@ -76,10 +76,6 @@ typedef struct _ADAPTER _adapter, ADAPTER,*PADAPTER; #include #include -#ifdef CONFIG_IOCTL_CFG80211 - #include "ioctl_cfg80211.h" -#endif //CONFIG_IOCTL_CFG80211 - #define SPEC_DEV_ID_NONE BIT(0) #define SPEC_DEV_ID_DISABLE_HT BIT(1) #define SPEC_DEV_ID_ENABLE_PS BIT(2) @@ -336,12 +332,6 @@ struct _ADAPTER{ struct hostapd_priv *phostapdpriv; #endif -#ifdef CONFIG_IOCTL_CFG80211 -#ifdef CONFIG_P2P - struct cfg80211_wifidirect_info cfg80211_wdinfo; -#endif //CONFIG_P2P -#endif //CONFIG_IOCTL_CFG80211 - #ifdef CONFIG_P2P struct wifidirect_info wdinfo; #endif //CONFIG_P2P @@ -388,10 +378,6 @@ struct _ADAPTER{ struct iw_statistics iwstats; struct proc_dir_entry *dir_dev;// for proc directory -#ifdef CONFIG_IOCTL_CFG80211 - struct wireless_dev *rtw_wdev; -#endif //CONFIG_IOCTL_CFG80211 - int net_closed; u8 bFWReady; u8 bBTFWReady; diff --git a/include/ioctl_cfg80211.h b/include/ioctl_cfg80211.h index 542dfd5..e2b8a8f 100644 --- a/include/ioctl_cfg80211.h +++ b/include/ioctl_cfg80211.h @@ -20,11 +20,6 @@ #ifndef __IOCTL_CFG80211_H__ #define __IOCTL_CFG80211_H__ - -#if defined(RTW_USE_CFG80211_STA_EVENT) - #undef CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER -#endif - struct rtw_wdev_invit_info { u8 token; u8 flags; diff --git a/include/osdep_service.h b/include/osdep_service.h index 83634f9..7b5614e 100644 --- a/include/osdep_service.h +++ b/include/osdep_service.h @@ -63,11 +63,6 @@ #include #include -#ifdef CONFIG_IOCTL_CFG80211 -#include -#include -#endif //CONFIG_IOCTL_CFG80211 - #include #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) #include diff --git a/include/rtw_mlme.h b/include/rtw_mlme.h index 0d136a6..3d8438d 100644 --- a/include/rtw_mlme.h +++ b/include/rtw_mlme.h @@ -234,18 +234,6 @@ struct scan_limit_info{ u8 operation_ch[2]; // Store the operation channel of invitation request frame }; -#ifdef CONFIG_IOCTL_CFG80211 -struct cfg80211_wifidirect_info{ - _timer remain_on_ch_timer; - u8 restore_channel; - struct ieee80211_channel remain_on_ch_channel; - enum nl80211_channel_type remain_on_ch_type; - u64 remain_on_ch_cookie; - struct net_device *remain_on_ch_dev; - bool is_ro_ch; -}; -#endif //CONFIG_IOCTL_CFG80211 - struct wifidirect_info{ _adapter* padapter; _timer find_phase_timer; @@ -392,11 +380,6 @@ struct mlme_priv { _timer scan_to_timer; // driver itself handles scan_timeout status. u32 scan_start_time; // used to evaluate the time spent in scanning - #ifdef CONFIG_SET_SCAN_DENY_TIMER - _timer set_scan_deny_timer; - ATOMIC_T set_scan_deny; //0: allowed, 1: deny - #endif - struct qos_priv qospriv; #ifdef CONFIG_80211N_HT @@ -464,12 +447,11 @@ struct mlme_priv { u8 *wps_beacon_ie; //u8 *wps_probe_req_ie; u8 *wps_probe_resp_ie; - u8 *wps_assoc_resp_ie; // for CONFIG_IOCTL_CFG80211, this IE could include p2p ie / wfd ie + u8 *wps_assoc_resp_ie; u32 wps_beacon_ie_len; - //u32 wps_probe_req_ie_len; u32 wps_probe_resp_ie_len; - u32 wps_assoc_resp_ie_len; // for CONFIG_IOCTL_CFG80211, this IE len could include p2p ie / wfd ie + u32 wps_assoc_resp_ie_len; u8 *p2p_beacon_ie; u8 *p2p_probe_req_ie; @@ -482,41 +464,12 @@ struct mlme_priv { u32 p2p_probe_resp_ie_len; u32 p2p_go_probe_resp_ie_len; //for GO u32 p2p_assoc_req_ie_len; -/* -#if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) - //u8 *wps_p2p_beacon_ie; - u8 *p2p_beacon_ie; - u8 *wps_p2p_probe_resp_ie; - u8 *wps_p2p_assoc_resp_ie; - //u32 wps_p2p_beacon_ie_len; - u32 p2p_beacon_ie_len; - u32 wps_p2p_probe_resp_ie_len; - u32 wps_p2p_assoc_resp_ie_len; -#endif -*/ - _lock bcn_update_lock; u8 update_bcn; #endif //#if defined (CONFIG_AP_MODE) -#if defined(CONFIG_WFD) && defined(CONFIG_IOCTL_CFG80211) - - u8 *wfd_beacon_ie; - u8 *wfd_probe_req_ie; - u8 *wfd_probe_resp_ie; - u8 *wfd_go_probe_resp_ie; //for GO - u8 *wfd_assoc_req_ie; - - u32 wfd_beacon_ie_len; - u32 wfd_probe_req_ie_len; - u32 wfd_probe_resp_ie_len; - u32 wfd_go_probe_resp_ie_len; //for GO - u32 wfd_assoc_req_ie_len; - -#endif - #ifdef CONFIG_FTP_PROTECT u8 ftp_lock_flag; #endif //CONFIG_FTP_PROTECT @@ -682,17 +635,10 @@ extern void _rtw_join_timeout_handler(_adapter *adapter); extern void rtw_scan_timeout_handler(_adapter *adapter); extern void rtw_dynamic_check_timer_handlder(_adapter *adapter); -#ifdef CONFIG_SET_SCAN_DENY_TIMER -bool rtw_is_scan_deny(_adapter *adapter); -void rtw_clear_scan_deny(_adapter *adapter); -void rtw_set_scan_deny_timer_hdl(_adapter *adapter); -void rtw_set_scan_deny(_adapter *adapter, u32 ms); -#else #define rtw_is_scan_deny(adapter) false #define rtw_clear_scan_deny(adapter) do {} while (0) #define rtw_set_scan_deny_timer_hdl(adapter) do {} while (0) #define rtw_set_scan_deny(adapter, ms) do {} while (0) -#endif extern int _rtw_init_mlme_priv(_adapter *padapter); diff --git a/include/rtw_p2p.h b/include/rtw_p2p.h index 681056e..5c42100 100644 --- a/include/rtw_p2p.h +++ b/include/rtw_p2p.h @@ -59,12 +59,6 @@ void process_p2p_ps_ie(PADAPTER padapter, u8 *IEs, u32 IELength); void p2p_ps_wk_hdl(_adapter *padapter, u8 p2p_ps_state); u8 p2p_ps_wk_cmd(_adapter*padapter, u8 p2p_ps_state, u8 enqueue); -#ifdef CONFIG_IOCTL_CFG80211 -void rtw_init_cfg80211_wifidirect_info( _adapter* padapter); -int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx); -void rtw_append_wfd_ie(_adapter *padapter, u8 *buf, u32 *len); -#endif //CONFIG_IOCTL_CFG80211 - void reset_global_wifidirect_info( _adapter* padapter ); int rtw_init_wifi_display_info(_adapter* padapter); void rtw_init_wifidirect_timers(_adapter* padapter); diff --git a/include/sta_info.h b/include/sta_info.h index d9076ab..ed424fe 100644 --- a/include/sta_info.h +++ b/include/sta_info.h @@ -220,11 +220,6 @@ struct sta_info { #endif // CONFIG_AP_MODE -#ifdef CONFIG_IOCTL_CFG80211 - u8 *passoc_req; - u32 assoc_req_len; -#endif - //for DM RSSI_STA rssi_stat; diff --git a/os_dep/ioctl_cfg80211.c b/os_dep/ioctl_cfg80211.c deleted file mode 100644 index 8fb2452..0000000 --- a/os_dep/ioctl_cfg80211.c +++ /dev/null @@ -1,4779 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _IOCTL_CFG80211_C_ - -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_IOCTL_CFG80211 - -#include "ioctl_cfg80211.h" - -#define RTW_MAX_MGMT_TX_CNT (8) - -#define RTW_SCAN_IE_LEN_MAX 2304 -#define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 65535 //ms -#define RTW_MAX_NUM_PMKIDS 4 - -#define RTW_CH_MAX_2G_CHANNEL 14 /* Max channel in 2G band */ - -static const u32 rtw_cipher_suites[] = { - WLAN_CIPHER_SUITE_WEP40, - WLAN_CIPHER_SUITE_WEP104, - WLAN_CIPHER_SUITE_TKIP, - WLAN_CIPHER_SUITE_CCMP, -}; - -#define RATETAB_ENT(_rate, _rateid, _flags) \ - { \ - .bitrate = (_rate), \ - .hw_value = (_rateid), \ - .flags = (_flags), \ - } - -#define CHAN2G(_channel, _freq, _flags) { \ - .band = IEEE80211_BAND_2GHZ, \ - .center_freq = (_freq), \ - .hw_value = (_channel), \ - .flags = (_flags), \ - .max_antenna_gain = 0, \ - .max_power = 30, \ -} - -#define CHAN5G(_channel, _flags) { \ - .band = IEEE80211_BAND_5GHZ, \ - .center_freq = 5000 + (5 * (_channel)), \ - .hw_value = (_channel), \ - .flags = (_flags), \ - .max_antenna_gain = 0, \ - .max_power = 30, \ -} - -static struct ieee80211_rate rtw_rates[] = { - RATETAB_ENT(10, 0x1, 0), - RATETAB_ENT(20, 0x2, 0), - RATETAB_ENT(55, 0x4, 0), - RATETAB_ENT(110, 0x8, 0), - RATETAB_ENT(60, 0x10, 0), - RATETAB_ENT(90, 0x20, 0), - RATETAB_ENT(120, 0x40, 0), - RATETAB_ENT(180, 0x80, 0), - RATETAB_ENT(240, 0x100, 0), - RATETAB_ENT(360, 0x200, 0), - RATETAB_ENT(480, 0x400, 0), - RATETAB_ENT(540, 0x800, 0), -}; - -#define rtw_a_rates (rtw_rates + 4) -#define RTW_A_RATES_NUM 8 -#define rtw_g_rates (rtw_rates + 0) -#define RTW_G_RATES_NUM 12 - -#define RTW_2G_CHANNELS_NUM 14 -#define RTW_5G_CHANNELS_NUM 37 - -static struct ieee80211_channel rtw_2ghz_channels[] = { - CHAN2G(1, 2412, 0), - CHAN2G(2, 2417, 0), - CHAN2G(3, 2422, 0), - CHAN2G(4, 2427, 0), - CHAN2G(5, 2432, 0), - CHAN2G(6, 2437, 0), - CHAN2G(7, 2442, 0), - CHAN2G(8, 2447, 0), - CHAN2G(9, 2452, 0), - CHAN2G(10, 2457, 0), - CHAN2G(11, 2462, 0), - CHAN2G(12, 2467, 0), - CHAN2G(13, 2472, 0), - CHAN2G(14, 2484, 0), -}; - -static struct ieee80211_channel rtw_5ghz_a_channels[] = { - CHAN5G(34, 0), CHAN5G(36, 0), - CHAN5G(38, 0), CHAN5G(40, 0), - CHAN5G(42, 0), CHAN5G(44, 0), - CHAN5G(46, 0), CHAN5G(48, 0), - CHAN5G(52, 0), CHAN5G(56, 0), - CHAN5G(60, 0), CHAN5G(64, 0), - CHAN5G(100, 0), CHAN5G(104, 0), - CHAN5G(108, 0), CHAN5G(112, 0), - CHAN5G(116, 0), CHAN5G(120, 0), - CHAN5G(124, 0), CHAN5G(128, 0), - CHAN5G(132, 0), CHAN5G(136, 0), - CHAN5G(140, 0), CHAN5G(149, 0), - CHAN5G(153, 0), CHAN5G(157, 0), - CHAN5G(161, 0), CHAN5G(165, 0), - CHAN5G(184, 0), CHAN5G(188, 0), - CHAN5G(192, 0), CHAN5G(196, 0), - CHAN5G(200, 0), CHAN5G(204, 0), - CHAN5G(208, 0), CHAN5G(212, 0), - CHAN5G(216, 0), -}; - - -void rtw_2g_channels_init(struct ieee80211_channel *channels) -{ - _rtw_memcpy((void*)channels, (void*)rtw_2ghz_channels, - sizeof(struct ieee80211_channel)*RTW_2G_CHANNELS_NUM - ); -} - -void rtw_5g_channels_init(struct ieee80211_channel *channels) -{ - _rtw_memcpy((void*)channels, (void*)rtw_5ghz_a_channels, - sizeof(struct ieee80211_channel)*RTW_5G_CHANNELS_NUM - ); -} - -void rtw_2g_rates_init(struct ieee80211_rate *rates) -{ - _rtw_memcpy(rates, rtw_g_rates, - sizeof(struct ieee80211_rate)*RTW_G_RATES_NUM - ); -} - -void rtw_5g_rates_init(struct ieee80211_rate *rates) -{ - _rtw_memcpy(rates, rtw_a_rates, - sizeof(struct ieee80211_rate)*RTW_A_RATES_NUM - ); -} - -struct ieee80211_supported_band *rtw_spt_band_alloc( - enum ieee80211_band band - ) -{ - struct ieee80211_supported_band *spt_band = NULL; - int n_channels, n_bitrates; - - if (band == IEEE80211_BAND_2GHZ) - { - n_channels = RTW_2G_CHANNELS_NUM; - n_bitrates = RTW_G_RATES_NUM; - } - else if (band == IEEE80211_BAND_5GHZ) - { - n_channels = RTW_5G_CHANNELS_NUM; - n_bitrates = RTW_A_RATES_NUM; - } - else - { - goto exit; - } - - spt_band = (struct ieee80211_supported_band *)rtw_zmalloc( - sizeof(struct ieee80211_supported_band) - + sizeof(struct ieee80211_channel)*n_channels - + sizeof(struct ieee80211_rate)*n_bitrates - ); - if (!spt_band) - goto exit; - - spt_band->channels = (struct ieee80211_channel*)(((u8*)spt_band)+sizeof(struct ieee80211_supported_band)); - spt_band->bitrates= (struct ieee80211_rate*)(((u8*)spt_band->channels)+sizeof(struct ieee80211_channel)*n_channels); - spt_band->band = band; - spt_band->n_channels = n_channels; - spt_band->n_bitrates = n_bitrates; - - if (band == IEEE80211_BAND_2GHZ) - { - rtw_2g_channels_init(spt_band->channels); - rtw_2g_rates_init(spt_band->bitrates); - } - else if (band == IEEE80211_BAND_5GHZ) - { - rtw_5g_channels_init(spt_band->channels); - rtw_5g_rates_init(spt_band->bitrates); - } - - //spt_band.ht_cap - -exit: - - return spt_band; -} - -void rtw_spt_band_free(struct ieee80211_supported_band *spt_band) -{ - u32 size; - - if (!spt_band) - return; - - if (spt_band->band == IEEE80211_BAND_2GHZ) - { - size = sizeof(struct ieee80211_supported_band) - + sizeof(struct ieee80211_channel)*RTW_2G_CHANNELS_NUM - + sizeof(struct ieee80211_rate)*RTW_G_RATES_NUM; - } - else if (spt_band->band == IEEE80211_BAND_5GHZ) - { - size = sizeof(struct ieee80211_supported_band) - + sizeof(struct ieee80211_channel)*RTW_5G_CHANNELS_NUM - + sizeof(struct ieee80211_rate)*RTW_A_RATES_NUM; - } - else - { - - } - rtw_mfree((u8*)spt_band, size); -} - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) -static const struct ieee80211_txrx_stypes -rtw_cfg80211_default_mgmt_stypes[NUM_NL80211_IFTYPES] = { - [NL80211_IFTYPE_ADHOC] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) - }, - [NL80211_IFTYPE_STATION] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) - }, - [NL80211_IFTYPE_AP] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | - BIT(IEEE80211_STYPE_DISASSOC >> 4) | - BIT(IEEE80211_STYPE_AUTH >> 4) | - BIT(IEEE80211_STYPE_DEAUTH >> 4) | - BIT(IEEE80211_STYPE_ACTION >> 4) - }, - [NL80211_IFTYPE_AP_VLAN] = { - /* copy AP */ - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | - BIT(IEEE80211_STYPE_DISASSOC >> 4) | - BIT(IEEE80211_STYPE_AUTH >> 4) | - BIT(IEEE80211_STYPE_DEAUTH >> 4) | - BIT(IEEE80211_STYPE_ACTION >> 4) - }, - [NL80211_IFTYPE_P2P_CLIENT] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) - }, - [NL80211_IFTYPE_P2P_GO] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | - BIT(IEEE80211_STYPE_DISASSOC >> 4) | - BIT(IEEE80211_STYPE_AUTH >> 4) | - BIT(IEEE80211_STYPE_DEAUTH >> 4) | - BIT(IEEE80211_STYPE_ACTION >> 4) - }, -}; -#endif - -static int rtw_ieee80211_channel_to_frequency(int chan, int band) -{ - /* see 802.11 17.3.8.3.2 and Annex J - * there are overlapping channel numbers in 5GHz and 2GHz bands */ - - if (band == IEEE80211_BAND_5GHZ) { - if (chan >= 182 && chan <= 196) - return 4000 + chan * 5; - else - return 5000 + chan * 5; - } else { /* IEEE80211_BAND_2GHZ */ - if (chan == 14) - return 2484; - else if (chan < 14) - return 2407 + chan * 5; - else - return 0; /* not supported */ - } -} - -static int rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork) -{ - int ret=0; - struct ieee80211_channel *notify_channel; - struct cfg80211_bss *bss; - //struct ieee80211_supported_band *band; - u16 channel; - u32 freq; - u64 notify_timestamp; - u16 notify_capability; - u16 notify_interval; - u8 *notify_ie; - size_t notify_ielen; - s32 notify_signal; - u8 buf[768], *pbuf; - size_t len; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - struct wireless_dev *wdev = padapter->rtw_wdev; - struct wiphy *wiphy = wdev->wiphy; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - - //DBG_88E("%s\n", __func__); - - - channel = pnetwork->network.Configuration.DSConfig; - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - - notify_channel = ieee80211_get_channel(wiphy, freq); - - //rtw_get_timestampe_from_ie() - notify_timestamp = jiffies_to_msecs(jiffies)*1000; /* uSec */ - - notify_interval = le16_to_cpu(*(u16*)rtw_get_beacon_interval_from_ie(pnetwork->network.IEs)); - notify_capability = le16_to_cpu(*(u16*)rtw_get_capability_from_ie(pnetwork->network.IEs)); - - - notify_ie = pnetwork->network.IEs+_FIXED_IE_LENGTH_; - notify_ielen = pnetwork->network.IELength-_FIXED_IE_LENGTH_; - - //We've set wiphy's signal_type as CFG80211_SIGNAL_TYPE_MBM: signal strength in mBm (100*dBm) - if ( check_fwstate(pmlmepriv, _FW_LINKED)== true && - is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) { - notify_signal = 100*translate_percentage_to_dbm(padapter->recvpriv.signal_strength);//dbm - } else { - notify_signal = 100*translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);//dbm - } - -/* - DBG_88E("bssid: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n", - pnetwork->network.MacAddress[0], pnetwork->network.MacAddress[1], pnetwork->network.MacAddress[2], - pnetwork->network.MacAddress[3], pnetwork->network.MacAddress[4], pnetwork->network.MacAddress[5]); - DBG_88E("Channel: %d(%d)\n", channel, freq); - DBG_88E("Capability: %X\n", notify_capability); - DBG_88E("Beacon interval: %d\n", notify_interval); - DBG_88E("Signal: %d\n", notify_signal); - DBG_88E("notify_timestamp: %#018llx\n", notify_timestamp); -*/ - - pbuf = buf; - pwlanhdr = (struct rtw_ieee80211_hdr *)pbuf; - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); - //pmlmeext->mgnt_seq++; - - if (pnetwork->network.Reserved[0] == 1) { // WIFI_BEACON - _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); - SetFrameSubType(pbuf, WIFI_BEACON); - } else { - _rtw_memcpy(pwlanhdr->addr1, myid(&(padapter->eeprompriv)), ETH_ALEN); - SetFrameSubType(pbuf, WIFI_PROBERSP); - } - - _rtw_memcpy(pwlanhdr->addr2, pnetwork->network.MacAddress, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, pnetwork->network.MacAddress, ETH_ALEN); - - - pbuf += sizeof(struct rtw_ieee80211_hdr_3addr); - len = sizeof (struct rtw_ieee80211_hdr_3addr); - - _rtw_memcpy(pbuf, pnetwork->network.IEs, pnetwork->network.IELength); - len += pnetwork->network.IELength; - - //#ifdef CONFIG_P2P - //if (rtw_get_p2p_ie(pnetwork->network.IEs+12, pnetwork->network.IELength-12, NULL, NULL)) - //{ - // DBG_88E("%s, got p2p_ie\n", __func__); - //} - //#endif - - -#if 1 - bss = cfg80211_inform_bss_frame(wiphy, notify_channel, (struct ieee80211_mgmt *)buf, - len, notify_signal, GFP_ATOMIC); -#else - - bss = cfg80211_inform_bss(wiphy, notify_channel, (const u8 *)pnetwork->network.MacAddress, - notify_timestamp, notify_capability, notify_interval, notify_ie, - notify_ielen, notify_signal, GFP_ATOMIC/*GFP_KERNEL*/); -#endif - - if (unlikely(!bss)) { - DBG_88E("rtw_cfg80211_inform_bss error\n"); - return -EINVAL; - } - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38)) -#ifndef COMPAT_KERNEL_RELEASE - //patch for cfg80211, update beacon ies to information_elements - if (pnetwork->network.Reserved[0] == 1) { // WIFI_BEACON - - if (bss->len_information_elements != bss->len_beacon_ies) - { - bss->information_elements = bss->beacon_ies; - bss->len_information_elements = bss->len_beacon_ies; - } - } -#endif //COMPAT_KERNEL_RELEASE -#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38) - -/* - { - if ( bss->information_elements == bss->proberesp_ies) - { - if ( bss->len_information_elements != bss->len_proberesp_ies) - { - DBG_88E("error!, len_information_elements != bss->len_proberesp_ies\n"); - } - - } - else if (bss->len_information_elements < bss->len_beacon_ies) - { - bss->information_elements = bss->beacon_ies; - bss->len_information_elements = bss->len_beacon_ies; - } - } -*/ - - cfg80211_put_bss(bss); - - return ret; - -} - -void rtw_cfg80211_indicate_connect(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wlan_network *cur_network = &(pmlmepriv->cur_network); - struct wireless_dev *pwdev = padapter->rtw_wdev; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif - - - DBG_88E("%s(padapter=%p)\n", __func__, padapter); - - if (pwdev->iftype != NL80211_IFTYPE_STATION - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - && pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT - #endif - ) { - return; - } - - if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == true) - return; - -#ifdef CONFIG_P2P - if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); - rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); - rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); - DBG_88E("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); - } -#endif //CONFIG_P2P - - if (pmlmepriv->to_roaming > 0) { - #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) || defined(COMPAT_KERNEL_RELEASE) - struct wiphy *wiphy = pwdev->wiphy; - struct ieee80211_channel *notify_channel; - u32 freq; - u16 channel = cur_network->network.Configuration.DSConfig; - - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - - notify_channel = ieee80211_get_channel(wiphy, freq); - #endif - - DBG_88E("%s call cfg80211_roamed\n", __func__); - cfg80211_roamed(padapter->pnetdev - #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) || defined(COMPAT_KERNEL_RELEASE) - , notify_channel - #endif - , cur_network->network.MacAddress - , pmlmepriv->assoc_req+sizeof(struct rtw_ieee80211_hdr_3addr)+2 - , pmlmepriv->assoc_req_len-sizeof(struct rtw_ieee80211_hdr_3addr)-2 - , pmlmepriv->assoc_rsp+sizeof(struct rtw_ieee80211_hdr_3addr)+6 - , pmlmepriv->assoc_rsp_len-sizeof(struct rtw_ieee80211_hdr_3addr)-6 - , GFP_ATOMIC); - } else { - DBG_88E("pwdev->sme_state(b)=%d\n", pwdev->sme_state); - cfg80211_connect_result(padapter->pnetdev, cur_network->network.MacAddress - , pmlmepriv->assoc_req+sizeof(struct rtw_ieee80211_hdr_3addr)+2 - , pmlmepriv->assoc_req_len-sizeof(struct rtw_ieee80211_hdr_3addr)-2 - , pmlmepriv->assoc_rsp+sizeof(struct rtw_ieee80211_hdr_3addr)+6 - , pmlmepriv->assoc_rsp_len-sizeof(struct rtw_ieee80211_hdr_3addr)-6 - , WLAN_STATUS_SUCCESS, GFP_ATOMIC); - DBG_88E("pwdev->sme_state(a)=%d\n", pwdev->sme_state); - } -} - -void rtw_cfg80211_indicate_disconnect(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wireless_dev *pwdev = padapter->rtw_wdev; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif - - DBG_88E("%s(padapter=%p)\n", __func__, padapter); - - if (pwdev->iftype != NL80211_IFTYPE_STATION - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - && pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT - #endif - ) { - return; - } - - if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == true) - return; - -#ifdef CONFIG_P2P - if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - _cancel_timer_ex( &pwdinfo->find_phase_timer ); - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); - - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); - rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); - - DBG_88E("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); - } -#endif //CONFIG_P2P - - if (!padapter->mlmepriv.not_indic_disco) { - DBG_88E("pwdev->sme_state(b)=%d\n", pwdev->sme_state); - - if (pwdev->sme_state==CFG80211_SME_CONNECTING) - cfg80211_connect_result(padapter->pnetdev, NULL, NULL, 0, NULL, 0, - WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_ATOMIC/*GFP_KERNEL*/); - else if (pwdev->sme_state==CFG80211_SME_CONNECTED) - cfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, GFP_ATOMIC); - //else - //DBG_88E("pwdev->sme_state=%d\n", pwdev->sme_state); - - DBG_88E("pwdev->sme_state(a)=%d\n", pwdev->sme_state); - } -} - - -#ifdef CONFIG_AP_MODE -static u8 set_pairwise_key(_adapter *padapter, struct sta_info *psta) -{ - struct cmd_obj* ph2c; - struct set_stakey_parm *psetstakey_para; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if ( ph2c == NULL){ - res= _FAIL; - goto exit; - } - - psetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm)); - if (psetstakey_para==NULL){ - rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res=_FAIL; - goto exit; - } - - init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_); - - - psetstakey_para->algorithm = (u8)psta->dot118021XPrivacy; - - _rtw_memcpy(psetstakey_para->addr, psta->hwaddr, ETH_ALEN); - - _rtw_memcpy(psetstakey_para->key, &psta->dot118021x_UncstKey, 16); - - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - -exit: - - return res; - -} - -static int set_group_key(_adapter *padapter, u8 *key, u8 alg, int keyid) -{ - u8 keylen; - struct cmd_obj* pcmd; - struct setkey_parm *psetkeyparm; - struct cmd_priv *pcmdpriv=&(padapter->cmdpriv); - int res=_SUCCESS; - - DBG_88E("%s\n", __func__); - - pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if (pcmd==NULL){ - res= _FAIL; - goto exit; - } - psetkeyparm=(struct setkey_parm*)rtw_zmalloc(sizeof(struct setkey_parm)); - if (psetkeyparm==NULL){ - rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - _rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm)); - - psetkeyparm->keyid=(u8)keyid; - - psetkeyparm->algorithm = alg; - - psetkeyparm->set_tx = 1; - - switch (alg) - { - case _WEP40_: - keylen = 5; - break; - case _WEP104_: - keylen = 13; - break; - case _TKIP_: - case _TKIP_WTMIC_: - case _AES_: - keylen = 16; - default: - keylen = 16; - } - - _rtw_memcpy(&(psetkeyparm->key[0]), key, keylen); - - 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); - - res = rtw_enqueue_cmd(pcmdpriv, pcmd); - -exit: - - return res; - - -} - -static int set_wep_key(_adapter *padapter, u8 *key, u8 keylen, int keyid) -{ - u8 alg; - - switch (keylen) - { - case 5: - alg =_WEP40_; - break; - case 13: - alg =_WEP104_; - break; - default: - alg =_NO_PRIVACY_; - } - - return set_group_key(padapter, key, alg, keyid); - -} - -static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len) -{ - int ret = 0; - u32 wep_key_idx, wep_key_len,wep_total_len; - struct sta_info *psta = NULL, *pbcmc_sta = NULL; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv* psecuritypriv=&(padapter->securitypriv); - struct sta_priv *pstapriv = &padapter->stapriv; - - DBG_88E("%s\n", __func__); - - param->u.crypt.err = 0; - param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0'; - - //sizeof(struct ieee_param) = 64 bytes; - //if (param_len != (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len) - if (param_len != sizeof(struct ieee_param) + param->u.crypt.key_len) - { - ret = -EINVAL; - goto exit; - } - - if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff && - param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff && - param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) - { - if (param->u.crypt.idx >= WEP_KEYS) - { - ret = -EINVAL; - goto exit; - } - } - else - { - psta = rtw_get_stainfo(pstapriv, param->sta_addr); - if (!psta) - { - //ret = -EINVAL; - DBG_88E("rtw_set_encryption(), sta has already been removed or never been added\n"); - goto exit; - } - } - - if (strcmp(param->u.crypt.alg, "none") == 0 && (psta==NULL)) - { - //todo:clear default encryption keys - - DBG_88E("clear default encryption keys, keyid=%d\n", param->u.crypt.idx); - - goto exit; - } - - - if (strcmp(param->u.crypt.alg, "WEP") == 0 && (psta==NULL)) - { - DBG_88E("r871x_set_encryption, crypt.alg = WEP\n"); - - wep_key_idx = param->u.crypt.idx; - wep_key_len = param->u.crypt.key_len; - - DBG_88E("r871x_set_encryption, wep_key_idx=%d, len=%d\n", wep_key_idx, wep_key_len); - - if ((wep_key_idx >= WEP_KEYS) || (wep_key_len<=0)) - { - ret = -EINVAL; - goto exit; - } - - if (wep_key_len > 0) - { - wep_key_len = wep_key_len <= 5 ? 5 : 13; - } - - if (psecuritypriv->bWepDefaultKeyIdxSet == 0) - { - //wep default key has not been set, so use this key index as default key. - - psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; - psecuritypriv->dot11PrivacyAlgrthm=_WEP40_; - psecuritypriv->dot118021XGrpPrivacy=_WEP40_; - - if (wep_key_len == 13) - { - psecuritypriv->dot11PrivacyAlgrthm=_WEP104_; - psecuritypriv->dot118021XGrpPrivacy=_WEP104_; - } - - psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx; - } - - _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), param->u.crypt.key, wep_key_len); - - psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len; - - set_wep_key(padapter, param->u.crypt.key, wep_key_len, wep_key_idx); - - goto exit; - - } - - - if (!psta && check_fwstate(pmlmepriv, WIFI_AP_STATE)) // //group key - { - if (param->u.crypt.set_tx == 0) //group key - { - if (strcmp(param->u.crypt.alg, "WEP") == 0) - { - DBG_88E("%s, set group_key, WEP\n", __func__); - - _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - - psecuritypriv->dot118021XGrpPrivacy = _WEP40_; - if (param->u.crypt.key_len==13) - { - psecuritypriv->dot118021XGrpPrivacy = _WEP104_; - } - - } - else if (strcmp(param->u.crypt.alg, "TKIP") == 0) - { - DBG_88E("%s, set group_key, TKIP\n", __func__); - - psecuritypriv->dot118021XGrpPrivacy = _TKIP_; - - _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - - //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len); - //set mic key - _rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8); - _rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8); - - psecuritypriv->busetkipkey = true; - - } - else if (strcmp(param->u.crypt.alg, "CCMP") == 0) - { - DBG_88E("%s, set group_key, CCMP\n", __func__); - - psecuritypriv->dot118021XGrpPrivacy = _AES_; - - _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - } - else - { - DBG_88E("%s, set group_key, none\n", __func__); - - psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; - } - - psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx; - - psecuritypriv->binstallGrpkey = true; - - psecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;//!!! - - set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx); - - pbcmc_sta=rtw_get_bcmc_stainfo(padapter); - if (pbcmc_sta) - { - pbcmc_sta->ieee8021x_blocked = false; - pbcmc_sta->dot118021XPrivacy= psecuritypriv->dot118021XGrpPrivacy;//rx will use bmc_sta's dot118021XPrivacy - } - - } - - goto exit; - - } - - if (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X && psta) // psk/802_1x - { - if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) - { - if (param->u.crypt.set_tx ==1) //pairwise key - { - _rtw_memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - - if (strcmp(param->u.crypt.alg, "WEP") == 0) - { - DBG_88E("%s, set pairwise key, WEP\n", __func__); - - psta->dot118021XPrivacy = _WEP40_; - if (param->u.crypt.key_len==13) - { - psta->dot118021XPrivacy = _WEP104_; - } - } - else if (strcmp(param->u.crypt.alg, "TKIP") == 0) - { - DBG_88E("%s, set pairwise key, TKIP\n", __func__); - - psta->dot118021XPrivacy = _TKIP_; - - //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len); - //set mic key - _rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8); - _rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8); - - psecuritypriv->busetkipkey = true; - - } - else if (strcmp(param->u.crypt.alg, "CCMP") == 0) - { - - DBG_88E("%s, set pairwise key, CCMP\n", __func__); - - psta->dot118021XPrivacy = _AES_; - } - else - { - DBG_88E("%s, set pairwise key, none\n", __func__); - - psta->dot118021XPrivacy = _NO_PRIVACY_; - } - - set_pairwise_key(padapter, psta); - - psta->ieee8021x_blocked = false; - - psta->bpairwise_key_installed = true; - - } - else//group key??? - { - if (strcmp(param->u.crypt.alg, "WEP") == 0) - { - _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - - psecuritypriv->dot118021XGrpPrivacy = _WEP40_; - if (param->u.crypt.key_len==13) - { - psecuritypriv->dot118021XGrpPrivacy = _WEP104_; - } - } - else if (strcmp(param->u.crypt.alg, "TKIP") == 0) - { - psecuritypriv->dot118021XGrpPrivacy = _TKIP_; - - _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - - //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len); - //set mic key - _rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8); - _rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8); - - psecuritypriv->busetkipkey = true; - - } - else if (strcmp(param->u.crypt.alg, "CCMP") == 0) - { - psecuritypriv->dot118021XGrpPrivacy = _AES_; - - _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - } - else - { - psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; - } - - psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx; - - psecuritypriv->binstallGrpkey = true; - - psecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;//!!! - - set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx); - - pbcmc_sta=rtw_get_bcmc_stainfo(padapter); - if (pbcmc_sta) - { - pbcmc_sta->ieee8021x_blocked = false; - pbcmc_sta->dot118021XPrivacy= psecuritypriv->dot118021XGrpPrivacy;//rx will use bmc_sta's dot118021XPrivacy - } - - } - - } - - } - -exit: - - return ret; - -} -#endif - -static int rtw_cfg80211_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len) -{ - int ret = 0; - u32 wep_key_idx, wep_key_len,wep_total_len; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; -#ifdef CONFIG_P2P - struct wifidirect_info* pwdinfo = &padapter->wdinfo; -#endif //CONFIG_P2P - -_func_enter_; - - DBG_88E("%s\n", __func__); - - param->u.crypt.err = 0; - param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0'; - - if (param_len < (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len) - { - ret = -EINVAL; - goto exit; - } - - if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff && - param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff && - param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) - { - if (param->u.crypt.idx >= WEP_KEYS) - { - ret = -EINVAL; - goto exit; - } - } else { - ret = -EINVAL; - goto exit; - } - - if (strcmp(param->u.crypt.alg, "WEP") == 0) - { - RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,("wpa_set_encryption, crypt.alg = WEP\n")); - DBG_88E("wpa_set_encryption, crypt.alg = WEP\n"); - - wep_key_idx = param->u.crypt.idx; - wep_key_len = param->u.crypt.key_len; - - if ((wep_key_idx > WEP_KEYS) || (wep_key_len <= 0)) - { - ret = -EINVAL; - goto exit; - } - - if (psecuritypriv->bWepDefaultKeyIdxSet == 0) - { - //wep default key has not been set, so use this key index as default key. - - wep_key_len = wep_key_len <= 5 ? 5 : 13; - - psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; - psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; - psecuritypriv->dot118021XGrpPrivacy = _WEP40_; - - if (wep_key_len==13) - { - psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; - psecuritypriv->dot118021XGrpPrivacy = _WEP104_; - } - - psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx; - } - - _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), param->u.crypt.key, wep_key_len); - - psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len; - - rtw_set_key(padapter, psecuritypriv, wep_key_idx, 0); - - goto exit; - } - - if (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) // 802_1x - { - struct sta_info * psta,*pbcmc_sta; - struct sta_priv * pstapriv = &padapter->stapriv; - - //DBG_88E("%s, : dot11AuthAlgrthm == dot11AuthAlgrthm_8021X\n", __func__); - - if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_MP_STATE) == true) //sta mode - { - psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); - if (psta == NULL) { - //DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail\n")); - DBG_88E("%s, : Obtain Sta_info fail\n", __func__); - } - else - { - //Jeff: don't disable ieee8021x_blocked while clearing key - if (strcmp(param->u.crypt.alg, "none") != 0) - psta->ieee8021x_blocked = false; - - - if ((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled)|| - (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) - { - psta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; - } - - if (param->u.crypt.set_tx ==1)//pairwise key - { - - DBG_88E("%s, : param->u.crypt.set_tx ==1\n", __func__); - - _rtw_memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - - if (strcmp(param->u.crypt.alg, "TKIP") == 0)//set mic key - { - //DEBUG_ERR(("\nset key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len)); - _rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8); - _rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8); - - padapter->securitypriv.busetkipkey=false; - //_set_timer(&padapter->securitypriv.tkip_timer, 50); - } - - //DEBUG_ERR((" param->u.crypt.key_len=%d\n",param->u.crypt.key_len)); - DBG_88E(" ~~~~set sta key:unicastkey\n"); - - rtw_setstakey_cmd(padapter, (unsigned char *)psta, true); - } - else//group key - { - _rtw_memcpy(padapter->securitypriv.dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key,(param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - _rtw_memcpy(padapter->securitypriv.dot118021XGrptxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[16]),8); - _rtw_memcpy(padapter->securitypriv.dot118021XGrprxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[24]),8); - padapter->securitypriv.binstallGrpkey = true; - //DEBUG_ERR((" param->u.crypt.key_len=%d\n", param->u.crypt.key_len)); - DBG_88E(" ~~~~set sta key:groupkey\n"); - - padapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx; - - rtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1); -#ifdef CONFIG_P2P - if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING)) - { - rtw_p2p_set_state(pwdinfo, P2P_STATE_PROVISIONING_DONE); - } -#endif //CONFIG_P2P - - } - } - - pbcmc_sta=rtw_get_bcmc_stainfo(padapter); - if (pbcmc_sta==NULL) - { - //DEBUG_ERR( ("Set OID_802_11_ADD_KEY: bcmc stainfo is null\n")); - } - else - { - //Jeff: don't disable ieee8021x_blocked while clearing key - if (strcmp(param->u.crypt.alg, "none") != 0) - pbcmc_sta->ieee8021x_blocked = false; - - if ((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled)|| - (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) - { - pbcmc_sta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; - } - } - } - } - -exit: - - DBG_88E("%s, ret=%d\n", __func__, ret); - - _func_exit_; - - return ret; -} - -static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - u8 key_index, bool pairwise, const u8 *mac_addr, -#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - u8 key_index, const u8 *mac_addr, -#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - struct key_params *params) -{ - char *alg_name; - u32 param_len; - struct ieee_param *param = NULL; - int ret=0; - struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy); - _adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - DBG_88E(FUNC_NDEV_FMT" adding key for %pM\n", FUNC_NDEV_ARG(ndev), mac_addr); - DBG_88E("cipher=0x%x\n", params->cipher); - DBG_88E("key_len=0x%x\n", params->key_len); - DBG_88E("seq_len=0x%x\n", params->seq_len); - DBG_88E("key_index=%d\n", key_index); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - DBG_88E("pairwise=%d\n", pairwise); -#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - - param_len = sizeof(struct ieee_param) + params->key_len; - param = (struct ieee_param *)rtw_malloc(param_len); - if (param == NULL) - return -1; - - _rtw_memset(param, 0, param_len); - - param->cmd = IEEE_CMD_SET_ENCRYPTION; - _rtw_memset(param->sta_addr, 0xff, ETH_ALEN); - - switch (params->cipher) { - case IW_AUTH_CIPHER_NONE: - //todo: remove key - //remove = 1; - alg_name = "none"; - break; - case WLAN_CIPHER_SUITE_WEP40: - case WLAN_CIPHER_SUITE_WEP104: - alg_name = "WEP"; - break; - case WLAN_CIPHER_SUITE_TKIP: - alg_name = "TKIP"; - break; - case WLAN_CIPHER_SUITE_CCMP: - alg_name = "CCMP"; - break; - default: - ret = -ENOTSUPP; - goto addkey_end; - } - - strncpy((char *)param->u.crypt.alg, alg_name, IEEE_CRYPT_ALG_NAME_LEN); - - - if (!mac_addr || is_broadcast_ether_addr(mac_addr)) - { - param->u.crypt.set_tx = 0; //for wpa/wpa2 group key - } else { - param->u.crypt.set_tx = 1; //for wpa/wpa2 pairwise key - } - - - //param->u.crypt.idx = key_index - 1; - param->u.crypt.idx = key_index; - - if (params->seq_len && params->seq) - { - _rtw_memcpy(param->u.crypt.seq, params->seq, params->seq_len); - } - - if (params->key_len && params->key) - { - param->u.crypt.key_len = params->key_len; - _rtw_memcpy(param->u.crypt.key, params->key, params->key_len); - } - - if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == true) - { - ret = rtw_cfg80211_set_encryption(ndev, param, param_len); - } - else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == true) - { -#ifdef CONFIG_AP_MODE - if (mac_addr) - _rtw_memcpy(param->sta_addr, (void*)mac_addr, ETH_ALEN); - - ret = rtw_cfg80211_ap_set_encryption(ndev, param, param_len); -#endif - } - else - { - DBG_88E("error! fw_state=0x%x, iftype=%d\n", pmlmepriv->fw_state, rtw_wdev->iftype); - - } - -addkey_end: - if (param) - { - rtw_mfree((u8*)param, param_len); - } - - return ret; - -} - -static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - u8 key_index, bool pairwise, const u8 *mac_addr, -#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - u8 key_index, const u8 *mac_addr, -#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - void *cookie, - void (*callback)(void *cookie, - struct key_params*)) -{ - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - return 0; -} - -static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - u8 key_index, bool pairwise, const u8 *mac_addr) -#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - u8 key_index, const u8 *mac_addr) -#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) -{ - _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); - struct security_priv *psecuritypriv = &padapter->securitypriv; - - DBG_88E(FUNC_NDEV_FMT" key_index=%d\n", FUNC_NDEV_ARG(ndev), key_index); - - if (key_index == psecuritypriv->dot11PrivacyKeyIndex) - { - //clear the flag of wep default key set. - psecuritypriv->bWepDefaultKeyIdxSet = 0; - } - - return 0; -} - -static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, - struct net_device *ndev, u8 key_index - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - , bool unicast, bool multicast - #endif - ) -{ - _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); - struct security_priv *psecuritypriv = &padapter->securitypriv; - - DBG_88E(FUNC_NDEV_FMT" key_index=%d" - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - ", unicast=%d, multicast=%d" - #endif - ".\n", FUNC_NDEV_ARG(ndev), key_index - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - , unicast, multicast - #endif - ); - - if ((key_index < WEP_KEYS) && ((psecuritypriv->dot11PrivacyAlgrthm == _WEP40_) || (psecuritypriv->dot11PrivacyAlgrthm == _WEP104_))) //set wep default key - { - psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; - - psecuritypriv->dot11PrivacyKeyIndex = key_index; - - psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; - psecuritypriv->dot118021XGrpPrivacy = _WEP40_; - if (psecuritypriv->dot11DefKeylen[key_index] == 13) - { - psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; - psecuritypriv->dot118021XGrpPrivacy = _WEP104_; - } - - psecuritypriv->bWepDefaultKeyIdxSet = 1; //set the flag to represent that wep default key has been set - } - - return 0; - -} - -static int cfg80211_rtw_get_station(struct wiphy *wiphy, - struct net_device *ndev, - u8 *mac, struct station_info *sinfo) -{ - _adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - if (!mac) { - DBG_88E(FUNC_NDEV_FMT" mac==%p\n", FUNC_NDEV_ARG(ndev), mac); - return -ENOENT; - } - sinfo->filled = 0; - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_88E(FUNC_NDEV_FMT" mac=%pM\n", FUNC_NDEV_ARG(ndev), mac); -#endif - - //for infra./P2PClient mode - if ( check_fwstate(pmlmepriv, WIFI_STATION_STATE) - && check_fwstate(pmlmepriv, _FW_LINKED) - ) - { - struct wlan_network *cur_network = &(pmlmepriv->cur_network); - - if (_rtw_memcmp(mac, cur_network->network.MacAddress, ETH_ALEN) == false) - { - DBG_88E("%s, mismatch bssid=%pM\n", __func__, cur_network->network.MacAddress); - return -ENOENT; - } - - sinfo->filled |= STATION_INFO_SIGNAL; - sinfo->signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength); - - sinfo->filled |= STATION_INFO_TX_BITRATE; - sinfo->txrate.legacy = rtw_get_cur_max_rate(padapter); - } - - //for Ad-Hoc/AP mode - if ( ( check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) - ||check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) - ||check_fwstate(pmlmepriv, WIFI_AP_STATE) ) - && check_fwstate(pmlmepriv, _FW_LINKED) - ) - { - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - - psta = rtw_get_stainfo(pstapriv, mac); - if (psta == NULL) - { - DBG_88E("%s, sta_info is null\n", __func__); - return -ENOENT; - } - - //TODO: should acquire station info... - } - - return 0; -} - -extern int netdev_open(struct net_device *pnetdev); - -static int cfg80211_rtw_change_iface(struct wiphy *wiphy, - struct net_device *ndev, - enum nl80211_iftype type, u32 *flags, - struct vif_params *params) -{ - enum nl80211_iftype old_type; - NDIS_802_11_NETWORK_INFRASTRUCTURE networkType ; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy); -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif - int ret = 0; - u8 change = false; - - DBG_88E(FUNC_NDEV_FMT" call netdev_open\n", FUNC_NDEV_ARG(ndev)); - if (netdev_open(ndev) != 0) { - ret= -EPERM; - goto exit; - } - - if (_FAIL == rtw_pwr_wakeup(padapter)) { - ret= -EPERM; - goto exit; - } - - old_type = rtw_wdev->iftype; - DBG_88E(FUNC_NDEV_FMT" old_iftype=%d, new_iftype=%d\n", - FUNC_NDEV_ARG(ndev), old_type, type); - - if (old_type != type) - { - change = true; - pmlmeext->action_public_rxseq = 0xffff; - pmlmeext->action_public_dialog_token = 0xff; - } - - switch (type) { - case NL80211_IFTYPE_ADHOC: - networkType = Ndis802_11IBSS; - break; -#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) - case NL80211_IFTYPE_P2P_CLIENT: -#endif - case NL80211_IFTYPE_STATION: - networkType = Ndis802_11Infrastructure; - #ifdef CONFIG_P2P - if (change && rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - { - _cancel_timer_ex( &pwdinfo->find_phase_timer ); - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); - - //it means remove GO and change mode from AP(GO) to station(P2P DEVICE) - rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); - - DBG_88E("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); - } - #endif //CONFIG_P2P - break; -#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) - case NL80211_IFTYPE_P2P_GO: -#endif - case NL80211_IFTYPE_AP: - networkType = Ndis802_11APMode; - #ifdef CONFIG_P2P - if (change && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - //it means P2P Group created, we will be GO and change mode from P2P DEVICE to AP(GO) - rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); - } - #endif //CONFIG_P2P - break; - default: - return -EOPNOTSUPP; - } - - rtw_wdev->iftype = type; - - if (rtw_set_802_11_infrastructure_mode(padapter, networkType) ==false) - { - rtw_wdev->iftype = old_type; - ret = -EPERM; - goto exit; - } - - rtw_setopmode_cmd(padapter, networkType); - -exit: - - return ret; -} - -void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv, bool aborted) -{ - _irqL irqL; - - _enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL); - if (pwdev_priv->scan_request != NULL) - { - //struct cfg80211_scan_request *scan_request = pwdev_priv->scan_request; - - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("%s with scan req\n", __func__); - #endif - - //avoid WARN_ON(request != wiphy_to_dev(request->wiphy)->scan_req); - //if (scan_request == wiphy_to_dev(scan_request->wiphy)->scan_req) - if (pwdev_priv->scan_request->wiphy != pwdev_priv->rtw_wdev->wiphy) - { - DBG_88E("error wiphy compare\n"); - } - else - { - cfg80211_scan_done(pwdev_priv->scan_request, aborted); - } - - pwdev_priv->scan_request = NULL; - - } else { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("%s without scan req\n", __func__); - #endif - } - _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL); -} - -void rtw_cfg80211_surveydone_event_callback(_adapter *padapter) -{ - _irqL irqL; - _list *plist, *phead; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - _queue *queue = &(pmlmepriv->scanned_queue); - struct wlan_network *pnetwork = NULL; - u32 cnt=0; - u32 wait_for_surveydone; - sint wait_status; -#ifdef CONFIG_P2P - struct wifidirect_info* pwdinfo = &padapter->wdinfo; -#endif //CONFIG_P2P - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("%s\n", __func__); -#endif - - _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - - phead = get_list_head(queue); - plist = get_next(phead); - - while (1) { - if (rtw_end_of_queue_search(phead,plist)== true) - break; - - pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); - - //report network only if the current channel set contains the channel to which this network belongs - if (rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, pnetwork->network.Configuration.DSConfig) >= 0) - rtw_cfg80211_inform_bss(padapter, pnetwork); - - plist = get_next(plist); - } - - _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - - //call this after other things have been done - rtw_cfg80211_indicate_scan_done(wdev_to_priv(padapter->rtw_wdev), false); -} - -static int rtw_cfg80211_set_probe_req_wpsp2pie(struct net_device *net, char *buf, int len) -{ - int ret = 0; - uint wps_ielen = 0; - u8 *wps_ie; - u32 p2p_ielen = 0; - u8 *p2p_ie; - u32 wfd_ielen = 0; - u8 *wfd_ie; - _adapter *padapter = (_adapter *)rtw_netdev_priv(net); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("%s, ielen=%d\n", __func__, len); -#endif - - if (len>0) - { - if ((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen))) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("probe_req_wps_ielen=%d\n", wps_ielen); - #endif - - if (pmlmepriv->wps_probe_req_ie) - { - u32 free_len = pmlmepriv->wps_probe_req_ie_len; - pmlmepriv->wps_probe_req_ie_len = 0; - rtw_mfree(pmlmepriv->wps_probe_req_ie, free_len); - pmlmepriv->wps_probe_req_ie = NULL; - } - - pmlmepriv->wps_probe_req_ie = rtw_malloc(wps_ielen); - if ( pmlmepriv->wps_probe_req_ie == NULL) { - DBG_88E("%s()-%d: rtw_malloc() ERROR!\n", __func__, __LINE__); - return -EINVAL; - - } - _rtw_memcpy(pmlmepriv->wps_probe_req_ie, wps_ie, wps_ielen); - pmlmepriv->wps_probe_req_ie_len = wps_ielen; - } - - //buf += wps_ielen; - //len -= wps_ielen; - - #ifdef CONFIG_P2P - if ((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen))) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("probe_req_p2p_ielen=%d\n", p2p_ielen); - #endif - - if (pmlmepriv->p2p_probe_req_ie) - { - u32 free_len = pmlmepriv->p2p_probe_req_ie_len; - pmlmepriv->p2p_probe_req_ie_len = 0; - rtw_mfree(pmlmepriv->p2p_probe_req_ie, free_len); - pmlmepriv->p2p_probe_req_ie = NULL; - } - - pmlmepriv->p2p_probe_req_ie = rtw_malloc(p2p_ielen); - if ( pmlmepriv->p2p_probe_req_ie == NULL) { - DBG_88E("%s()-%d: rtw_malloc() ERROR!\n", __func__, __LINE__); - return -EINVAL; - - } - _rtw_memcpy(pmlmepriv->p2p_probe_req_ie, p2p_ie, p2p_ielen); - pmlmepriv->p2p_probe_req_ie_len = p2p_ielen; - } - #endif //CONFIG_P2P - - //buf += p2p_ielen; - //len -= p2p_ielen; - - #ifdef CONFIG_WFD - if (rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("probe_req_wfd_ielen=%d\n", wfd_ielen); - #endif - - if (pmlmepriv->wfd_probe_req_ie) - { - u32 free_len = pmlmepriv->wfd_probe_req_ie_len; - pmlmepriv->wfd_probe_req_ie_len = 0; - rtw_mfree(pmlmepriv->wfd_probe_req_ie, free_len); - pmlmepriv->wfd_probe_req_ie = NULL; - } - - pmlmepriv->wfd_probe_req_ie = rtw_malloc(wfd_ielen); - if ( pmlmepriv->wfd_probe_req_ie == NULL) { - DBG_88E("%s()-%d: rtw_malloc() ERROR!\n", __func__, __LINE__); - return -EINVAL; - - } - rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_req_ie, &pmlmepriv->wfd_probe_req_ie_len); - } - #endif //CONFIG_WFD - - } - - return ret; - -} - -static int cfg80211_rtw_scan(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_scan_request *request) -{ - int i; - u8 _status = false; - int ret = 0; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_priv *pmlmepriv= &padapter->mlmepriv; - NDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT]; - struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT]; - _irqL irqL; - u8 *wps_ie=NULL; - uint wps_ielen=0; - u8 *p2p_ie=NULL; - uint p2p_ielen=0; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif //CONFIG_P2P - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - struct cfg80211_ssid *ssids = request->ssids; - int social_channel = 0, j = 0; - bool need_indicate_scan_done = false; - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); -#endif - - if (padapter->registrypriv.mp_mode == 1) - { - if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == true) - { - ret = -EPERM; - goto exit; - } - } - - _enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL); - pwdev_priv->scan_request = request; - _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL); - - if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == true) - { - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("%s under WIFI_AP_STATE\n", __func__); -#endif - //need_indicate_scan_done = true; - //goto check_need_indicate_scan_done; - } - - if (_FAIL == rtw_pwr_wakeup(padapter)) { - need_indicate_scan_done = true; - goto check_need_indicate_scan_done; - } - - #ifdef CONFIG_P2P - if (ssids->ssid != NULL - && _rtw_memcmp(ssids->ssid, "DIRECT-", 7) - && rtw_get_p2p_ie((u8 *)request->ie, request->ie_len, NULL, NULL) - ) - { - if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - rtw_p2p_enable(padapter, P2P_ROLE_DEVICE); - wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = true; - } - else - { - rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); - #endif - } - rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); - - if (request->n_channels == 3 && - request->channels[0]->hw_value == 1 && - request->channels[1]->hw_value == 6 && - request->channels[2]->hw_value == 11 - ) - { - social_channel = 1; - } - } - #endif //CONFIG_P2P - - if (request->ie && request->ie_len>0) - { - rtw_cfg80211_set_probe_req_wpsp2pie( ndev, (u8 *)request->ie, request->ie_len ); - } - - if (pmlmepriv->LinkDetectInfo.bBusyTraffic == true) - { - DBG_88E("%s, bBusyTraffic == true\n", __func__); - need_indicate_scan_done = true; - goto check_need_indicate_scan_done; - } - if (rtw_is_scan_deny(padapter)){ - DBG_88E(FUNC_NDEV_FMT ": scan deny\n", FUNC_NDEV_ARG(ndev)); - need_indicate_scan_done = true; - goto check_need_indicate_scan_done; - } - - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == true) - { - DBG_88E("%s, fwstate=0x%x\n", __func__, pmlmepriv->fw_state); - need_indicate_scan_done = true; - goto check_need_indicate_scan_done; - } - -#ifdef CONFIG_P2P - if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) - { - rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH); - rtw_free_network_queue(padapter, true); - - if (social_channel == 0) - rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE); - else - rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_SOCIAL_LAST); - } -#endif //CONFIG_P2P - - - _rtw_memset(ssid, 0, sizeof(NDIS_802_11_SSID)*RTW_SSID_SCAN_AMOUNT); - //parsing request ssids, n_ssids - for (i = 0; i < request->n_ssids && i < RTW_SSID_SCAN_AMOUNT; i++) { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("ssid=%s, len=%d\n", ssids[i].ssid, ssids[i].ssid_len); - #endif - _rtw_memcpy(ssid[i].Ssid, ssids[i].ssid, ssids[i].ssid_len); - ssid[i].SsidLength = ssids[i].ssid_len; - } - - - /* parsing channels, n_channels */ - _rtw_memset(ch, 0, sizeof(struct rtw_ieee80211_channel)*RTW_CHANNEL_SCAN_AMOUNT); - if (request->n_channels == 1) - for (i=0;in_channels && ichannels[i])); - #endif - ch[i].hw_value = request->channels[i]->hw_value; - ch[i].flags = request->channels[i]->flags; - } - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - if (request->n_channels == 1) { - _rtw_memcpy(&ch[1], &ch[0], sizeof(struct rtw_ieee80211_channel)); - _rtw_memcpy(&ch[2], &ch[0], sizeof(struct rtw_ieee80211_channel)); - _status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, ch, 3); - } else { - _status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, NULL, 0); - } - _exit_critical_bh(&pmlmepriv->lock, &irqL); - - - if (_status == false) - { - ret = -1; - } - -check_need_indicate_scan_done: - if (need_indicate_scan_done) - rtw_cfg80211_surveydone_event_callback(padapter); - -exit: - - return ret; - -} - -static int cfg80211_rtw_set_wiphy_params(struct wiphy *wiphy, u32 changed) -{ - DBG_88E("%s\n", __func__); - return 0; -} - -static int cfg80211_rtw_join_ibss(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_ibss_params *params) -{ - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - return 0; -} - -static int cfg80211_rtw_leave_ibss(struct wiphy *wiphy, struct net_device *ndev) -{ - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - return 0; -} - -static int rtw_cfg80211_set_wpa_version(struct security_priv *psecuritypriv, u32 wpa_version) -{ - DBG_88E("%s, wpa_version=%d\n", __func__, wpa_version); - - if (!wpa_version) { - psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; - return 0; - } - - - if (wpa_version & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2)) - { - psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPAPSK; - } - - - return 0; - -} - -static int rtw_cfg80211_set_auth_type(struct security_priv *psecuritypriv, - enum nl80211_auth_type sme_auth_type) -{ - DBG_88E("%s, nl80211_auth_type=%d\n", __func__, sme_auth_type); - - - switch (sme_auth_type) { - case NL80211_AUTHTYPE_AUTOMATIC: - - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Auto; - - break; - case NL80211_AUTHTYPE_OPEN_SYSTEM: - - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; - - if (psecuritypriv->ndisauthtype>Ndis802_11AuthModeWPA) - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; - break; - case NL80211_AUTHTYPE_SHARED_KEY: - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Shared; - psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - default: - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; - } - return 0; -} - -static int rtw_cfg80211_set_cipher(struct security_priv *psecuritypriv, u32 cipher, bool ucast) -{ - u32 ndisencryptstatus = Ndis802_11EncryptionDisabled; - - u32 *profile_cipher = ucast ? &psecuritypriv->dot11PrivacyAlgrthm : - &psecuritypriv->dot118021XGrpPrivacy; - - DBG_88E("%s, ucast=%d, cipher=0x%x\n", __func__, ucast, cipher); - - - if (!cipher) { - *profile_cipher = _NO_PRIVACY_; - psecuritypriv->ndisencryptstatus = ndisencryptstatus; - return 0; - } - - switch (cipher) { - case IW_AUTH_CIPHER_NONE: - *profile_cipher = _NO_PRIVACY_; - ndisencryptstatus = Ndis802_11EncryptionDisabled; - break; - case WLAN_CIPHER_SUITE_WEP40: - *profile_cipher = _WEP40_; - ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - case WLAN_CIPHER_SUITE_WEP104: - *profile_cipher = _WEP104_; - ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - case WLAN_CIPHER_SUITE_TKIP: - *profile_cipher = _TKIP_; - ndisencryptstatus = Ndis802_11Encryption2Enabled; - break; - case WLAN_CIPHER_SUITE_CCMP: - *profile_cipher = _AES_; - ndisencryptstatus = Ndis802_11Encryption3Enabled; - break; - default: - DBG_88E("Unsupported cipher: 0x%x\n", cipher); - return -ENOTSUPP; - } - - if (ucast) - { - psecuritypriv->ndisencryptstatus = ndisencryptstatus; - - //if (psecuritypriv->dot11PrivacyAlgrthm >= _AES_) - // psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPA2PSK; - } - - return 0; -} - -static int rtw_cfg80211_set_key_mgt(struct security_priv *psecuritypriv, u32 key_mgt) -{ - DBG_88E("%s, key_mgt=0x%x\n", __func__, key_mgt); - - if (key_mgt == WLAN_AKM_SUITE_8021X) - //*auth_type = UMAC_AUTH_TYPE_8021X; - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; - else if (key_mgt == WLAN_AKM_SUITE_PSK) { - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; - } else { - DBG_88E("Invalid key mgt: 0x%x\n", key_mgt); - } - return 0; -} - -static int rtw_cfg80211_set_wpa_ie(_adapter *padapter, u8 *pie, size_t ielen) -{ - u8 *buf=NULL, *pos=NULL; - u32 left; - int group_cipher = WPA_CIPHER_NONE, pairwise_cipher = WPA_CIPHER_NONE; - int ret = 0; - int wpa_ielen=0; - int wpa2_ielen=0; - u8 *pwpa, *pwpa2; - - if (pie == NULL || !ielen) { - /* Treat this as normal case, but need to clear WIFI_UNDER_WPS */ - _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); - goto exit; - } - - if (ielen > MAX_WPA_IE_LEN+MAX_WPS_IE_LEN+MAX_P2P_IE_LEN) { - ret = -EINVAL; - goto exit; - } - - buf = rtw_zmalloc(ielen); - if (buf == NULL){ - ret = -ENOMEM; - goto exit; - } - - _rtw_memcpy(buf, pie , ielen); - - //dump - { - int i; - DBG_88E("set wpa_ie(length:%zu):\n", ielen); - for (i=0;i0) - { - if (rtw_parse_wpa_ie(pwpa, wpa_ielen+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) - { - padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; - padapter->securitypriv.ndisauthtype=Ndis802_11AuthModeWPAPSK; - _rtw_memcpy(padapter->securitypriv.supplicant_ie, &pwpa[0], wpa_ielen+2); - - DBG_88E("got wpa_ie, wpa_ielen:%u\n", wpa_ielen); - } - } - - pwpa2 = rtw_get_wpa2_ie(buf, &wpa2_ielen, ielen); - if (pwpa2 && wpa2_ielen>0) - { - if (rtw_parse_wpa2_ie(pwpa2, wpa2_ielen+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) - { - padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; - padapter->securitypriv.ndisauthtype=Ndis802_11AuthModeWPA2PSK; - _rtw_memcpy(padapter->securitypriv.supplicant_ie, &pwpa2[0], wpa2_ielen+2); - - DBG_88E("got wpa2_ie, wpa2_ielen:%u\n", wpa2_ielen); - } - } - - switch (group_cipher) - { - case WPA_CIPHER_NONE: - padapter->securitypriv.dot118021XGrpPrivacy=_NO_PRIVACY_; - padapter->securitypriv.ndisencryptstatus=Ndis802_11EncryptionDisabled; - break; - case WPA_CIPHER_WEP40: - padapter->securitypriv.dot118021XGrpPrivacy=_WEP40_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - case WPA_CIPHER_TKIP: - padapter->securitypriv.dot118021XGrpPrivacy=_TKIP_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled; - break; - case WPA_CIPHER_CCMP: - padapter->securitypriv.dot118021XGrpPrivacy=_AES_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled; - break; - case WPA_CIPHER_WEP104: - padapter->securitypriv.dot118021XGrpPrivacy=_WEP104_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - } - - switch (pairwise_cipher) - { - case WPA_CIPHER_NONE: - padapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_; - padapter->securitypriv.ndisencryptstatus=Ndis802_11EncryptionDisabled; - break; - case WPA_CIPHER_WEP40: - padapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - case WPA_CIPHER_TKIP: - padapter->securitypriv.dot11PrivacyAlgrthm=_TKIP_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled; - break; - case WPA_CIPHER_CCMP: - padapter->securitypriv.dot11PrivacyAlgrthm=_AES_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled; - break; - case WPA_CIPHER_WEP104: - padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - } - - {/* handle wps_ie */ - uint wps_ielen; - u8 *wps_ie; - - wps_ie = rtw_get_wps_ie(buf, ielen, NULL, &wps_ielen); - if (wps_ie && wps_ielen > 0) { - DBG_88E("got wps_ie, wps_ielen:%u\n", wps_ielen); - padapter->securitypriv.wps_ie_len = wps_ielensecuritypriv.wps_ie, wps_ie, padapter->securitypriv.wps_ie_len); - set_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS); - } else { - _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); - } - } - - #ifdef CONFIG_P2P - {//check p2p_ie for assoc req; - uint p2p_ielen=0; - u8 *p2p_ie; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - if ((p2p_ie=rtw_get_p2p_ie(buf, ielen, NULL, &p2p_ielen))) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("%s p2p_assoc_req_ielen=%d\n", __func__, p2p_ielen); - #endif - - if (pmlmepriv->p2p_assoc_req_ie) - { - u32 free_len = pmlmepriv->p2p_assoc_req_ie_len; - pmlmepriv->p2p_assoc_req_ie_len = 0; - rtw_mfree(pmlmepriv->p2p_assoc_req_ie, free_len); - pmlmepriv->p2p_assoc_req_ie = NULL; - } - - pmlmepriv->p2p_assoc_req_ie = rtw_malloc(p2p_ielen); - if ( pmlmepriv->p2p_assoc_req_ie == NULL) { - DBG_88E("%s()-%d: rtw_malloc() ERROR!\n", __func__, __LINE__); - goto exit; - } - _rtw_memcpy(pmlmepriv->p2p_assoc_req_ie, p2p_ie, p2p_ielen); - pmlmepriv->p2p_assoc_req_ie_len = p2p_ielen; - } - } - #endif //CONFIG_P2P - - #ifdef CONFIG_WFD - {//check wfd_ie for assoc req; - uint wfd_ielen=0; - u8 *wfd_ie; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - if (rtw_get_wfd_ie(buf, ielen, NULL, &wfd_ielen)) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("%s wfd_assoc_req_ielen=%d\n", __func__, wfd_ielen); - #endif - - if (pmlmepriv->wfd_assoc_req_ie) - { - u32 free_len = pmlmepriv->wfd_assoc_req_ie_len; - pmlmepriv->wfd_assoc_req_ie_len = 0; - rtw_mfree(pmlmepriv->wfd_assoc_req_ie, free_len); - pmlmepriv->wfd_assoc_req_ie = NULL; - } - - pmlmepriv->wfd_assoc_req_ie = rtw_malloc(wfd_ielen); - if ( pmlmepriv->wfd_assoc_req_ie == NULL) { - DBG_88E("%s()-%d: rtw_malloc() ERROR!\n", __func__, __LINE__); - goto exit; - } - rtw_get_wfd_ie(buf, ielen, pmlmepriv->wfd_assoc_req_ie, &pmlmepriv->wfd_assoc_req_ie_len); - } - } - #endif //CONFIG_WFD - - - RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_, - ("rtw_set_wpa_ie: pairwise_cipher=0x%08x padapter->securitypriv.ndisencryptstatus=%d padapter->securitypriv.ndisauthtype=%d\n", - pairwise_cipher, padapter->securitypriv.ndisencryptstatus, padapter->securitypriv.ndisauthtype)); - -exit: - if (buf) - rtw_mfree(buf, ielen); - if (ret) - _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); - return ret; -} - -static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_connect_params *sme) -{ - int ret=0; - _irqL irqL; - _list *phead; - struct wlan_network *pnetwork = NULL; - NDIS_802_11_AUTHENTICATION_MODE authmode; - NDIS_802_11_SSID ndis_ssid; - u8 *dst_ssid, *src_ssid; - u8 *dst_bssid, *src_bssid; - //u8 matched_by_bssid=false; - //u8 matched_by_ssid=false; - u8 matched=false; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - _queue *queue = &pmlmepriv->scanned_queue; - - DBG_88E("=>"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - DBG_88E("privacy=%d, key=%p, key_len=%d, key_idx=%d\n", - sme->privacy, sme->key, sme->key_len, sme->key_idx); - - - if (wdev_to_priv(padapter->rtw_wdev)->block == true) - { - ret = -EBUSY; - DBG_88E("%s wdev_priv.block is set\n", __func__); - goto exit; - } - - if (_FAIL == rtw_pwr_wakeup(padapter)) { - ret= -EPERM; - goto exit; - } - - if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { - ret = -EPERM; - goto exit; - } - - if (!sme->ssid || !sme->ssid_len) - { - ret = -EINVAL; - goto exit; - } - - if (sme->ssid_len > IW_ESSID_MAX_SIZE){ - - ret= -E2BIG; - goto exit; - } - - - _rtw_memset(&ndis_ssid, 0, sizeof(NDIS_802_11_SSID)); - ndis_ssid.SsidLength = sme->ssid_len; - _rtw_memcpy(ndis_ssid.Ssid, sme->ssid, sme->ssid_len); - - DBG_88E("ssid=%s, len=%zu\n", ndis_ssid.Ssid, sme->ssid_len); - - - if (sme->bssid) - DBG_88E("bssid=%pM\n", sme->bssid); - - - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == true) - { - ret = -EBUSY; - DBG_88E("%s, fw_state=0x%x, goto exit\n", __func__, pmlmepriv->fw_state); - goto exit; - } - - - _enter_critical_bh(&queue->lock, &irqL); - - phead = get_list_head(queue); - pmlmepriv->pscanned = get_next(phead); - - while (1) - { - if (rtw_end_of_queue_search(phead, pmlmepriv->pscanned) == true) - { - break; - } - - pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned, struct wlan_network, list); - pmlmepriv->pscanned = get_next(pmlmepriv->pscanned); - - dst_ssid = pnetwork->network.Ssid.Ssid; - dst_bssid = pnetwork->network.MacAddress; - - if (sme->bssid) { - if (_rtw_memcmp(pnetwork->network.MacAddress, sme->bssid, ETH_ALEN) == false) - continue; - } - - if (sme->ssid && sme->ssid_len) { - if ( pnetwork->network.Ssid.SsidLength != sme->ssid_len - || _rtw_memcmp(pnetwork->network.Ssid.Ssid, sme->ssid, sme->ssid_len) == false - ) - continue; - } - - - if (sme->bssid) - { - src_bssid = sme->bssid; - - if ((_rtw_memcmp(dst_bssid, src_bssid, ETH_ALEN)) == true) - { - DBG_88E("matched by bssid\n"); - - ndis_ssid.SsidLength = pnetwork->network.Ssid.SsidLength; - _rtw_memcpy(ndis_ssid.Ssid, pnetwork->network.Ssid.Ssid, pnetwork->network.Ssid.SsidLength); - - matched=true; - break; - } - - } - else if (sme->ssid && sme->ssid_len) - { - src_ssid = ndis_ssid.Ssid; - - if ((_rtw_memcmp(dst_ssid, src_ssid, ndis_ssid.SsidLength) == true) && - (pnetwork->network.Ssid.SsidLength==ndis_ssid.SsidLength)) - { - DBG_88E("matched by ssid\n"); - matched=true; - break; - } - } - - } - - _exit_critical_bh(&queue->lock, &irqL); - - if ((matched == false) || (pnetwork== NULL)) - { - ret = -ENOENT; - DBG_88E("connect, matched == false, goto exit\n"); - goto exit; - } - - - if (rtw_set_802_11_infrastructure_mode(padapter, pnetwork->network.InfrastructureMode) == false) - { - ret = -EPERM; - goto exit; - } - - psecuritypriv->ndisencryptstatus = Ndis802_11EncryptionDisabled; - psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_; - psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; //open system - psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; - - ret = rtw_cfg80211_set_wpa_version(psecuritypriv, sme->crypto.wpa_versions); - if (ret < 0) - goto exit; - ret = rtw_cfg80211_set_auth_type(psecuritypriv, sme->auth_type); - - if (ret < 0) - goto exit; - - DBG_88E("%s, ie_len=%zu\n", __func__, sme->ie_len); - - ret = rtw_cfg80211_set_wpa_ie(padapter, sme->ie, sme->ie_len); - if (ret < 0) - goto exit; - - if (sme->crypto.n_ciphers_pairwise) { - ret = rtw_cfg80211_set_cipher(psecuritypriv, sme->crypto.ciphers_pairwise[0], true); - if (ret < 0) - goto exit; - } - - //For WEP Shared auth - if ((psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Shared - || psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Auto) && sme->key - ) - { - u32 wep_key_idx, wep_key_len,wep_total_len; - NDIS_802_11_WEP *pwep = NULL; - DBG_88E("%s(): Shared/Auto WEP\n",__func__); - - wep_key_idx = sme->key_idx; - wep_key_len = sme->key_len; - - if (sme->key_idx > WEP_KEYS) { - ret = -EINVAL; - goto exit; - } - - if (wep_key_len > 0) - { - wep_key_len = wep_key_len <= 5 ? 5 : 13; - wep_total_len = wep_key_len + FIELD_OFFSET(NDIS_802_11_WEP, KeyMaterial); - pwep =(NDIS_802_11_WEP *) rtw_malloc(wep_total_len); - if (pwep == NULL){ - DBG_88E(" wpa_set_encryption: pwep allocate fail !!!\n"); - ret = -ENOMEM; - goto exit; - } - - _rtw_memset(pwep, 0, wep_total_len); - - pwep->KeyLength = wep_key_len; - pwep->Length = wep_total_len; - - if (wep_key_len==13) - { - padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_; - padapter->securitypriv.dot118021XGrpPrivacy=_WEP104_; - } - } - else { - ret = -EINVAL; - goto exit; - } - - pwep->KeyIndex = wep_key_idx; - pwep->KeyIndex |= 0x80000000; - - _rtw_memcpy(pwep->KeyMaterial, (void *)sme->key, pwep->KeyLength); - - if (rtw_set_802_11_add_wep(padapter, pwep) == (u8)_FAIL) - { - ret = -EOPNOTSUPP ; - } - - if (pwep) { - rtw_mfree((u8 *)pwep,wep_total_len); - } - - if (ret < 0) - goto exit; - } - - ret = rtw_cfg80211_set_cipher(psecuritypriv, sme->crypto.cipher_group, false); - if (ret < 0) - return ret; - - if (sme->crypto.n_akm_suites) { - ret = rtw_cfg80211_set_key_mgt(psecuritypriv, sme->crypto.akm_suites[0]); - if (ret < 0) - goto exit; - } - - authmode = psecuritypriv->ndisauthtype; - rtw_set_802_11_authentication_mode(padapter, authmode); - - //rtw_set_802_11_encryption_mode(padapter, padapter->securitypriv.ndisencryptstatus); - - if (rtw_set_802_11_ssid(padapter, &ndis_ssid) == false) { - ret = -1; - goto exit; - } - - - DBG_88E("set ssid:dot11AuthAlgrthm=%d, dot11PrivacyAlgrthm=%d, dot118021XGrpPrivacy=%d\n", psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm, psecuritypriv->dot118021XGrpPrivacy); - -exit: - - DBG_88E("<=%s, ret %d\n",__func__, ret); - - return ret; -} - -static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev, - u16 reason_code) -{ - _adapter *padapter = wiphy_to_adapter(wiphy); - - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - if (check_fwstate(&padapter->mlmepriv, _FW_LINKED)) - { - rtw_scan_abort(padapter); - LeaveAllPowerSaveMode(padapter); - rtw_disassoc_cmd(padapter, 500, false); - - DBG_88E("%s...call rtw_indicate_disconnect\n", __func__); - - padapter->mlmepriv.not_indic_disco = true; - rtw_indicate_disconnect(padapter); - padapter->mlmepriv.not_indic_disco = false; - - rtw_free_assoc_resources(padapter, 1); - } - - return 0; -} - -static int cfg80211_rtw_set_txpower(struct wiphy *wiphy, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) || defined(COMPAT_KERNEL_RELEASE) - enum nl80211_tx_power_setting type, int mbm) -#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) - enum tx_power_setting type, int dbm) -#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) -{ - DBG_88E("%s\n", __func__); - return 0; -} - -static int cfg80211_rtw_get_txpower(struct wiphy *wiphy, int *dbm) -{ - DBG_88E("%s\n", __func__); - - *dbm = (12); - - return 0; -} - -inline bool rtw_cfg80211_pwr_mgmt(_adapter *adapter) -{ - struct rtw_wdev_priv *rtw_wdev_priv = wdev_to_priv(adapter->rtw_wdev); - return rtw_wdev_priv->power_mgmt; -} - -static int cfg80211_rtw_set_power_mgmt(struct wiphy *wiphy, - struct net_device *ndev, - bool enabled, int timeout) -{ - _adapter *padapter = wiphy_to_adapter(wiphy); - struct rtw_wdev_priv *rtw_wdev_priv = wdev_to_priv(padapter->rtw_wdev); - - DBG_88E(FUNC_NDEV_FMT" enabled:%u, timeout:%d\n", FUNC_NDEV_ARG(ndev), - enabled, timeout); - - rtw_wdev_priv->power_mgmt = enabled; - - if (!enabled) - LPS_Leave(padapter); - return 0; -} - -static int cfg80211_rtw_set_pmksa(struct wiphy *wiphy, - struct net_device *netdev, - struct cfg80211_pmksa *pmksa) -{ - u8 index,blInserted = false; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct security_priv *psecuritypriv = &padapter->securitypriv; - u8 strZeroMacAddress[ ETH_ALEN ] = { 0x00 }; - - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev)); - - if ( _rtw_memcmp( pmksa->bssid, strZeroMacAddress, ETH_ALEN ) == true ) - { - return -EINVAL; - } - - blInserted = false; - - //overwrite PMKID - for (index=0 ; indexPMKIDList[index].Bssid, pmksa->bssid, ETH_ALEN) ==true ) - { // BSSID is matched, the same AP => rewrite with new PMKID. - DBG_88E(FUNC_NDEV_FMT" BSSID exists in the PMKList.\n", FUNC_NDEV_ARG(netdev)); - - _rtw_memcpy( psecuritypriv->PMKIDList[index].PMKID, pmksa->pmkid, WLAN_PMKID_LEN); - psecuritypriv->PMKIDList[index].bUsed = true; - psecuritypriv->PMKIDIndex = index+1; - blInserted = true; - break; - } - } - - if (!blInserted) - { - // Find a new entry - DBG_88E(FUNC_NDEV_FMT" Use the new entry index = %d for this PMKID.\n", - FUNC_NDEV_ARG(netdev), psecuritypriv->PMKIDIndex ); - - _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].Bssid, pmksa->bssid, ETH_ALEN); - _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].PMKID, pmksa->pmkid, WLAN_PMKID_LEN); - - psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].bUsed = true; - psecuritypriv->PMKIDIndex++ ; - if (psecuritypriv->PMKIDIndex==16) - { - psecuritypriv->PMKIDIndex =0; - } - } - - return 0; -} - -static int cfg80211_rtw_del_pmksa(struct wiphy *wiphy, - struct net_device *netdev, - struct cfg80211_pmksa *pmksa) -{ - u8 index, bMatched = false; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct security_priv *psecuritypriv = &padapter->securitypriv; - - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev)); - - for (index=0 ; indexPMKIDList[index].Bssid, pmksa->bssid, ETH_ALEN) ==true ) - { // BSSID is matched, the same AP => Remove this PMKID information and reset it. - _rtw_memset( psecuritypriv->PMKIDList[index].Bssid, 0x00, ETH_ALEN ); - _rtw_memset( psecuritypriv->PMKIDList[index].PMKID, 0x00, WLAN_PMKID_LEN ); - psecuritypriv->PMKIDList[index].bUsed = false; - bMatched = true; - break; - } - } - - if (false == bMatched) - { - DBG_88E(FUNC_NDEV_FMT" do not have matched BSSID\n" - , FUNC_NDEV_ARG(netdev)); - return -EINVAL; - } - - return 0; -} - -static int cfg80211_rtw_flush_pmksa(struct wiphy *wiphy, - struct net_device *netdev) -{ - _adapter *padapter = wiphy_to_adapter(wiphy); - struct security_priv *psecuritypriv = &padapter->securitypriv; - - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev)); - - _rtw_memset( &psecuritypriv->PMKIDList[ 0 ], 0x00, sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE ); - psecuritypriv->PMKIDIndex = 0; - - return 0; -} - -#ifdef CONFIG_AP_MODE -void rtw_cfg80211_indicate_sta_assoc(_adapter *padapter, u8 *pmgmt_frame, uint frame_len) -{ - s32 freq; - int channel; - struct wireless_dev *pwdev = padapter->rtw_wdev; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct net_device *ndev = padapter->pnetdev; - - DBG_88E("%s(padapter=%p,%s)\n", __func__, padapter, ndev->name); - -#if defined(RTW_USE_CFG80211_STA_EVENT) || defined(COMPAT_KERNEL_RELEASE) - { - struct station_info sinfo; - u8 ie_offset; - if (GetFrameSubType(pmgmt_frame) == WIFI_ASSOCREQ) - ie_offset = _ASOCREQ_IE_OFFSET_; - else // WIFI_REASSOCREQ - ie_offset = _REASOCREQ_IE_OFFSET_; - - sinfo.filled = 0; - sinfo.filled = STATION_INFO_ASSOC_REQ_IES; - sinfo.assoc_req_ies = pmgmt_frame + WLAN_HDR_A3_LEN + ie_offset; - sinfo.assoc_req_ies_len = frame_len - WLAN_HDR_A3_LEN - ie_offset; - cfg80211_new_sta(ndev, GetAddr2Ptr(pmgmt_frame), &sinfo, GFP_ATOMIC); - } -#else /* defined(RTW_USE_CFG80211_STA_EVENT) */ - channel = pmlmeext->cur_channel; - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - - #ifdef COMPAT_KERNEL_RELEASE - rtw_cfg80211_rx_mgmt(ndev, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); - #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - rtw_cfg80211_rx_mgmt(ndev, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); - #else //COMPAT_KERNEL_RELEASE - { - //to avoid WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION) when calling cfg80211_send_rx_assoc() - pwdev->iftype = NL80211_IFTYPE_STATION; - DBG_88E("iftype=%d before call cfg80211_send_rx_assoc()\n", pwdev->iftype); - rtw_cfg80211_send_rx_assoc(ndev, NULL, pmgmt_frame, frame_len); - DBG_88E("iftype=%d after call cfg80211_send_rx_assoc()\n", pwdev->iftype); - pwdev->iftype = NL80211_IFTYPE_AP; - } - #endif //COMPAT_KERNEL_RELEASE -#endif /* defined(RTW_USE_CFG80211_STA_EVENT) */ -} - -void rtw_cfg80211_indicate_sta_disassoc(_adapter *padapter, unsigned char *da, unsigned short reason) -{ - s32 freq; - int channel; - u8 *pmgmt_frame; - uint frame_len; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - u8 mgmt_buf[128] = {0}; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct net_device *ndev = padapter->pnetdev; - - DBG_88E("%s(padapter=%p,%s)\n", __func__, padapter, ndev->name); - -#if defined(RTW_USE_CFG80211_STA_EVENT) || defined(COMPAT_KERNEL_RELEASE) - cfg80211_del_sta(ndev, da, GFP_ATOMIC); -#else /* defined(RTW_USE_CFG80211_STA_EVENT) */ - channel = pmlmeext->cur_channel; - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - - pmgmt_frame = mgmt_buf; - pwlanhdr = (struct rtw_ieee80211_hdr *)pmgmt_frame; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - //_rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); - //_rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr1, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, da, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pmgmt_frame, WIFI_DEAUTH); - - pmgmt_frame += sizeof(struct rtw_ieee80211_hdr_3addr); - frame_len = sizeof(struct rtw_ieee80211_hdr_3addr); - - reason = cpu_to_le16(reason); - pmgmt_frame = rtw_set_fixed_ie(pmgmt_frame, _RSON_CODE_ , (unsigned char *)&reason, &frame_len); - - #ifdef COMPAT_KERNEL_RELEASE - rtw_cfg80211_rx_mgmt(padapter->pnetdev, freq, 0, mgmt_buf, frame_len, GFP_ATOMIC); - #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - rtw_cfg80211_rx_mgmt(padapter->pnetdev, freq, 0, mgmt_buf, frame_len, GFP_ATOMIC); - #else //COMPAT_KERNEL_RELEASE - cfg80211_send_disassoc(padapter->pnetdev, mgmt_buf, frame_len); - //cfg80211_rx_action(padapter->pnetdev, freq, mgmt_buf, frame_len, GFP_ATOMIC); - #endif //COMPAT_KERNEL_RELEASE -#endif /* defined(RTW_USE_CFG80211_STA_EVENT) */ -} - -static int rtw_cfg80211_monitor_if_open(struct net_device *ndev) -{ - int ret = 0; - - DBG_88E("%s\n", __func__); - - return ret; -} - -static int rtw_cfg80211_monitor_if_close(struct net_device *ndev) -{ - int ret = 0; - - DBG_88E("%s\n", __func__); - - return ret; -} - -static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb, struct net_device *ndev) -{ - int ret = 0; - int rtap_len; - int qos_len = 0; - int dot11_hdr_len = 24; - int snap_len = 6; - unsigned char *pdata; - u16 frame_ctl; - unsigned char src_mac_addr[6]; - unsigned char dst_mac_addr[6]; - struct ieee80211_hdr *dot11_hdr; - struct ieee80211_radiotap_header *rtap_hdr; - _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); - - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header))) - goto fail; - - rtap_hdr = (struct ieee80211_radiotap_header *)skb->data; - if (unlikely(rtap_hdr->it_version)) - goto fail; - - rtap_len = ieee80211_get_radiotap_len(skb->data); - if (unlikely(skb->len < rtap_len)) - goto fail; - - if (rtap_len != 14) - { - DBG_88E("radiotap len (should be 14): %d\n", rtap_len); - goto fail; - } - - /* Skip the ratio tap header */ - skb_pull(skb, rtap_len); - - dot11_hdr = (struct ieee80211_hdr *)skb->data; - frame_ctl = le16_to_cpu(dot11_hdr->frame_control); - /* Check if the QoS bit is set */ - if ((frame_ctl & RTW_IEEE80211_FCTL_FTYPE) == RTW_IEEE80211_FTYPE_DATA) { - /* Check if this ia a Wireless Distribution System (WDS) frame - * which has 4 MAC addresses - */ - if (dot11_hdr->frame_control & 0x0080) - qos_len = 2; - if ((dot11_hdr->frame_control & 0x0300) == 0x0300) - dot11_hdr_len += 6; - - memcpy(dst_mac_addr, dot11_hdr->addr1, sizeof(dst_mac_addr)); - memcpy(src_mac_addr, dot11_hdr->addr2, sizeof(src_mac_addr)); - - /* Skip the 802.11 header, QoS (if any) and SNAP, but leave spaces for - * for two MAC addresses - */ - skb_pull(skb, dot11_hdr_len + qos_len + snap_len - sizeof(src_mac_addr) * 2); - pdata = (unsigned char*)skb->data; - memcpy(pdata, dst_mac_addr, sizeof(dst_mac_addr)); - memcpy(pdata + sizeof(dst_mac_addr), src_mac_addr, sizeof(src_mac_addr)); - - DBG_88E("should be eapol packet\n"); - - /* Use the real net device to transmit the packet */ - ret = rtw_xmit_entry(skb, padapter->pnetdev); - - return ret; - - } - else if ((frame_ctl & (RTW_IEEE80211_FCTL_FTYPE|RTW_IEEE80211_FCTL_STYPE)) - == (RTW_IEEE80211_FTYPE_MGMT|RTW_IEEE80211_STYPE_ACTION) - ) - { - //only for action frames - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - //u8 category, action, OUI_Subtype, dialogToken=0; - //unsigned char *frame_body; - struct rtw_ieee80211_hdr *pwlanhdr; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - u8 *buf = skb->data; - u32 len = skb->len; - u8 category, action; - int type = -1; - - if (rtw_action_frame_parse(buf, len, &category, &action) == false) { - DBG_88E(FUNC_NDEV_FMT" frame_control:0x%x\n", FUNC_NDEV_ARG(ndev), - le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)buf)->frame_ctl)); - goto fail; - } - - DBG_88E("RTW_Tx:da=%pM via "FUNC_NDEV_FMT"\n", - GetAddr1Ptr(buf), FUNC_NDEV_ARG(ndev)); - #ifdef CONFIG_P2P - if ((type = rtw_p2p_check_frames(padapter, buf, len, true)) >= 0) - goto dump; - #endif - if (category == RTW_WLAN_CATEGORY_PUBLIC) - DBG_88E("RTW_Tx:%s\n", action_public_str(action)); - else - DBG_88E("RTW_Tx:category(%u), action(%u)\n", category, action); - -dump: - //starting alloc mgmt frame to dump it - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - goto fail; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - pattrib->retry_ctrl = false; - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - - _rtw_memcpy(pframe, (void*)buf, len); - #ifdef CONFIG_WFD - if (type >= 0) - { - struct wifi_display_info *pwfd_info; - - pwfd_info = padapter->wdinfo.wfd_info; - - if ( true == pwfd_info->wfd_enable ) - { - rtw_append_wfd_ie( padapter, pframe, &len ); - } - } - #endif // CONFIG_WFD - pattrib->pktlen = len; - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - //update seq number - pmlmeext->mgnt_seq = GetSequence(pwlanhdr); - pattrib->seqnum = pmlmeext->mgnt_seq; - pmlmeext->mgnt_seq++; - - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - - } - else - { - DBG_88E("frame_ctl=0x%x\n", frame_ctl & (RTW_IEEE80211_FCTL_FTYPE|RTW_IEEE80211_FCTL_STYPE)); - } - - -fail: - - dev_kfree_skb(skb); - - return 0; - -} - -static void rtw_cfg80211_monitor_if_set_multicast_list(struct net_device *ndev) -{ - DBG_88E("%s\n", __func__); -} - -static int rtw_cfg80211_monitor_if_set_mac_address(struct net_device *ndev, void *addr) -{ - int ret = 0; - - DBG_88E("%s\n", __func__); - - return ret; -} - -#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) -static const struct net_device_ops rtw_cfg80211_monitor_if_ops = { - .ndo_open = rtw_cfg80211_monitor_if_open, - .ndo_stop = rtw_cfg80211_monitor_if_close, - .ndo_start_xmit = rtw_cfg80211_monitor_if_xmit_entry, - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)) - .ndo_set_multicast_list = rtw_cfg80211_monitor_if_set_multicast_list, - #endif - .ndo_set_mac_address = rtw_cfg80211_monitor_if_set_mac_address, -}; -#endif - -static struct net_device *rtw_cfg80211_add_monitor_if (_adapter *padapter, char *name) -{ - int ret = 0; - struct net_device* ndev = NULL; - struct rtw_netdev_priv_indicator *pnpi; - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - - DBG_88E("%s\n", __func__); - - if (!name ) { - ret = -EINVAL; - goto out; - } - - if ((strnicmp(name, pwdev_priv->ifname_mon, strlen(name)) ==0) - && pwdev_priv->pmon_ndev) - { - ndev = pwdev_priv->pmon_ndev; - - DBG_88E("%s, monitor interface(%s) has existed\n", __func__, name); - - goto out; - } - - - ndev = alloc_etherdev(sizeof(struct rtw_netdev_priv_indicator)); - if (!ndev) { - ret = -ENOMEM; - goto out; - } - - ndev->type = ARPHRD_IEEE80211_RADIOTAP; - strncpy(ndev->name, name, IFNAMSIZ); - ndev->name[IFNAMSIZ - 1] = 0; - -#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) - ndev->netdev_ops = &rtw_cfg80211_monitor_if_ops; -#else - ndev->open = rtw_cfg80211_monitor_if_open; - ndev->stop = rtw_cfg80211_monitor_if_close; - ndev->hard_start_xmit = rtw_cfg80211_monitor_if_xmit_entry; - ndev->set_mac_address = rtw_cfg80211_monitor_if_set_mac_address; -#endif - - pnpi = netdev_priv(ndev); - pnpi->priv = padapter; - pnpi->sizeof_priv = sizeof(_adapter); - - ret = register_netdevice(ndev); - if (ret) { - goto out; - } - - pwdev_priv->pmon_ndev = ndev; - _rtw_memcpy(pwdev_priv->ifname_mon, name, IFNAMSIZ+1); - -out: - if (ret && ndev) - { - free_netdev(ndev); - ndev = NULL; - } - - - DBG_88E("%s, ndev=%p, pmon_ndev=%p, ret=%d\n", __func__, ndev, pwdev_priv->pmon_ndev, ret); - - return ndev; -} - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) -static struct net_device * cfg80211_rtw_add_virtual_intf(struct wiphy *wiphy, char *name, -#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) -static int cfg80211_rtw_add_virtual_intf(struct wiphy *wiphy, char *name, -#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) - enum nl80211_iftype type, u32 *flags, - struct vif_params *params) -{ - struct net_device* ndev = NULL; - _adapter *padapter = wiphy_to_adapter(wiphy); - - DBG_88E("%s(padapter=%p), ifname=%s, type=%d\n", __func__, padapter, name, type); - - - switch (type) { - case NL80211_IFTYPE_ADHOC: - case NL80211_IFTYPE_AP_VLAN: - case NL80211_IFTYPE_WDS: - case NL80211_IFTYPE_MESH_POINT: - - break; - case NL80211_IFTYPE_MONITOR: - ndev = rtw_cfg80211_add_monitor_if (padapter, name); - break; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - case NL80211_IFTYPE_P2P_CLIENT: -#endif - case NL80211_IFTYPE_STATION: - - break; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - case NL80211_IFTYPE_P2P_GO: -#endif - case NL80211_IFTYPE_AP: - - break; - default: - DBG_88E("Unsupported interface type\n"); - break; - } - - DBG_88E("ndev=%p\n", ndev); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - return ndev; -#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) - return 0; -#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) - -} - -static int cfg80211_rtw_del_virtual_intf(struct wiphy *wiphy, struct net_device *ndev) -{ - _adapter *padapter = wiphy_to_adapter(wiphy); - struct rtw_wdev_priv *pwdev_priv = (struct rtw_wdev_priv *)wiphy_priv(wiphy); - - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - if (ndev) - { - unregister_netdev(ndev); - - free_netdev(ndev); - - if (ndev == pwdev_priv->pmon_ndev) - { - DBG_88E("remove monitor interface\n"); - pwdev_priv->pmon_ndev = NULL; - pwdev_priv->ifname_mon[0] = '\0'; - } - } - - return 0; -} - -static int rtw_add_beacon(_adapter *adapter, const u8 *head, size_t head_len, const u8 *tail, size_t tail_len) -{ - int ret=0; - u8 *pbuf = NULL; - uint len, wps_ielen=0; - uint p2p_ielen=0; - u8 *p2p_ie; - u8 got_p2p_ie = false; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - //struct sta_priv *pstapriv = &padapter->stapriv; - - - DBG_88E("%s beacon_head_len=%zu, beacon_tail_len=%zu\n", __func__, head_len, tail_len); - - - if (check_fwstate(pmlmepriv, WIFI_AP_STATE) != true) - return -EINVAL; - - if (head_len<24) - return -EINVAL; - - - pbuf = rtw_zmalloc(head_len+tail_len); - if (!pbuf) - return -ENOMEM; - - - //_rtw_memcpy(&pstapriv->max_num_sta, param->u.bcn_ie.reserved, 2); - - //if ((pstapriv->max_num_sta>NUM_STA) || (pstapriv->max_num_sta<=0)) - // pstapriv->max_num_sta = NUM_STA; - - - _rtw_memcpy(pbuf, (void *)head+24, head_len-24);// 24=beacon header len. - _rtw_memcpy(pbuf+head_len-24, (void *)tail, tail_len); - - len = head_len+tail_len-24; - - //check wps ie if inclued - if (rtw_get_wps_ie(pbuf+_FIXED_IE_LENGTH_, len-_FIXED_IE_LENGTH_, NULL, &wps_ielen)) - DBG_88E("add bcn, wps_ielen=%d\n", wps_ielen); - -#ifdef CONFIG_P2P - //check p2p ie if inclued - if (rtw_get_p2p_ie(pbuf+_FIXED_IE_LENGTH_, len-_FIXED_IE_LENGTH_, NULL, &p2p_ielen)) - { - DBG_88E("got p2p_ie, len=%d\n", p2p_ielen); - got_p2p_ie = true; - } -#endif - - rtw_ies_remove_ie(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, P2P_OUI, 4); - - // pbss_network->IEs will not include p2p_ie - if (rtw_check_beacon_data(adapter, pbuf, len) == _SUCCESS) - //if (rtw_check_beacon_data(padapter, pbuf, len) == _SUCCESS) - { -#ifdef CONFIG_P2P - //check p2p if enable - if (got_p2p_ie == true) - { - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - struct wifidirect_info *pwdinfo= &(adapter->wdinfo); - - if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - DBG_88E("Enable P2P function for the first time\n"); - rtw_p2p_enable(adapter, P2P_ROLE_GO); - wdev_to_priv(adapter->rtw_wdev)->p2p_enabled = true; - } - else - { - _cancel_timer_ex( &pwdinfo->find_phase_timer ); - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); - - DBG_88E("enter GO Mode, p2p_ielen=%d\n", p2p_ielen); - - rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); - rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); - pwdinfo->intent = 15; - } - - pwdinfo->operating_channel = pmlmeext->cur_channel; - - } -#endif //CONFIG_P2P - - ret = 0; - - } - else - { - ret = -EINVAL; - } - - - rtw_mfree(pbuf, head_len+tail_len); - - return ret; -} - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE) -static int cfg80211_rtw_add_beacon(struct wiphy *wiphy, struct net_device *ndev, - struct beacon_parameters *info) -{ - int ret=0; - _adapter *adapter = wiphy_to_adapter(wiphy); - - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - ret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail, info->tail_len); - - return ret; -} - -static int cfg80211_rtw_set_beacon(struct wiphy *wiphy, struct net_device *ndev, - struct beacon_parameters *info) -{ - _adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - pmlmeext->bstart_bss = true; - - cfg80211_rtw_add_beacon(wiphy, ndev, info); - - return 0; -} - -static int cfg80211_rtw_del_beacon(struct wiphy *wiphy, struct net_device *ndev) -{ - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - return 0; -} -#else -static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_ap_settings *settings) -{ - int ret = 0; - _adapter *adapter = wiphy_to_adapter(wiphy); - - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - ret = rtw_add_beacon(adapter, settings->beacon.head, settings->beacon.head_len, - settings->beacon.tail, settings->beacon.tail_len); - - return ret; -} - -static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_beacon_data *info) -{ - int ret = 0; - _adapter *adapter = wiphy_to_adapter(wiphy); - - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - ret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail, info->tail_len); - - return ret; -} - -static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev) -{ - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - return 0; -} - -#endif //(LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) - -static int cfg80211_rtw_add_station(struct wiphy *wiphy, struct net_device *ndev, - u8 *mac, struct station_parameters *params) -{ - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - return 0; -} - -static int cfg80211_rtw_del_station(struct wiphy *wiphy, struct net_device *ndev, - u8 *mac) -{ - int ret=0; - _irqL irqL; - _list *phead, *plist; - u8 updated; - struct sta_info *psta = NULL; - _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct sta_priv *pstapriv = &padapter->stapriv; - - DBG_88E("+"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - if (check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE)) != true) - { - DBG_88E("%s, fw_state != FW_LINKED|WIFI_AP_STATE\n", __func__); - return -EINVAL; - } - - - if (!mac) - { - DBG_88E("flush all sta, and cam_entry\n"); - - flush_all_cam_entry(padapter); //clear CAM - - ret = rtw_sta_flush(padapter); - - return ret; - } - - - DBG_88E("free sta macaddr =%pM\n", mac); - - if (mac[0] == 0xff && mac[1] == 0xff && - mac[2] == 0xff && mac[3] == 0xff && - mac[4] == 0xff && mac[5] == 0xff) - { - return -EINVAL; - } - - - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - //check asoc_queue - while ((rtw_end_of_queue_search(phead, plist)) == false) - { - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - - plist = get_next(plist); - - if (_rtw_memcmp(mac, psta->hwaddr, ETH_ALEN)) - { - if (psta->dot8021xalg == 1 && psta->bpairwise_key_installed == false) - { - DBG_88E("%s, sta's dot8021xalg = 1 and key_installed = false\n", __func__); - } - else - { - DBG_88E("free psta=%p, aid=%d\n", psta, psta->aid); - - rtw_list_delete(&psta->asoc_list); - pstapriv->asoc_list_cnt--; - - //_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - updated = ap_free_sta(padapter, psta, true, WLAN_REASON_DEAUTH_LEAVING); - //_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - psta = NULL; - - break; - } - - } - - } - - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - associated_clients_update(padapter, updated); - - DBG_88E("-"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - return ret; - -} - -static int cfg80211_rtw_change_station(struct wiphy *wiphy, struct net_device *ndev, - u8 *mac, struct station_parameters *params) -{ - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - return 0; -} - -static int cfg80211_rtw_dump_station(struct wiphy *wiphy, struct net_device *ndev, - int idx, u8 *mac, struct station_info *sinfo) -{ - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - //TODO: dump scanned queue - - return -ENOENT; -} - -static int cfg80211_rtw_change_bss(struct wiphy *wiphy, struct net_device *ndev, - struct bss_parameters *params) -{ - u8 i; - - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); -/* - DBG_88E("use_cts_prot=%d\n", params->use_cts_prot); - DBG_88E("use_short_preamble=%d\n", params->use_short_preamble); - DBG_88E("use_short_slot_time=%d\n", params->use_short_slot_time); - DBG_88E("ap_isolate=%d\n", params->ap_isolate); - - DBG_88E("basic_rates_len=%d\n", params->basic_rates_len); - for (i=0; ibasic_rates_len; i++) - { - DBG_88E("basic_rates=%d\n", params->basic_rates[i]); - - } -*/ - return 0; - -} - -static int cfg80211_rtw_set_channel(struct wiphy *wiphy - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) - , struct net_device *ndev - #endif - , struct ieee80211_channel *chan, enum nl80211_channel_type channel_type) -{ - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - #endif - - return 0; -} - -static int cfg80211_rtw_auth(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_auth_request *req) -{ - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - return 0; -} - -static int cfg80211_rtw_assoc(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_assoc_request *req) -{ - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - return 0; -} -#endif //CONFIG_AP_MODE - -void rtw_cfg80211_rx_action_p2p(_adapter *padapter, u8 *pmgmt_frame, uint frame_len) -{ - int type; - s32 freq; - int channel; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - u8 category, action; - - channel = rtw_get_oper_ch(padapter); - - DBG_88E("RTW_Rx:cur_ch=%d\n", channel); - #ifdef CONFIG_P2P - type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, false); - if (type >= 0) - goto indicate; - #endif - rtw_action_frame_parse(pmgmt_frame, frame_len, &category, &action); - DBG_88E("RTW_Rx:category(%u), action(%u)\n", category, action); - -indicate: - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - rtw_cfg80211_rx_mgmt(padapter->pnetdev, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); -#else - cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC); -#endif -} - -void rtw_cfg80211_rx_p2p_action_public(_adapter *padapter, u8 *pmgmt_frame, uint frame_len) -{ - int type; - s32 freq; - int channel; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - u8 category, action; - - channel = rtw_get_oper_ch(padapter); - - DBG_88E("RTW_Rx:cur_ch=%d\n", channel); - #ifdef CONFIG_P2P - type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, false); - if (type >= 0) { - switch (type) { - case P2P_GO_NEGO_CONF: - case P2P_PROVISION_DISC_RESP: - rtw_clear_scan_deny(padapter); - } - goto indicate; - } - #endif - rtw_action_frame_parse(pmgmt_frame, frame_len, &category, &action); - DBG_88E("RTW_Rx:category(%u), action(%u)\n", category, action); - -indicate: - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - rtw_cfg80211_rx_mgmt(padapter->pnetdev, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); -#else - cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC); -#endif -} - -void rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const char*msg) -{ - s32 freq; - int channel; - struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(adapter->rtw_wdev); - u8 category, action; - - channel = rtw_get_oper_ch(adapter); - - rtw_action_frame_parse(frame, frame_len, &category, &action); - - DBG_88E("RTW_Rx:cur_ch=%d\n", channel); - if (msg) - DBG_88E("RTW_Rx:%s\n", msg); - else - DBG_88E("RTW_Rx:category(%u), action(%u)\n", category, action); - - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - rtw_cfg80211_rx_mgmt(adapter->pnetdev, freq, 0, frame, frame_len, GFP_ATOMIC); -#else - cfg80211_rx_action(adapter->pnetdev, freq, frame, frame_len, GFP_ATOMIC); -#endif - -} - -#ifdef CONFIG_P2P -void rtw_cfg80211_issue_p2p_provision_request(_adapter *padapter, const u8 *buf, size_t len) -{ - u16 wps_devicepassword_id = 0x0000; - uint wps_devicepassword_id_len = 0; - u8 wpsie[ 255 ] = { 0x00 }, p2p_ie[ 255 ] = { 0x00 }; - uint p2p_ielen = 0; - uint wpsielen = 0; - u32 devinfo_contentlen = 0; - u8 devinfo_content[64] = { 0x00 }; - u16 capability = 0; - uint capability_len = 0; - - unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; - u8 action = P2P_PUB_ACTION_ACTION; - u8 dialogToken = 1; - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_PROVISION_DISC_REQ; - u32 p2pielen = 0; -#ifdef CONFIG_WFD - u32 wfdielen = 0; -#endif //CONFIG_WFD - - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - struct wifidirect_info *pwdinfo = &(padapter->wdinfo); - u8 *frame_body = (unsigned char *)(buf + sizeof(struct rtw_ieee80211_hdr_3addr)); - size_t frame_body_len = len - sizeof(struct rtw_ieee80211_hdr_3addr); - - - DBG_88E( "[%s] In\n", __func__ ); - - //prepare for building provision_request frame - _rtw_memcpy(pwdinfo->tx_prov_disc_info.peerIFAddr, GetAddr1Ptr(buf), ETH_ALEN); - _rtw_memcpy(pwdinfo->tx_prov_disc_info.peerDevAddr, GetAddr1Ptr(buf), ETH_ALEN); - - pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON; - - rtw_get_wps_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wpsielen); - rtw_get_wps_attr_content( wpsie, wpsielen, WPS_ATTR_DEVICE_PWID, (u8*) &wps_devicepassword_id, &wps_devicepassword_id_len); - wps_devicepassword_id = be16_to_cpu( wps_devicepassword_id ); - - switch (wps_devicepassword_id) - { - case WPS_DPID_PIN: - pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_LABEL; - break; - case WPS_DPID_USER_SPEC: - pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_DISPLYA; - break; - case WPS_DPID_MACHINE_SPEC: - break; - case WPS_DPID_REKEY: - break; - case WPS_DPID_PBC: - pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON; - break; - case WPS_DPID_REGISTRAR_SPEC: - pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_KEYPAD; - break; - default: - break; - } - - - if ( rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) - { - - rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, devinfo_content, &devinfo_contentlen); - rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&capability, &capability_len); - - } - - - //start to build provision_request frame - _rtw_memset(wpsie, 0, sizeof(wpsie)); - _rtw_memset(p2p_ie, 0, sizeof(p2p_ie)); - p2p_ielen = 0; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, pwdinfo->tx_prov_disc_info.peerDevAddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, pwdinfo->tx_prov_disc_info.peerDevAddr, ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); - - - //build_prov_disc_request_p2p_ie - // P2P OUI - p2pielen = 0; - p2p_ie[ p2pielen++ ] = 0x50; - p2p_ie[ p2pielen++ ] = 0x6F; - p2p_ie[ p2pielen++ ] = 0x9A; - p2p_ie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // Commented by Albert 20110301 - // According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes - // 1. P2P Capability - // 2. Device Info - // 3. Group ID ( When joining an operating P2P Group ) - - // P2P Capability ATTR - // Type: - p2p_ie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; - - // Length: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - RTW_PUT_LE16(p2p_ie + p2pielen, 0x0002); - p2pielen += 2; - - // Value: - // Device Capability Bitmap, 1 byte - // Group Capability Bitmap, 1 byte - _rtw_memcpy(p2p_ie + p2pielen, &capability, 2); - p2pielen += 2; - - - // Device Info ATTR - // Type: - p2p_ie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; - - // Length: - // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) - // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); - RTW_PUT_LE16(p2p_ie + p2pielen, devinfo_contentlen); - p2pielen += 2; - - // Value: - _rtw_memcpy(p2p_ie + p2pielen, devinfo_content, devinfo_contentlen); - p2pielen += devinfo_contentlen; - - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2p_ie, &p2p_ielen); - //p2pielen = build_prov_disc_request_p2p_ie( pwdinfo, pframe, NULL, 0, pwdinfo->tx_prov_disc_info.peerDevAddr); - //pframe += p2pielen; - pattrib->pktlen += p2p_ielen; - - wpsielen = 0; - // WPS OUI - *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); - wpsielen += 4; - - // WPS version - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); - wpsielen += 2; - - // Value: - wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 - - // Config Method - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); - wpsielen += 2; - - // Value: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->tx_prov_disc_info.wps_config_method_request ); - wpsielen += 2; - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); - - -#ifdef CONFIG_WFD - wfdielen = build_provdisc_req_wfd_ie(pwdinfo, pframe); - pframe += wfdielen; - pattrib->pktlen += wfdielen; -#endif //CONFIG_WFD - - pattrib->last_txcmdsz = pattrib->pktlen; - - //dump_mgntframe(padapter, pmgntframe); - if (dump_mgntframe_and_wait_ack(padapter, pmgntframe) != _SUCCESS) - DBG_88E("%s, ack to\n", __func__); - - //if (wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC) - //{ - // DBG_88E("waiting for p2p peer key-in PIN CODE\n"); - // rtw_msleep_os(15000); // 15 sec for key in PIN CODE, workaround for GS2 before issuing Nego Req. - //} - -} - -static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy, struct net_device *ndev, - struct ieee80211_channel * channel, - enum nl80211_channel_type channel_type, - unsigned int duration, u64 *cookie) -{ - s32 err = 0; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; - u8 remain_ch = (u8) ieee80211_frequency_to_channel(channel->center_freq); - u8 ready_on_channel = false; - - DBG_88E(FUNC_NDEV_FMT" ch:%u duration:%d\n", FUNC_NDEV_ARG(ndev), remain_ch, duration); - - if (pcfg80211_wdinfo->is_ro_ch == true) - { - DBG_88E("%s, cancel ro ch timer\n", __func__); - - _cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer); - - p2p_protocol_wk_hdl(padapter, P2P_RO_CH_WK); - } - - pcfg80211_wdinfo->is_ro_ch = true; - - if (_FAIL == rtw_pwr_wakeup(padapter)) { - err = -EFAULT; - goto exit; - } - - pcfg80211_wdinfo->remain_on_ch_dev = ndev; - _rtw_memcpy(&pcfg80211_wdinfo->remain_on_ch_channel, channel, sizeof(struct ieee80211_channel)); - pcfg80211_wdinfo->remain_on_ch_type= channel_type; - pcfg80211_wdinfo->remain_on_ch_cookie= *cookie; - - rtw_scan_abort(padapter); - - if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { - rtw_p2p_enable(padapter, P2P_ROLE_DEVICE); - wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = true; - } - else - { - rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); -#ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); -#endif - } - - - rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); - - - if (duration < 400) - duration = duration*3;//extend from exper. - - pcfg80211_wdinfo->restore_channel = pmlmeext->cur_channel; - - if (rtw_ch_set_search_ch(pmlmeext->channel_set, remain_ch) >= 0) { - if (remain_ch != pmlmeext->cur_channel ) - ready_on_channel = true; - } else { - DBG_88E("%s remain_ch:%u not in channel plan!!!!\n", __func__, remain_ch); - } - - - //call this after other things have been done - if (ready_on_channel == true) { - if ( !check_fwstate(&padapter->mlmepriv, _FW_LINKED ) ) - pmlmeext->cur_channel = remain_ch; - - set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - } - - DBG_88E("%s, set ro ch timer, duration=%d\n", __func__, duration); - _set_timer( &pcfg80211_wdinfo->remain_on_ch_timer, duration); - - cfg80211_ready_on_channel(ndev, *cookie, channel, channel_type, duration, GFP_KERNEL); - - pwdinfo->listen_channel = pmlmeext->cur_channel; - -exit: - if (err) - pcfg80211_wdinfo->is_ro_ch = false; - - return err; -} - -static s32 cfg80211_rtw_cancel_remain_on_channel(struct wiphy *wiphy, struct net_device *ndev, - u64 cookie) -{ - s32 err = 0; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; - - DBG_88E(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - if (pcfg80211_wdinfo->is_ro_ch == true) { - DBG_88E("%s, cancel ro ch timer\n", __func__); - _cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer); - p2p_protocol_wk_hdl(padapter, P2P_RO_CH_WK); - } - - { - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); -#ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); -#endif - } - pcfg80211_wdinfo->is_ro_ch = false; - - return err; -} - -#endif //CONFIG_P2P - -static int _cfg80211_rtw_mgmt_tx(struct net_device *ndev, u8 tx_ch, const u8 *buf, size_t len) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - int ret = _FAIL; - bool ack = true; - struct rtw_ieee80211_hdr *pwlanhdr; - _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - //struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; - - if (_FAIL == rtw_pwr_wakeup(padapter)) { - ret = -EFAULT; - goto exit; - } - - rtw_set_scan_deny(padapter, 1000); - - rtw_scan_abort(padapter); - - if (tx_ch != rtw_get_oper_ch(padapter)) { - if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED )) - pmlmeext->cur_channel = tx_ch; - set_channel_bwmode(padapter, tx_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - } - - //starting alloc mgmt frame to dump it - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - ret = _FAIL; - goto exit; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - pattrib->retry_ctrl = false; - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - - _rtw_memcpy(pframe, (void*)buf, len); - pattrib->pktlen = len; - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - //update seq number - pmlmeext->mgnt_seq = GetSequence(pwlanhdr); - pattrib->seqnum = pmlmeext->mgnt_seq; - pmlmeext->mgnt_seq++; - -#ifdef CONFIG_WFD - { - struct wifi_display_info *pwfd_info; - - pwfd_info = padapter->wdinfo.wfd_info; - - if ( true == pwfd_info->wfd_enable ) - { - rtw_append_wfd_ie( padapter, pframe, &pattrib->pktlen ); - } - } -#endif // CONFIG_WFD - - pattrib->last_txcmdsz = pattrib->pktlen; - - if (dump_mgntframe_and_wait_ack(padapter, pmgntframe) != _SUCCESS) - { - ack = false; - ret = _FAIL; - - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("%s, ack == _FAIL\n", __func__); - #endif - } - else - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("%s, ack=%d, ok!\n", __func__, ack); - #endif - ret = _SUCCESS; - } - -exit: - - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("%s, ret=%d\n", __func__, ret); - #endif - - return ret; - -} - -static int cfg80211_rtw_mgmt_tx(struct wiphy *wiphy, struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - struct ieee80211_channel *chan, bool offchan, - enum nl80211_channel_type channel_type, - bool channel_type_valid, unsigned int wait, -#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) */ - struct ieee80211_channel *chan, - enum nl80211_channel_type channel_type, - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - bool channel_type_valid, - #endif -#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) */ - const u8 *buf, size_t len, - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0)) - bool no_cck, - #endif - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) - bool dont_wait_for_ack, - #endif - u64 *cookie) -{ - _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - int ret = 0; - int tx_ret; - u32 dump_limit = RTW_MAX_MGMT_TX_CNT; - u32 dump_cnt = 0; - bool ack = true; - u8 tx_ch = (u8)ieee80211_frequency_to_channel(chan->center_freq); - u8 category, action; - int type = (-1); - - /* cookie generation */ - *cookie = (unsigned long) buf; - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_88E(FUNC_NDEV_FMT" len=%zu, ch=%d, ch_type=%d\n", FUNC_NDEV_ARG(ndev), - len, tx_ch, channel_type); - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - DBG_88E("channel_type_valid=%d\n", channel_type_valid); - #endif -#endif /* CONFIG_DEBUG_CFG80211 */ - - /* indicate ack before issue frame to avoid racing with rsp frame */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - cfg80211_mgmt_tx_status(ndev, *cookie, buf, len, ack, GFP_KERNEL); -#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,34) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,35)) - cfg80211_action_tx_status(ndev, *cookie, buf, len, ack, GFP_KERNEL); -#endif - - if (rtw_action_frame_parse(buf, len, &category, &action) == false) { - DBG_88E(FUNC_NDEV_FMT" frame_control:0x%x\n", FUNC_NDEV_ARG(ndev), - le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)buf)->frame_ctl)); - goto exit; - } - - DBG_88E("RTW_Tx:tx_ch=%d, da=%pM\n", tx_ch, GetAddr1Ptr(buf)); - #ifdef CONFIG_P2P - if ((type = rtw_p2p_check_frames(padapter, buf, len, true)) >= 0) - goto dump; - #endif - if (category == RTW_WLAN_CATEGORY_PUBLIC) - DBG_88E("RTW_Tx:%s\n", action_public_str(action)); - else - DBG_88E("RTW_Tx:category(%u), action(%u)\n", category, action); - -dump: - do { - dump_cnt++; - tx_ret = _cfg80211_rtw_mgmt_tx(ndev, tx_ch, buf, len); - } while (dump_cnt < dump_limit && tx_ret != _SUCCESS); - - if (tx_ret != _SUCCESS || dump_cnt > 1) { - DBG_88E(FUNC_NDEV_FMT" %s (%d/%d)\n", FUNC_NDEV_ARG(ndev), - tx_ret==_SUCCESS?"OK":"FAIL", dump_cnt, dump_limit); - } - - switch (type) { - case P2P_GO_NEGO_CONF: - rtw_clear_scan_deny(padapter); - break; - case P2P_INVIT_RESP: - if (pwdev_priv->invit_info.flags & BIT(0) - && pwdev_priv->invit_info.status == 0) - { - DBG_88E(FUNC_ADPT_FMT" agree with invitation of persistent group\n", - FUNC_ADPT_ARG(padapter)); - rtw_set_scan_deny(padapter, 5000); - rtw_pwr_wakeup_ex(padapter, 5000); - rtw_clear_scan_deny(padapter); - } - break; - } - -exit: - return ret; -} - -static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy, struct net_device *ndev, - u16 frame_type, bool reg) -{ - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_88E(FUNC_NDEV_FMT" frame_type: %x, reg: %d\n", FUNC_NDEV_ARG(ndev), - frame_type, reg); -#endif - - if (frame_type != (IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ)) - return; - - return; -} - -static int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf, int len) -{ - int ret = 0; - uint wps_ielen = 0; - u8 *wps_ie; - u32 p2p_ielen = 0; - u8 wps_oui[8]={0x0,0x50,0xf2,0x04}; - u8 *p2p_ie; - u32 wfd_ielen = 0; - u8 *wfd_ie; - _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - - DBG_88E(FUNC_NDEV_FMT" ielen=%d\n", FUNC_NDEV_ARG(ndev), len); - - if (len>0) - { - if ((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen))) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("bcn_wps_ielen=%d\n", wps_ielen); - #endif - - if (pmlmepriv->wps_beacon_ie) - { - u32 free_len = pmlmepriv->wps_beacon_ie_len; - pmlmepriv->wps_beacon_ie_len = 0; - rtw_mfree(pmlmepriv->wps_beacon_ie, free_len); - pmlmepriv->wps_beacon_ie = NULL; - } - - pmlmepriv->wps_beacon_ie = rtw_malloc(wps_ielen); - if ( pmlmepriv->wps_beacon_ie == NULL) { - DBG_88E("%s()-%d: rtw_malloc() ERROR!\n", __func__, __LINE__); - return -EINVAL; - - } - - _rtw_memcpy(pmlmepriv->wps_beacon_ie, wps_ie, wps_ielen); - pmlmepriv->wps_beacon_ie_len = wps_ielen; - - update_beacon(padapter, _VENDOR_SPECIFIC_IE_, wps_oui, true); - - } - - //buf += wps_ielen; - //len -= wps_ielen; - - #ifdef CONFIG_P2P - if ((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen))) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("bcn_p2p_ielen=%d\n", p2p_ielen); - #endif - - if (pmlmepriv->p2p_beacon_ie) - { - u32 free_len = pmlmepriv->p2p_beacon_ie_len; - pmlmepriv->p2p_beacon_ie_len = 0; - rtw_mfree(pmlmepriv->p2p_beacon_ie, free_len); - pmlmepriv->p2p_beacon_ie = NULL; - } - - pmlmepriv->p2p_beacon_ie = rtw_malloc(p2p_ielen); - if ( pmlmepriv->p2p_beacon_ie == NULL) { - DBG_88E("%s()-%d: rtw_malloc() ERROR!\n", __func__, __LINE__); - return -EINVAL; - - } - - _rtw_memcpy(pmlmepriv->p2p_beacon_ie, p2p_ie, p2p_ielen); - pmlmepriv->p2p_beacon_ie_len = p2p_ielen; - - } - #endif //CONFIG_P2P - - //buf += p2p_ielen; - //len -= p2p_ielen; - - #ifdef CONFIG_WFD - if (rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("bcn_wfd_ielen=%d\n", wfd_ielen); - #endif - - if (pmlmepriv->wfd_beacon_ie) - { - u32 free_len = pmlmepriv->wfd_beacon_ie_len; - pmlmepriv->wfd_beacon_ie_len = 0; - rtw_mfree(pmlmepriv->wfd_beacon_ie, free_len); - pmlmepriv->wfd_beacon_ie = NULL; - } - - pmlmepriv->wfd_beacon_ie = rtw_malloc(wfd_ielen); - if ( pmlmepriv->wfd_beacon_ie == NULL) { - DBG_88E("%s()-%d: rtw_malloc() ERROR!\n", __func__, __LINE__); - return -EINVAL; - - } - rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_beacon_ie, &pmlmepriv->wfd_beacon_ie_len); - } - #endif //CONFIG_WFD - - pmlmeext->bstart_bss = true; - - } - - return ret; - -} - -static int rtw_cfg80211_set_probe_resp_wpsp2pie(struct net_device *net, char *buf, int len) -{ - int ret = 0; - uint wps_ielen = 0; - u8 *wps_ie; - u32 p2p_ielen = 0; - u8 *p2p_ie; - u32 wfd_ielen = 0; - u8 *wfd_ie; - _adapter *padapter = (_adapter *)rtw_netdev_priv(net); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("%s, ielen=%d\n", __func__, len); -#endif - - if (len>0) - { - if ((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen))) - { - uint attr_contentlen = 0; - u16 uconfig_method, *puconfig_method = NULL; - - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("probe_resp_wps_ielen=%d\n", wps_ielen); - #endif - - if (pmlmepriv->wps_probe_resp_ie) - { - u32 free_len = pmlmepriv->wps_probe_resp_ie_len; - pmlmepriv->wps_probe_resp_ie_len = 0; - rtw_mfree(pmlmepriv->wps_probe_resp_ie, free_len); - pmlmepriv->wps_probe_resp_ie = NULL; - } - - pmlmepriv->wps_probe_resp_ie = rtw_malloc(wps_ielen); - if ( pmlmepriv->wps_probe_resp_ie == NULL) { - DBG_88E("%s()-%d: rtw_malloc() ERROR!\n", __func__, __LINE__); - return -EINVAL; - - } - - //add PUSH_BUTTON config_method by driver self in wpsie of probe_resp at GO Mode - if ( (puconfig_method = (u16*)rtw_get_wps_attr_content( wps_ie, wps_ielen, WPS_ATTR_CONF_METHOD , NULL, &attr_contentlen)) != NULL ) - { - #ifdef CONFIG_DEBUG_CFG80211 - //printk("config_method in wpsie of probe_resp = 0x%x\n", be16_to_cpu(*puconfig_method)); - #endif - - uconfig_method = WPS_CM_PUSH_BUTTON; - uconfig_method = cpu_to_be16( uconfig_method ); - - *puconfig_method |= uconfig_method; - } - - _rtw_memcpy(pmlmepriv->wps_probe_resp_ie, wps_ie, wps_ielen); - pmlmepriv->wps_probe_resp_ie_len = wps_ielen; - - } - - //buf += wps_ielen; - //len -= wps_ielen; - - #ifdef CONFIG_P2P - if ((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen))) - { - u8 is_GO = false; - u32 attr_contentlen = 0; - u16 cap_attr=0; - - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("probe_resp_p2p_ielen=%d\n", p2p_ielen); - #endif - - //Check P2P Capability ATTR - if ( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*) &attr_contentlen) ) - { - u8 grp_cap=0; - //DBG_88E( "[%s] Got P2P Capability Attr!!\n", __func__ ); - cap_attr = le16_to_cpu(cap_attr); - grp_cap = (u8)((cap_attr >> 8)&0xff); - - is_GO = (grp_cap&BIT(0)) ? true:false; - - if (is_GO) - DBG_88E("Got P2P Capability Attr, grp_cap=0x%x, is_GO\n", grp_cap); - } - - - if (is_GO == false) - { - if (pmlmepriv->p2p_probe_resp_ie) - { - u32 free_len = pmlmepriv->p2p_probe_resp_ie_len; - pmlmepriv->p2p_probe_resp_ie_len = 0; - rtw_mfree(pmlmepriv->p2p_probe_resp_ie, free_len); - pmlmepriv->p2p_probe_resp_ie = NULL; - } - - pmlmepriv->p2p_probe_resp_ie = rtw_malloc(p2p_ielen); - if ( pmlmepriv->p2p_probe_resp_ie == NULL) { - DBG_88E("%s()-%d: rtw_malloc() ERROR!\n", __func__, __LINE__); - return -EINVAL; - - } - _rtw_memcpy(pmlmepriv->p2p_probe_resp_ie, p2p_ie, p2p_ielen); - pmlmepriv->p2p_probe_resp_ie_len = p2p_ielen; - } - else - { - if (pmlmepriv->p2p_go_probe_resp_ie) - { - u32 free_len = pmlmepriv->p2p_go_probe_resp_ie_len; - pmlmepriv->p2p_go_probe_resp_ie_len = 0; - rtw_mfree(pmlmepriv->p2p_go_probe_resp_ie, free_len); - pmlmepriv->p2p_go_probe_resp_ie = NULL; - } - - pmlmepriv->p2p_go_probe_resp_ie = rtw_malloc(p2p_ielen); - if ( pmlmepriv->p2p_go_probe_resp_ie == NULL) { - DBG_88E("%s()-%d: rtw_malloc() ERROR!\n", __func__, __LINE__); - return -EINVAL; - - } - _rtw_memcpy(pmlmepriv->p2p_go_probe_resp_ie, p2p_ie, p2p_ielen); - pmlmepriv->p2p_go_probe_resp_ie_len = p2p_ielen; - } - - } - #endif //CONFIG_P2P - - //buf += p2p_ielen; - //len -= p2p_ielen; - - #ifdef CONFIG_WFD - if (rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("probe_resp_wfd_ielen=%d\n", wfd_ielen); - #endif - - if (pmlmepriv->wfd_probe_resp_ie) - { - u32 free_len = pmlmepriv->wfd_probe_resp_ie_len; - pmlmepriv->wfd_probe_resp_ie_len = 0; - rtw_mfree(pmlmepriv->wfd_probe_resp_ie, free_len); - pmlmepriv->wfd_probe_resp_ie = NULL; - } - - pmlmepriv->wfd_probe_resp_ie = rtw_malloc(wfd_ielen); - if ( pmlmepriv->wfd_probe_resp_ie == NULL) { - DBG_88E("%s()-%d: rtw_malloc() ERROR!\n", __func__, __LINE__); - return -EINVAL; - - } - rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_resp_ie, &pmlmepriv->wfd_probe_resp_ie_len); - } - #endif //CONFIG_WFD - - } - - return ret; - -} - -static int rtw_cfg80211_set_assoc_resp_wpsp2pie(struct net_device *net, char *buf, int len) -{ - int ret = 0; - _adapter *padapter = (_adapter *)rtw_netdev_priv(net); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - DBG_88E("%s, ielen=%d\n", __func__, len); - - if (len>0) - { - if (pmlmepriv->wps_assoc_resp_ie) - { - u32 free_len = pmlmepriv->wps_assoc_resp_ie_len; - pmlmepriv->wps_assoc_resp_ie_len = 0; - rtw_mfree(pmlmepriv->wps_assoc_resp_ie, free_len); - pmlmepriv->wps_assoc_resp_ie = NULL; - } - - pmlmepriv->wps_assoc_resp_ie = rtw_malloc(len); - if ( pmlmepriv->wps_assoc_resp_ie == NULL) { - DBG_88E("%s()-%d: rtw_malloc() ERROR!\n", __func__, __LINE__); - return -EINVAL; - - } - _rtw_memcpy(pmlmepriv->wps_assoc_resp_ie, buf, len); - pmlmepriv->wps_assoc_resp_ie_len = len; - } - - return ret; - -} - -int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len, - int type) -{ - int ret = 0; - uint wps_ielen = 0; - u32 p2p_ielen = 0; - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_88E("%s, ielen=%d\n", __func__, len); -#endif - - if ( (rtw_get_wps_ie(buf, len, NULL, &wps_ielen) && (wps_ielen>0)) - #ifdef CONFIG_P2P - || (rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen) && (p2p_ielen>0)) - #endif - ) - { - if (net != NULL) - { - switch (type) - { - case 0x1: //BEACON - ret = rtw_cfg80211_set_beacon_wpsp2pie(net, buf, len); - break; - case 0x2: //PROBE_RESP - ret = rtw_cfg80211_set_probe_resp_wpsp2pie(net, buf, len); - break; - case 0x4: //ASSOC_RESP - ret = rtw_cfg80211_set_assoc_resp_wpsp2pie(net, buf, len); - break; - } - } - } - - return ret; - -} - -static struct cfg80211_ops rtw_cfg80211_ops = { - .change_virtual_intf = cfg80211_rtw_change_iface, - .add_key = cfg80211_rtw_add_key, - .get_key = cfg80211_rtw_get_key, - .del_key = cfg80211_rtw_del_key, - .set_default_key = cfg80211_rtw_set_default_key, - .get_station = cfg80211_rtw_get_station, - .scan = cfg80211_rtw_scan, - .set_wiphy_params = cfg80211_rtw_set_wiphy_params, - .connect = cfg80211_rtw_connect, - .disconnect = cfg80211_rtw_disconnect, - .join_ibss = cfg80211_rtw_join_ibss, - .leave_ibss = cfg80211_rtw_leave_ibss, - .set_tx_power = cfg80211_rtw_set_txpower, - .get_tx_power = cfg80211_rtw_get_txpower, - .set_power_mgmt = cfg80211_rtw_set_power_mgmt, - .set_pmksa = cfg80211_rtw_set_pmksa, - .del_pmksa = cfg80211_rtw_del_pmksa, - .flush_pmksa = cfg80211_rtw_flush_pmksa, - -#ifdef CONFIG_AP_MODE - .add_virtual_intf = cfg80211_rtw_add_virtual_intf, - .del_virtual_intf = cfg80211_rtw_del_virtual_intf, - - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) && !defined(COMPAT_KERNEL_RELEASE) - .add_beacon = cfg80211_rtw_add_beacon, - .set_beacon = cfg80211_rtw_set_beacon, - .del_beacon = cfg80211_rtw_del_beacon, - #else - .start_ap = cfg80211_rtw_start_ap, - .change_beacon = cfg80211_rtw_change_beacon, - .stop_ap = cfg80211_rtw_stop_ap, - #endif - - .add_station = cfg80211_rtw_add_station, - .del_station = cfg80211_rtw_del_station, - .change_station = cfg80211_rtw_change_station, - .dump_station = cfg80211_rtw_dump_station, - .change_bss = cfg80211_rtw_change_bss, - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) - .set_channel = cfg80211_rtw_set_channel, - #endif - //.auth = cfg80211_rtw_auth, - //.assoc = cfg80211_rtw_assoc, -#endif //CONFIG_AP_MODE - -#ifdef CONFIG_P2P - .remain_on_channel = cfg80211_rtw_remain_on_channel, - .cancel_remain_on_channel = cfg80211_rtw_cancel_remain_on_channel, -#endif - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - .mgmt_tx = cfg80211_rtw_mgmt_tx, - .mgmt_frame_register = cfg80211_rtw_mgmt_frame_register, -#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,34) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,35)) - .action = cfg80211_rtw_mgmt_tx, -#endif -}; - -static void rtw_cfg80211_init_ht_capab(struct ieee80211_sta_ht_cap *ht_cap, enum ieee80211_band band, u8 rf_type) -{ - -#define MAX_BIT_RATE_40MHZ_MCS15 300 /* Mbps */ -#define MAX_BIT_RATE_40MHZ_MCS7 150 /* Mbps */ - - ht_cap->ht_supported = true; - - ht_cap->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 | - IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20 | - IEEE80211_HT_CAP_DSSSCCK40 | IEEE80211_HT_CAP_MAX_AMSDU; - - /* - *Maximum length of AMPDU that the STA can receive. - *Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets) - */ - ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; - - /*Minimum MPDU start spacing , */ - ht_cap->ampdu_density = IEEE80211_HT_MPDU_DENSITY_16; - - ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; - - /* - *hw->wiphy->bands[IEEE80211_BAND_2GHZ] - *base on ant_num - *rx_mask: RX mask - *if rx_ant =1 rx_mask[0]=0xff;==>MCS0-MCS7 - *if rx_ant =2 rx_mask[1]=0xff;==>MCS8-MCS15 - *if rx_ant >=3 rx_mask[2]=0xff; - *if BW_40 rx_mask[4]=0x01; - *highest supported RX rate - */ - if (rf_type == RF_1T1R) - { - ht_cap->mcs.rx_mask[0] = 0xFF; - ht_cap->mcs.rx_mask[1] = 0x00; - ht_cap->mcs.rx_mask[4] = 0x01; - - ht_cap->mcs.rx_highest = MAX_BIT_RATE_40MHZ_MCS7; - } - else if ((rf_type == RF_1T2R) || (rf_type==RF_2T2R)) - { - ht_cap->mcs.rx_mask[0] = 0xFF; - ht_cap->mcs.rx_mask[1] = 0xFF; - ht_cap->mcs.rx_mask[4] = 0x01; - - ht_cap->mcs.rx_highest = MAX_BIT_RATE_40MHZ_MCS15; - } - else - { - DBG_88E("%s, error rf_type=%d\n", __func__, rf_type); - } - -} - -void rtw_cfg80211_init_wiphy(_adapter *padapter) -{ - u8 rf_type; - struct ieee80211_supported_band *bands; - struct wireless_dev *pwdev = padapter->rtw_wdev; - struct wiphy *wiphy = pwdev->wiphy; - - rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - - DBG_88E("%s:rf_type=%d\n", __func__, rf_type); - - /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */ - { - bands = wiphy->bands[IEEE80211_BAND_2GHZ]; - if (bands) - rtw_cfg80211_init_ht_capab(&bands->ht_cap, IEEE80211_BAND_2GHZ, rf_type); - } - - /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */ - { - bands = wiphy->bands[IEEE80211_BAND_5GHZ]; - if (bands) - rtw_cfg80211_init_ht_capab(&bands->ht_cap, IEEE80211_BAND_5GHZ, rf_type); - } -} - -static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy) -{ - - wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; - - wiphy->max_scan_ssids = RTW_SSID_SCAN_AMOUNT; - wiphy->max_scan_ie_len = RTW_SCAN_IE_LEN_MAX; - wiphy->max_num_pmkids = RTW_MAX_NUM_PMKIDS; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - wiphy->max_remain_on_channel_duration = RTW_MAX_REMAIN_ON_CHANNEL_DURATION; -#endif - - wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) - | BIT(NL80211_IFTYPE_ADHOC) -#ifdef CONFIG_AP_MODE - | BIT(NL80211_IFTYPE_AP) - | BIT(NL80211_IFTYPE_MONITOR) -#endif -#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) - | BIT(NL80211_IFTYPE_P2P_CLIENT) - | BIT(NL80211_IFTYPE_P2P_GO) -#endif - ; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) -#ifdef CONFIG_AP_MODE - wiphy->mgmt_stypes = rtw_cfg80211_default_mgmt_stypes; -#endif //CONFIG_AP_MODE -#endif - - wiphy->cipher_suites = rtw_cipher_suites; - wiphy->n_cipher_suites = ARRAY_SIZE(rtw_cipher_suites); - - /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */ - wiphy->bands[IEEE80211_BAND_2GHZ] = rtw_spt_band_alloc(IEEE80211_BAND_2GHZ); - /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */ - wiphy->bands[IEEE80211_BAND_5GHZ] = rtw_spt_band_alloc(IEEE80211_BAND_5GHZ); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38) && LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)) - wiphy->flags |= WIPHY_FLAG_SUPPORTS_SEPARATE_DEFAULT_KEYS; -#endif - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) - wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; - wiphy->flags |= WIPHY_FLAG_OFFCHAN_TX | WIPHY_FLAG_HAVE_AP_SME; -#endif - - if (padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE) - wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT; - else - wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; -} - -int rtw_wdev_alloc(_adapter *padapter, struct device *dev) -{ - int ret = 0; - struct wireless_dev *wdev; - struct rtw_wdev_priv *pwdev_priv; - struct net_device *pnetdev = padapter->pnetdev; - - DBG_88E("%s(padapter=%p)\n", __func__, padapter); - - wdev = (struct wireless_dev *)rtw_zmalloc(sizeof(struct wireless_dev)); - if (!wdev) { - DBG_88E("Couldn't allocate wireless device\n"); - return (-ENOMEM); - } - - wdev->wiphy = wiphy_new(&rtw_cfg80211_ops, sizeof(struct rtw_wdev_priv)); - if (!wdev->wiphy) { - DBG_88E("Couldn't allocate wiphy device\n"); - ret = -ENOMEM; - goto out_err_new; - } - - set_wiphy_dev(wdev->wiphy, dev); - - // - padapter->rtw_wdev = wdev; - pnetdev->ieee80211_ptr = wdev; - - //init pwdev_priv - pwdev_priv = wdev_to_priv(wdev); - pwdev_priv->pmon_ndev = NULL; - pwdev_priv->ifname_mon[0] = '\0'; - pwdev_priv->rtw_wdev = wdev; - pwdev_priv->padapter = padapter; - pwdev_priv->scan_request = NULL; - _rtw_spinlock_init(&pwdev_priv->scan_req_lock); - - pwdev_priv->p2p_enabled = false; - pwdev_priv->provdisc_req_issued = false; - rtw_wdev_invit_info_init(&pwdev_priv->invit_info); - - pwdev_priv->bandroid_scan = false; - - if (padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE) - pwdev_priv->power_mgmt = true; - else - pwdev_priv->power_mgmt = false; - - wdev->netdev = pnetdev; - wdev->iftype = NL80211_IFTYPE_MONITOR; // for rtw_setopmode_cmd() in cfg80211_rtw_change_iface() - - rtw_cfg80211_preinit_wiphy(padapter, wdev->wiphy); - - ret = wiphy_register(wdev->wiphy); - if (ret < 0) { - DBG_88E("Couldn't register wiphy device\n"); - goto out_err_register; - } - - SET_NETDEV_DEV(pnetdev, wiphy_dev(wdev->wiphy)); - - return ret; - - out_err_register: - wiphy_free(wdev->wiphy); - - out_err_new: - rtw_mfree((u8*)wdev, sizeof(struct wireless_dev)); - - return ret; - -} - -void rtw_wdev_free(struct wireless_dev *wdev) -{ - struct rtw_wdev_priv *pwdev_priv; - - DBG_88E("%s(wdev=%p)\n", __func__, wdev); - - if (!wdev) - return; - - pwdev_priv = wdev_to_priv(wdev); - - if (pwdev_priv->pmon_ndev) - free_netdev(pwdev_priv->pmon_ndev); - - rtw_spt_band_free(wdev->wiphy->bands[IEEE80211_BAND_2GHZ]); - rtw_spt_band_free(wdev->wiphy->bands[IEEE80211_BAND_5GHZ]); - - wiphy_free(wdev->wiphy); - - rtw_mfree((u8*)wdev, sizeof(struct wireless_dev)); -} - -void rtw_wdev_unregister(struct wireless_dev *wdev) -{ - struct rtw_wdev_priv *pwdev_priv; - - DBG_88E("%s(wdev=%p)\n", __func__, wdev); - - if (!wdev) - return; - - pwdev_priv = wdev_to_priv(wdev); - - rtw_cfg80211_indicate_scan_done(pwdev_priv, true); - - if (pwdev_priv->pmon_ndev) { - DBG_88E("%s, unregister monitor interface\n", __func__); - unregister_netdev(pwdev_priv->pmon_ndev); - } - - wiphy_unregister(wdev->wiphy); -} - -#endif //CONFIG_IOCTL_CFG80211 diff --git a/os_dep/ioctl_linux.c b/os_dep/ioctl_linux.c index 289bd4c..7fd4dfc 100644 --- a/os_dep/ioctl_linux.c +++ b/os_dep/ioctl_linux.c @@ -148,15 +148,11 @@ static void indicate_wx_custom_event(_adapter *padapter, char *msg) wrqu.data.length = strlen(msg); DBG_88E("%s %s\n", __func__, buff); -#ifndef CONFIG_IOCTL_CFG80211 wireless_send_event(padapter->pnetdev, IWEVCUSTOM, &wrqu, buff); -#endif rtw_mfree(buff, IW_CUSTOM_MAX+1); - } - static void request_wps_pbc_event(_adapter *padapter) { u8 *buff, *p; @@ -181,9 +177,7 @@ static void request_wps_pbc_event(_adapter *padapter) DBG_88E("%s\n", __func__); -#ifndef CONFIG_IOCTL_CFG80211 wireless_send_event(padapter->pnetdev, IWEVCUSTOM, &wrqu, buff); -#endif if (buff) { @@ -200,10 +194,7 @@ void indicate_wx_scan_complete_event(_adapter *padapter) _rtw_memset(&wrqu, 0, sizeof(union iwreq_data)); - //DBG_88E("+rtw_indicate_wx_scan_complete_event\n"); -#ifndef CONFIG_IOCTL_CFG80211 wireless_send_event(padapter->pnetdev, SIOCGIWSCAN, &wrqu, NULL); -#endif } @@ -219,9 +210,7 @@ void rtw_indicate_wx_assoc_event(_adapter *padapter) _rtw_memcpy(wrqu.ap_addr.sa_data, pmlmepriv->cur_network.network.MacAddress, ETH_ALEN); DBG_88E_LEVEL(_drv_always_, "assoc success\n"); -#ifndef CONFIG_IOCTL_CFG80211 wireless_send_event(padapter->pnetdev, SIOCGIWAP, &wrqu, NULL); -#endif } void rtw_indicate_wx_disassoc_event(_adapter *padapter) @@ -233,10 +222,8 @@ void rtw_indicate_wx_disassoc_event(_adapter *padapter) wrqu.ap_addr.sa_family = ARPHRD_ETHER; _rtw_memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN); -#ifndef CONFIG_IOCTL_CFG80211 DBG_88E_LEVEL(_drv_always_, "indicate disassoc\n"); wireless_send_event(padapter->pnetdev, SIOCGIWAP, &wrqu, NULL); -#endif } /* diff --git a/os_dep/mlme_linux.c b/os_dep/mlme_linux.c index 7885523..23efec2 100644 --- a/os_dep/mlme_linux.c +++ b/os_dep/mlme_linux.c @@ -53,15 +53,6 @@ if (adapter->registrypriv.mp_mode == 1) _set_timer(&adapter->mlmepriv.dynamic_chk_timer, 2000); } -#ifdef CONFIG_SET_SCAN_DENY_TIMER -void _rtw_set_scan_deny_timer_hdl(void *FunctionContext) -{ - _adapter *adapter = (_adapter *)FunctionContext; - rtw_set_scan_deny_timer_hdl(adapter); -} -#endif - - void rtw_init_mlme_timer(_adapter *padapter) { struct mlme_priv *pmlmepriv = &padapter->mlmepriv; @@ -72,10 +63,6 @@ void rtw_init_mlme_timer(_adapter *padapter) _init_timer(&(pmlmepriv->dynamic_chk_timer), padapter->pnetdev, _dynamic_check_timer_handlder, padapter); - #ifdef CONFIG_SET_SCAN_DENY_TIMER - _init_timer(&(pmlmepriv->set_scan_deny_timer), padapter->pnetdev, _rtw_set_scan_deny_timer_hdl, padapter); - #endif - #if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST) if (padapter->HalFunc.hal_init_checkbthang_workqueue) padapter->HalFunc.hal_init_checkbthang_workqueue(padapter); @@ -87,10 +74,6 @@ void rtw_os_indicate_connect(_adapter *adapter) _func_enter_; -#ifdef CONFIG_IOCTL_CFG80211 - rtw_cfg80211_indicate_connect(adapter); -#endif //CONFIG_IOCTL_CFG80211 - rtw_indicate_wx_assoc_event(adapter); netif_carrier_on(adapter->pnetdev); @@ -105,9 +88,6 @@ _func_exit_; extern void indicate_wx_scan_complete_event(_adapter *padapter); void rtw_os_indicate_scan_done( _adapter *padapter, bool aborted) { -#ifdef CONFIG_IOCTL_CFG80211 - rtw_cfg80211_indicate_scan_done(wdev_to_priv(padapter->rtw_wdev), aborted); -#endif indicate_wx_scan_complete_event(padapter); } @@ -174,10 +154,6 @@ _func_enter_; netif_carrier_off(adapter->pnetdev); // Do it first for tx broadcast pkt after disconnection issue! -#ifdef CONFIG_IOCTL_CFG80211 - rtw_cfg80211_indicate_disconnect(adapter); -#endif //CONFIG_IOCTL_CFG80211 - rtw_indicate_wx_disassoc_event(adapter); rtw_reset_securitypriv( adapter ); @@ -224,13 +200,10 @@ _func_enter_; wrqu.data.length = (wrqu.data.lengthpnetdev,IWEVCUSTOM,&wrqu,buff); -#endif if (buff) rtw_mfree(buff, IW_CUSTOM_MAX); - } _func_exit_; @@ -293,9 +266,7 @@ void rtw_indicate_sta_assoc_event(_adapter *padapter, struct sta_info *psta) DBG_88E("+rtw_indicate_sta_assoc_event\n"); -#ifndef CONFIG_IOCTL_CFG80211 wireless_send_event(padapter->pnetdev, IWEVREGISTERED, &wrqu, NULL); -#endif } void rtw_indicate_sta_disassoc_event(_adapter *padapter, struct sta_info *psta) @@ -319,9 +290,7 @@ void rtw_indicate_sta_disassoc_event(_adapter *padapter, struct sta_info *psta) DBG_88E("+rtw_indicate_sta_disassoc_event\n"); -#ifndef CONFIG_IOCTL_CFG80211 wireless_send_event(padapter->pnetdev, IWEVEXPIRED, &wrqu, NULL); -#endif } #endif diff --git a/os_dep/os_intfs.c b/os_dep/os_intfs.c index dbcda17..25d7973 100644 --- a/os_dep/os_intfs.c +++ b/os_dep/os_intfs.c @@ -1116,9 +1116,6 @@ _func_enter_; rtw_init_wifidirect_timers(padapter); init_wifidirect_info(padapter, P2P_ROLE_DISABLE); reset_global_wifidirect_info(padapter); - #ifdef CONFIG_IOCTL_CFG80211 - rtw_init_cfg80211_wifidirect_info(padapter); - #endif #ifdef CONFIG_WFD if (rtw_init_wifi_display_info(padapter) == _FAIL) RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init init_wifi_display_info\n")); @@ -1202,17 +1199,6 @@ void rtw_cancel_all_timer(_adapter *padapter) _cancel_timer_ex(&padapter->pwrctrlpriv.pwr_state_check_timer); -#ifdef CONFIG_IOCTL_CFG80211 -#ifdef CONFIG_P2P - _cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer); -#endif //CONFIG_P2P -#endif //CONFIG_IOCTL_CFG80211 - -#ifdef CONFIG_SET_SCAN_DENY_TIMER - _cancel_timer_ex(&padapter->mlmepriv.set_scan_deny_timer); - RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel set_scan_deny_timer!\n")); -#endif - _cancel_timer_ex(&padapter->recvpriv.signal_stat_timer); #if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST) if (padapter->HalFunc.hal_cancel_checkbthang_workqueue) @@ -1384,9 +1370,6 @@ int _netdev_open(struct net_device *pnetdev) padapter->intf_start(padapter); rtw_proc_init_one(pnetdev); -#ifdef CONFIG_IOCTL_CFG80211 - rtw_cfg80211_init_wiphy(padapter); -#endif rtw_led_control(padapter, LED_CTL_NO_LINK); padapter->bup = true; @@ -1583,19 +1566,9 @@ static int netdev_close(struct net_device *pnetdev) nat25_db_cleanup(padapter); #ifdef CONFIG_P2P - #ifdef CONFIG_IOCTL_CFG80211 - if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled == true) - wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = false; - #endif rtw_p2p_enable(padapter, P2P_ROLE_DISABLE); #endif //CONFIG_P2P -#ifdef CONFIG_IOCTL_CFG80211 - rtw_scan_abort(padapter); - wdev_to_priv(padapter->rtw_wdev)->bandroid_scan = false; - padapter->rtw_wdev->iftype = NL80211_IFTYPE_MONITOR; //set this at the end -#endif //CONFIG_IOCTL_CFG80211 - RT_TRACE(_module_os_intfs_c_,_drv_info_,("-88eu_drv - drv_close\n")); DBG_88E("-88eu_drv - drv_close, bup=%d\n", padapter->bup); return 0; diff --git a/os_dep/recv_linux.c b/os_dep/recv_linux.c index 61f32c4..e77d8c3 100644 --- a/os_dep/recv_linux.c +++ b/os_dep/recv_linux.c @@ -98,9 +98,6 @@ int rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf) void rtw_handle_tkip_mic_err(_adapter *padapter,u8 bgroup) { -#ifdef CONFIG_IOCTL_CFG80211 - enum nl80211_key_type key_type; -#endif union iwreq_data wrqu; struct iw_michaelmicfailure ev; struct mlme_priv* pmlmepriv = &padapter->mlmepriv; @@ -127,29 +124,11 @@ void rtw_handle_tkip_mic_err(_adapter *padapter,u8 bgroup) } } -#ifdef CONFIG_IOCTL_CFG80211 - if ( bgroup ) - { - key_type |= NL80211_KEYTYPE_GROUP; - } - else - { - key_type |= NL80211_KEYTYPE_PAIRWISE; - } - - cfg80211_michael_mic_failure(padapter->pnetdev, (u8 *)&pmlmepriv->assoc_bssid[ 0 ], key_type, -1, - NULL, GFP_ATOMIC); -#endif - _rtw_memset( &ev, 0x00, sizeof( ev ) ); if ( bgroup ) - { ev.flags |= IW_MICFAILURE_GROUP; - } else - { ev.flags |= IW_MICFAILURE_PAIRWISE; - } ev.src_addr.sa_family = ARPHRD_ETHER; _rtw_memcpy( ev.src_addr.sa_data, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN ); @@ -157,9 +136,7 @@ void rtw_handle_tkip_mic_err(_adapter *padapter,u8 bgroup) _rtw_memset( &wrqu, 0x00, sizeof( wrqu ) ); wrqu.data.length = sizeof( ev ); -#ifndef CONFIG_IOCTL_CFG80211 wireless_send_event( padapter->pnetdev, IWEVMICHAELMICFAILURE, &wrqu, (char*) &ev ); -#endif } void rtw_hostapd_mlme_rx(_adapter *padapter, union recv_frame *precv_frame) diff --git a/os_dep/rtw_android.c b/os_dep/rtw_android.c index a157131..917a019 100644 --- a/os_dep/rtw_android.c +++ b/os_dep/rtw_android.c @@ -298,10 +298,6 @@ static int rtw_android_set_block(struct net_device *net, char *command, int tota _adapter *adapter = (_adapter *)rtw_netdev_priv(net); char *block_value = command + strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_BLOCK]) + 1; - #ifdef CONFIG_IOCTL_CFG80211 - wdev_to_priv(adapter->rtw_wdev)->block = (*block_value=='0')?false:true; - #endif - return 0; } @@ -461,15 +457,6 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) //bytes_written = wl_cfg80211_set_p2p_ps(net, command + skip, priv_cmd.total_len - skip); break; -#ifdef CONFIG_IOCTL_CFG80211 - case ANDROID_WIFI_CMD_SET_AP_WPS_P2P_IE: - { - int skip = strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_SET_AP_WPS_P2P_IE]) + 3; - bytes_written = rtw_cfg80211_set_mgnt_wpsp2pie(net, command + skip, priv_cmd.total_len - skip, *(command + skip - 2) - '0'); - break; - } -#endif //CONFIG_IOCTL_CFG80211 - #ifdef CONFIG_WFD case ANDROID_WIFI_CMD_WFD_ENABLE: { diff --git a/os_dep/usb_intf.c b/os_dep/usb_intf.c index f3c51fa..7e20409 100644 --- a/os_dep/usb_intf.c +++ b/os_dep/usb_intf.c @@ -1039,13 +1039,6 @@ static _adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj, SET_NETDEV_DEV(pnetdev, dvobj_to_dev(dvobj)); padapter = rtw_netdev_priv(pnetdev); -#ifdef CONFIG_IOCTL_CFG80211 - if (rtw_wdev_alloc(padapter, dvobj_to_dev(dvobj)) != 0) { - goto handle_dualmac; - } -#endif - - //step 2. hook HalFunc, allocate HalData hal_set_hal_ops(padapter); @@ -1147,12 +1140,6 @@ free_hal_data: if (status != _SUCCESS && padapter->HalData) kfree(padapter->HalData); free_wdev: - if (status != _SUCCESS) { - #ifdef CONFIG_IOCTL_CFG80211 - rtw_wdev_unregister(padapter->rtw_wdev); - rtw_wdev_free(padapter->rtw_wdev); - #endif - } handle_dualmac: if (status != _SUCCESS) rtw_handle_dualmac(padapter, 0); @@ -1200,11 +1187,6 @@ static void rtw_usb_if1_deinit(_adapter *if1) rtw_handle_dualmac(if1, 0); -#ifdef CONFIG_IOCTL_CFG80211 - rtw_wdev_unregister(if1->rtw_wdev); - rtw_wdev_free(if1->rtw_wdev); -#endif - #ifdef CONFIG_BT_COEXIST if (1 == if1->pwrctrlpriv.autopm_cnt){ #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33))