From 4cf5fcf936f3b8af4cabea9890802deb66d231e0 Mon Sep 17 00:00:00 2001 From: pvvx Date: Thu, 2 Mar 2017 11:46:28 +0300 Subject: [PATCH] update --- .../component/common/api/at_cmd/atcmd_sys.c | 2 +- .../component/common/api/lwip_netconf.c | 10 +- .../component/common/api/wifi/wifi_conf.c | 1627 +++--- .../component/common/api/wifi/wifi_ind.c | 230 +- .../component/common/api/wifi/wifi_util.c | 1471 +++--- .../drivers/wlan/realtek/include/wifi_lib.h | 215 +- .../drivers/wlan/realtek/include/wlan_lib.h | 108 +- .../wlan/realtek/src/osdep/freertos/wrapper.h | 30 +- .../wlan/realtek/src/osdep/wlan_intf.h | 2 +- .../os/os_dep/include/osdep_service.h | 2 +- .../bsp/lib/common/GCC/export-rom_v04.txt | 4 +- .../realtek/8195a/misc/driver/rtl_consol.h | 2 +- build/bin/ota.bin | Bin 307340 -> 305316 bytes build/bin/ram_2.bin | Bin 307320 -> 305296 bytes build/bin/ram_2.ns.bin | Bin 307336 -> 305312 bytes build/bin/ram_2.p.bin | Bin 307336 -> 305312 bytes build/bin/ram_all.bin | Bin 352392 -> 350368 bytes build/obj/build.nmap | 4454 +++++++++-------- 18 files changed, 3919 insertions(+), 4238 deletions(-) diff --git a/RTL00_SDKV35a/component/common/api/at_cmd/atcmd_sys.c b/RTL00_SDKV35a/component/common/api/at_cmd/atcmd_sys.c index cf2a735..8afaea7 100644 --- a/RTL00_SDKV35a/component/common/api/at_cmd/atcmd_sys.c +++ b/RTL00_SDKV35a/component/common/api/at_cmd/atcmd_sys.c @@ -1316,7 +1316,7 @@ void fATST(void *arg) { #if 0 #include "wlan_lib.h" #include "hal_com_reg.h" -// struct net_device *rltk_wlan_info; +// extern Rltk_wlan_t rltk_wlan_info[2]; void fATXT(void *arg) { #if DEBUG_AT_USER_LEVEL > 3 diff --git a/RTL00_SDKV35a/component/common/api/lwip_netconf.c b/RTL00_SDKV35a/component/common/api/lwip_netconf.c index 426fd93..d343924 100644 --- a/RTL00_SDKV35a/component/common/api/lwip_netconf.c +++ b/RTL00_SDKV35a/component/common/api/lwip_netconf.c @@ -233,7 +233,7 @@ uint8_t LwIP_DHCP(uint8_t idx, uint8_t dhcp_state) { iptab[1] = (uint8_t) (IPaddress >> 16); iptab[2] = (uint8_t) (IPaddress >> 8); iptab[3] = (uint8_t) (IPaddress); - printf("Interface %d IP address: %d.%d.%d.%d\n", idx, iptab[3], + info_printf("Interface %d IP address: %d.%d.%d.%d\n", idx, iptab[3], iptab[2], iptab[1], iptab[0]); #if CONFIG_WLAN error_flag = RTW_NO_ERROR; @@ -257,8 +257,8 @@ uint8_t LwIP_DHCP(uint8_t idx, uint8_t dhcp_state) { iptab[1] = IP_ADDR2; iptab[2] = IP_ADDR1; iptab[3] = IP_ADDR0; - printf("Interface %d DHCP timeout\n", idx); - printf("Static IP address: %d.%d.%d.%d\n", iptab[3], iptab[2], iptab[1], iptab[0]); + info_printf("Interface %d DHCP timeout\n", idx); + info_printf("Static IP address: %d.%d.%d.%d\n", iptab[3], iptab[2], iptab[1], iptab[0]); #if CONFIG_WLAN error_flag = RTW_DHCP_FAIL; #endif @@ -280,14 +280,14 @@ uint8_t LwIP_DHCP(uint8_t idx, uint8_t dhcp_state) { #if CONFIG_WLAN wifi_unreg_event_handler(WIFI_EVENT_BEACON_AFTER_DHCP, wifi_rx_beacon_hdl); #endif - printf("LwIP_DHCP: Release ip\n"); + info_printf("LwIP_DHCP(%d): Release ip\n", idx); dhcp_release_unicast(pnetif); return DHCP_RELEASE_IP; case DHCP_STOP: #if CONFIG_WLAN wifi_unreg_event_handler(WIFI_EVENT_BEACON_AFTER_DHCP, wifi_rx_beacon_hdl); #endif - printf("LwIP_DHCP: dhcp stop.\n"); + info_printf("LwIP_DHCP(%d): dhcp stop.\n", idx); dhcp_stop(pnetif); return DHCP_STOP; default: diff --git a/RTL00_SDKV35a/component/common/api/wifi/wifi_conf.c b/RTL00_SDKV35a/component/common/api/wifi/wifi_conf.c index b261278..fedaad6 100644 --- a/RTL00_SDKV35a/component/common/api/wifi/wifi_conf.c +++ b/RTL00_SDKV35a/component/common/api/wifi/wifi_conf.c @@ -5,7 +5,6 @@ #include #include "main.h" #include -//#include #include #include #include @@ -26,11 +25,11 @@ extern int inic_stop(void); #include "wlan_lib.h" #if CONFIG_DEBUG_LOG > 0 - #undef printf - #define printf(...) rtl_printf(__VA_ARGS__) +#undef printf +#define printf(...) rtl_printf(__VA_ARGS__) #else - #undef printf - #define printf(...) +#undef printf +#define printf(...) #endif #define SHOW_PRIVATE_OUT 1 // =0 - off, = 1 On @@ -66,7 +65,8 @@ extern struct netif xnetif[NET_IF_NUM]; /****************************************************** * Variables Definitions ******************************************************/ -static internal_scan_handler_t scan_result_handler_ptr = {0, 0, 0, RTW_FALSE, 0, 0, 0, 0, 0}; +static internal_scan_handler_t scan_result_handler_ptr = { 0, 0, 0, RTW_FALSE, + 0, 0, 0, 0, 0 }; static internal_join_result_t* join_user_data; extern rtw_mode_t wifi_mode; int error_flag = RTW_UNKNOWN; @@ -80,10 +80,10 @@ extern unsigned char dhcp_mode_sta; ******************************************************/ #ifndef WLAN0_NAME - #define WLAN0_NAME "wlan0" +#define WLAN0_NAME "wlan0" #endif #ifndef WLAN1_NAME - #define WLAN1_NAME "wlan1" +#define WLAN1_NAME "wlan1" #endif /* Give default value if not defined */ #ifndef NET_IF_NUM @@ -125,7 +125,7 @@ extern unsigned char dhcp_mode_sta; #define AP_IP_ADDR2 43 #define AP_IP_ADDR3 1 #endif - + /*NETMASK*/ #ifndef AP_NETMASK_ADDR0 #define AP_NETMASK_ADDR0 255 @@ -151,118 +151,108 @@ extern unsigned char dhcp_mode_sta; //----------------------------------------------------------------------start-patch// #include "freertos/wrapper.h" #include "skbuff.h" -/* -typedef struct -{ - unsigned int rx_packets; - unsigned int tx_packets; - unsigned int rx_dropped; - unsigned int tx_dropped; - unsigned int rx_bytes; - unsigned int tx_bytes; - unsigned int rx_overflow; -}net_device_stats; -typedef struct net_device -{ - char name[16]; - void *priv; - unsigned char dev_addr[6]; - int (*init)(void); - int (*open)(struct net_device *); - int (*stop)(struct net_device *); - int (*hard_start_xmit)(struct sk_buff *, net_device *); - int (*do_ioctl)(struct net_device *, iwreq *, int); - net_device_stats *(*get_stats)(net_device *); -}; -*/ -extern struct net_device *rltk_wlan_info; -void patch_rltk_wlan_deinit(void) -{ - struct net_device *v0; - int v1; - char *v4; +//extern Rltk_wlan_t rltk_wlan_info[2]; +void patch_rltk_wlan_deinit(void) { + uint8_t chk; + if (rltk_wlan_info[0].enable || rltk_wlan_info[0].enable) { + _adapter *ad = rltk_wlan_info[0].dev->priv; + ad->bSurpriseRemoved = 1; // + 5892 + rtw_wakeup_task(&ad->isrThread.task); // +5912 + while (1) { + save_and_cli(); // taskENTER_CRITICAL(); // vPortEnterCritical() + rltk_wlan_info[0].enable = 0; + rltk_wlan_info[1].enable = 0; + chk = rltk_wlan_info[0].tx_busy + rltk_wlan_info[0].rx_busy + + rltk_wlan_info[1].tx_busy + rltk_wlan_info[0].rx_busy; + restore_flags(); + if (!chk) + break; + rtl_printf("[%s] Wait for TX/RX Busy (%d)\n", __func__, chk); + vTaskDelay(10); + } + while (1) { + if (!*(u32 *) (ad->isrThread.wakeup_sema) || ad->RxStop == 2) + break; + rtl_printf("[%s] Wait for RxStop\n", __func__); + vTaskDelay(10); + } + rtw_dev_remove(rltk_wlan_info); + rtw_drv_halt(); + deinit_timer_wrapper(); - v0 = rltk_wlan_info; + rltk_wlan_info[0].enable = 0; + rltk_wlan_info[1].enable = 0; - if(rltk_wlan_info->priv != NULL) { - v1 = *(u32 *)rltk_wlan_info->priv; /* pointer to private data */ - *(u8 *)(v1 + 5892) = 1; - rtw_wakeup_task(v1 + 5912); - while(1) { - save_and_cli(); - *((u8 *)&rltk_wlan_info + 16) = 0; - *((u8 *)&rltk_wlan_info + 40) = 0; - v4 = &(*(&rltk_wlan_info + 9))->name[(u32)*(&rltk_wlan_info + 2) - + (u32)*(&rltk_wlan_info + 3) - + (unsigned int)*(&rltk_wlan_info + 8)]; - restore_flags(); - if (!v4 ) break; - rtl_printf("[%s] Wait for TX/RX Busy (%d)\n", "rltk_wlan_deinit", v4); - vTaskDelay(10); - } - while(1) { - if ( !*(u32 *)(v1 + 5916) || *(u8 *)(v1 + 5892) == 2 ) break; - rtl_printf("[%s] Wait for RxStop\n", "rltk_wlan_deinit"); - vTaskDelay(10); - } - rtw_dev_remove(rltk_wlan_info); - rtw_drv_halt(); - deinit_timer_wrapper(); - *((u8 *)&rltk_wlan_info + 16) = 0; - *((u8 *)&rltk_wlan_info + 40) = 0; - *(u64 *)&rltk_wlan_info = 0LL; - *((u64 *)&rltk_wlan_info + 1) = 0LL; - *((u64 *)&rltk_wlan_info + 3) = 0LL; - *((u64 *)&rltk_wlan_info + 4) = 0LL; - //deinit_mem_monitor(NULL, NULL); - } + rltk_wlan_info[0].dev = 0; + rltk_wlan_info[0].skb = 0; + rltk_wlan_info[0].tx_busy = 0; + rltk_wlan_info[0].rx_busy = 0; + rltk_wlan_info[0].enable = 0; + rltk_wlan_info[1].dev = 0; + rltk_wlan_info[1].skb = 0; + rltk_wlan_info[1].tx_busy = 0; + rltk_wlan_info[1].rx_busy = 0; + rltk_wlan_info[1].enable = 0; + //deinit_mem_monitor(NULL, NULL); + } } //------------------------------------------------------------------------end-patch// -static int wifi_connect_local(rtw_network_info_t *pWifi) -{ +static int wifi_connect_local(rtw_network_info_t *pWifi) { int ret = 0; - - if(is_promisc_enabled()) + + if (is_promisc_enabled()) promisc_set(0, NULL, 0); - if(!pWifi) return -1; - switch(pWifi->security_type){ - case RTW_SECURITY_OPEN: - ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_NONE, NULL, 0, 0, 0, 0, NULL, 0); - break; - case RTW_SECURITY_WEP_PSK: - case RTW_SECURITY_WEP_SHARED: - ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_SHARED_KEY); - if(ret == 0) - ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_WEP, NULL, pWifi->key_id, 1 /* set tx key */, 0, 0, pWifi->password, pWifi->password_len); - break; - case RTW_SECURITY_WPA_TKIP_PSK: - case RTW_SECURITY_WPA2_TKIP_PSK: - ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_OPEN_SYSTEM); - if(ret == 0) - ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_TKIP, NULL, 0, 0, 0, 0, NULL, 0); - if(ret == 0) - ret = wext_set_passphrase(WLAN0_NAME, pWifi->password, pWifi->password_len); - break; - case RTW_SECURITY_WPA_AES_PSK: - case RTW_SECURITY_WPA2_AES_PSK: - case RTW_SECURITY_WPA2_MIXED_PSK: - case RTW_SECURITY_WPA_WPA2_MIXED: - ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_OPEN_SYSTEM); - if(ret == 0) - ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_CCMP, NULL, 0, 0, 0, 0, NULL, 0); - if(ret == 0) - ret = wext_set_passphrase(WLAN0_NAME, pWifi->password, pWifi->password_len); - break; - default: - ret = -1; - printf("WIFICONF: security type(0x%x) is not supported.\n", pWifi->security_type); - break; + if (!pWifi) + return -1; + switch (pWifi->security_type) { + case RTW_SECURITY_OPEN: + ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_NONE, NULL, 0, 0, 0, 0, + NULL, 0); + break; + case RTW_SECURITY_WEP_PSK: + case RTW_SECURITY_WEP_SHARED: + ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, + IW_AUTH_ALG_SHARED_KEY); + if (ret == 0) + ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_WEP, NULL, + pWifi->key_id, 1 /* set tx key */, 0, 0, pWifi->password, + pWifi->password_len); + break; + case RTW_SECURITY_WPA_TKIP_PSK: + case RTW_SECURITY_WPA2_TKIP_PSK: + ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, + IW_AUTH_ALG_OPEN_SYSTEM); + if (ret == 0) + ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_TKIP, NULL, 0, 0, + 0, 0, NULL, 0); + if (ret == 0) + ret = wext_set_passphrase(WLAN0_NAME, pWifi->password, + pWifi->password_len); + break; + case RTW_SECURITY_WPA_AES_PSK: + case RTW_SECURITY_WPA2_AES_PSK: + case RTW_SECURITY_WPA2_MIXED_PSK: + case RTW_SECURITY_WPA_WPA2_MIXED: + ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, + IW_AUTH_ALG_OPEN_SYSTEM); + if (ret == 0) + ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_CCMP, NULL, 0, 0, + 0, 0, NULL, 0); + if (ret == 0) + ret = wext_set_passphrase(WLAN0_NAME, pWifi->password, + pWifi->password_len); + break; + default: + ret = -1; + error_printf("%s: security type(0x%x) is not supported!\n", + pWifi->security_type, __func__); + break; } #if DD_WIFI_CONN // дублирование с wifi_connect_bssid_local() if(ret == 0) - ret = wext_set_ssid(WLAN0_NAME, pWifi->ssid.val, pWifi->ssid.len); + ret = wext_set_ssid(WLAN0_NAME, pWifi->ssid.val, pWifi->ssid.len); #endif return ret; } @@ -272,46 +262,46 @@ static int wifi_connect_bssid_local(rtw_network_info_t *pWifi) { int ret = 0; u8 bssid[12] = {0}; - + if(is_promisc_enabled()) - promisc_set(0, NULL, 0); + promisc_set(0, NULL, 0); if(!pWifi) return -1; - switch(pWifi->security_type){ + switch(pWifi->security_type) { case RTW_SECURITY_OPEN: - ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_NONE, NULL, 0, 0, 0, 0, NULL, 0); - break; + ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_NONE, NULL, 0, 0, 0, 0, NULL, 0); + break; case RTW_SECURITY_WEP_PSK: case RTW_SECURITY_WEP_SHARED: - ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_SHARED_KEY); - if(ret == 0) - ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_WEP, NULL, pWifi->key_id, 1 /* set tx key */, 0, 0, pWifi->password, pWifi->password_len); - break; + ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_SHARED_KEY); + if(ret == 0) + ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_WEP, NULL, pWifi->key_id, 1 /* set tx key */, 0, 0, pWifi->password, pWifi->password_len); + break; case RTW_SECURITY_WPA_TKIP_PSK: case RTW_SECURITY_WPA2_TKIP_PSK: - ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_OPEN_SYSTEM); - if(ret == 0) - ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_TKIP, NULL, 0, 0, 0, 0, NULL, 0); - if(ret == 0) - ret = wext_set_passphrase(WLAN0_NAME, pWifi->password, pWifi->password_len); - break; + ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_OPEN_SYSTEM); + if(ret == 0) + ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_TKIP, NULL, 0, 0, 0, 0, NULL, 0); + if(ret == 0) + ret = wext_set_passphrase(WLAN0_NAME, pWifi->password, pWifi->password_len); + break; case RTW_SECURITY_WPA_AES_PSK: case RTW_SECURITY_WPA2_AES_PSK: case RTW_SECURITY_WPA2_MIXED_PSK: - ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_OPEN_SYSTEM); - if(ret == 0) - ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_CCMP, NULL, 0, 0, 0, 0, NULL, 0); - if(ret == 0) - ret = wext_set_passphrase(WLAN0_NAME, pWifi->password, pWifi->password_len); - break; + ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_OPEN_SYSTEM); + if(ret == 0) + ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_CCMP, NULL, 0, 0, 0, 0, NULL, 0); + if(ret == 0) + ret = wext_set_passphrase(WLAN0_NAME, pWifi->password, pWifi->password_len); + break; default: - ret = -1; - printf("WIFICONF: security type(0x%x) is not supported.\n", pWifi->security_type); - break; + ret = -1; + printf("WIFICONF: security type(0x%x) is not supported.\n", pWifi->security_type); + break; } - if(ret == 0){ + if(ret == 0) { memcpy(bssid, pWifi->bssid.octet, ETH_ALEN); - if(pWifi->ssid.len){ + if(pWifi->ssid.len) { bssid[ETH_ALEN] = '#'; bssid[ETH_ALEN + 1] = '@'; memcpy(bssid + ETH_ALEN + 2, &pWifi, sizeof(pWifi)); @@ -322,95 +312,106 @@ static int wifi_connect_bssid_local(rtw_network_info_t *pWifi) } #endif -void wifi_rx_beacon_hdl( char* buf, int buf_len, int flags, void* userdata) { +void wifi_rx_beacon_hdl(char* buf, int buf_len, int flags, void* userdata) { //printf("Beacon!\n"); } - -static void wifi_no_network_hdl(char* buf, int buf_len, int flags, void* userdata) -{ - if(join_user_data!=NULL) - rtw_join_status = JOIN_NO_NETWORKS; +static void wifi_no_network_hdl(char* buf, int buf_len, int flags, + void* userdata) { + if (join_user_data != NULL) + rtw_join_status = JOIN_NO_NETWORKS; } -static void wifi_connected_hdl( char* buf, int buf_len, int flags, void* userdata) -{ +static void wifi_connected_hdl(char* buf, int buf_len, int flags, + void* userdata) { #ifdef CONFIG_ENABLE_EAP - if(get_eap_phase()){ + if(get_eap_phase()) { rtw_join_status = JOIN_COMPLETE | JOIN_SECURITY_COMPLETE | JOIN_ASSOCIATED | JOIN_AUTHENTICATED | JOIN_LINK_READY; return; } #endif /* CONFIG_ENABLE_EAP */ - if((join_user_data!=NULL)&&((join_user_data->network_info.security_type == RTW_SECURITY_OPEN) || - (join_user_data->network_info.security_type == RTW_SECURITY_WEP_PSK))){ - rtw_join_status = JOIN_COMPLETE | JOIN_SECURITY_COMPLETE | JOIN_ASSOCIATED | JOIN_AUTHENTICATED | JOIN_LINK_READY; + if ((join_user_data != NULL) + && ((join_user_data->network_info.security_type == RTW_SECURITY_OPEN) + || (join_user_data->network_info.security_type + == RTW_SECURITY_WEP_PSK))) { + rtw_join_status = JOIN_COMPLETE | JOIN_SECURITY_COMPLETE + | JOIN_ASSOCIATED | JOIN_AUTHENTICATED | JOIN_LINK_READY; rtw_up_sema(&join_user_data->join_sema); - }else if((join_user_data!=NULL)&&((join_user_data->network_info.security_type == RTW_SECURITY_WPA2_AES_PSK) )){ - rtw_join_status = JOIN_COMPLETE | JOIN_SECURITY_COMPLETE | JOIN_ASSOCIATED | JOIN_AUTHENTICATED | JOIN_LINK_READY; + } else if ((join_user_data != NULL) + && ((join_user_data->network_info.security_type + == RTW_SECURITY_WPA2_AES_PSK))) { + rtw_join_status = JOIN_COMPLETE | JOIN_SECURITY_COMPLETE + | JOIN_ASSOCIATED | JOIN_AUTHENTICATED | JOIN_LINK_READY; } } -static void wifi_handshake_done_hdl( char* buf, int buf_len, int flags, void* userdata) -{ - rtw_join_status = JOIN_COMPLETE | JOIN_SECURITY_COMPLETE | JOIN_ASSOCIATED | JOIN_AUTHENTICATED | JOIN_LINK_READY | JOIN_HANDSHAKE_DONE; - if(join_user_data != NULL) +static void wifi_handshake_done_hdl(char* buf, int buf_len, int flags, + void* userdata) { + rtw_join_status = JOIN_COMPLETE | JOIN_SECURITY_COMPLETE | JOIN_ASSOCIATED + | JOIN_AUTHENTICATED | JOIN_LINK_READY | JOIN_HANDSHAKE_DONE; + if (join_user_data != NULL) rtw_up_sema(&join_user_data->join_sema); } -static void wifi_disconn_hdl( char* buf, int buf_len, int flags, void* userdata) -{ - if(join_user_data != NULL){ - if(join_user_data->network_info.security_type == RTW_SECURITY_OPEN){ +static void wifi_disconn_hdl(char* buf, int buf_len, int flags, void* userdata) { + if (join_user_data != NULL) { + if (join_user_data->network_info.security_type == RTW_SECURITY_OPEN) { - if(rtw_join_status == JOIN_NO_NETWORKS) + if (rtw_join_status == JOIN_NO_NETWORKS) error_flag = RTW_NONE_NETWORK; - }else if(join_user_data->network_info.security_type == RTW_SECURITY_WEP_PSK){ + } else if (join_user_data->network_info.security_type + == RTW_SECURITY_WEP_PSK) { - if(rtw_join_status == JOIN_NO_NETWORKS) + if (rtw_join_status == JOIN_NO_NETWORKS) error_flag = RTW_NONE_NETWORK; - else if(rtw_join_status == 0) - error_flag = RTW_CONNECT_FAIL; + else if (rtw_join_status == 0) + error_flag = RTW_CONNECT_FAIL; - }else if(join_user_data->network_info.security_type == RTW_SECURITY_WPA2_AES_PSK){ + } else if (join_user_data->network_info.security_type + == RTW_SECURITY_WPA2_AES_PSK) { - if(rtw_join_status ==JOIN_NO_NETWORKS) + if (rtw_join_status == JOIN_NO_NETWORKS) error_flag = RTW_NONE_NETWORK; - else if(rtw_join_status == 0) - error_flag = RTW_CONNECT_FAIL; + else if (rtw_join_status == 0) + error_flag = RTW_CONNECT_FAIL; - else if(rtw_join_status == JOIN_COMPLETE | JOIN_SECURITY_COMPLETE | JOIN_ASSOCIATED | JOIN_AUTHENTICATED | JOIN_LINK_READY) - error_flag = RTW_WRONG_PASSWORD; + else if (rtw_join_status == JOIN_COMPLETE | JOIN_SECURITY_COMPLETE + | JOIN_ASSOCIATED | JOIN_AUTHENTICATED | JOIN_LINK_READY) + error_flag = RTW_WRONG_PASSWORD; } - - }else{ - if(error_flag == RTW_NO_ERROR) //wifi_disconn_hdl will be dispatched one more time after join_user_data = NULL add by frankie + + } else { + if (error_flag == RTW_NO_ERROR) //wifi_disconn_hdl will be dispatched one more time after join_user_data = NULL add by frankie error_flag = RTW_UNKNOWN; } - if(join_user_data != NULL) + if (join_user_data != NULL) rtw_up_sema(&join_user_data->join_sema); - //printf("\r\nWiFi Disconnect. Error flag is %d.\n", error_flag); +#if CONFIG_DEBUG_LOG > 4 + info_printf("%s: Error flag is %d!\n", __func__, error_flag); +#endif } #if CONFIG_EXAMPLE_WLAN_FAST_CONNECT #define WLAN0_NAME "wlan0" // ????? -void restore_wifi_info_to_flash() -{ +void restore_wifi_info_to_flash() { struct wlan_fast_reconnect * data_to_flash; u32 channel = 0; u8 index = 0; - u8 *ifname[1] = {WLAN0_NAME}; + u8 *ifname[1] = { WLAN0_NAME }; rtw_wifi_setting_t setting; //struct security_priv *psecuritypriv = &padapter->securitypriv; //WLAN_BSSID_EX *pcur_bss = pmlmepriv->cur_network.network; - data_to_flash = (struct wlan_fast_reconnect *)rtw_zmalloc(sizeof(struct wlan_fast_reconnect)); + data_to_flash = (struct wlan_fast_reconnect *) rtw_zmalloc( + sizeof(struct wlan_fast_reconnect)); - if(data_to_flash && p_write_reconnect_ptr){ - if(wifi_get_setting((const char*)ifname[0],&setting) || setting.mode == RTW_MODE_AP){ + if (data_to_flash && p_write_reconnect_ptr) { + if (wifi_get_setting((const char*) ifname[0], &setting) + || setting.mode == RTW_MODE_AP) { printf(" %s():wifi_get_setting fail or ap mode\n", __func__); return; } @@ -418,142 +419,153 @@ void restore_wifi_info_to_flash() rtw_memset(psk_essid[index], 0, sizeof(psk_essid[index])); strncpy(psk_essid[index], setting.ssid, strlen(setting.ssid)); - switch(setting.security_type){ - case RTW_SECURITY_OPEN: - rtw_memset(psk_passphrase[index], 0, sizeof(psk_passphrase[index])); - rtw_memset(wpa_global_PSK[index], 0, sizeof(wpa_global_PSK[index])); - data_to_flash->security_type = RTW_SECURITY_OPEN; - break; - case RTW_SECURITY_WEP_PSK: - channel |= (setting.key_idx) << 28; - rtw_memset(psk_passphrase[index], 0, sizeof(psk_passphrase[index])); - rtw_memset(wpa_global_PSK[index], 0, sizeof(wpa_global_PSK[index])); - rtw_memcpy(psk_passphrase[index], setting.password, sizeof(psk_passphrase[index])); - data_to_flash->security_type = RTW_SECURITY_WEP_PSK; - break; - case RTW_SECURITY_WPA_TKIP_PSK: - data_to_flash->security_type = RTW_SECURITY_WPA_TKIP_PSK; - break; - case RTW_SECURITY_WPA2_AES_PSK: - data_to_flash->security_type = RTW_SECURITY_WPA2_AES_PSK; - break; - default: - break; + switch (setting.security_type) { + case RTW_SECURITY_OPEN: + rtw_memset(psk_passphrase[index], 0, sizeof(psk_passphrase[index])); + rtw_memset(wpa_global_PSK[index], 0, sizeof(wpa_global_PSK[index])); + data_to_flash->security_type = RTW_SECURITY_OPEN; + break; + case RTW_SECURITY_WEP_PSK: + channel |= (setting.key_idx) << 28; + rtw_memset(psk_passphrase[index], 0, sizeof(psk_passphrase[index])); + rtw_memset(wpa_global_PSK[index], 0, sizeof(wpa_global_PSK[index])); + rtw_memcpy(psk_passphrase[index], setting.password, + sizeof(psk_passphrase[index])); + data_to_flash->security_type = RTW_SECURITY_WEP_PSK; + break; + case RTW_SECURITY_WPA_TKIP_PSK: + data_to_flash->security_type = RTW_SECURITY_WPA_TKIP_PSK; + break; + case RTW_SECURITY_WPA2_AES_PSK: + data_to_flash->security_type = RTW_SECURITY_WPA2_AES_PSK; + break; + default: + break; } - memcpy(data_to_flash->psk_essid, psk_essid[index], sizeof(data_to_flash->psk_essid)); + memcpy(data_to_flash->psk_essid, psk_essid[index], + sizeof(data_to_flash->psk_essid)); if (strlen(psk_passphrase64) == 64) { - memcpy(data_to_flash->psk_passphrase, psk_passphrase64, sizeof(data_to_flash->psk_passphrase)); + memcpy(data_to_flash->psk_passphrase, psk_passphrase64, + sizeof(data_to_flash->psk_passphrase)); } else { - memcpy(data_to_flash->psk_passphrase, psk_passphrase[index], sizeof(data_to_flash->psk_passphrase)); + memcpy(data_to_flash->psk_passphrase, psk_passphrase[index], + sizeof(data_to_flash->psk_passphrase)); } - memcpy(data_to_flash->wpa_global_PSK, wpa_global_PSK[index], sizeof(data_to_flash->wpa_global_PSK)); + memcpy(data_to_flash->wpa_global_PSK, wpa_global_PSK[index], + sizeof(data_to_flash->wpa_global_PSK)); memcpy(&(data_to_flash->channel), &channel, 4); //call callback function in user program - p_write_reconnect_ptr((u8 *)data_to_flash, sizeof(struct wlan_fast_reconnect)); + p_write_reconnect_ptr((u8 *) data_to_flash, + sizeof(struct wlan_fast_reconnect)); } - if(data_to_flash) + if (data_to_flash) rtw_free(data_to_flash); } #endif //----------------------------------------------------------------------------// -int wifi_connect( - char *ssid, - rtw_security_t security_type, - char *password, - int ssid_len, - int password_len, - int key_id, - void *semaphore) -{ +int wifi_connect(char *ssid, rtw_security_t security_type, char *password, + int ssid_len, int password_len, int key_id, void *semaphore) { xSemaphoreHandle join_semaphore; rtw_result_t result = RTW_SUCCESS; u8 wep_hex = 0; - u8 wep_pwd[14] = {0}; + u8 wep_pwd[14] = { 0 }; - if((rtw_join_status & JOIN_SIMPLE_CONFIG) || (rtw_join_status & JOIN_AIRKISS)){ + if ((rtw_join_status & JOIN_SIMPLE_CONFIG ) + || (rtw_join_status & JOIN_AIRKISS )) { return RTW_ERROR; } - rtw_join_status = 0;//clear for last connect status - error_flag = RTW_UNKNOWN ;//clear for last connect status - if ( ( ( ( password_len > RTW_MAX_PSK_LEN ) || - ( password_len < RTW_MIN_PSK_LEN ) ) && - ( ( security_type == RTW_SECURITY_WPA_TKIP_PSK ) || - ( security_type == RTW_SECURITY_WPA_AES_PSK ) || - ( security_type == RTW_SECURITY_WPA2_AES_PSK ) || - ( security_type == RTW_SECURITY_WPA2_TKIP_PSK ) || - ( security_type == RTW_SECURITY_WPA2_MIXED_PSK ) ) )) { - error_flag = RTW_WRONG_PASSWORD; + rtw_join_status = 0; //clear for last connect status + error_flag = RTW_UNKNOWN; //clear for last connect status + if ((((password_len > RTW_MAX_PSK_LEN) || (password_len < RTW_MIN_PSK_LEN)) + && ((security_type == RTW_SECURITY_WPA_TKIP_PSK) + || (security_type == RTW_SECURITY_WPA_AES_PSK) + || (security_type == RTW_SECURITY_WPA2_AES_PSK) + || (security_type == RTW_SECURITY_WPA2_TKIP_PSK) + || (security_type == RTW_SECURITY_WPA2_MIXED_PSK)))) { + error_flag = RTW_WRONG_PASSWORD; return RTW_INVALID_KEY; } - if ((security_type == RTW_SECURITY_WEP_PSK)|| - (security_type ==RTW_SECURITY_WEP_SHARED)) { - if ((password_len != 5) && (password_len != 13) && - (password_len != 10)&& (password_len != 26)) { - error_flag = RTW_WRONG_PASSWORD; + if ((security_type == RTW_SECURITY_WEP_PSK) + || (security_type == RTW_SECURITY_WEP_SHARED)) { + if ((password_len != 5) && (password_len != 13) && (password_len != 10) + && (password_len != 26)) { + error_flag = RTW_WRONG_PASSWORD; return RTW_INVALID_KEY; } else { - if(password_len == 10) { + if (password_len == 10) { - u32 p[5] = {0}; - u8 i = 0; - sscanf((const char*)password, "%02x%02x%02x%02x%02x", &p[0], &p[1], &p[2], &p[3], &p[4]); - for(i=0; i< 5; i++) - wep_pwd[i] = (u8)p[i]; + u32 p[5] = { 0 }; + u8 i = 0; + sscanf((const char*) password, "%02x%02x%02x%02x%02x", &p[0], + &p[1], &p[2], &p[3], &p[4]); + for (i = 0; i < 5; i++) + wep_pwd[i] = (u8) p[i]; wep_pwd[5] = '\0'; password_len = 5; wep_hex = 1; } else if (password_len == 26) { - u32 p[13] = {0}; + u32 p[13] = { 0 }; u8 i = 0; - sscanf((const char*)password, "%02x%02x%02x%02x%02x%02x%02x"\ - "%02x%02x%02x%02x%02x%02x", &p[0], &p[1], &p[2], &p[3], &p[4],\ - &p[5], &p[6], &p[7], &p[8], &p[9], &p[10], &p[11], &p[12]); - for(i=0; i< 13; i++) - wep_pwd[i] = (u8)p[i]; + sscanf((const char*) password, "%02x%02x%02x%02x%02x%02x%02x" + "%02x%02x%02x%02x%02x%02x", &p[0], &p[1], &p[2], &p[3], + &p[4], &p[5], &p[6], &p[7], &p[8], &p[9], &p[10], + &p[11], &p[12]); + for (i = 0; i < 13; i++) + wep_pwd[i] = (u8) p[i]; wep_pwd[13] = '\0'; password_len = 13; wep_hex = 1; } } } - - internal_join_result_t *join_result = (internal_join_result_t *)rtw_zmalloc(sizeof(internal_join_result_t)); - if(!join_result) { + + internal_join_result_t *join_result = + (internal_join_result_t *) rtw_zmalloc( + sizeof(internal_join_result_t)); + if (!join_result) { +#if CONFIG_DEBUG_LOG > 3 + error_printf("%s: Can't malloc memory!\n", __func__); +#endif return RTW_NOMEM; } join_result->network_info.ssid.len = ssid_len > 32 ? 32 : ssid_len; rtw_memcpy(join_result->network_info.ssid.val, ssid, ssid_len); - + join_result->network_info.password_len = password_len; - if(password_len) { + if (password_len) { /* add \0 to the end */ join_result->network_info.password = rtw_zmalloc(password_len + 1); - if(!join_result->network_info.password) { + if (!join_result->network_info.password) { result = RTW_NOMEM; +#if CONFIG_DEBUG_LOG > 3 + error_printf("%s: Can't malloc memory!\n", __func__); +#endif goto error; } if (0 == wep_hex) - rtw_memcpy(join_result->network_info.password, password, password_len); + rtw_memcpy(join_result->network_info.password, password, + password_len); else - rtw_memcpy(join_result->network_info.password, wep_pwd, password_len); + rtw_memcpy(join_result->network_info.password, wep_pwd, + password_len); } - + join_result->network_info.security_type = security_type; join_result->network_info.key_id = key_id; - - if(semaphore == NULL) { - rtw_init_sema( &join_result->join_sema, 0 ); - if(!join_result->join_sema){ + + if (semaphore == NULL) { + rtw_init_sema(&join_result->join_sema, 0); + if (!join_result->join_sema) { result = RTW_NORESOURCE; goto error; } @@ -561,22 +573,24 @@ int wifi_connect( } else { join_result->join_sema = semaphore; } - wifi_reg_event_handler(WIFI_EVENT_NO_NETWORK,wifi_no_network_hdl,NULL); + wifi_reg_event_handler(WIFI_EVENT_NO_NETWORK, wifi_no_network_hdl, NULL); wifi_reg_event_handler(WIFI_EVENT_CONNECT, wifi_connected_hdl, NULL); wifi_reg_event_handler(WIFI_EVENT_DISCONNECT, wifi_disconn_hdl, NULL); - wifi_reg_event_handler(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, wifi_handshake_done_hdl, NULL); + wifi_reg_event_handler(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, + wifi_handshake_done_hdl, NULL); #if DD_WIFI_CONN // дублирование с wifi_connect_bssid_local() wifi_connect_local(&join_result->network_info); #else - if(wifi_connect_local(&join_result->network_info) == 0) - wext_set_ssid(WLAN0_NAME, join_result->network_info.ssid.val, join_result->network_info.ssid.len); + if (wifi_connect_local(&join_result->network_info) == 0) + wext_set_ssid(WLAN0_NAME, join_result->network_info.ssid.val, + join_result->network_info.ssid.len); #endif join_user_data = join_result; - if(semaphore == NULL) { + if (semaphore == NULL) { // for eap connection, timeout should be longer (default value in wpa_supplicant: 60s) #ifdef CONFIG_ENABLE_EAP - if(get_eap_phase()){ + if(get_eap_phase()) { if(rtw_down_timeout_sema( &join_result->join_sema, 60000 ) == RTW_FALSE) { printf("RTW API: Join bss timeout\n"); if(password_len) { @@ -593,18 +607,19 @@ int wifi_connect( } else #endif - if(rtw_down_timeout_sema( &join_result->join_sema, RTW_JOIN_TIMEOUT ) == RTW_FALSE) { + if (rtw_down_timeout_sema(&join_result->join_sema, RTW_JOIN_TIMEOUT) + == RTW_FALSE) { printf("RTW API: Join bss timeout\n"); - if(password_len) { + if (password_len) { rtw_free(join_result->network_info.password); } result = RTW_TIMEOUT; goto error; } else { - if(join_result->network_info.password_len) { + if (join_result->network_info.password_len) { rtw_free(join_result->network_info.password); } - if(wifi_is_connected_to_ap( ) != RTW_SUCCESS) { + if (wifi_is_connected_to_ap() != RTW_SUCCESS) { result = RTW_ERROR; goto error; } @@ -617,97 +632,92 @@ int wifi_connect( restore_wifi_info_to_flash(); #endif -error: - if(semaphore == NULL){ - rtw_free_sema( &join_semaphore); + error: if (semaphore == NULL) { + rtw_free_sema(&join_semaphore); } join_user_data = NULL; rtw_free((u8*)join_result); wifi_unreg_event_handler(WIFI_EVENT_CONNECT, wifi_connected_hdl); - wifi_unreg_event_handler(WIFI_EVENT_NO_NETWORK,wifi_no_network_hdl); - wifi_unreg_event_handler(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, wifi_handshake_done_hdl); + wifi_unreg_event_handler(WIFI_EVENT_NO_NETWORK, wifi_no_network_hdl); + wifi_unreg_event_handler(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, + wifi_handshake_done_hdl); return result; } -int wifi_connect_bssid( - unsigned char bssid[ETH_ALEN], - char *ssid, - rtw_security_t security_type, - char *password, - int bssid_len, - int ssid_len, - int password_len, - int key_id, - void *semaphore) -{ +int wifi_connect_bssid(unsigned char bssid[ETH_ALEN], char *ssid, + rtw_security_t security_type, char *password, int bssid_len, + int ssid_len, int password_len, int key_id, void *semaphore) { xSemaphoreHandle join_semaphore; rtw_result_t result = RTW_SUCCESS; - if((rtw_join_status & JOIN_SIMPLE_CONFIG) || (rtw_join_status & JOIN_AIRKISS)){ - return RTW_ERROR; + if ((rtw_join_status & JOIN_SIMPLE_CONFIG ) + || (rtw_join_status & JOIN_AIRKISS )) { + return RTW_ERROR; } - rtw_join_status = 0;//clear for last connect status - error_flag = RTW_UNKNOWN;//clear for last connect status - internal_join_result_t *join_result = (internal_join_result_t *)rtw_zmalloc(sizeof(internal_join_result_t)); - if(!join_result) { + rtw_join_status = 0; //clear for last connect status + error_flag = RTW_UNKNOWN; //clear for last connect status + internal_join_result_t *join_result = + (internal_join_result_t *) rtw_zmalloc( + sizeof(internal_join_result_t)); + if (!join_result) { return RTW_NOMEM; } - if(ssid_len && ssid){ + if (ssid_len && ssid) { join_result->network_info.ssid.len = ssid_len > 32 ? 32 : ssid_len; rtw_memcpy(join_result->network_info.ssid.val, ssid, ssid_len); } rtw_memcpy(join_result->network_info.bssid.octet, bssid, bssid_len); - if ( ( ( ( password_len > RTW_MAX_PSK_LEN ) || - ( password_len < RTW_MIN_PSK_LEN ) ) && - ( ( security_type == RTW_SECURITY_WPA_TKIP_PSK ) || - ( security_type == RTW_SECURITY_WPA_AES_PSK ) || - ( security_type == RTW_SECURITY_WPA2_AES_PSK ) || - ( security_type == RTW_SECURITY_WPA2_TKIP_PSK ) || - ( security_type == RTW_SECURITY_WPA2_MIXED_PSK ) ) )|| - (((password_len != 5)&& (password_len != 13))&& - ((security_type == RTW_SECURITY_WEP_PSK)|| - (security_type ==RTW_SECURITY_WEP_SHARED ) ))) { + if ((((password_len > RTW_MAX_PSK_LEN) || (password_len < RTW_MIN_PSK_LEN)) + && ((security_type == RTW_SECURITY_WPA_TKIP_PSK) + || (security_type == RTW_SECURITY_WPA_AES_PSK) + || (security_type == RTW_SECURITY_WPA2_AES_PSK) + || (security_type == RTW_SECURITY_WPA2_TKIP_PSK) + || (security_type == RTW_SECURITY_WPA2_MIXED_PSK))) + || (((password_len != 5) && (password_len != 13)) + && ((security_type == RTW_SECURITY_WEP_PSK) + || (security_type == RTW_SECURITY_WEP_SHARED)))) { return RTW_INVALID_KEY; } join_result->network_info.password_len = password_len; - if(password_len) { + if (password_len) { /* add \0 to the end */ join_result->network_info.password = rtw_zmalloc(password_len + 1); - if(!join_result->network_info.password) { + if (!join_result->network_info.password) { return RTW_NOMEM; } rtw_memcpy(join_result->network_info.password, password, password_len); } - - join_result->network_info.security_type = security_type; - join_result->network_info.key_id = key_id; - - if(semaphore == NULL) { - rtw_init_sema( &join_result->join_sema, 0 ); - if(!join_result->join_sema){ - return RTW_NORESOURCE; + + join_result->network_info.security_type = security_type; + join_result->network_info.key_id = key_id; + + if (semaphore == NULL) { + rtw_init_sema(&join_result->join_sema, 0); + if (!join_result->join_sema) { + return RTW_NORESOURCE; } join_semaphore = join_result->join_sema; } else { join_result->join_sema = semaphore; } - wifi_reg_event_handler(WIFI_EVENT_NO_NETWORK,wifi_no_network_hdl,NULL); + wifi_reg_event_handler(WIFI_EVENT_NO_NETWORK, wifi_no_network_hdl, NULL); wifi_reg_event_handler(WIFI_EVENT_CONNECT, wifi_connected_hdl, NULL); wifi_reg_event_handler(WIFI_EVENT_DISCONNECT, wifi_disconn_hdl, NULL); - wifi_reg_event_handler(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, wifi_handshake_done_hdl, NULL); + wifi_reg_event_handler(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, + wifi_handshake_done_hdl, NULL); #if DD_WIFI_CONN // дублирование с wifi_connect_bssid_local() wifi_connect_bssid_local(&join_result->network_info); #else rtw_network_info_t *pWifi = &join_result->network_info; - if(wifi_connect_local(pWifi) == 0) { - struct{ + if (wifi_connect_local(pWifi) == 0) { + struct { u8 bssid[ETH_ALEN + 2]; void * p; - } bs = {0}; + } bs = { 0 }; memcpy(bs.bssid, pWifi->bssid.octet, ETH_ALEN); - if(pWifi->ssid.len){ + if (pWifi->ssid.len) { bs.bssid[ETH_ALEN] = '#'; bs.bssid[ETH_ALEN + 1] = '@'; bs.p = pWifi; @@ -718,23 +728,24 @@ int wifi_connect_bssid( join_user_data = join_result; - if(semaphore == NULL) { - if(rtw_down_timeout_sema( &join_result->join_sema, RTW_JOIN_TIMEOUT ) == RTW_FALSE) { + if (semaphore == NULL) { + if (rtw_down_timeout_sema(&join_result->join_sema, RTW_JOIN_TIMEOUT) + == RTW_FALSE) { printf("RTW API: Join bss timeout\n"); - if(password_len) { + if (password_len) { rtw_free(join_result->network_info.password); } rtw_free((u8*)join_result); - rtw_free_sema( &join_semaphore); + rtw_free_sema(&join_semaphore); result = RTW_TIMEOUT; goto error; } else { - rtw_free_sema( &join_semaphore ); - if(join_result->network_info.password_len) { + rtw_free_sema(&join_semaphore); + if (join_result->network_info.password_len) { rtw_free(join_result->network_info.password); } rtw_free((u8*)join_result); - if( wifi_is_connected_to_ap( ) != RTW_SUCCESS) { + if (wifi_is_connected_to_ap() != RTW_SUCCESS) { result = RTW_ERROR; goto error; } @@ -747,79 +758,62 @@ int wifi_connect_bssid( restore_wifi_info_to_flash(); #endif -error: - join_user_data = NULL; + error: join_user_data = NULL; wifi_unreg_event_handler(WIFI_EVENT_CONNECT, wifi_connected_hdl); - wifi_unreg_event_handler(WIFI_EVENT_NO_NETWORK,wifi_no_network_hdl); - wifi_unreg_event_handler(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, wifi_handshake_done_hdl); + wifi_unreg_event_handler(WIFI_EVENT_NO_NETWORK, wifi_no_network_hdl); + wifi_unreg_event_handler(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, + wifi_handshake_done_hdl); return result; } -int wifi_disconnect(void) -{ +int wifi_disconnect(void) { int ret = 0; //set MAC address last byte to 1 since driver will filter the mac with all 0x00 or 0xff //add extra 2 zero byte for check of #@ in wext_set_bssid() - const __u8 null_bssid[ETH_ALEN + 2] = {0, 0, 0, 0, 0, 1, 0, 0}; + const __u8 null_bssid[ETH_ALEN + 2] = { 0, 0, 0, 0, 0, 1, 0, 0 }; - if (wext_set_bssid(WLAN0_NAME, null_bssid) < 0){ - printf("WEXT: Failed to set bogus BSSID to disconnect\n"); + if (wext_set_bssid(WLAN0_NAME, null_bssid) < 0) { + error_printf("WEXT: Failed to set bogus BSSID to disconnect\n"); ret = -1; } return ret; } //----------------------------------------------------------------------------// -int wifi_is_connected_to_ap( void ) -{ +int wifi_is_connected_to_ap(void) { return rltk_wlan_is_connected_to_ap(); } //----------------------------------------------------------------------------// -int wifi_is_up(rtw_interface_t interface) -{ - if(interface == RTW_AP_INTERFACE) { - if(wifi_mode == RTW_MODE_STA_AP) { - return rltk_wlan_running(WLAN1_IDX); - } - } - +int wifi_is_up(rtw_interface_t interface) { + if (interface == RTW_AP_INTERFACE && wifi_mode == RTW_MODE_STA_AP) + return rltk_wlan_running(WLAN1_IDX); return rltk_wlan_running(WLAN0_IDX); } -int wifi_is_ready_to_transceive(rtw_interface_t interface) -{ - switch ( interface ) - { - case RTW_AP_INTERFACE: - return ( wifi_is_up(interface) == RTW_TRUE ) ? RTW_SUCCESS : RTW_ERROR; +int wifi_is_ready_to_transceive(rtw_interface_t interface) { + switch (interface) { + case RTW_AP_INTERFACE: + return (wifi_is_up(interface) == RTW_TRUE) ? RTW_SUCCESS : RTW_ERROR; - case RTW_STA_INTERFACE: - switch ( error_flag) - { - case RTW_NO_ERROR: + case RTW_STA_INTERFACE: + if (error_flag == RTW_NO_ERROR) return RTW_SUCCESS; - - default: - return RTW_ERROR; - } - default: - return RTW_ERROR; - } + break; + } + return RTW_ERROR; } //----------------------------------------------------------------------------// -int wifi_set_mac_address(char * mac) -{ - char buf[13+17+1]; +int wifi_set_mac_address(char * mac) { + char buf[13 + 17 + 1]; rtw_memset(buf, 0, sizeof(buf)); - snprintf(buf, 13+17, "write_mac %s", mac); + snprintf(buf, 13 + 17, "write_mac %s", mac); return wext_private_command(WLAN0_NAME, buf, SHOW_PRIVATE_OUT); } -int wifi_get_mac_address(char * mac) -{ +int wifi_get_mac_address(char * mac) { int ret = 0; char buf[32]; rtw_memset(buf, 0, sizeof(buf)); @@ -833,20 +827,17 @@ int wifi_get_mac_address(char * mac) } //----------------------------------------------------------------------------// -int wifi_enable_powersave(void) -{ +int wifi_enable_powersave(void) { return wext_enable_powersave(WLAN0_NAME, 1, 1); } -int wifi_disable_powersave(void) -{ +int wifi_disable_powersave(void) { return wext_disable_powersave(WLAN0_NAME); } #if 1 //Not ready //----------------------------------------------------------------------------// -int wifi_get_txpower(int *poweridx) -{ +int wifi_get_txpower(int *poweridx) { int ret; char buf[11]; @@ -861,11 +852,10 @@ int wifi_get_txpower(int *poweridx) return ret; } -int wifi_set_txpower(int poweridx) -{ +int wifi_set_txpower(int poweridx) { int ret; char buf[24]; - + rtw_memset(buf, 0, sizeof(buf)); snprintf(buf, 24, "txpower patha=%d,pathb=%d", poweridx, poweridx); // patha=%d,pathb=%d ? ret = wext_private_command(WLAN0_NAME, buf, SHOW_PRIVATE_OUT); @@ -875,13 +865,13 @@ int wifi_set_txpower(int poweridx) #endif //----------------------------------------------------------------------------// -int wifi_get_associated_client_list(void * client_list_buffer, uint16_t buffer_length) -{ +int wifi_get_associated_client_list(void * client_list_buffer, + uint16_t buffer_length) { const char * ifname = WLAN0_NAME; int ret = 0; char buf[25]; - - if(wifi_mode == RTW_MODE_STA_AP) { + + if (wifi_mode == RTW_MODE_STA_AP) { ifname = WLAN1_NAME; } @@ -893,13 +883,12 @@ int wifi_get_associated_client_list(void * client_list_buffer, uint16_t buffer_l } //----------------------------------------------------------------------------// -int wifi_get_ap_info(rtw_bss_info_t * ap_info, rtw_security_t* security) -{ +int wifi_get_ap_info(rtw_bss_info_t * ap_info, rtw_security_t* security) { const char * ifname = WLAN0_NAME; int ret = 0; char buf[24]; - if(wifi_mode == RTW_MODE_STA_AP) { + if (wifi_mode == RTW_MODE_STA_AP) { ifname = WLAN1_NAME; } @@ -917,14 +906,12 @@ int wifi_get_ap_info(rtw_bss_info_t * ap_info, rtw_security_t* security) return ret; } -int wifi_get_drv_ability(uint32_t *ability) -{ +int wifi_get_drv_ability(uint32_t *ability) { return wext_get_drv_ability(WLAN0_NAME, ability); } //----------------------------------------------------------------------------// -int wifi_set_country(rtw_country_code_t country_code) -{ +int wifi_set_country(rtw_country_code_t country_code) { int ret; ret = wext_set_country(WLAN0_NAME, country_code); @@ -933,12 +920,11 @@ int wifi_set_country(rtw_country_code_t country_code) } //----------------------------------------------------------------------------// -int wifi_set_channel_plan(uint8_t channel_plan) -{ +int wifi_set_channel_plan(uint8_t channel_plan) { const char * ifname = WLAN0_NAME; int ret = 0; char buf[24]; - + rtw_memset(buf, 0, sizeof(buf)); snprintf(buf, 24, "set_ch_plan %x", channel_plan); ret = wext_private_command(ifname, buf, SHOW_PRIVATE_OUT); @@ -946,113 +932,104 @@ int wifi_set_channel_plan(uint8_t channel_plan) } //----------------------------------------------------------------------------// -int wifi_get_rssi(int *pRSSI) -{ +int wifi_get_rssi(int *pRSSI) { return wext_get_rssi(WLAN0_NAME, pRSSI); } //----------------------------------------------------------------------------// -int wifi_set_channel(int channel) -{ +int wifi_set_channel(int channel) { return wext_set_channel(WLAN0_NAME, channel); } -int wifi_get_channel(int *channel) -{ - return wext_get_channel(WLAN0_NAME, (u8*)channel); +int wifi_get_channel(int *channel) { + return wext_get_channel(WLAN0_NAME, (u8*) channel); } //----------------------------------------------------------------------------// -int wifi_register_multicast_address(rtw_mac_t *mac) -{ +int wifi_register_multicast_address(rtw_mac_t *mac) { return wext_register_multicast_address(WLAN0_NAME, mac); } -int wifi_unregister_multicast_address(rtw_mac_t *mac) -{ +int wifi_unregister_multicast_address(rtw_mac_t *mac) { return wext_unregister_multicast_address(WLAN0_NAME, mac); } //----------------------------------------------------------------------------// -void wifi_set_mib(void) -{ +void wifi_set_mib(void) { // adaptivity wext_set_adaptivity(RTW_ADAPTIVITY_DISABLE); } //----------------------------------------------------------------------------// -int wifi_rf_on(void) -{ +int wifi_rf_on(void) { int ret; ret = rltk_wlan_rf_on(); return ret; } //----------------------------------------------------------------------------// -int wifi_rf_off(void) -{ +int wifi_rf_off(void) { int ret; ret = rltk_wlan_rf_off(); return ret; } //----------------------------------------------------------------------------// -int wifi_on(rtw_mode_t mode) -{ +int wifi_on(rtw_mode_t mode) { int ret = 0; //pvvx int timeout = 20; // 20 sec ?! - int timeout = wifi_test_timeout_ms/wifi_test_timeout_step_ms; + int timeout = wifi_test_timeout_ms / wifi_test_timeout_step_ms; int idx; int devnum = 1; static int event_init = 0; - - if(rltk_wlan_running(WLAN0_IDX)) { + + if (rltk_wlan_running(WLAN0_IDX)) { printf("WIFI is already running\n"); return 0; } - if(event_init == 0){ + if (event_init == 0) { init_event_callback_list(); event_init = 1; } - + wifi_mode = mode; - if(mode == RTW_MODE_STA_AP) + if (mode == RTW_MODE_STA_AP) devnum = 2; // set wifi mib wifi_set_mib(); printf("Initializing WIFI ...\n"); - for(idx=0;idxBSSID.octet, (*result_ptr)->BSSID.octet)){ - if((*result_ptr)->signal_strength > scan_result_handler_ptr.pap_details[i]->signal_strength){ - temp = scan_result_handler_ptr.pap_details[i]; - for(j = i-1; j >= 0; j--){ - if(scan_result_handler_ptr.pap_details[j]->signal_strength >= (*result_ptr)->signal_strength) - break; + for (i = 0; i < scan_result_handler_ptr.scan_cnt; i++) { + if (CMP_MAC(scan_result_handler_ptr.pap_details[i]->BSSID.octet, + (*result_ptr)->BSSID.octet)) { + if ((*result_ptr)->signal_strength + > scan_result_handler_ptr.pap_details[i]->signal_strength) { + temp = scan_result_handler_ptr.pap_details[i]; + for (j = i - 1; j >= 0; j--) { + if (scan_result_handler_ptr.pap_details[j]->signal_strength + >= (*result_ptr)->signal_strength) + break; else - scan_result_handler_ptr.pap_details[j+1] = scan_result_handler_ptr.pap_details[j]; - } - scan_result_handler_ptr.pap_details[j+1] = temp; - scan_result_handler_ptr.pap_details[j+1]->signal_strength = (*result_ptr)->signal_strength; + scan_result_handler_ptr.pap_details[j + 1] = + scan_result_handler_ptr.pap_details[j]; + } + scan_result_handler_ptr.pap_details[j + 1] = temp; + scan_result_handler_ptr.pap_details[j + 1]->signal_strength = + (*result_ptr)->signal_strength; } memset(*result_ptr, 0, sizeof(rtw_scan_result_t)); return; @@ -1281,46 +1258,61 @@ void wifi_scan_each_report_hdl( char* buf, int buf_len, int flags, void* userdat } scan_result_handler_ptr.scan_cnt++; - - if(scan_result_handler_ptr.scan_cnt > scan_result_handler_ptr.max_ap_size){ + + if (scan_result_handler_ptr.scan_cnt + > scan_result_handler_ptr.max_ap_size) { scan_result_handler_ptr.scan_cnt = scan_result_handler_ptr.max_ap_size; - if((*result_ptr)->signal_strength > scan_result_handler_ptr.pap_details[scan_result_handler_ptr.max_ap_size-1]->signal_strength){ - rtw_memcpy(scan_result_handler_ptr.pap_details[scan_result_handler_ptr.max_ap_size-1], *result_ptr, sizeof(rtw_scan_result_t)); - temp = scan_result_handler_ptr.pap_details[scan_result_handler_ptr.max_ap_size -1]; - }else + if ((*result_ptr)->signal_strength + > scan_result_handler_ptr.pap_details[scan_result_handler_ptr.max_ap_size + - 1]->signal_strength) { + rtw_memcpy( + scan_result_handler_ptr.pap_details[scan_result_handler_ptr.max_ap_size + - 1], *result_ptr, sizeof(rtw_scan_result_t)); + temp = + scan_result_handler_ptr.pap_details[scan_result_handler_ptr.max_ap_size + - 1]; + } else return; - }else{ - rtw_memcpy(&scan_result_handler_ptr.ap_details[scan_result_handler_ptr.scan_cnt-1], *result_ptr, sizeof(rtw_scan_result_t)); + } else { + rtw_memcpy( + &scan_result_handler_ptr.ap_details[scan_result_handler_ptr.scan_cnt + - 1], *result_ptr, sizeof(rtw_scan_result_t)); } - for(i=0; i< scan_result_handler_ptr.scan_cnt-1; i++){ - if((*result_ptr)->signal_strength > scan_result_handler_ptr.pap_details[i]->signal_strength) + for (i = 0; i < scan_result_handler_ptr.scan_cnt - 1; i++) { + if ((*result_ptr)->signal_strength + > scan_result_handler_ptr.pap_details[i]->signal_strength) break; } insert_pos = i; - for(i = scan_result_handler_ptr.scan_cnt-1; i>insert_pos; i--) - scan_result_handler_ptr.pap_details[i] = scan_result_handler_ptr.pap_details[i-1]; + for (i = scan_result_handler_ptr.scan_cnt - 1; i > insert_pos; i--) + scan_result_handler_ptr.pap_details[i] = + scan_result_handler_ptr.pap_details[i - 1]; - if(temp != NULL) + if (temp != NULL) scan_result_handler_ptr.pap_details[insert_pos] = temp; else - scan_result_handler_ptr.pap_details[insert_pos] = &scan_result_handler_ptr.ap_details[scan_result_handler_ptr.scan_cnt-1]; + scan_result_handler_ptr.pap_details[insert_pos] = + &scan_result_handler_ptr.ap_details[scan_result_handler_ptr.scan_cnt + - 1]; rtw_memset(*result_ptr, 0, sizeof(rtw_scan_result_t)); } -void wifi_scan_done_hdl( char* buf, int buf_len, int flags, void* userdata) -{ +void wifi_scan_done_hdl(char* buf, int buf_len, int flags, void* userdata) { int i = 0; rtw_scan_handler_result_t scan_result_report; - for(i=0; ibuf, pscan_buf->buf_len, flags); - }else{ - wifi_reg_event_handler(WIFI_EVENT_SCAN_RESULT_REPORT, wifi_scan_each_report_hdl, NULL); + if (result_ptr != NULL) { + pscan_buf = (scan_buf_arg *) result_ptr; + ret = wext_set_scan(WLAN0_NAME, (char*) pscan_buf->buf, + pscan_buf->buf_len, flags); + } else { + wifi_reg_event_handler(WIFI_EVENT_SCAN_RESULT_REPORT, + wifi_scan_each_report_hdl, NULL); wifi_reg_event_handler(WIFI_EVENT_SCAN_DONE, wifi_scan_done_hdl, NULL); ret = wext_set_scan(WLAN0_NAME, NULL, 0, flags); } - - if(ret == 0) { - if(result_ptr != NULL){ + + if (ret == 0) { + if (result_ptr != NULL) { ret = wext_get_scan(WLAN0_NAME, pscan_buf->buf, pscan_buf->buf_len); } } return ret; } -int wifi_scan_networks_with_ssid(int (results_handler)(char*buf, int buflen, char *ssid, void *user_data), - OUT void* user_data, IN int scan_buflen, IN char* ssid, IN int ssid_len) -{ +int wifi_scan_networks_with_ssid( + int (results_handler)(char*buf, int buflen, char *ssid, void *user_data), + OUT void* user_data, IN int scan_buflen, IN char* ssid, IN int ssid_len) { int scan_cnt = 0, add_cnt = 0; scan_buf_arg scan_buf; int ret; scan_buf.buf_len = scan_buflen; - scan_buf.buf = (char*)pvPortMalloc(scan_buf.buf_len); - if(!scan_buf.buf){ + scan_buf.buf = (char*) pvPortMalloc(scan_buf.buf_len); + if (!scan_buf.buf) { printf("ERROR: Can't malloc memory(%d)\n", scan_buf.buf_len); return RTW_NOMEM; } //set ssid memset(scan_buf.buf, 0, scan_buf.buf_len); memcpy(scan_buf.buf, &ssid_len, sizeof(int)); - memcpy(scan_buf.buf+sizeof(int), ssid, ssid_len); + memcpy(scan_buf.buf + sizeof(int), ssid, ssid_len); //Scan channel - if((scan_cnt = (wifi_scan(RTW_SCAN_TYPE_ACTIVE, RTW_BSS_TYPE_ANY, &scan_buf))) < 0){ + if ((scan_cnt = (wifi_scan(RTW_SCAN_TYPE_ACTIVE, RTW_BSS_TYPE_ANY, + &scan_buf))) < 0) { printf("ERROR: wifi scan failed\n"); ret = RTW_ERROR; - }else{ - if(NULL == results_handler) - { + } else { + if (NULL == results_handler) { int plen = 0; - while(plen < scan_buf.buf_len){ + while (plen < scan_buf.buf_len) { int len, rssi, ssid_len, i, security_mode; int wps_password_id; char *mac, *ssid; //u8 *security_mode; printf("\n"); // len - len = (int)*(scan_buf.buf + plen); + len = (int) *(scan_buf.buf + plen); printf("len = %d,\t", len); // check end - if(len == 0) break; + if (len == 0) + break; // mac mac = scan_buf.buf + plen + 1; printf("mac = "); - for(i=0; i<6; i++) + for (i = 0; i < 6; i++) printf("%02x ", (u8)*(mac+i)); printf(",\t"); // rssi - rssi = *(int*)(scan_buf.buf + plen + 1 + 6); + rssi = *(int*) (scan_buf.buf + plen + 1 + 6); printf(" rssi = %d,\t", rssi); // security_mode - security_mode = (int)*(scan_buf.buf + plen + 1 + 6 + 4); + security_mode = (int) *(scan_buf.buf + plen + 1 + 6 + 4); switch (security_mode) { - case IW_ENCODE_ALG_NONE: - printf("sec = open ,\t"); - break; - case IW_ENCODE_ALG_WEP: - printf("sec = wep ,\t"); - break; - case IW_ENCODE_ALG_CCMP: - printf("sec = wpa/wpa2,\t"); - break; + case IW_ENCODE_ALG_NONE: + printf("sec = open ,\t"); + break; + case IW_ENCODE_ALG_WEP: + printf("sec = wep ,\t"); + break; + case IW_ENCODE_ALG_CCMP: + printf("sec = wpa/wpa2,\t"); + break; } // password id - wps_password_id = (int)*(scan_buf.buf + plen + 1 + 6 + 4 + 1); + wps_password_id = (int) *(scan_buf.buf + plen + 1 + 6 + 4 + 1); printf("wps password id = %d,\t", wps_password_id); - - printf("channel = %d,\t", *(scan_buf.buf + plen + 1 + 6 + 4 + 1 + 1)); + + printf("channel = %d,\t", + *(scan_buf.buf + plen + 1 + 6 + 4 + 1 + 1)); // ssid ssid_len = len - 1 - 6 - 4 - 1 - 1 - 1; ssid = scan_buf.buf + plen + 1 + 6 + 4 + 1 + 1 + 1; printf("ssid = "); - for(i=0; i 0) - { + while (scan_result_handler_ptr.scan_running && count > 0) { rtw_msleep_os(20); - count --; + count--; } - if(count == 0){ - printf("[%d]WiFi: Scan is running. Wait 2s timeout.\n", rtw_get_current_time()); + if (count == 0) { + printf("[%d]WiFi: Scan is running. Wait 2s timeout.\n", + rtw_get_current_time()); return RTW_TIMEOUT; } } @@ -1486,131 +1482,133 @@ int wifi_scan_networks(rtw_scan_result_handler_t results_handler, void* user_dat #endif scan_result_handler_ptr.gscan_result_handler = results_handler; - + scan_result_handler_ptr.max_ap_size = max_ap_size; - scan_result_handler_ptr.ap_details = (rtw_scan_result_t*)rtw_zmalloc(max_ap_size*sizeof(rtw_scan_result_t)); - if(scan_result_handler_ptr.ap_details == NULL){ + scan_result_handler_ptr.ap_details = (rtw_scan_result_t*) rtw_zmalloc( + max_ap_size * sizeof(rtw_scan_result_t)); + if (scan_result_handler_ptr.ap_details == NULL) { goto err_exit; } - rtw_memset(scan_result_handler_ptr.ap_details, 0, max_ap_size*sizeof(rtw_scan_result_t)); + rtw_memset(scan_result_handler_ptr.ap_details, 0, + max_ap_size * sizeof(rtw_scan_result_t)); - scan_result_handler_ptr.pap_details = (rtw_scan_result_t**)rtw_zmalloc(max_ap_size*sizeof(rtw_scan_result_t*)); - if(scan_result_handler_ptr.pap_details == NULL) + scan_result_handler_ptr.pap_details = (rtw_scan_result_t**) rtw_zmalloc( + max_ap_size * sizeof(rtw_scan_result_t*)); + if (scan_result_handler_ptr.pap_details == NULL) goto error2_with_result_ptr; rtw_memset(scan_result_handler_ptr.pap_details, 0, max_ap_size); - + scan_result_handler_ptr.scan_cnt = 0; scan_result_handler_ptr.scan_complete = RTW_FALSE; scan_result_handler_ptr.user_data = user_data; - if (wifi_scan( RTW_SCAN_COMMAMD<<4 | RTW_SCAN_TYPE_ACTIVE, RTW_BSS_TYPE_ANY, NULL) != RTW_SUCCESS) - { + if (wifi_scan(RTW_SCAN_COMMAMD << 4 | RTW_SCAN_TYPE_ACTIVE, + RTW_BSS_TYPE_ANY, NULL) != RTW_SUCCESS) { goto error1_with_result_ptr; } return RTW_SUCCESS; -error1_with_result_ptr: + error1_with_result_ptr: rtw_free((u8*)scan_result_handler_ptr.pap_details); scan_result_handler_ptr.pap_details = NULL; - -error2_with_result_ptr: + + error2_with_result_ptr: rtw_free((u8*)scan_result_handler_ptr.ap_details); scan_result_handler_ptr.ap_details = NULL; -err_exit: - rtw_memset((void *)&scan_result_handler_ptr, 0, sizeof(scan_result_handler_ptr)); + err_exit: rtw_memset((void *) &scan_result_handler_ptr, 0, + sizeof(scan_result_handler_ptr)); return RTW_ERROR; } //----------------------------------------------------------------------------// -int wifi_set_pscan_chan(__u8 * channel_list,__u8 * pscan_config, __u8 length) -{ - if(channel_list) - return wext_set_pscan_channel(WLAN0_NAME, channel_list, pscan_config, length); +int wifi_set_pscan_chan(__u8 * channel_list, __u8 * pscan_config, __u8 length) { + if (channel_list) + return wext_set_pscan_channel(WLAN0_NAME, channel_list, pscan_config, + length); else - return -1; + return -1; } //----------------------------------------------------------------------------// -int wifi_get_setting(const char *ifname, rtw_wifi_setting_t *pSetting) -{ +int wifi_get_setting(const char *ifname, rtw_wifi_setting_t *pSetting) { int ret = 0; int mode = 0; unsigned short security = 0; memset(pSetting, 0, sizeof(rtw_wifi_setting_t)); - if(wext_get_mode(ifname, &mode) < 0) + if (wext_get_mode(ifname, &mode) < 0) ret = -1; - switch(mode) { - case IW_MODE_MASTER: - pSetting->mode = RTW_MODE_AP; - break; - case IW_MODE_INFRA: - default: - pSetting->mode = RTW_MODE_STA; - break; + switch (mode) { + case IW_MODE_MASTER: + pSetting->mode = RTW_MODE_AP; + break; + case IW_MODE_INFRA: + default: + pSetting->mode = RTW_MODE_STA; + break; //default: - //printf("\r\n%s(): Unknown mode %d\n", __func__, mode); - //break; + //printf("\r\n%s(): Unknown mode %d\n", __func__, mode); + //break; } - if(wext_get_ssid(ifname, pSetting->ssid) < 0) + if (wext_get_ssid(ifname, pSetting->ssid) < 0) ret = -1; - if(wext_get_channel(ifname, &pSetting->channel) < 0) + if (wext_get_channel(ifname, &pSetting->channel) < 0) ret = -1; - if(wext_get_enc_ext(ifname, &security, &pSetting->key_idx, pSetting->password) < 0) + if (wext_get_enc_ext(ifname, &security, &pSetting->key_idx, + pSetting->password) < 0) ret = -1; - switch(security){ - case IW_ENCODE_ALG_NONE: - pSetting->security_type = RTW_SECURITY_OPEN; - break; - case IW_ENCODE_ALG_WEP: - pSetting->security_type = RTW_SECURITY_WEP_PSK; - break; - case IW_ENCODE_ALG_TKIP: - pSetting->security_type = RTW_SECURITY_WPA_TKIP_PSK; - break; - case IW_ENCODE_ALG_CCMP: - pSetting->security_type = RTW_SECURITY_WPA2_AES_PSK; - break; - default: - break; + switch (security) { + case IW_ENCODE_ALG_NONE: + pSetting->security_type = RTW_SECURITY_OPEN; + break; + case IW_ENCODE_ALG_WEP: + pSetting->security_type = RTW_SECURITY_WEP_PSK; + break; + case IW_ENCODE_ALG_TKIP: + pSetting->security_type = RTW_SECURITY_WPA_TKIP_PSK; + break; + case IW_ENCODE_ALG_CCMP: + pSetting->security_type = RTW_SECURITY_WPA2_AES_PSK; + break; + default: + break; } - if(security == IW_ENCODE_ALG_TKIP || security == IW_ENCODE_ALG_CCMP) - if(wext_get_passphrase(ifname, pSetting->password) < 0) + if (security == IW_ENCODE_ALG_TKIP || security == IW_ENCODE_ALG_CCMP) + if (wext_get_passphrase(ifname, pSetting->password) < 0) ret = -1; return ret; } //----------------------------------------------------------------------------// -int wifi_show_setting(const char *ifname, rtw_wifi_setting_t *pSetting) -{ +int wifi_show_setting(const char *ifname, rtw_wifi_setting_t *pSetting) { int ret = 0; - printf("\nWIFI %s Setting:\n==============================\n",ifname); + printf("\nWIFI %s Setting:\n==============================\n", ifname); - switch(pSetting->mode) { - case RTW_MODE_AP: + switch (pSetting->mode) { + case RTW_MODE_AP: #if CONFIG_EXAMPLE_UART_ATCMD - at_printf("AP,"); + at_printf("AP,"); #endif - printf("\tMODE => AP\n"); - break; - case RTW_MODE_STA: + printf("\tMODE => AP\n"); + break; + case RTW_MODE_STA: #if CONFIG_EXAMPLE_UART_ATCMD - at_printf("STA,"); + at_printf("STA,"); #endif - printf("\tMODE => STATION\n"); - break; - default: + printf("\tMODE => STATION\n"); + break; + default: #if CONFIG_EXAMPLE_UART_ATCMD - at_printf("UNKNOWN,"); + at_printf("UNKNOWN,"); #endif - printf("\tMODE => UNKNOWN\n"); + printf("\tMODE => UNKNOWN\n"); } #if CONFIG_EXAMPLE_UART_ATCMD at_printf("%s,%d,", pSetting->ssid, pSetting->channel); @@ -1618,37 +1616,37 @@ int wifi_show_setting(const char *ifname, rtw_wifi_setting_t *pSetting) printf("\tSSID => %s\n", pSetting->ssid); printf("\tCHANNEL => %d\n", pSetting->channel); - switch(pSetting->security_type) { - case RTW_SECURITY_OPEN: + switch (pSetting->security_type) { + case RTW_SECURITY_OPEN: #if CONFIG_EXAMPLE_UART_ATCMD - at_printf("OPEN,"); + at_printf("OPEN,"); #endif - printf("\tSECURITY => OPEN\n"); - break; - case RTW_SECURITY_WEP_PSK: + printf("\tSECURITY => OPEN\n"); + break; + case RTW_SECURITY_WEP_PSK: #if CONFIG_EXAMPLE_UART_ATCMD - at_printf("WEP,%d,", pSetting->key_idx); + at_printf("WEP,%d,", pSetting->key_idx); #endif - printf("\tSECURITY => WEP\n"); - printf("\tKEY INDEX => %d\n", pSetting->key_idx); - break; - case RTW_SECURITY_WPA_TKIP_PSK: + printf("\tSECURITY => WEP\n"); + printf("\tKEY INDEX => %d\n", pSetting->key_idx); + break; + case RTW_SECURITY_WPA_TKIP_PSK: #if CONFIG_EXAMPLE_UART_ATCMD - at_printf("TKIP,"); + at_printf("TKIP,"); #endif - printf("\tSECURITY => TKIP\n"); - break; - case RTW_SECURITY_WPA2_AES_PSK: + printf("\tSECURITY => TKIP\n"); + break; + case RTW_SECURITY_WPA2_AES_PSK: #if CONFIG_EXAMPLE_UART_ATCMD - at_printf("AES,"); + at_printf("AES,"); #endif - printf("\tSECURITY => AES\n"); - break; - default: + printf("\tSECURITY => AES\n"); + break; + default: #if CONFIG_EXAMPLE_UART_ATCMD - at_printf("UNKNOWN,"); + at_printf("UNKNOWN,"); #endif - printf("\tSECURITY => UNKNOWN\n"); + printf("\tSECURITY => UNKNOWN\n"); } #if CONFIG_EXAMPLE_UART_ATCMD @@ -1661,60 +1659,54 @@ int wifi_show_setting(const char *ifname, rtw_wifi_setting_t *pSetting) } //----------------------------------------------------------------------------// -int wifi_set_network_mode(rtw_network_mode_t mode) -{ - if((mode == RTW_NETWORK_B) || (mode == RTW_NETWORK_BG) || (mode == RTW_NETWORK_BGN)) +int wifi_set_network_mode(rtw_network_mode_t mode) { + if ((mode == RTW_NETWORK_B) || (mode == RTW_NETWORK_BG) + || (mode == RTW_NETWORK_BGN)) return rltk_wlan_wireless_mode((unsigned char) mode); return -1; } -int wifi_set_wps_phase(unsigned char is_trigger_wps) -{ +int wifi_set_wps_phase(unsigned char is_trigger_wps) { return rltk_wlan_set_wps_phase(is_trigger_wps); } //----------------------------------------------------------------------------// -int wifi_set_promisc(rtw_rcr_level_t enabled, void (*callback)(unsigned char*, unsigned int, void*), unsigned char len_used) -{ +int wifi_set_promisc(rtw_rcr_level_t enabled, + void (*callback)(unsigned char*, unsigned int, void*), + unsigned char len_used) { return promisc_set(enabled, callback, len_used); } -void wifi_enter_promisc_mode(){ +void wifi_enter_promisc_mode() { int mode = 0; unsigned char ssid[33]; - if(wifi_mode == RTW_MODE_STA_AP){ + if (wifi_mode == RTW_MODE_STA_AP) { wifi_off(); - vTaskDelay(wifi_test_timeout_step_ms/portTICK_RATE_MS); + vTaskDelay(wifi_test_timeout_step_ms / portTICK_RATE_MS); wifi_on(RTW_MODE_PROMISC); - }else{ + } else { wext_get_mode(WLAN0_NAME, &mode); - switch(mode) { - case IW_MODE_MASTER: //In AP mode - //rltk_wlan_deinit(); - wifi_off();//modified by Chris Yang for iNIC - vTaskDelay(wifi_test_timeout_step_ms/portTICK_RATE_MS); - //rltk_wlan_init(0, RTW_MODE_PROMISC); - //rltk_wlan_start(0); - wifi_on(RTW_MODE_PROMISC); - break; - case IW_MODE_INFRA: //In STA mode - if(wext_get_ssid(WLAN0_NAME, ssid) > 0) - wifi_disconnect(); + switch (mode) { + case IW_MODE_MASTER: //In AP mode + //rltk_wlan_deinit(); + wifi_off(); //modified by Chris Yang for iNIC + vTaskDelay(wifi_test_timeout_step_ms / portTICK_RATE_MS); + //rltk_wlan_init(0, RTW_MODE_PROMISC); + //rltk_wlan_start(0); + wifi_on(RTW_MODE_PROMISC); + break; + case IW_MODE_INFRA: //In STA mode + if (wext_get_ssid(WLAN0_NAME, ssid) > 0) + wifi_disconnect(); } } } -int wifi_restart_ap( - unsigned char *ssid, - rtw_security_t security_type, - unsigned char *password, - int ssid_len, - int password_len, - int channel) -{ +int wifi_restart_ap(unsigned char *ssid, rtw_security_t security_type, + unsigned char *password, int ssid_len, int password_len, int channel) { unsigned char idx = 0; struct ip_addr ipaddr; struct ip_addr netmask; @@ -1725,33 +1717,34 @@ int wifi_restart_ap( int sta_linked = 0; #endif - if(rltk_wlan_running(WLAN1_IDX)){ + if (rltk_wlan_running(WLAN1_IDX)) { idx = 1; } - + // stop dhcp server dhcps_deinit(); #ifdef CONFIG_CONCURRENT_MODE - if(idx > 0){ + if (idx > 0) { sta_linked = wifi_get_setting(WLAN0_NAME, &setting); wifi_off(); - vTaskDelay(wifi_test_timeout_step_ms/portTICK_RATE_MS); + vTaskDelay(wifi_test_timeout_step_ms / portTICK_RATE_MS); wifi_on(RTW_MODE_STA_AP); - } - else + } else #endif { IP4_ADDR(&ipaddr, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3); - IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1 , NETMASK_ADDR2, NETMASK_ADDR3); + IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, + NETMASK_ADDR3); IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3); - netif_set_addr(pnetif, &ipaddr, &netmask,&gw); + netif_set_addr(pnetif, &ipaddr, &netmask, &gw); wifi_off(); - vTaskDelay(wifi_test_timeout_step_ms/portTICK_RATE_MS); - wifi_on(RTW_MODE_AP); + vTaskDelay(wifi_test_timeout_step_ms / portTICK_RATE_MS); + wifi_on(RTW_MODE_AP); } // start ap - if(wifi_start_ap((char*)ssid, security_type, (char*)password, ssid_len, password_len, channel) < 0) { + if (wifi_start_ap((char*) ssid, security_type, (char*) password, ssid_len, + password_len, channel) < 0) { printf("ERROR: Operation failed!\n"); return -1; } @@ -1761,20 +1754,17 @@ int wifi_restart_ap( #endif #ifdef CONFIG_CONCURRENT_MODE // connect to ap if wlan0 was linked with ap - if(idx > 0 && sta_linked == 0){ + if (idx > 0 && sta_linked == 0) { int ret; - printf("AP: ssid=%s\n", (char*)setting.ssid); + printf("AP: ssid=%s\n", (char* )setting.ssid); printf("AP: security_type=%d\n", setting.security_type); - printf("AP: password=%s\n", (char*)setting.password); + printf("AP: password=%s\n", (char* )setting.password); printf("AP: key_idx =%d\n", setting.key_idx); - ret = wifi_connect((char*)setting.ssid, - setting.security_type, - (char*)setting.password, - strlen((char*)setting.ssid), - strlen((char*)setting.password), - setting.key_idx, - NULL); - if(ret == RTW_SUCCESS) { + ret = wifi_connect((char*) setting.ssid, setting.security_type, + (char*) setting.password, strlen((char* )setting.ssid), + strlen((char* )setting.password), setting.key_idx, + NULL); + if (ret == RTW_SUCCESS) { #if CONFIG_DHCP_CLIENT /* Start DHCPClient */ LwIP_DHCP(0, DHCP_START); @@ -1796,7 +1786,8 @@ int wifi_restart_ap( } #if CONFIG_AUTO_RECONNECT -extern void (*p_wlan_autoreconnect_hdl)(rtw_security_t, char*, int, char*, int, int); +extern void (*p_wlan_autoreconnect_hdl)(rtw_security_t, char*, int, char*, int, + int); struct wifi_autoreconnect_param { rtw_security_t security_type; @@ -1807,17 +1798,19 @@ struct wifi_autoreconnect_param { int key_id; }; -static void wifi_autoreconnect_thread(void *param) -{ +static void wifi_autoreconnect_thread(void *param) { int ret = RTW_ERROR; - struct wifi_autoreconnect_param *reconnect_param = (struct wifi_autoreconnect_param *) param; + struct wifi_autoreconnect_param *reconnect_param = + (struct wifi_autoreconnect_param *) param; printf("auto reconnect ...\n"); - ret = wifi_connect(reconnect_param->ssid, reconnect_param->security_type, reconnect_param->password, - reconnect_param->ssid_len, reconnect_param->password_len, reconnect_param->key_id, NULL); - if(ret == RTW_SUCCESS) { + ret = wifi_connect(reconnect_param->ssid, reconnect_param->security_type, + reconnect_param->password, reconnect_param->ssid_len, + reconnect_param->password_len, reconnect_param->key_id, NULL); + if (ret == RTW_SUCCESS) { #if CONFIG_LWIP_LAYER + #if ATCMD_VER == ATVER_2 - if (dhcp_mode_sta == 2){ + if (dhcp_mode_sta == 2) { struct netif * pnetif = &xnetif[0]; LwIP_UseStaticIP(pnetif); dhcps_init(pnetif); @@ -1828,7 +1821,7 @@ static void wifi_autoreconnect_thread(void *param) LwIP_DHCP(0, DHCP_START); #if LWIP_AUTOIP uint8_t *ip = LwIP_GetIP(&xnetif[0]); - if((ip[0] == 0) && (ip[1] == 0) && (ip[2] == 0) && (ip[3] == 0)) { + if ((ip[0] == 0) && (ip[1] == 0) && (ip[2] == 0) && (ip[3] == 0)) { printf("IPv4 AUTOIP ...\n"); LwIP_AUTOIP(&xnetif[0]); } @@ -1843,11 +1836,8 @@ static void wifi_autoreconnect_thread(void *param) vTaskDelete(NULL); } -void wifi_autoreconnect_hdl(rtw_security_t security_type, - char *ssid, int ssid_len, - char *password, int password_len, - int key_id) -{ +void wifi_autoreconnect_hdl(rtw_security_t security_type, char *ssid, + int ssid_len, char *password, int password_len, int key_id) { static struct wifi_autoreconnect_param param; param.security_type = security_type; param.ssid = ssid; @@ -1855,24 +1845,22 @@ void wifi_autoreconnect_hdl(rtw_security_t security_type, param.password = password; param.password_len = password_len; param.key_id = key_id; - xTaskCreate(wifi_autoreconnect_thread, (const char *)"wifi_autoreconnect", 512, ¶m, tskIDLE_PRIORITY + 1, NULL); + xTaskCreate(wifi_autoreconnect_thread, (const char * )"st_recon", 400, + ¶m, tskIDLE_PRIORITY + 1, NULL); } -int wifi_config_autoreconnect(__u8 mode, __u8 retyr_times, __u16 timeout) -{ - p_wlan_autoreconnect_hdl = wifi_autoreconnect_hdl; - return wext_set_autoreconnect(WLAN0_NAME, mode, retyr_times, timeout); +int wifi_config_autoreconnect(__u8 mode, __u8 retyr_times, __u16 timeout) { + p_wlan_autoreconnect_hdl = wifi_autoreconnect_hdl; + return wext_set_autoreconnect(WLAN0_NAME, mode, retyr_times, timeout); } -int wifi_set_autoreconnect(__u8 mode) -{ +int wifi_set_autoreconnect(__u8 mode) { p_wlan_autoreconnect_hdl = wifi_autoreconnect_hdl; return wifi_config_autoreconnect(mode, 3, 5);//default retry 2 times(limit is 3), timeout 5 seconds } -int wifi_get_autoreconnect(__u8 *mode) -{ - return wext_get_autoreconnect(WLAN0_NAME, mode); +int wifi_get_autoreconnect(__u8 *mode) { + return wext_get_autoreconnect(WLAN0_NAME, mode); } #endif @@ -1906,19 +1894,15 @@ int wifi_get_autoreconnect(__u8 *mode) * } */ -int wifi_add_custom_ie(void *cus_ie, int ie_num) -{ +int wifi_add_custom_ie(void *cus_ie, int ie_num) { return wext_add_custom_ie(WLAN0_NAME, cus_ie, ie_num); } - -int wifi_update_custom_ie(void *cus_ie, int ie_index) -{ +int wifi_update_custom_ie(void *cus_ie, int ie_index) { return wext_update_custom_ie(WLAN0_NAME, cus_ie, ie_index); } -int wifi_del_custom_ie() -{ +int wifi_del_custom_ie() { return wext_del_custom_ie(WLAN0_NAME); } @@ -1926,44 +1910,39 @@ int wifi_del_custom_ie() #ifdef CONFIG_PROMISC extern void promisc_init_packet_filter(void); -extern int promisc_add_packet_filter(u8 filter_id, rtw_packet_filter_pattern_t *patt, rtw_packet_filter_rule_e rule); +extern int promisc_add_packet_filter(u8 filter_id, + rtw_packet_filter_pattern_t *patt, rtw_packet_filter_rule_e rule); extern int promisc_enable_packet_filter(u8 filter_id); extern int promisc_disable_packet_filter(u8 filter_id); extern int promisc_remove_packet_filter(u8 filter_id); -void wifi_init_packet_filter() -{ +void wifi_init_packet_filter() { promisc_init_packet_filter(); } -int wifi_add_packet_filter(unsigned char filter_id, rtw_packet_filter_pattern_t *patt, rtw_packet_filter_rule_e rule) -{ +int wifi_add_packet_filter(unsigned char filter_id, + rtw_packet_filter_pattern_t *patt, rtw_packet_filter_rule_e rule) { return promisc_add_packet_filter(filter_id, patt, rule); } -int wifi_enable_packet_filter(unsigned char filter_id) -{ +int wifi_enable_packet_filter(unsigned char filter_id) { return promisc_enable_packet_filter(filter_id); } -int wifi_disable_packet_filter(unsigned char filter_id) -{ +int wifi_disable_packet_filter(unsigned char filter_id) { return promisc_disable_packet_filter(filter_id); } -int wifi_remove_packet_filter(unsigned char filter_id) -{ +int wifi_remove_packet_filter(unsigned char filter_id) { return promisc_remove_packet_filter(filter_id); } #endif #ifdef CONFIG_AP_MODE -int wifi_enable_forwarding(void) -{ +int wifi_enable_forwarding(void) { return wext_enable_forwarding(WLAN0_NAME); } -int wifi_disable_forwarding(void) -{ +int wifi_disable_forwarding(void) { return wext_disable_forwarding(WLAN0_NAME); } #endif @@ -1972,11 +1951,45 @@ int wifi_disable_forwarding(void) * usage: wifi_set_ch_deauth(0) -> wlan0 wifi_connect -> wifi_set_ch_deauth(1) */ #ifdef CONFIG_CONCURRENT_MODE -int wifi_set_ch_deauth(__u8 enable) -{ +int wifi_set_ch_deauth(__u8 enable) { return wext_set_ch_deauth(WLAN1_NAME, enable); } #endif //----------------------------------------------------------------------------// #endif //#if CONFIG_WLAN +#if CONFIG_DEBUG_LOG > 4 +extern void dump_bytes(uint32 addr, int size); + +static void test_rtk() { + printf("rltk_wlan_info = %p\n", &rltk_wlan_info); +// dump_bytes((u32)&rltk_wlan_info, 16); + _adapter *ad = rltk_wlan_info[1].dev; + printf("adapter = %p\n", ad); +// dump_bytes((u32)ad, 16); +// printf("bSurpriseRemoved [%p] = %d, +%d\n", &ad->bSurpriseRemoved, ad->bSurpriseRemoved, (u32)&ad->bSurpriseRemoved - (u32)ad); +// dump_bytes((u32)&ad->bSurpriseRemoved, 32); + printf("mlmepriv +%d, mlmeextpriv +%d, cmdpriv +d%\n", + (u32)(&ad->mlmepriv) - (u32)(ad), + (u32)(&ad->mlmeextpriv) - (u32)(ad), + (u32)(&ad->cmdpriv) - (u32)(ad)); + printf("xmitpriv +%d, recvpriv +%d, stapriv +%d\n", + (u32)(&ad->xmitpriv) - (u32)(ad), (u32)(&ad->recvpriv) - (u32)(ad), + (u32)(&ad->stapriv) - (u32)(ad)); + printf("bDriverStopped %d, hw_init_completed %d, cmdThread %d\n", + (u32)(&ad->bDriverStopped) - (u32)(ad), + (u32)(&ad->hw_init_completed) - (u32)(ad), + (u32)(&ad->cmdThread) - (u32)(ad)); + printf("intf_start %d, bup %d, pcodatapriv %d\n", + (u32)(&ad->intf_start) - (u32)(ad), (u32)(&ad->bup) - (u32)(ad), + (u32)(&ad->pcodatapriv) - (u32)(ad)); + printf("Sizeof(adapter) = %d\n", sizeof(struct _ADAPTER)); + if (sizeof(struct _ADAPTER) != 6088) { + printf("Error: Check aligned WiFi struct!\n"); + } +} + +MON_RAM_TAB_SECTION COMMAND_TABLE console_commands_wifi[] = { + { "RTK", 0, test_rtk, ": Test WiFi struct align"}, +}; +#endif diff --git a/RTL00_SDKV35a/component/common/api/wifi/wifi_ind.c b/RTL00_SDKV35a/component/common/api/wifi/wifi_ind.c index a9f603f..d31d6f1 100644 --- a/RTL00_SDKV35a/component/common/api/wifi/wifi_ind.c +++ b/RTL00_SDKV35a/component/common/api/wifi/wifi_ind.c @@ -9,11 +9,11 @@ ******************************************************/ #if CONFIG_DEBUG_LOG > 3 - #define WIFI_INDICATE_MSG 1 +#define WIFI_INDICATE_MSG 1 #else - #define WIFI_INDICATE_MSG 0 +#define WIFI_INDICATE_MSG 0 #endif -#define WIFI_MANAGER_STACKSIZE 1300 +#define WIFI_MANAGER_STACKSIZE 400 // 1300 #define WIFI_MANAGER_PRIORITY (0) //Actual priority is 4 since calling rtw_create_task #define WIFI_MANAGER_Q_SZ 8 @@ -22,44 +22,47 @@ * Globals ******************************************************/ -static event_list_elem_t event_callback_list[WIFI_EVENT_MAX][WIFI_EVENT_MAX_ROW]; +static event_list_elem_t event_callback_list[WIFI_EVENT_MAX][WIFI_EVENT_MAX_ROW]; #if CONFIG_WIFI_IND_USE_THREAD -static rtw_worker_thread_t wifi_worker_thread; +static rtw_worker_thread_t wifi_worker_thread; #endif //----------------------------------------------------------------------------// #if CONFIG_WIFI_IND_USE_THREAD -static rtw_result_t rtw_send_event_to_worker(int event_cmd, char *buf, int buf_len, int flags) -{ +static rtw_result_t rtw_send_event_to_worker(int event_cmd, char *buf, + int buf_len, int flags) { rtw_event_message_t message; int i; rtw_result_t ret = RTW_SUCCESS; char *local_buf = NULL; - - if(event_cmd >= WIFI_EVENT_MAX) + + if (event_cmd >= WIFI_EVENT_MAX) return RTW_BADARG; - - for(i = 0; i < WIFI_EVENT_MAX_ROW; i++){ - if(event_callback_list[event_cmd][i].handler == NULL) + + for (i = 0; i < WIFI_EVENT_MAX_ROW; i++) { + if (event_callback_list[event_cmd][i].handler == NULL) continue; - message.function = (event_handler_t)event_callback_list[event_cmd][i].handler; + message.function = + (event_handler_t) event_callback_list[event_cmd][i].handler; message.buf_len = buf_len; - if(buf_len){ - local_buf = (char*)pvPortMalloc(buf_len); - if(local_buf == NULL) + if (buf_len) { + local_buf = (char*) pvPortMalloc(buf_len); + if (local_buf == NULL) return RTW_NOMEM; memcpy(local_buf, buf, buf_len); - //printf("\n!!!!!Allocate %p(%d) for evcmd %d\n", local_buf, buf_len, event_cmd); + //debug_printf("Allocate %p(%d) for evcmd %d\n", local_buf, buf_len, event_cmd); } message.buf = local_buf; message.flags = flags; message.user_data = event_callback_list[event_cmd][i].handler_user_data; ret = rtw_push_to_xqueue(&wifi_worker_thread.event_queue, &message, 0); - if(ret != RTW_SUCCESS){ - if(local_buf){ - printf("rtw_send_event_to_worker: enqueue cmd %d failed and free %p(%d)\n", event_cmd, local_buf, buf_len); + if (ret != RTW_SUCCESS) { + if (local_buf) { + warning_printf( + "rtw_send_event_to_worker: enqueue cmd %d failed and free %p(%d)\n", + event_cmd, local_buf, buf_len); vPortFree(local_buf); } break; @@ -72,14 +75,14 @@ static rtw_result_t rtw_indicate_event_handle(int event_cmd, char *buf, int buf_ { rtw_event_handler_t handle = NULL; int i; - + if(event_cmd >= WIFI_EVENT_MAX) - return RTW_BADARG; - - for(i = 0; i < WIFI_EVENT_MAX_ROW; i++){ + return RTW_BADARG; + + for(i = 0; i < WIFI_EVENT_MAX_ROW; i++) { handle = event_callback_list[event_cmd][i].handler; if(handle == NULL) - continue; + continue; handle(buf, buf_len, flags, event_callback_list[event_cmd][i].handler_user_data); } @@ -91,118 +94,111 @@ static rtw_result_t rtw_indicate_event_handle(int event_cmd, char *buf, int buf_ extern gpio_t gpio_led; #endif -void wifi_indication( WIFI_EVENT_INDICATE event, char *buf, int buf_len, int flags) -{ +void wifi_indication(WIFI_EVENT_INDICATE event, char *buf, int buf_len, + int flags) { // // If upper layer application triggers additional operations on receiving of wext_wlan_indicate, // please strictly check current stack size usage (by using uxTaskGetStackHighWaterMark() ) // , and tries not to share the same stack with wlan driver if remaining stack space is // not available for the following operations. // ex: using semaphore to notice another thread. - switch(event) - { - case WIFI_EVENT_DISCONNECT: + switch (event) { + case WIFI_EVENT_DISCONNECT: #if(WIFI_INDICATE_MSG>0) - printf(" %s():Disconnection indication received\n", __FUNCTION__); + info_printf("%s: Disconnection indication received\n", __func__); #endif - break; - case WIFI_EVENT_CONNECT: - // For WPA/WPA2 mode, indication of connection does not mean data can be - // correctly transmitted or received. Data can be correctly transmitted or - // received only when 4-way handshake is done. - // Please check WIFI_EVENT_FOURWAY_HANDSHAKE_DONE event + break; + case WIFI_EVENT_CONNECT: + // For WPA/WPA2 mode, indication of connection does not mean data can be + // correctly transmitted or received. Data can be correctly transmitted or + // received only when 4-way handshake is done. + // Please check WIFI_EVENT_FOURWAY_HANDSHAKE_DONE event #if(WIFI_INDICATE_MSG>0) - // Sample: return mac address - if(buf != NULL && buf_len == 6) - { - printf("%s():Connect indication received: %02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__, - buf[0],buf[1],buf[2],buf[3],buf[4],buf[5]); - } + // Sample: return mac address + if (buf != NULL && buf_len == 6) { + info_printf( + "%s: Connect indication received: %02x:%02x:%02x:%02x:%02x:%02x\n", + __func__, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]); + } #endif - break; - case WIFI_EVENT_FOURWAY_HANDSHAKE_DONE: + break; + case WIFI_EVENT_FOURWAY_HANDSHAKE_DONE: #if(WIFI_INDICATE_MSG>0) - if(buf != NULL) - { - if(buf_len == strlen(IW_EXT_STR_FOURWAY_DONE)) - printf("%s():%s\n", __FUNCTION__, buf); - } + if (buf != NULL) + info_printf("%s: %s\n", __func__, buf); #endif - break; - case WIFI_EVENT_SCAN_RESULT_REPORT: + break; + case WIFI_EVENT_SCAN_RESULT_REPORT: #if(WIFI_INDICATE_MSG>0) - printf("%s(): WIFI_EVENT_SCAN_RESULT_REPORT\n", __func__); + info_printf("%s: WIFI_EVENT_SCAN_RESULT_REPORT\n", __func__); #endif - break; - case WIFI_EVENT_SCAN_DONE: + break; + case WIFI_EVENT_SCAN_DONE: #if(WIFI_INDICATE_MSG>0) - printf("%s(): WIFI_EVENT_SCAN_DONE\n", __func__); -#if CONFIG_DEBUG_LOG > 3 - printf("Time at start %d ms.\n", xTaskGetTickCount()); + info_printf("%s: WIFI_EVENT_SCAN_DONE\n", __func__); +//#if CONFIG_DEBUG_LOG > 3 +// debug_printf("Time at start %d ms.\n", xTaskGetTickCount()); +//#endif #endif -#endif - break; - case WIFI_EVENT_RECONNECTION_FAIL: + break; + case WIFI_EVENT_RECONNECTION_FAIL: #if(WIFI_INDICATE_MSG>0) - if(buf != NULL){ - if(buf_len == strlen(IW_EXT_STR_RECONNECTION_FAIL)) - printf("%s\n", buf); - } + info_printf("%s: %s\n", __func__, buf); #endif - break; - case WIFI_EVENT_NO_NETWORK: + break; + case WIFI_EVENT_NO_NETWORK: #if(WIFI_INDICATE_MSG>0) - printf("%s(): WIFI_EVENT_NO_NETWORK\n", __func__); + info_printf("%s: %s\n", __func__, buf); #endif - break; + break; #if CONFIG_ENABLE_P2P - case WIFI_EVENT_SEND_ACTION_DONE: + case WIFI_EVENT_SEND_ACTION_DONE: #if(WIFI_INDICATE_MSG>0) - printf("%s(): WIFI_EVENT_SEND_ACTION_DONE\n", __func__); + info_printf("%s: %s\n", __func__); #endif - break; - case WIFI_EVENT_RX_MGNT: + break; + case WIFI_EVENT_RX_MGNT: #if(WIFI_INDICATE_MSG>0) - printf("%s(): WIFI_EVENT_RX_MGNT\n", __func__); + info_printf("%s: WIFI_EVENT_RX_MGNT\n", __func__); #endif - break; + break; #endif //CONFIG_ENABLE_P2P - case WIFI_EVENT_STA_ASSOC: + case WIFI_EVENT_STA_ASSOC: #if(WIFI_INDICATE_MSG>0) - printf("%s(): WIFI_EVENT_STA_ASSOC\n", __func__); + info_printf("%s: %s\n", __func__); #endif - break; - case WIFI_EVENT_STA_DISASSOC: + break; + case WIFI_EVENT_STA_DISASSOC: #if(WIFI_INDICATE_MSG>0) - printf("%s(): WIFI_EVENT_STA_DISASSOC\n", __func__); + info_printf("%s: %s\n", __func__); #endif - break; + break; #ifdef CONFIG_WPS case WIFI_EVENT_STA_WPS_START: #if(WIFI_INDICATE_MSG>0) - printf("%s(): WIFI_EVENT_STA_WPS_START\n", __func__); + info_printf("%s: WIFI_EVENT_STA_WPS_START\n", __func__); #endif - break; + break; case WIFI_EVENT_WPS_FINISH: #if(WIFI_INDICATE_MSG>0) - printf("%s(): WIFI_EVENT_WPS_FINISH\n", __func__); + info_printf("%s: WIFI_EVENT_WPS_FINISH\n", __func__); #endif - break; + break; case WIFI_EVENT_EAPOL_RECVD: #if(WIFI_INDICATE_MSG>0) - printf("%s(): WIFI_EVENT_EAPOL_RECVD\n", __func__); + info_printf("%s: WIFI_EVENT_EAPOL_RECVD\n", __func__); #endif - break; + break; #endif - case WIFI_EVENT_BEACON_AFTER_DHCP: + case WIFI_EVENT_BEACON_AFTER_DHCP: #if(WIFI_INDICATE_MSG>1) - printf("%s(): WIFI_EVENT_BEACON_AFTER_DHCP\n", __func__); + info_printf("%s: WIFI_EVENT_BEACON_AFTER_DHCP\n", __func__); #endif #if 0 // test beacon - gpio_write(&gpio_led, 1); - gpio_write(&gpio_led, 0); + gpio_write(&gpio_led, 1); + gpio_write(&gpio_led, 0); #endif - break; + break; } #if CONFIG_INIC_EN @@ -216,31 +212,33 @@ void wifi_indication( WIFI_EVENT_INDICATE event, char *buf, int buf_len, int fla #endif } -void wifi_reg_event_handler(unsigned int event_cmds, rtw_event_handler_t handler_func, void *handler_user_data) -{ +void wifi_reg_event_handler(unsigned int event_cmds, + rtw_event_handler_t handler_func, void *handler_user_data) { int i = 0, j = 0; - if(event_cmds < WIFI_EVENT_MAX){ - for(i=0; i < WIFI_EVENT_MAX_ROW; i++){ - if(event_callback_list[event_cmds][i].handler == NULL){ - for(j=0; j #include -#if CONFIG_DEBUG_LOG > 0 - #define wext_printf(...) rtl_printf(__VA_ARGS__) -#else - #define wext_printf(...) -#endif - - -int iw_ioctl(const char * ifname, unsigned long request, struct iwreq * pwrq) -{ +int iw_ioctl(const char * ifname, unsigned long request, struct iwreq * pwrq) { memcpy(pwrq->ifr_name, ifname, 5); - return rltk_wlan_control(request, (void *) pwrq); + int ret = rltk_wlan_control(request, (void *) pwrq); +#if CONFIG_DEBUG_LOG > 3 + if (ret < 0) + error_printf("ioctl[%p, '%s', %02x %02x %02x %02x ...] error (%d)!\n", + request, ifname, pwrq->u.name[0], pwrq->u.name[1], + pwrq->u.name[2], pwrq->u.name[3], ret); +#endif +#if CONFIG_DEBUG_LOG > 4 + else + debug_printf("ioctl[%p, '%s', %02x %02x %02x %02x ...] = %d\n", + request, ifname, pwrq->u.name[0], pwrq->u.name[1], + pwrq->u.name[2], pwrq->u.name[3], ret); +#endif + return ret; } -int wext_get_ssid(const char *ifname, __u8 *ssid) -{ +/* ssid = NULL -> not connected */ +int wext_get_ssid(const char *ifname, __u8 *ssid) { struct iwreq iwr; - int ret = 0; - memset(&iwr, 0, sizeof(iwr)); iwr.u.essid.pointer = ssid; iwr.u.essid.length = 32; - - if (iw_ioctl(ifname, SIOCGIWESSID, &iwr) < 0) { - wext_printf("ioctl[SIOCGIWESSID] ssid = NULL, not connected\n"); //do not use perror - ret = -1; - } else { + int ret = iw_ioctl(ifname, SIOCGIWESSID, &iwr); + if (ret >= 0) { ret = iwr.u.essid.length; if (ret > 32) ret = 32; @@ -43,194 +43,134 @@ int wext_get_ssid(const char *ifname, __u8 *ssid) ret--; ssid[ret] = '\0'; } - return ret; } -int wext_set_ssid(const char *ifname, const __u8 *ssid, __u16 ssid_len) -{ +int wext_set_ssid(const char *ifname, const __u8 *ssid, __u16 ssid_len) { struct iwreq iwr; - int ret = 0; - memset(&iwr, 0, sizeof(iwr)); iwr.u.essid.pointer = (void *) ssid; iwr.u.essid.length = ssid_len; iwr.u.essid.flags = (ssid_len != 0); - - if (iw_ioctl(ifname, SIOCSIWESSID, &iwr) < 0) { - wext_printf("ioctl[SIOCSIWESSID] error\n"); - ret = -1; - } - - return ret; + return iw_ioctl(ifname, SIOCSIWESSID, &iwr); } -int wext_set_bssid(const char *ifname, const __u8 *bssid) -{ +int wext_set_bssid(const char *ifname, const __u8 *bssid) { struct iwreq iwr; - int ret = 0; - memset(&iwr, 0, sizeof(iwr)); iwr.u.ap_addr.sa_family = ARPHRD_ETHER; memcpy(iwr.u.ap_addr.sa_data, bssid, ETH_ALEN); - - if(bssid[ETH_ALEN]=='#' && bssid[ETH_ALEN + 1]=='@'){ + if (bssid[ETH_ALEN] == '#' && bssid[ETH_ALEN + 1] == '@') { memcpy(iwr.u.ap_addr.sa_data + ETH_ALEN, bssid + ETH_ALEN, 6); } - - if (iw_ioctl(ifname, SIOCSIWAP, &iwr) < 0) { - wext_printf("ioctl[SIOCSIWAP] error\n"); - ret = -1; - } - - return ret; + return iw_ioctl(ifname, SIOCSIWAP, &iwr); } -int is_broadcast_ether_addr(const unsigned char *addr) -{ +int is_broadcast_ether_addr(const unsigned char *addr) { return (addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5]) == 0xff; } -int wext_set_auth_param(const char *ifname, __u16 idx, __u32 value) -{ +int wext_set_auth_param(const char *ifname, __u16 idx, __u32 value) { struct iwreq iwr; - int ret = 0; - memset(&iwr, 0, sizeof(iwr)); iwr.u.param.flags = idx & IW_AUTH_INDEX; iwr.u.param.value = value; - - if (iw_ioctl(ifname, SIOCSIWAUTH, &iwr) < 0) { - wext_printf("WEXT: SIOCSIWAUTH(param %d value 0x%x) failed)\n", idx, value); - } - - return ret; + return iw_ioctl(ifname, SIOCSIWAUTH, &iwr); } -int wext_set_key_ext(const char *ifname, __u16 alg, const __u8 *addr, int key_idx, int set_tx, const __u8 *seq, __u16 seq_len, __u8 *key, __u16 key_len) -{ +int wext_set_key_ext(const char *ifname, __u16 alg, const __u8 *addr, + int key_idx, int set_tx, const __u8 *seq, __u16 seq_len, __u8 *key, + __u16 key_len) { struct iwreq iwr; - int ret = 0; + int ret = -1; struct iw_encode_ext *ext; - ext = (struct iw_encode_ext *) malloc(sizeof(struct iw_encode_ext) + key_len); - if (ext == NULL) - return -1; - else + ext = (struct iw_encode_ext *) pvPortMalloc( + sizeof(struct iw_encode_ext) + key_len); + if (ext != NULL) { memset(ext, 0, sizeof(struct iw_encode_ext) + key_len); - - memset(&iwr, 0, sizeof(iwr)); - iwr.u.encoding.flags = key_idx + 1; - iwr.u.encoding.flags |= IW_ENCODE_TEMP; - iwr.u.encoding.pointer = ext; - iwr.u.encoding.length = sizeof(struct iw_encode_ext) + key_len; - - if (alg == IW_ENCODE_DISABLED) - iwr.u.encoding.flags |= IW_ENCODE_DISABLED; - - if (addr == NULL || is_broadcast_ether_addr(addr)) - ext->ext_flags |= IW_ENCODE_EXT_GROUP_KEY; - - if (set_tx) - ext->ext_flags |= IW_ENCODE_EXT_SET_TX_KEY; - - ext->addr.sa_family = ARPHRD_ETHER; - - if (addr) - memcpy(ext->addr.sa_data, addr, ETH_ALEN); + memset(&iwr, 0, sizeof(iwr)); + iwr.u.encoding.flags = key_idx + 1; + iwr.u.encoding.flags |= IW_ENCODE_TEMP; + iwr.u.encoding.pointer = ext; + iwr.u.encoding.length = sizeof(struct iw_encode_ext) + key_len; + if (alg == IW_ENCODE_DISABLED) + iwr.u.encoding.flags |= IW_ENCODE_DISABLED; + if (addr == NULL || is_broadcast_ether_addr(addr)) + ext->ext_flags |= IW_ENCODE_EXT_GROUP_KEY; + if (set_tx) + ext->ext_flags |= IW_ENCODE_EXT_SET_TX_KEY; + ext->addr.sa_family = ARPHRD_ETHER; + if (addr) + memcpy(ext->addr.sa_data, addr, ETH_ALEN); + else + memset(ext->addr.sa_data, 0xff, ETH_ALEN); + if (key && key_len) { + memcpy(ext->key, key, key_len); + ext->key_len = key_len; + } + ext->alg = alg; + if (seq && seq_len) { + ext->ext_flags |= IW_ENCODE_EXT_RX_SEQ_VALID; + memcpy(ext->rx_seq, seq, seq_len); + } + ret = iw_ioctl(ifname, SIOCSIWENCODEEXT, &iwr); + vPortFree(ext); + } +#if CONFIG_DEBUG_LOG > 3 else - memset(ext->addr.sa_data, 0xff, ETH_ALEN); - - if (key && key_len) { - memcpy(ext->key, key, key_len); - ext->key_len = key_len; - } - - ext->alg = alg; - - if (seq && seq_len) { - ext->ext_flags |= IW_ENCODE_EXT_RX_SEQ_VALID; - memcpy(ext->rx_seq, seq, seq_len); - } - - if (iw_ioctl(ifname, SIOCSIWENCODEEXT, &iwr) < 0) { - ret = -2; - wext_printf("ioctl[SIOCSIWENCODEEXT] set key fail\n"); - } - - free(ext); - + error_printf("%s: Can't malloc memory!\n", __func__); +#endif return ret; } -int wext_get_enc_ext(const char *ifname, __u16 *alg, __u8 *key_idx, __u8 *passphrase) -{ +int wext_get_enc_ext(const char *ifname, __u16 *alg, __u8 *key_idx, + __u8 *passphrase) { struct iwreq iwr; - int ret = 0; + int ret = -1; struct iw_encode_ext *ext; - ext = (struct iw_encode_ext *) malloc(sizeof(struct iw_encode_ext) + 16); - if (ext == NULL) - return -1; - else + ext = (struct iw_encode_ext *) pvPortMalloc( + sizeof(struct iw_encode_ext) + 16); + if (ext != NULL) { memset(ext, 0, sizeof(struct iw_encode_ext) + 16); - - iwr.u.encoding.pointer = ext; - - if (iw_ioctl(ifname, SIOCGIWENCODEEXT, &iwr) < 0) { - wext_printf("ioctl[SIOCGIWENCODEEXT] error\n"); - ret = -1; + iwr.u.encoding.pointer = ext; + ret = iw_ioctl(ifname, SIOCGIWENCODEEXT, &iwr); + if (ret >= 0) { + *alg = ext->alg; + if (key_idx) + *key_idx = (__u8 ) iwr.u.encoding.flags; + if (passphrase) + memcpy(passphrase, ext->key, ext->key_len); + } + vPortFree(ext); } +#if CONFIG_DEBUG_LOG > 3 else - { - *alg = ext->alg; - if(key_idx) - *key_idx = (__u8)iwr.u.encoding.flags; - if(passphrase) - memcpy(passphrase, ext->key, ext->key_len); - } - - if(ext != NULL) - free(ext); - + error_printf("%s: Can't malloc memory!\n", __func__); +#endif return ret; } -int wext_set_passphrase(const char *ifname, const __u8 *passphrase, __u16 passphrase_len) -{ +int wext_set_passphrase(const char *ifname, const __u8 *passphrase, + __u16 passphrase_len) { struct iwreq iwr; - int ret = 0; - memset(&iwr, 0, sizeof(iwr)); iwr.u.passphrase.pointer = (void *) passphrase; iwr.u.passphrase.length = passphrase_len; iwr.u.passphrase.flags = (passphrase_len != 0); - - if (iw_ioctl(ifname, SIOCSIWPRIVPASSPHRASE, &iwr) < 0) { - wext_printf("ioctl[SIOCSIWESSID+0x1f] error\n"); - ret = -1; - } - - return ret; + return iw_ioctl(ifname, SIOCSIWPRIVPASSPHRASE, &iwr); } -int wext_get_passphrase(const char *ifname, __u8 *passphrase) -{ +int wext_get_passphrase(const char *ifname, __u8 *passphrase) { struct iwreq iwr; - int ret = 0; - memset(&iwr, 0, sizeof(iwr)); iwr.u.passphrase.pointer = (void *) passphrase; - - if (iw_ioctl(ifname, SIOCGIWPRIVPASSPHRASE, &iwr) < 0) { - wext_printf("ioctl[SIOCGIWPRIVPASSPHRASE] error\n"); - ret = -1; - } - else { + int ret = iw_ioctl(ifname, SIOCGIWPRIVPASSPHRASE, &iwr); + if (ret >= 0) { ret = iwr.u.passphrase.length; passphrase[ret] = '\0'; } - return ret; } @@ -238,7 +178,7 @@ int wext_get_passphrase(const char *ifname, __u8 *passphrase) int wext_set_mac_address(const char *ifname, char * mac) { char buf[13+17+1]; - rtw_memset(buf, 0, sizeof(buf)); + memset(buf, 0, sizeof(buf)); snprintf(buf, 13+17, "write_mac %s", mac); return wext_private_command(ifname, buf, 0); } @@ -248,318 +188,212 @@ int wext_get_mac_address(const char *ifname, char * mac) int ret = 0; char buf[32]; - rtw_memset(buf, 0, sizeof(buf)); - rtw_memcpy(buf, "read_mac", 8); + memset(buf, 0, sizeof(buf)); + memcpy(buf, "read_mac", 8); ret = wext_private_command_with_retval(ifname, buf, buf, 32); strcpy(mac, buf); return ret; } #endif -int wext_enable_powersave(const char *ifname, __u8 ips_mode, __u8 lps_mode) -{ +int wext_enable_powersave(const char *ifname, __u8 ips_mode, __u8 lps_mode) { struct iwreq iwr; - int ret = 0; - __u16 pindex = 0; - __u8 *para = NULL; - int cmd_len = 0; - + __u16 pindex = 7; + __u8 para[16]; // 7 + (1+1+1) + (1+1+1) + int cmd_len = sizeof("pm_set"); memset(&iwr, 0, sizeof(iwr)); - cmd_len = sizeof("pm_set"); - // Encode parameters as TLV (type, length, value) format - para = pvPortMalloc( 7 + (1+1+1) + (1+1+1) ); - if(para == NULL) return -1; - - snprintf((char*)para, cmd_len, "pm_set"); - pindex = 7; - + snprintf((char*) para, cmd_len, "pm_set"); para[pindex++] = 0; // type 0 for ips para[pindex++] = 1; para[pindex++] = ips_mode; - para[pindex++] = 1; // type 1 for lps para[pindex++] = 1; para[pindex++] = lps_mode; - - iwr.u.data.pointer = para; + iwr.u.data.pointer = ¶[0]; iwr.u.data.length = pindex; - - if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) { - wext_printf("ioctl[SIOCSIWPRIVAPESSID] error\n"); - ret = -1; - } - - vPortFree(para); - return ret; + return iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr); } -int wext_disable_powersave(const char *ifname) -{ +int wext_disable_powersave(const char *ifname) { struct iwreq iwr; - int ret = 0; - __u16 pindex = 0; - __u8 *para = NULL; - int cmd_len = 0; - + __u16 pindex = 7; + __u8 para[16]; // 7 + (1+1+1) + (1+1+1) + int cmd_len = sizeof("pm_set"); memset(&iwr, 0, sizeof(iwr)); - cmd_len = sizeof("pm_set"); - // Encode parameters as TLV (type, length, value) format - para = pvPortMalloc( 7 + (1+1+1) + (1+1+1) ); - if(para == NULL) return -1; - - snprintf((char*)para, cmd_len, "pm_set"); - pindex = 7; - + snprintf((char*) para, cmd_len, "pm_set"); para[pindex++] = 0; // type 0 for ips para[pindex++] = 1; para[pindex++] = 0; // ips = 0 - para[pindex++] = 1; // type 1 for lps para[pindex++] = 1; para[pindex++] = 0; // lps = 0 - - iwr.u.data.pointer = para; + iwr.u.data.pointer = ¶[0]; iwr.u.data.length = pindex; - - if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) { - wext_printf("ioctl[SIOCSIWPRIVAPESSID] error\n"); - ret = -1; - } - - vPortFree(para); - return ret; - + return iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr); } -int wext_set_tdma_param(const char *ifname, __u8 slot_period, __u8 rfon_period_len_1, __u8 rfon_period_len_2, __u8 rfon_period_len_3) -{ +int wext_set_tdma_param(const char *ifname, __u8 slot_period, + __u8 rfon_period_len_1, __u8 rfon_period_len_2, __u8 rfon_period_len_3) { struct iwreq iwr; - int ret = 0; - __u16 pindex = 0; - __u8 *para = NULL; - int cmd_len = 0; - + int ret = -1; + __u16 pindex = 7; + __u8 para[16]; // 7+(1+1+4) + int cmd_len = sizeof("pm_set"); memset(&iwr, 0, sizeof(iwr)); - cmd_len = sizeof("pm_set"); - // Encode parameters as TLV (type, length, value) format - para = pvPortMalloc( 7 + (1+1+4) ); - - snprintf((char*)para, cmd_len, "pm_set"); - pindex = 7; - + snprintf((char*) para, cmd_len, "pm_set"); para[pindex++] = 2; // type 2 tdma param para[pindex++] = 4; para[pindex++] = slot_period; para[pindex++] = rfon_period_len_1; para[pindex++] = rfon_period_len_2; para[pindex++] = rfon_period_len_3; - iwr.u.data.pointer = para; iwr.u.data.length = pindex; - - if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) { - wext_printf("ioctl[SIOCSIWPRIVAPESSID] error\n"); - ret = -1; - } - - vPortFree(para); - return ret; + return iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr); } -int wext_set_lps_dtim(const char *ifname, __u8 lps_dtim) -{ +int wext_set_lps_dtim(const char *ifname, __u8 lps_dtim) { struct iwreq iwr; - int ret = 0; - __u16 pindex = 0; - __u8 *para = NULL; + int ret = -1; + __u16 pindex = 7; + __u8 para[16]; // 7+(1+1+1) int cmd_len = 0; memset(&iwr, 0, sizeof(iwr)); cmd_len = sizeof("pm_set"); - // Encode parameters as TLV (type, length, value) format - para = pvPortMalloc( 7 + (1+1+1) ); - - snprintf((char*)para, cmd_len, "pm_set"); - pindex = 7; - + snprintf((char*) para, cmd_len, "pm_set"); para[pindex++] = 3; // type 3 lps dtim para[pindex++] = 1; para[pindex++] = lps_dtim; - - iwr.u.data.pointer = para; + iwr.u.data.pointer = ¶[0]; iwr.u.data.length = pindex; - - if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) { - wext_printf("ioctl[SIOCSIWPRIVAPESSID] error\n"); - ret = -1; - } - - vPortFree(para); + ret = iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr); return ret; } -int wext_get_lps_dtim(const char *ifname, __u8 *lps_dtim) -{ +int wext_get_lps_dtim(const char *ifname, __u8 *lps_dtim) { struct iwreq iwr; - int ret = 0; - __u16 pindex = 0; - __u8 *para = NULL; + int ret = -1; + __u16 pindex = 7; int cmd_len = 0; - + __u8 para[16]; // 7+(1+1+1) memset(&iwr, 0, sizeof(iwr)); cmd_len = sizeof("pm_get"); - // Encode parameters as TLV (type, length, value) format - para = pvPortMalloc( 7 + (1+1+1) ); - - snprintf((char*)para, cmd_len, "pm_get"); - pindex = 7; - + snprintf((char*) para, cmd_len, "pm_get"); para[pindex++] = 3; // type 3 for lps dtim para[pindex++] = 1; para[pindex++] = 0; - - iwr.u.data.pointer = para; + iwr.u.data.pointer = ¶[0]; iwr.u.data.length = pindex; - - if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) { - wext_printf("ioctl[SIOCSIWPRIVAPESSID] error\n"); - ret = -1; - goto exit; - } - + ret = iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr); //get result at the beginning of iwr.u.data.pointer - if((para[0]==3)&&(para[1]==1)) + if ((para[0] == 3) && (para[1] == 1)) *lps_dtim = para[2]; - else - wext_printf("%s error\n", __func__); - -exit: - vPortFree(para); - - return ret; -} - -int wext_set_tos_value(const char *ifname, __u8 *tos_value) -{ - struct iwreq iwr; - int ret = 0; - __u8 *para = NULL; - int cmd_len = sizeof("set_tos_value"); - - memset(&iwr, 0, sizeof(iwr)); - - para = pvPortMalloc(cmd_len + 4); - snprintf((char*)para, cmd_len, "set_tos_value"); - - if(*tos_value >= 0 && *tos_value <=32){ - *(para + cmd_len) = 0x4f; - *(para + cmd_len+1) = 0xa4; - *(para + cmd_len+2) = 0; - *(para + cmd_len+3) = 0; - } - else if(*tos_value > 32 && *tos_value <=96){ - *(para + cmd_len) = 0x2b; - *(para + cmd_len+1) = 0xa4; - *(para + cmd_len+2) = 0; - *(para + cmd_len+3) = 0; - } - else if(*tos_value > 96 && *tos_value <= 160){ - *(para + cmd_len) = 0x22; - *(para + cmd_len+1) = 0x43; - *(para + cmd_len+2) = 0x5e; - *(para + cmd_len+3) = 0; - } - else if(*tos_value > 160){ - *(para + cmd_len) = 0x22; - *(para + cmd_len+1) = 0x32; - *(para + cmd_len+2) = 0x2f; - *(para + cmd_len+3) = 0; - } - - iwr.u.data.pointer = para; - iwr.u.data.length = cmd_len + 4; - - if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) { - wext_printf("wext_set_tos_value():ioctl[SIOCDEVPRIVATE] error\n"); + else { +#if CONFIG_DEBUG_LOG > 3 + error_printf("%s: error!\n", __func__); +#endif ret = -1; } - - vPortFree(para); return ret; } -int wext_get_tx_power(const char *ifname, __u8 *poweridx) -{ +int wext_set_tos_value(const char *ifname, __u8 *tos_value) { struct iwreq iwr; - int ret = 0; - __u8 *para = NULL; - int cmd_len = sizeof("get_tx_power"); + int ret = -1; + __u8 para[sizeof("set_tos_value") + 4]; + int cmd_len = sizeof("set_tos_value"); + memset(&iwr, 0, sizeof(iwr)); + snprintf((char*) para, cmd_len, "set_tos_value"); + if (*tos_value >= 0 && *tos_value <= 32) { + *(para + cmd_len) = 0x4f; + *(para + cmd_len + 1) = 0xa4; + *(para + cmd_len + 2) = 0; + *(para + cmd_len + 3) = 0; + } else if (*tos_value > 32 && *tos_value <= 96) { + *(para + cmd_len) = 0x2b; + *(para + cmd_len + 1) = 0xa4; + *(para + cmd_len + 2) = 0; + *(para + cmd_len + 3) = 0; + } else if (*tos_value > 96 && *tos_value <= 160) { + *(para + cmd_len) = 0x22; + *(para + cmd_len + 1) = 0x43; + *(para + cmd_len + 2) = 0x5e; + *(para + cmd_len + 3) = 0; + } else if (*tos_value > 160) { + *(para + cmd_len) = 0x22; + *(para + cmd_len + 1) = 0x32; + *(para + cmd_len + 2) = 0x2f; + *(para + cmd_len + 3) = 0; + } + iwr.u.data.pointer = ¶[0]; + iwr.u.data.length = cmd_len + 4; + return iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr); +} +int wext_get_tx_power(const char *ifname, __u8 *poweridx) { + struct iwreq iwr; + int ret = -1; + __u8 *para; + int cmd_len = sizeof("get_tx_power"); memset(&iwr, 0, sizeof(iwr)); //Tx power size : 20 Bytes //CCK 1M,2M,5.5M,11M : 4 Bytes //OFDM 6M, 9M, 12M, 18M, 24M, 36M 48M, 54M : 8 Bytes //MCS 0~7 : 8 Bytes para = pvPortMalloc(cmd_len + 20); - if(para != NULL) { - - snprintf((char*)para, cmd_len, "get_tx_power"); - + if (para != NULL) { + snprintf((char*) para, cmd_len, "get_tx_power"); iwr.u.data.pointer = para; iwr.u.data.length = cmd_len + 20; - if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) { - wext_printf("wext_get_tx_power():ioctl[SIOCDEVPRIVATE] error!\n"); - ret = -1; - } - - memcpy(poweridx,(__u8 *)(iwr.u.data.pointer),20); + ret = iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr); + if (ret >= 0) + memcpy(poweridx, (__u8 *) (iwr.u.data.pointer), 20); vPortFree(para); } - else { - printf("wext_get_tx_power() error alloc!\n"); - ret = -1; - } - +#if CONFIG_DEBUG_LOG > 3 + else + error_printf("%s: Can't malloc memory!\n", __func__); +#endif return ret; } -#if 0 -int wext_set_txpower(const char *ifname, int poweridx) -{ +#if 1 // work ? +int wext_set_txpower(const char *ifname, int poweridx) { int ret; char buf[24]; - - rtw_memset(buf, 0, sizeof(buf)); + + memset(buf, 0, sizeof(buf)); snprintf(buf, 24, "txpower patha=%d", poweridx); ret = wext_private_command(ifname, buf, 0); return ret; } -int wext_get_associated_client_list(const char *ifname, void * client_list_buffer, uint16_t buffer_length) -{ +int wext_get_associated_client_list(const char *ifname, + void * client_list_buffer, uint16_t buffer_length) { int ret; char buf[25]; - rtw_memset(buf, 0, sizeof(buf)); + memset(buf, 0, sizeof(buf)); snprintf(buf, 25, "get_client_list %x", client_list_buffer); ret = wext_private_command(ifname, buf, 0); return ret; } -int wext_get_ap_info(const char *ifname, rtw_bss_info_t * ap_info, rtw_security_t* security) -{ +int wext_get_ap_info(const char *ifname, rtw_bss_info_t * ap_info, + rtw_security_t* security) { int ret = 0; char buf[24]; - rtw_memset(buf, 0, sizeof(buf)); + memset(buf, 0, sizeof(buf)); snprintf(buf, 24, "get_ap_info %x", ap_info); ret = wext_private_command(ifname, buf, 0); @@ -571,772 +405,599 @@ int wext_get_ap_info(const char *ifname, rtw_bss_info_t * ap_info, rtw_security_ } #endif -int wext_set_mode(const char *ifname, int mode) -{ +int wext_set_mode(const char *ifname, int mode) { struct iwreq iwr; - int ret = 0; - memset(&iwr, 0, sizeof(iwr)); iwr.u.mode = mode; - if (iw_ioctl(ifname, SIOCSIWMODE, &iwr) < 0) { - wext_printf("ioctl[SIOCSIWMODE] error\n"); - ret = -1; - } - - return ret; + return iw_ioctl(ifname, SIOCSIWMODE, &iwr); } -int wext_get_mode(const char *ifname, int *mode) -{ +int wext_get_mode(const char *ifname, int *mode) { struct iwreq iwr; - int ret = 0; - memset(&iwr, 0, sizeof(iwr)); - - if (iw_ioctl(ifname, SIOCGIWMODE, &iwr) < 0) { - wext_printf("ioctl[SIOCGIWMODE] error\n"); - ret = -1; - } - else + int ret = iw_ioctl(ifname, SIOCGIWMODE, &iwr); + if (ret >= 0) *mode = iwr.u.mode; - return ret; } -int wext_set_ap_ssid(const char *ifname, const __u8 *ssid, __u16 ssid_len) -{ +int wext_set_ap_ssid(const char *ifname, const __u8 *ssid, __u16 ssid_len) { struct iwreq iwr; - int ret = 0; - memset(&iwr, 0, sizeof(iwr)); iwr.u.essid.pointer = (void *) ssid; iwr.u.essid.length = ssid_len; iwr.u.essid.flags = (ssid_len != 0); - - if (iw_ioctl(ifname, SIOCSIWPRIVAPESSID, &iwr) < 0) { - wext_printf("ioctl[SIOCSIWPRIVAPESSID] error\n"); - ret = -1; - } - - return ret; + return iw_ioctl(ifname, SIOCSIWPRIVAPESSID, &iwr); } -int wext_set_country(const char *ifname, rtw_country_code_t country_code) -{ +int wext_set_country(const char *ifname, rtw_country_code_t country_code) { struct iwreq iwr; - int ret = 0; - memset(&iwr, 0, sizeof(iwr)); - iwr.u.param.value = country_code; - - if (iw_ioctl(ifname, SIOCSIWPRIVCOUNTRY, &iwr) < 0) { - wext_printf("ioctl[SIOCSIWPRIVCOUNTRY] error\n"); - ret = -1; - } - return ret; + return iw_ioctl(ifname, SIOCSIWPRIVCOUNTRY, &iwr); } -int wext_get_rssi(const char *ifname, int *rssi) -{ +int wext_get_rssi(const char *ifname, int *rssi) { struct iwreq iwr; - int ret = 0; - memset(&iwr, 0, sizeof(iwr)); - - if (iw_ioctl(ifname, SIOCGIWSENS, &iwr) < 0) { - wext_printf("ioctl[SIOCGIWSENS] error\n"); - ret = -1; - } else { + int ret = iw_ioctl(ifname, SIOCGIWSENS, &iwr); + if (ret >= 0) *rssi = 0 - iwr.u.sens.value; - } return ret; } -int wext_set_pscan_channel(const char *ifname, __u8 *ch, __u8 *pscan_config, __u8 length) -{ +int wext_set_pscan_channel(const char *ifname, __u8 *ch, __u8 *pscan_config, + __u8 length) { struct iwreq iwr; - int ret = 0; - __u8 *para = NULL; - int i =0; - + int ret = -1; + __u8 *para; + int i = 0; memset(&iwr, 0, sizeof(iwr)); //Format of para:function_name num_channel chan1... pscan_config1 ... para = pvPortMalloc((length + length + 1) + 12);//size:num_chan + num_time + length + function_name - if(para == NULL) return -1; + if (para != NULL) { + //Cmd + snprintf((char*) para, 12, "PartialScan"); + //length + *(para + 12) = length; + for (i = 0; i < length; i++) { + *(para + 13 + i) = *(ch + i); + *((__u16 *) (para + 13 + length + i)) = *(pscan_config + i); + } - //Cmd - snprintf((char*)para, 12, "PartialScan"); - //length - *(para+12) = length; - for(i = 0; i < length; i++){ - *(para + 13 + i)= *(ch + i); - *((__u16*) (para + 13 + length + i))= *(pscan_config + i); + iwr.u.data.pointer = para; + iwr.u.data.length = (length + length + 1) + 12; + ret = iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr); + vPortFree(para); } - - iwr.u.data.pointer = para; - iwr.u.data.length = (length + length + 1) + 12; - if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) { - wext_printf("wext_set_pscan_channel():ioctl[SIOCDEVPRIVATE] error\n"); - ret = -1; - } - vPortFree(para); +#if CONFIG_DEBUG_LOG > 3 + else + error_printf("%s: Can't malloc memory!\n", __func__); +#endif return ret; } -int wext_set_channel(const char *ifname, __u8 ch) -{ +int wext_set_channel(const char *ifname, __u8 ch) { struct iwreq iwr; - int ret = 0; - memset(&iwr, 0, sizeof(iwr)); iwr.u.freq.m = 0; iwr.u.freq.e = 0; iwr.u.freq.i = ch; - - if (iw_ioctl(ifname, SIOCSIWFREQ, &iwr) < 0) { - wext_printf("ioctl[SIOCSIWFREQ] error\n"); - ret = -1; - } - - return ret; + return iw_ioctl(ifname, SIOCSIWFREQ, &iwr); } -int wext_get_channel(const char *ifname, __u8 *ch) -{ +int wext_get_channel(const char *ifname, __u8 *ch) { struct iwreq iwr; - int ret = 0; - memset(&iwr, 0, sizeof(iwr)); - - if (iw_ioctl(ifname, SIOCGIWFREQ, &iwr) < 0) { - wext_printf("ioctl[SIOCGIWFREQ] error\n"); - ret = -1; - } - else + int ret = iw_ioctl(ifname, SIOCGIWFREQ, &iwr); + if (ret >= 0) *ch = iwr.u.freq.i; - return ret; } -int wext_register_multicast_address(const char *ifname, rtw_mac_t *mac) -{ - int ret = 0; +int wext_register_multicast_address(const char *ifname, rtw_mac_t *mac) { char buf[32]; - - rtw_memset(buf, 0, sizeof(buf)); + memset(buf, 0, sizeof(buf)); snprintf(buf, 32, "reg_multicast "MAC_FMT, MAC_ARG(mac->octet)); - ret = wext_private_command(ifname, buf, 0); - - return ret; + return wext_private_command(ifname, buf, 0); } -int wext_unregister_multicast_address(const char *ifname, rtw_mac_t *mac) -{ - int ret = 0; - char buf[35]; - - rtw_memset(buf, 0, sizeof(buf)); +int wext_unregister_multicast_address(const char *ifname, rtw_mac_t *mac) { + char buf[36]; + memset(buf, 0, sizeof(buf)); snprintf(buf, 35, "reg_multicast -d "MAC_FMT, MAC_ARG(mac->octet)); - ret = wext_private_command(ifname, buf, 0); - - return ret; + return wext_private_command(ifname, buf, 0); } -int wext_set_scan(const char *ifname, char *buf, __u16 buf_len, __u16 flags) -{ +int wext_set_scan(const char *ifname, char *buf, __u16 buf_len, __u16 flags) { struct iwreq iwr; - int ret = 0; - memset(&iwr, 0, sizeof(iwr)); #if 0 //for scan_with_ssid if(buf) - memset(buf, 0, buf_len); + memset(buf, 0, buf_len); #endif iwr.u.data.pointer = buf; iwr.u.data.flags = flags; iwr.u.data.length = buf_len; - if (iw_ioctl(ifname, SIOCSIWSCAN, &iwr) < 0) { - wext_printf("ioctl[SIOCSIWSCAN] error\n"); - ret = -1; - } - return ret; + return iw_ioctl(ifname, SIOCSIWSCAN, &iwr); } -int wext_get_scan(const char *ifname, char *buf, __u16 buf_len) -{ +int wext_get_scan(const char *ifname, char *buf, __u16 buf_len) { struct iwreq iwr; - int ret = 0; - + memset(&iwr, 0, sizeof(iwr)); iwr.u.data.pointer = buf; iwr.u.data.length = buf_len; - if (iw_ioctl(ifname, SIOCGIWSCAN, &iwr) < 0) { - wext_printf("ioctl[SIOCGIWSCAN] error\n"); - ret = -1; - }else + int ret = iw_ioctl(ifname, SIOCGIWSCAN, &iwr); + if (ret >= 0) ret = iwr.u.data.flags; return ret; } -int wext_private_command_with_retval(const char *ifname, char *cmd, char *ret_buf, int ret_len) -{ +int wext_private_command_with_retval(const char *ifname, char *cmd, + char *ret_buf, int ret_len) { struct iwreq iwr; - int ret = 0, buf_size; + int ret = -1, buf_size; char *buf; - - buf_size = 128; - if(strlen(cmd) >= buf_size) - buf_size = strlen(cmd) + 1; // 1 : '\0' - buf = (char*)pvPortMalloc(buf_size); - if(!buf){ - wext_printf("WEXT: Can't malloc memory\n"); - return -1; - } - memset(buf, 0, buf_size); - strcpy(buf, cmd); - memset(&iwr, 0, sizeof(iwr)); - iwr.u.data.pointer = buf; - iwr.u.data.length = buf_size; - iwr.u.data.flags = 0; - if ((ret = iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr)) < 0) { - wext_printf("ioctl[SIOCDEVPRIVATE] error. ret=%d\n", ret); + buf_size = 128; + if (strlen(cmd) >= buf_size) + buf_size = strlen(cmd) + 1; // 1 : '\0' + buf = (char*) pvPortMalloc(buf_size); + if (buf != NULL) { + memset(buf, 0, buf_size); + strcpy(buf, cmd); + memset(&iwr, 0, sizeof(iwr)); + iwr.u.data.pointer = buf; + iwr.u.data.length = buf_size; + iwr.u.data.flags = 0; + ret = iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr); + if (ret >= 0 & ret_buf != NULL) { + if (ret_len > iwr.u.data.length) + ret_len = iwr.u.data.length; + memcpy(ret_buf, (char *) iwr.u.data.pointer, ret_len); + } + vPortFree(buf); } - if(ret_buf){ - if(ret_len > iwr.u.data.length) - ret_len = iwr.u.data.length; - rtw_memcpy(ret_buf, (char *) iwr.u.data.pointer, ret_len); - } - vPortFree(buf); +#if CONFIG_DEBUG_LOG > 3 + else + error_printf("%s: Can't malloc memory!\n", __func__); +#endif return ret; } -int wext_private_command(const char *ifname, char *cmd, int show_msg) -{ +int wext_private_command(const char *ifname, char *cmd, int show_msg) { struct iwreq iwr; - int ret = 0, buf_size; + int ret = -1, buf_size; char *buf; - u8 cmdname[17] = {0}; // IFNAMSIZ+1 + u8 cmdname[17] = { 0 }; // IFNAMSIZ+1 sscanf(cmd, "%16s", cmdname); - if((strcmp((const char *)cmdname, "config_get") == 0) - || (strcmp((const char *)cmdname, "config_set") == 0) - || (strcmp((const char *)cmdname, "efuse_get") == 0) - || (strcmp((const char *)cmdname, "efuse_set") == 0) - || (strcmp((const char *)cmdname, "mp_psd") == 0)) - buf_size = 2600;//2600 for config_get rmap,0,512 (or realmap) + if ((strcmp((const char *)cmdname, "config_get") == 0) + || (strcmp((const char *)cmdname, "config_set") == 0) + || (strcmp((const char *)cmdname, "efuse_get") == 0) + || (strcmp((const char *)cmdname, "efuse_set") == 0) + || (strcmp((const char *)cmdname, "mp_psd") == 0)) + buf_size = 2600; //2600 for config_get rmap,0,512 (or realmap) else buf_size = 512; - if(strlen(cmd) >= buf_size) + if (strlen(cmd) >= buf_size) buf_size = strlen(cmd) + 1; // 1 : '\0' - buf = (char*)pvPortMalloc(buf_size); - if(!buf){ - wext_printf("WEXT: Can't malloc memory\n"); - return -1; - } - memset(buf, 0, buf_size); - strcpy(buf, cmd); - memset(&iwr, 0, sizeof(iwr)); - iwr.u.data.pointer = buf; - iwr.u.data.length = buf_size; - iwr.u.data.flags = 0; + buf = (char*) pvPortMalloc(buf_size); + if (buf != NULL) { + memset(buf, 0, buf_size); + strcpy(buf, cmd); + memset(&iwr, 0, sizeof(iwr)); + iwr.u.data.pointer = buf; + iwr.u.data.length = buf_size; + iwr.u.data.flags = 0; - if ((ret = iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr)) < 0) { - wext_printf("ioctl[SIOCDEVPRIVATE] error. ret=%d\n", ret); + ret = iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr); + if (ret >= 0 && show_msg && iwr.u.data.length) { +#if CONFIG_DEBUG_LOG > 3 + if (iwr.u.data.length > buf_size) + error_printf("%s: Can't malloc memory!\n", __func__); + info_printf("Private Message: %s\n", (char * ) iwr.u.data.pointer); +#endif + } + vPortFree(buf); } - if (show_msg && iwr.u.data.length) { - if(iwr.u.data.length > buf_size) - wext_printf("WEXT: Malloc memory is not enough\n"); - wext_printf("Private Message: %s\n", (char *) iwr.u.data.pointer); - } - vPortFree(buf); +#if CONFIG_DEBUG_LOG > 3 + else + error_printf("%s: Can't malloc memory!\n", __func__); +#endif return ret; } -void wext_wlan_indicate(unsigned int cmd, union iwreq_data *wrqu, char *extra) -{ - unsigned char null_mac[6] = {0}; +void wext_wlan_indicate(unsigned int cmd, union iwreq_data *wrqu, char *extra) { + unsigned char null_mac[6] = { 0 }; - switch(cmd) - { - case SIOCGIWAP: - if(wrqu->ap_addr.sa_family == ARPHRD_ETHER) - { - if(!memcmp(wrqu->ap_addr.sa_data, null_mac, sizeof(null_mac))) - wifi_indication(WIFI_EVENT_DISCONNECT, NULL, 0, 0); - else - wifi_indication(WIFI_EVENT_CONNECT, wrqu->ap_addr.sa_data, sizeof(null_mac), 0); - } - break; - - case IWEVCUSTOM: - if(extra) - { - if(!memcmp(IW_EXT_STR_FOURWAY_DONE, extra, strlen(IW_EXT_STR_FOURWAY_DONE))) - wifi_indication(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, extra, strlen(IW_EXT_STR_FOURWAY_DONE), 0); - else if(!memcmp(IW_EXT_STR_RECONNECTION_FAIL, extra, strlen(IW_EXT_STR_RECONNECTION_FAIL))) - wifi_indication(WIFI_EVENT_RECONNECTION_FAIL, extra, strlen(IW_EXT_STR_RECONNECTION_FAIL), 0); - else if(!memcmp(IW_EVT_STR_NO_NETWORK, extra, strlen(IW_EVT_STR_NO_NETWORK))) - wifi_indication(WIFI_EVENT_NO_NETWORK, extra, strlen(IW_EVT_STR_NO_NETWORK), 0); -#if CONFIG_ENABLE_P2P || defined(CONFIG_AP_MODE) - else if(!memcmp(IW_EVT_STR_STA_ASSOC, extra, strlen(IW_EVT_STR_STA_ASSOC))) - wifi_indication(WIFI_EVENT_STA_ASSOC, wrqu->data.pointer, wrqu->data.length, 0); - else if(!memcmp(IW_EVT_STR_STA_DISASSOC, extra, strlen(IW_EVT_STR_STA_DISASSOC))) - wifi_indication(WIFI_EVENT_STA_DISASSOC, wrqu->addr.sa_data, sizeof(null_mac), 0); - else if(!memcmp(IW_EVT_STR_SEND_ACTION_DONE, extra, strlen(IW_EVT_STR_SEND_ACTION_DONE))) - wifi_indication(WIFI_EVENT_SEND_ACTION_DONE, NULL, 0, wrqu->data.flags); -#endif - } - break; - case SIOCGIWSCAN: - if(wrqu->data.pointer == NULL) - wifi_indication(WIFI_EVENT_SCAN_DONE, NULL, 0, 0); + switch (cmd) { + case SIOCGIWAP: + if (wrqu->ap_addr.sa_family == ARPHRD_ETHER) { + if (!memcmp(wrqu->ap_addr.sa_data, null_mac, sizeof(null_mac))) + wifi_indication(WIFI_EVENT_DISCONNECT, NULL, 0, 0); else - wifi_indication(WIFI_EVENT_SCAN_RESULT_REPORT, wrqu->data.pointer, wrqu->data.length, 0); - break; + wifi_indication(WIFI_EVENT_CONNECT, wrqu->ap_addr.sa_data, + sizeof(null_mac), 0); + } + break; + + case IWEVCUSTOM: + if (extra) { +#if CONFIG_DEBUG_LOG > 4 + info_printf("IWEVCUSTOM '%s'\n", extra); +#endif + if (!memcmp(IW_EXT_STR_FOURWAY_DONE, extra, + strlen(IW_EXT_STR_FOURWAY_DONE))) + wifi_indication(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, extra, + strlen(IW_EXT_STR_FOURWAY_DONE), 0); + else if (!memcmp(IW_EXT_STR_RECONNECTION_FAIL, extra, + strlen(IW_EXT_STR_RECONNECTION_FAIL))) + wifi_indication(WIFI_EVENT_RECONNECTION_FAIL, extra, + strlen(IW_EXT_STR_RECONNECTION_FAIL), 0); + else if (!memcmp(IW_EVT_STR_NO_NETWORK, extra, + strlen(IW_EVT_STR_NO_NETWORK))) + wifi_indication(WIFI_EVENT_NO_NETWORK, extra, + strlen(IW_EVT_STR_NO_NETWORK), 0); +#if CONFIG_ENABLE_P2P || defined(CONFIG_AP_MODE) + else if (!memcmp(IW_EVT_STR_STA_ASSOC, extra, + strlen(IW_EVT_STR_STA_ASSOC))) + wifi_indication(WIFI_EVENT_STA_ASSOC, wrqu->data.pointer, + wrqu->data.length, 0); + else if (!memcmp(IW_EVT_STR_STA_DISASSOC, extra, + strlen(IW_EVT_STR_STA_DISASSOC))) + wifi_indication(WIFI_EVENT_STA_DISASSOC, wrqu->addr.sa_data, + sizeof(null_mac), 0); + else if (!memcmp(IW_EVT_STR_SEND_ACTION_DONE, extra, + strlen(IW_EVT_STR_SEND_ACTION_DONE))) + wifi_indication(WIFI_EVENT_SEND_ACTION_DONE, NULL, 0, + wrqu->data.flags); +#endif + } + break; + case SIOCGIWSCAN: + if (wrqu->data.pointer == NULL) + wifi_indication(WIFI_EVENT_SCAN_DONE, NULL, 0, 0); + else + wifi_indication(WIFI_EVENT_SCAN_RESULT_REPORT, wrqu->data.pointer, + wrqu->data.length, 0); + break; #if CONFIG_ENABLE_P2P - case IWEVMGNTRECV: - wifi_indication(WIFI_EVENT_RX_MGNT, wrqu->data.pointer, wrqu->data.length, wrqu->data.flags); - break; + case IWEVMGNTRECV: + wifi_indication(WIFI_EVENT_RX_MGNT, wrqu->data.pointer, + wrqu->data.length, wrqu->data.flags); + break; #endif #ifdef REPORT_STA_EVENT case IWEVREGISTERED: - if(wrqu->addr.sa_family == ARPHRD_ETHER) - wifi_indication(WIFI_EVENT_STA_ASSOC, wrqu->addr.sa_data, sizeof(null_mac), 0); - break; + if(wrqu->addr.sa_family == ARPHRD_ETHER) + wifi_indication(WIFI_EVENT_STA_ASSOC, wrqu->addr.sa_data, sizeof(null_mac), 0); + break; case IWEVEXPIRED: - if(wrqu->addr.sa_family == ARPHRD_ETHER) - wifi_indication(WIFI_EVENT_STA_DISASSOC, wrqu->addr.sa_data, sizeof(null_mac), 0); - break; + if(wrqu->addr.sa_family == ARPHRD_ETHER) + wifi_indication(WIFI_EVENT_STA_DISASSOC, wrqu->addr.sa_data, sizeof(null_mac), 0); + break; #endif - default: - break; - + default: +#if CONFIG_DEBUG_LOG > 4 + info_printf("\nwlan_indicate: %p!\n", cmd); +#endif + break; } - } - -int wext_send_eapol(const char *ifname, char *buf, __u16 buf_len, __u16 flags) -{ +int wext_send_eapol(const char *ifname, char *buf, __u16 buf_len, __u16 flags) { struct iwreq iwr; - int ret = 0; - memset(&iwr, 0, sizeof(iwr)); iwr.u.data.pointer = buf; iwr.u.data.length = buf_len; - iwr.u.data.flags = flags; - if (iw_ioctl(ifname, SIOCSIWEAPOLSEND, &iwr) < 0) { - wext_printf("ioctl[SIOCSIWEAPOLSEND] error\n"); - ret = -1; - } - return ret; + iwr.u.data.flags = flags; + return iw_ioctl(ifname, SIOCSIWEAPOLSEND, &iwr); } - - #if CONFIG_ENABLE_P2P -int wext_send_mgnt(const char *ifname, char *buf, __u16 buf_len, __u16 flags) -{ +int wext_send_mgnt(const char *ifname, char *buf, __u16 buf_len, __u16 flags) { struct iwreq iwr; - int ret = 0; - memset(&iwr, 0, sizeof(iwr)); iwr.u.data.pointer = buf; iwr.u.data.length = buf_len; - iwr.u.data.flags = flags; - if (iw_ioctl(ifname, SIOCSIWMGNTSEND, &iwr) < 0) { - wext_printf("ioctl[SIOCSIWMGNTSEND] error\n"); - ret = -1; - } - return ret; + iwr.u.data.flags = flags; + return iw_ioctl(ifname, SIOCSIWMGNTSEND, &iwr); } #endif -int wext_set_gen_ie(const char *ifname, char *buf, __u16 buf_len, __u16 flags) -{ +int wext_set_gen_ie(const char *ifname, char *buf, __u16 buf_len, __u16 flags) { struct iwreq iwr; - int ret = 0; - memset(&iwr, 0, sizeof(iwr)); iwr.u.data.pointer = buf; iwr.u.data.length = buf_len; - iwr.u.data.flags = flags; - if (iw_ioctl(ifname, SIOCSIWGENIE, &iwr) < 0) { - wext_printf("ioctl[SIOCSIWGENIE] error\n"); - ret = -1; - } - return ret; + iwr.u.data.flags = flags; + return iw_ioctl(ifname, SIOCSIWGENIE, &iwr); } -int wext_set_autoreconnect(const char *ifname, __u8 mode, __u8 retyr_times, __u16 timeout) -{ +int wext_set_autoreconnect(const char *ifname, __u8 mode, __u8 retyr_times, + __u16 timeout) { struct iwreq iwr; int ret = 0; - __u8 *para = NULL; - int cmd_len = 0; - + __u8 para[sizeof("SetAutoRecnt") + 4]; + int cmd_len = sizeof("SetAutoRecnt"); memset(&iwr, 0, sizeof(iwr)); - cmd_len = sizeof("SetAutoRecnt"); - para = pvPortMalloc((4) + cmd_len);//size:para_len+cmd_len - if(para == NULL) return -1; - //Cmd - snprintf((char*)para, cmd_len, "SetAutoRecnt"); + snprintf((char*) para, cmd_len, "SetAutoRecnt"); //length - *(para+cmd_len) = mode; //para1 - *(para+cmd_len+1) = retyr_times; //para2 - *(para+cmd_len+2) = timeout; //para3 - - iwr.u.data.pointer = para; - iwr.u.data.length = (4) + cmd_len; - if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) { - wext_printf("wext_set_autoreconnect():ioctl[SIOCDEVPRIVATE] error\n"); - ret = -1; - } - vPortFree(para); - return ret; + *(para + cmd_len) = mode; //para1 + *(para + cmd_len + 1) = retyr_times; //para2 + *(para + cmd_len + 2) = timeout; //para3 + iwr.u.data.pointer = ¶[0]; + iwr.u.data.length = sizeof(para); + return iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr); } -int wext_get_autoreconnect(const char *ifname, __u8 *mode) -{ +int wext_get_autoreconnect(const char *ifname, __u8 *mode) { struct iwreq iwr; - int ret = 0; - __u8 *para = NULL; - int cmd_len = 0; - + __u8 para[sizeof("GetAutoRecnt") + 1]; + int cmd_len = sizeof("GetAutoRecnt"); memset(&iwr, 0, sizeof(iwr)); - cmd_len = sizeof("GetAutoRecnt"); - para = pvPortMalloc(cmd_len);//size:para_len+cmd_len //Cmd - snprintf((char*)para, cmd_len, "GetAutoRecnt"); + snprintf((char*) para, cmd_len, "GetAutoRecnt"); //length - - iwr.u.data.pointer = para; + iwr.u.data.pointer = ¶[0]; iwr.u.data.length = cmd_len; - if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) { - wext_printf("wext_get_autoreconnect():ioctl[SIOCDEVPRIVATE] error\n"); - ret = -1; - } - *mode = *(__u8 *)(iwr.u.data.pointer); - vPortFree(para); + int ret = iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr); + if (ret >= 0) + *mode = *(__u8 *) (iwr.u.data.pointer); return ret; } -int wext_get_drv_ability(const char *ifname, __u32 *ability) -{ - int ret = 0; - char * buf = (char *)rtw_zmalloc(33); - if(buf == NULL) return -1; - - snprintf(buf, 33, "get_drv_ability %x", ability); - ret = wext_private_command(ifname, buf, 0); - - rtw_free(buf); +int wext_get_drv_ability(const char *ifname, __u32 *ability) { + int ret = -1; + char * buf = (char *) pvPortMalloc(33); + if (buf != NULL) { + memset(buf, 0, 33); + snprintf(buf, 33, "get_drv_ability %x", ability); + ret = wext_private_command(ifname, buf, 0); + vPortFree(buf); + } +#if CONFIG_DEBUG_LOG > 3 + else + error_printf("%s: Can't malloc memory!\n", __func__); +#endif return ret; } #ifdef CONFIG_CUSTOM_IE -int wext_add_custom_ie(const char *ifname, void *cus_ie, int ie_num) -{ +int wext_add_custom_ie(const char *ifname, void *cus_ie, int ie_num) { struct iwreq iwr; - int ret = 0; - __u8 *para = NULL; - int cmd_len = 0; - if(ie_num <= 0 || !cus_ie){ - wext_printf("wext_add_custom_ie():wrong parameter\n"); - ret = -1; - return ret; + int ret = -1; + __u8 *para; + int cmd_len = sizeof("SetCusIE"); + if (ie_num <= 0 || !cus_ie) { +#if CONFIG_DEBUG_LOG > 3 + wext_printf("%s: wrong parameter!\n", __func__); +#endif + } else { + memset(&iwr, 0, sizeof(iwr)); + para = pvPortMalloc((4) * 2 + cmd_len); //size:addr len+cmd_len + if (para != NULL) { + //Cmd + snprintf(para, cmd_len, "SetCusIE"); + //addr length + *(__u32 *) (para + cmd_len) = (__u32 ) cus_ie; //ie addr + //ie_num + *(__u32 *) (para + cmd_len + 4) = ie_num; //num of ie + + iwr.u.data.pointer = para; + iwr.u.data.length = (4) * 2 + cmd_len; // 2 input + ret = iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr); + vPortFree(para); + } +#if CONFIG_DEBUG_LOG > 3 + else + error_printf("%s: Can't malloc memory!\n", __func__); +#endif } - memset(&iwr, 0, sizeof(iwr)); - cmd_len = sizeof("SetCusIE"); - para = pvPortMalloc((4)* 2 + cmd_len);//size:addr len+cmd_len - if(para == NULL) return -1; - - //Cmd - snprintf(para, cmd_len, "SetCusIE"); - //addr length - *(__u32 *)(para + cmd_len) = (__u32)cus_ie; //ie addr - //ie_num - *(__u32 *)(para + cmd_len + 4) = ie_num; //num of ie - - iwr.u.data.pointer = para; - iwr.u.data.length = (4)* 2 + cmd_len;// 2 input - if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) { - wext_printf("wext_add_custom_ie():ioctl[SIOCDEVPRIVATE] error\n"); - ret = -1; - } - vPortFree(para); - return ret; } -int wext_update_custom_ie(const char *ifname, void * cus_ie, int ie_index) -{ +int wext_update_custom_ie(const char *ifname, void * cus_ie, int ie_index) { struct iwreq iwr; - int ret = 0; + int ret = -1; __u8 *para = NULL; - int cmd_len = 0; - if(ie_index <= 0 || !cus_ie){ - wext_printf("wext_update_custom_ie():wrong parameter\n"); - ret = -1; - return ret; + int cmd_len = sizeof("UpdateIE"); + if (ie_index <= 0 || !cus_ie) { +#if CONFIG_DEBUG_LOG > 3 + wext_printf("%s: wrong parameter!\n", __func__); +#endif + } else { + memset(&iwr, 0, sizeof(iwr)); + cmd_len = para = pvPortMalloc((4) * 2 + cmd_len); //size:addr len+cmd_len + if (para != NULL) { + //Cmd + snprintf(para, cmd_len, "UpdateIE"); + //addr length + *(__u32 *) (para + cmd_len) = (__u32 ) cus_ie; //ie addr + //ie_index + *(__u32 *) (para + cmd_len + 4) = ie_index; //num of ie + + iwr.u.data.pointer = para; + iwr.u.data.length = (4) * 2 + cmd_len; // 2 input + ret = iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr); + vPortFree(para); + } +#if CONFIG_DEBUG_LOG > 3 + else + error_printf("%s: Can't malloc memory!\n", __func__); +#endif } - memset(&iwr, 0, sizeof(iwr)); - cmd_len = sizeof("UpdateIE"); - para = pvPortMalloc((4)* 2 + cmd_len);//size:addr len+cmd_len - if(para == NULL) return -1; - - //Cmd - snprintf(para, cmd_len, "UpdateIE"); - //addr length - *(__u32 *)(para + cmd_len) = (__u32)cus_ie; //ie addr - //ie_index - *(__u32 *)(para + cmd_len + 4) = ie_index; //num of ie - - iwr.u.data.pointer = para; - iwr.u.data.length = (4)* 2 + cmd_len;// 2 input - if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) { - wext_printf("wext_update_custom_ie():ioctl[SIOCDEVPRIVATE] error\n"); - ret = -1; - } - vPortFree(para); - return ret; - } -int wext_del_custom_ie(const char *ifname) -{ +int wext_del_custom_ie(const char *ifname) { struct iwreq iwr; - int ret = 0; - __u8 *para = NULL; - int cmd_len = 0; - + __u8 para[sizeof("DelIE")]; memset(&iwr, 0, sizeof(iwr)); - cmd_len = sizeof("DelIE"); - para = pvPortMalloc(cmd_len);//size:addr len+cmd_len //Cmd - snprintf(para, cmd_len, "DelIE"); - - iwr.u.data.pointer = para; - iwr.u.data.length = cmd_len; - if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) { - wext_printf("wext_del_custom_ie():ioctl[SIOCDEVPRIVATE] error\n"); - ret = -1; - } - vPortFree(para); - - return ret; - - + snprintf(para, sizeof("DelIE"), "DelIE"); + iwr.u.data.pointer = ¶[0]; + iwr.u.data.length = sizeof("DelIE"); + return iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr); } #endif #ifdef CONFIG_AP_MODE -int wext_enable_forwarding(const char *ifname) -{ +int wext_set_forwarding(const char *ifname, char flg) { struct iwreq iwr; - int ret = 0; - __u8 *para = NULL; - int cmd_len = 0; - + __u8 para[sizeof("forwarding_set") + 1]; + int cmd_len = sizeof("forwarding_set"); memset(&iwr, 0, sizeof(iwr)); - cmd_len = sizeof("forwarding_set"); - para = pvPortMalloc(cmd_len + 1); - if(para == NULL) return -1; - // forwarding_set 1 snprintf((char *) para, cmd_len, "forwarding_set"); - *(para + cmd_len) = '1'; - + *(para + cmd_len) = flg; iwr.u.essid.pointer = para; iwr.u.essid.length = cmd_len + 1; - - if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) { - wext_printf("wext_enable_forwarding(): ioctl[SIOCDEVPRIVATE] error\n"); - ret = -1; - } - - vPortFree(para); - return ret; + return iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr); +} +int wext_enable_forwarding(const char *ifname) { + return wext_set_forwarding(ifname, '1'); } -int wext_disable_forwarding(const char *ifname) -{ - struct iwreq iwr; - int ret = 0; - __u8 *para = NULL; - int cmd_len = 0; - - memset(&iwr, 0, sizeof(iwr)); - cmd_len = sizeof("forwarding_set"); - para = pvPortMalloc(cmd_len + 1); - if(para == NULL) return -1; - - // forwarding_set 0 - snprintf((char *) para, cmd_len, "forwarding_set"); - *(para + cmd_len) = '0'; - - iwr.u.essid.pointer = para; - iwr.u.essid.length = cmd_len + 1; - - if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) { - wext_printf("wext_disable_forwarding(): ioctl[SIOCDEVPRIVATE] error\n"); - ret = -1; - } - - vPortFree(para); - return ret; - +int wext_disable_forwarding(const char *ifname) { + return wext_set_forwarding(ifname, '0'); } #endif #ifdef CONFIG_CONCURRENT_MODE -int wext_set_ch_deauth(const char *ifname, __u8 enable) -{ - int ret = 0; - char * buf = (char *)rtw_zmalloc(16); - if(buf == NULL) return -1; - +int wext_set_ch_deauth(const char *ifname, __u8 enable) { + char buf[16]; + memset(buf, 0, 16); snprintf(buf, 16, "SetChDeauth %d", enable); - ret = wext_private_command(ifname, buf, 0); - - rtw_free(buf); - return ret; + return wext_private_command(ifname, buf, 0); } #endif -int wext_set_adaptivity(rtw_adaptivity_mode_t adaptivity_mode) -{ +int wext_set_adaptivity(rtw_adaptivity_mode_t adaptivity_mode) { extern u8 rtw_adaptivity_en; extern u8 rtw_adaptivity_mode; - switch(adaptivity_mode){ - case RTW_ADAPTIVITY_NORMAL: - rtw_adaptivity_en = 1; // enable adaptivity - rtw_adaptivity_mode = RTW_ADAPTIVITY_MODE_NORMAL; - break; - case RTW_ADAPTIVITY_CARRIER_SENSE: - rtw_adaptivity_en = 1; // enable adaptivity - rtw_adaptivity_mode = RTW_ADAPTIVITY_MODE_CARRIER_SENSE; - break; - case RTW_ADAPTIVITY_DISABLE: - default: - rtw_adaptivity_en = 0; //disable adaptivity - break; + switch (adaptivity_mode) { + case RTW_ADAPTIVITY_NORMAL: + rtw_adaptivity_en = 1; // enable adaptivity + rtw_adaptivity_mode = RTW_ADAPTIVITY_MODE_NORMAL; + break; + case RTW_ADAPTIVITY_CARRIER_SENSE: + rtw_adaptivity_en = 1; // enable adaptivity + rtw_adaptivity_mode = RTW_ADAPTIVITY_MODE_CARRIER_SENSE; + break; + case RTW_ADAPTIVITY_DISABLE: + default: + rtw_adaptivity_en = 0; //disable adaptivity + break; } return 0; } -int wext_set_adaptivity_th_l2h_ini(__u8 l2h_threshold) -{ +int wext_set_adaptivity_th_l2h_ini(__u8 l2h_threshold) { extern s8 rtw_adaptivity_th_l2h_ini; - rtw_adaptivity_th_l2h_ini = (__s8)l2h_threshold; + rtw_adaptivity_th_l2h_ini = (__s8 ) l2h_threshold; return 0; } -extern int rltk_get_auto_chl(const char *ifname, unsigned char *channel_set, int channel_num); +extern int rltk_get_auto_chl(const char *ifname, unsigned char *channel_set, + int channel_num); -int wext_get_auto_chl(const char *ifname, unsigned char *channel_set, unsigned char channel_num) -{ +int wext_get_auto_chl(const char *ifname, unsigned char *channel_set, + unsigned char channel_num) { int ret = -1; int channel = 0; wext_disable_powersave(ifname); - if((channel = rltk_get_auto_chl(ifname,channel_set,channel_num)) != 0 ) - ret = channel ; + if ((channel = rltk_get_auto_chl(ifname, channel_set, channel_num)) != 0) + ret = channel; wext_enable_powersave(ifname, 1, 1); return ret; } extern int rltk_set_sta_num(unsigned char ap_sta_num); -int wext_set_sta_num(unsigned char ap_sta_num) -{ +int wext_set_sta_num(unsigned char ap_sta_num) { return rltk_set_sta_num(ap_sta_num); } extern int rltk_del_station(const char *ifname, unsigned char *hwaddr); -int wext_del_station(const char *ifname, unsigned char* hwaddr) -{ +int wext_del_station(const char *ifname, unsigned char* hwaddr) { return rltk_del_station(ifname, hwaddr); } extern struct list_head *mf_list_head; -int wext_init_mac_filter(void) -{ - if(mf_list_head != NULL){ - return -1; +int wext_init_mac_filter(void) { + int ret = -1; + if (mf_list_head == NULL) { + mf_list_head = malloc(sizeof(struct list_head)); + if (mf_list_head != NULL) { + INIT_LIST_HEAD(mf_list_head); + ret = 0; + } +#if CONFIG_DEBUG_LOG > 3 + else error_printf("%s: Can't malloc memory!\n", __func__); +#endif } - - mf_list_head = malloc(sizeof(struct list_head)); - if(mf_list_head == NULL){ - wext_printf("ERROR: %s : can't allocate mf_list_head\n",__func__); - return -1; - } - - INIT_LIST_HEAD(mf_list_head); - - return 0; + return ret; } -int wext_deinit_mac_filter(void) -{ - if(mf_list_head == NULL){ - return -1; - } - struct list_head *iterator; - rtw_mac_filter_list_t *item; - list_for_each(iterator, mf_list_head) { - item = list_entry(iterator, rtw_mac_filter_list_t, node); - list_del(iterator); - free(item); - item = NULL; - iterator = mf_list_head; - } - - free(mf_list_head); - mf_list_head = NULL; - return 0; -} - -int wext_add_mac_filter(unsigned char* hwaddr) -{ - if(mf_list_head == NULL){ - return -1; - } - - rtw_mac_filter_list_t *mf_list_new; - mf_list_new = malloc(sizeof(rtw_mac_filter_list_t)); - if(mf_list_new == NULL){ - wext_printf("ERROR: %s : can't allocate mf_list_new",__func__); - return -1; - } - memcpy(mf_list_new->mac_addr,hwaddr,6); - list_add(&(mf_list_new->node), mf_list_head); - - return 0; -} - -int wext_del_mac_filter(unsigned char* hwaddr) -{ - if(mf_list_head == NULL){ - return -1; - } - - struct list_head *iterator; - rtw_mac_filter_list_t *item; - list_for_each(iterator, mf_list_head) { - item = list_entry(iterator, rtw_mac_filter_list_t, node); - if(memcmp(item->mac_addr,hwaddr,6) == 0){ +int wext_deinit_mac_filter(void) { + int ret = -1; + if (mf_list_head != NULL) { + struct list_head *iterator; + rtw_mac_filter_list_t *item; + list_for_each(iterator, mf_list_head) + { + item = list_entry(iterator, rtw_mac_filter_list_t, node); list_del(iterator); free(item); item = NULL; - return 0; + iterator = mf_list_head; + } + free(mf_list_head); + mf_list_head = NULL; + ret = 0; + } + return ret; +} + +int wext_add_mac_filter(unsigned char* hwaddr) { + int ret = -1; + if (mf_list_head != NULL) { + rtw_mac_filter_list_t *mf_list_new; + mf_list_new = malloc(sizeof(rtw_mac_filter_list_t)); + if (mf_list_new != NULL) { + memcpy(mf_list_new->mac_addr, hwaddr, 6); + list_add(&(mf_list_new->node), mf_list_head); + ret = 0; + } +#if CONFIG_DEBUG_LOG > 3 + else error_printf("%s: Can't malloc memory!\n", __func__); +#endif + } + return ret; +} + +int wext_del_mac_filter(unsigned char* hwaddr) { + int ret = -1; + if (mf_list_head != NULL) { + struct list_head *iterator; + rtw_mac_filter_list_t *item; + list_for_each(iterator, mf_list_head) + { + item = list_entry(iterator, rtw_mac_filter_list_t, node); + if (memcmp(item->mac_addr, hwaddr, 6) == 0) { + list_del(iterator); + free(item); + item = NULL; + ret = 0; + } } } - return -1; + return ret; } diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wifi_lib.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wifi_lib.h index 3a3b51c..76c9364 100644 --- a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wifi_lib.h +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wifi_lib.h @@ -7,15 +7,16 @@ #include "osdep_service.h" #include "freertos/wrapper.h" +#include "rtl_bios_data.h" -#define _atr_aligned2_ __attribute__((aligned(2))) -#define _atr_aligned4_ __attribute__((aligned(4))) -#define _atr_aligned8_ __attribute__((aligned(4))) +#define _atr_aligned2_ __attribute__((aligned(2))) +#define _atr_aligned4_ __attribute__((aligned(4))) +#define _atr_aligned8_ __attribute__((aligned(4))) #define sint8_t char #define sint16_t short #define sint32_t int -#define sint64_t long long +//#define sint64_t long long // warning align(8)! /* struct _ADAPTER; struct dvobj_priv; @@ -45,7 +46,7 @@ //typedef uint32_t dma_addr_t; // basic_types.h //typedef uint8_t uint8_t; //typedef uint16_t uint16_t; -//typedef unsigned sint64_t uint64_t; +//typedef unsigned sint64_t u8Byte; typedef int sint; typedef uint8_t BOOL; typedef uint8_t bool; @@ -55,6 +56,7 @@ typedef uint8_t u1Byte; typedef uint16_t u2Byte; typedef uint32_t u4Byte; typedef uint64_t u8Byte; +typedef uint64_t __attribute__((aligned(4))) _u8Byte; typedef sint8_t s1Byte; typedef sint16_t s2Byte; typedef sint32_t s4Byte; @@ -365,7 +367,6 @@ struct _NDIS_802_11_SSID { uint32_t SsidLength; uint8_t Ssid[36]; }; - typedef struct _NDIS_802_11_SSID NDIS_802_11_SSID; typedef uint8_t NDIS_802_11_MAC_ADDRESS[6]; typedef int NDIS_802_11_RSSI; @@ -545,7 +546,7 @@ struct mlme_priv { uint8_t key_mask; uint8_t acm_mask; uint8_t ChannelPlan; - RT_SCAN_TYPE scan_mode; + uint8_t scan_mode; // RT_SCAN_TYPE scan_mode; byte/dword ?? uint8_t *wps_probe_req_ie; uint32_t wps_probe_req_ie_len; uint8_t *wps_assoc_req_ie; @@ -566,12 +567,12 @@ struct mlme_priv { _lock bcn_update_lock; uint8_t update_bcn; uint8_t scanning_via_buddy_intf; - union recv_frame *p_copy_recv_frame; + struct recv_frame *p_copy_recv_frame; }; struct _atr_aligned4_ _RT_CHANNEL_INFO { uint8_t ChannelNum; - RT_SCAN_TYPE ScanType; + RT_SCAN_TYPE ScanType; // uint8_t ScanType; // byte/dword? uint8_t pscan_config; }; typedef struct _RT_CHANNEL_INFO RT_CHANNEL_INFO; @@ -603,22 +604,18 @@ struct WMM_para_element { struct AC_param ac_param[4]; }; -struct _atr_aligned4_ $FE810F6EACF8FAA6CBF1198AEAF43F3A { - uint16_t HT_caps_info; - uint8_t AMPDU_para; - uint8_t MCS_rate[16]; - uint16_t HT_ext_caps; - uint32_t Beamforming_caps; - uint8_t ASEL_caps; -}; - -union $4DB0E692E0E1D0D49E1F34B7B8486D8E { - struct $FE810F6EACF8FAA6CBF1198AEAF43F3A HT_cap_element; - uint8_t HT_cap[26]; -}; - struct HT_caps_element { - union $4DB0E692E0E1D0D49E1F34B7B8486D8E u; + union { + struct _atr_aligned4_ { + uint16_t HT_caps_info; + uint8_t AMPDU_para; + uint8_t MCS_rate[16]; + uint16_t HT_ext_caps; + uint32_t Beamforming_caps; + uint8_t ASEL_caps; + } HT_cap_element; + uint8_t HT_cap[26]; + }u; }; struct HT_info_element { @@ -685,8 +682,8 @@ typedef struct _cus_ie{ #endif /* _CUS_IE_ */ // typedef struct _cus_ie *p_cus_ie; -struct _atr_aligned2_ mlme_ext_priv { //__attribute__((packed))? - _adapter *padapter; +struct mlme_ext_priv { //__attribute__((packed))? + _adapter *padapter; //+0 padapter+1256 [912] uint8_t mlmeext_init; struct atomic_t event_seq; uint16_t mgnt_seq; @@ -698,15 +695,15 @@ struct _atr_aligned2_ mlme_ext_priv { //__attribute__((packed))? RT_CHANNEL_INFO channel_set[14]; uint8_t basicrate[13]; uint8_t datarate[13]; - struct ss_res sitesurvey_res; - struct mlme_ext_info mlmext_info; + struct ss_res sitesurvey_res; //padapter+1472 + struct mlme_ext_info mlmext_info; //padapter+1528 _timer survey_timer; _timer link_timer; - uint16_t chan_scan_time; - uint8_t scan_abort; - uint8_t tx_rate; - uint8_t retry; - uint64_t TSFValue; + uint16_t chan_scan_time; //padapter+1984 + uint8_t scan_abort; //padapter+1986 + uint8_t tx_rate; //padapter+1987 + uint8_t retry; //padapter+1988 + _u8Byte TSFValue; //+740? padapter+1992 uint8_t bstart_bss; uint16_t action_public_rxseq; _timer reconnect_timer; @@ -784,11 +781,11 @@ struct _atr_aligned8_ xmit_priv { uint8_t vcs_setting; uint8_t vcs; uint8_t vcs_type; - uint64_t tx_bytes; - uint64_t tx_pkts; - uint64_t tx_drop; - uint64_t last_tx_bytes; - uint64_t last_tx_pkts; + u8Byte tx_bytes; + u8Byte tx_pkts; + u8Byte tx_drop; + u8Byte last_tx_bytes; + u8Byte last_tx_pkts; struct hw_xmit *hwxmits; uint8_t hwxmit_entry; struct rtw_tx_ring tx_ring[8]; @@ -830,11 +827,11 @@ struct _atr_aligned8_ recv_priv { uint32_t free_recvframe_cnt; _adapter *adapter; uint32_t bIsAnyNonBEPkts; - uint64_t rx_bytes; - uint64_t rx_pkts; - uint64_t rx_drop; - uint64_t rx_overflow; - uint64_t last_rx_bytes; + u8Byte rx_bytes; + u8Byte rx_pkts; + u8Byte rx_drop; + u8Byte rx_overflow; + u8Byte last_rx_bytes; uint32_t rx_icv_err; uint32_t rx_largepacket_crcerr; uint32_t rx_smallpacket_crcerr; @@ -898,20 +895,20 @@ union Keytype { uint32_t lkey[4]; }; -struct $7EAAF07643C317F97751F130E632CB13 { - uint8_t TSC0; - uint8_t TSC1; - uint8_t TSC2; - uint8_t TSC3; - uint8_t TSC4; - uint8_t TSC5; - uint8_t TSC6; - uint8_t TSC7; -}; + union pn48 { - uint64_t val; - struct $7EAAF07643C317F97751F130E632CB13 _byte_; + u8Byte val; + struct { + uint8_t TSC0; + uint8_t TSC1; + uint8_t TSC2; + uint8_t TSC3; + uint8_t TSC4; + uint8_t TSC5; + uint8_t TSC6; + uint8_t TSC7; + }_byte_; }; struct _NDIS_802_11_WEP { @@ -1091,7 +1088,7 @@ struct _atr_aligned4_ pwrctrl_priv { uint8_t smart_ps; uint8_t bcn_ant_mode; uint32_t alives; - uint64_t wowlan_fw_iv; + u8Byte wowlan_fw_iv; uint8_t bpower_saving; uint8_t b_hw_radio_off; uint8_t reg_rfoff; @@ -1310,10 +1307,12 @@ struct recv_frame_hdr { struct sta_info *psta; }; -union recv_frame { +struct recv_frame { +union { _list list; struct recv_frame_hdr hdr; uint32_t mem[32]; + }; }; /* union $AB04817EA6EB89125E28056B7464A4D7 { @@ -1380,22 +1379,22 @@ struct sta_recv_priv { }; struct stainfo_stats { - uint64_t rx_mgnt_pkts; - uint64_t rx_ctrl_pkts; - uint64_t rx_data_pkts; - uint64_t last_rx_mgnt_pkts; - uint64_t last_rx_ctrl_pkts; - uint64_t last_rx_data_pkts; - uint64_t rx_bytes; - uint64_t tx_pkts; - uint64_t tx_bytes; + u8Byte rx_mgnt_pkts; + u8Byte rx_ctrl_pkts; + u8Byte rx_data_pkts; + u8Byte last_rx_mgnt_pkts; + u8Byte last_rx_ctrl_pkts; + u8Byte last_rx_data_pkts; + u8Byte rx_bytes; + u8Byte tx_pkts; + u8Byte tx_bytes; }; struct _RSSI_STA { int32_t UndecoratedSmoothedPWDB; int32_t UndecoratedSmoothedCCK; int32_t UndecoratedSmoothedOFDM; - uint64_t PacketMap; + u8Byte PacketMap; uint8_t ValidBit; uint32_t OFDM_pkt; }; @@ -1980,61 +1979,62 @@ struct hal_ops { struct _atr_aligned4_ _ADAPTER { uint16_t HardwareType; - uint16_t interface_type; + uint16_t interface_type; //+2 uint32_t work_mode; - struct dvobj_priv *dvobj; - struct mlme_priv mlmepriv; - struct mlme_ext_priv mlmeextpriv; - struct cmd_priv cmdpriv; - struct evt_priv evtpriv; + struct dvobj_priv *dvobj; //+8 + struct mlme_priv mlmepriv; //+12 [1244] + struct mlme_ext_priv mlmeextpriv; //+1256 [912] + struct cmd_priv cmdpriv; //+2168 + struct evt_priv evtpriv; //+ struct io_priv iopriv; - struct xmit_priv xmitpriv; - struct recv_priv recvpriv; - struct sta_priv stapriv; + struct xmit_priv xmitpriv; //+2248 + struct recv_priv recvpriv; //+2752 + struct sta_priv stapriv; //+3024 [164] struct security_priv securitypriv; struct registry_priv registrypriv; - struct pwrctrl_priv pwrctrlpriv; + struct pwrctrl_priv pwrctrlpriv; // pwrctrlpriv.bInternalAutoSuspend //+5061 struct eeprom_priv eeprompriv; PVOID HalData; uint32_t hal_data_sz; struct hal_ops HalFunc; - int32_t bDriverStopped; - int32_t bSurpriseRemoved; - int32_t bCardDisableWOHSM; - uint8_t RxStop; + int32_t bDriverStopped; //+5880 + int32_t bSurpriseRemoved; //+5884 + int32_t bCardDisableWOHSM; //+5888 + uint8_t RxStop; //+5892 uint32_t IsrContent; uint32_t ImrContent; uint8_t EepromAddressSize; - uint8_t hw_init_completed; + uint8_t hw_init_completed; //+5905 uint8_t bDriverIsGoingToUnload; uint8_t init_adpt_in_progress; uint8_t bMpDriver; uint8_t bForwardingDisabled; - struct task_struct isrThread; - struct task_struct cmdThread; - struct task_struct recvtasklet_thread; - struct task_struct xmittasklet_thread; - void (*intf_start)(_adapter *); - void (*intf_stop)(_adapter *); - _nic_hdl pnetdev; - int bup; + struct task_struct isrThread; //+5888 + struct task_struct cmdThread; //+5920 + struct task_struct recvtasklet_thread; //+5952 + struct task_struct xmittasklet_thread; //+5984 + void (*intf_start)(_adapter *); //+6008 + void (*intf_stop)(_adapter *); //+6012 + _nic_hdl pnetdev; //+6016 + int bup; //+6020 struct net_device_stats stats; - uint8_t net_closed; + uint8_t net_closed; //+6052 uint8_t bFWReady; uint8_t bLinkInfoDump; uint8_t bRxRSSIDisplay; - _adapter *pbuddy_adapter; - _mutex *hw_init_mutex; - uint8_t isprimary; - uint8_t adapter_type; - uint8_t iface_type; - _mutex *ph2c_fwcmd_mutex; - _mutex *psetch_mutex; - _mutex *psetbw_mutex; - struct co_data_priv *pcodatapriv; - uint8_t fix_rate; -}; + _adapter *pbuddy_adapter; //+6056 + _mutex *hw_init_mutex; //+6060 + uint8_t isprimary; //+6064 + uint8_t adapter_type; //+6065 + uint8_t iface_type; //+6056 + _mutex *ph2c_fwcmd_mutex; //+6068 + _mutex *psetch_mutex; //+6072 + _mutex *psetbw_mutex; //+6076 + struct co_data_priv *pcodatapriv; //+6080 + uint8_t fix_rate; //+6084 +}; // [6088] (!) typedef struct _ADAPTER *PADAPTER; +// if sizeof(struct _ADAPTER) != 6088 #error "Check aligned struct!" ! enum tag_HAL_IC_Type_Definition // : sint32_t { @@ -2315,7 +2315,7 @@ struct _ODM_NOISE_MONITOR_ { s2Byte noise_all; }; typedef struct _ODM_NOISE_MONITOR_ ODM_NOISE_MONITOR; - +/* in rtl_bios_data.h struct _FALSE_ALARM_STATISTICS { u4Byte Cnt_Parity_Fail; u4Byte Cnt_Rate_Illegal; @@ -2334,6 +2334,7 @@ struct _FALSE_ALARM_STATISTICS { u4Byte Cnt_BW_LSC; }; typedef struct _FALSE_ALARM_STATISTICS FALSE_ALARM_STATISTICS; +*/ enum _BASEBAND_CONFIG_PHY_REG_PG_VALUE_TYPE //: sint32_t { @@ -2341,6 +2342,7 @@ enum _BASEBAND_CONFIG_PHY_REG_PG_VALUE_TYPE //: sint32_t }; typedef enum _BASEBAND_CONFIG_PHY_REG_PG_VALUE_TYPE PHY_REG_PG_TYPE; +/* in rtl_bios_data.h struct _atr_aligned4_ _CFO_TRACKING_ { BOOLEAN bATCStatus; BOOLEAN largeCFOHit; @@ -2358,7 +2360,8 @@ struct _atr_aligned4_ _CFO_TRACKING_ { u1Byte CFO_TH_ATC; }; typedef struct _CFO_TRACKING_ CFO_TRACKING; - +*/ +/* in rtl_bios_data.h struct _atr_aligned8_ _ROM_INFO { u1Byte EEPROMVersion; u1Byte CrystalCap; @@ -2366,6 +2369,8 @@ struct _atr_aligned8_ _ROM_INFO { u4Byte DebugLevel; }; typedef struct _ROM_INFO ROM_INFO; +*/ + typedef struct _ROM_INFO *PROM_INFO; typedef struct sta_info *PSTA_INFO_T; @@ -3269,7 +3274,7 @@ typedef int (*mac_monitor_ptr)(uint8_t *, char); struct mlme_handler { uint32_t num; - uint32_t (*func)(_adapter *, union recv_frame *); + uint32_t (*func)(_adapter *, struct recv_frame *); }; struct fwevent { diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wlan_lib.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wlan_lib.h index 111e677..5559791 100644 --- a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wlan_lib.h +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/include/wlan_lib.h @@ -271,7 +271,7 @@ extern int rtw_ps_enable(int enable); extern int rltk_wifi_fw_test(int argc, char **argv); // Data declarations extern _list timer_table; -extern struct net_device *rltk_wlan_info; +extern Rltk_wlan_t rltk_wlan_info[2]; // in wrapper.h extern int timer_used_num; extern int max_timer_used_num; //-------------------------------- @@ -527,12 +527,12 @@ extern _sema *pExportWlanIrqSemaphore; // freertos_recv.o // Function declarations extern int rtw_os_recv_resource_init(struct recv_priv *precvpriv, _adapter *padapter); -extern int rtw_os_recv_resource_alloc(_adapter *padapter, union recv_frame *precvframe); +extern int rtw_os_recv_resource_alloc(_adapter *padapter, struct recv_frame *precvframe); extern int rtw_os_recvbuf_resource_alloc(_adapter *padapter, struct recv_buf *precvbuf); extern int rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf); extern int rtw_tkip_countermeasure(_adapter *padapter); extern void rtw_handle_tkip_mic_err(_adapter *padapter, int bgroup); -extern int rtw_recv_indicatepkt(_adapter *padapter, union recv_frame *precv_frame); +extern int rtw_recv_indicatepkt(_adapter *padapter, struct recv_frame *precv_frame); extern void rtw_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl); //-------------------------------- @@ -951,10 +951,10 @@ extern int32_t rtl8195a_init_recv_priv(_adapter *padapter); //-------------------------------- // rtl8195a_rxdesc.o // Function declarations -extern void process_rssi(_adapter *padapter, union recv_frame *prframe); +extern void process_rssi(_adapter *padapter, struct recv_frame *prframe); extern int32_t translate2dbm(int signal_strength_idx); -extern void rtl8195a_query_rx_desc_status(union recv_frame *precvframe, uint8_t *pdesc); -extern void rtl8195a_query_rx_phy_status(union recv_frame *precvframe, uint8_t *pphy_status, int a3); +extern void rtl8195a_query_rx_desc_status(struct recv_frame *precvframe, uint8_t *pdesc); +extern void rtl8195a_query_rx_phy_status(struct recv_frame *precvframe, uint8_t *pphy_status, int a3); // Data declarations //-------------------------------- // rtl8195a_xmit.o @@ -1057,16 +1057,16 @@ extern void (*p_wlan_autoreconnect_hdl)(rtw_security_t, char *, int, char *, int // Function declarations extern u8 *get_da(u8 *pframe); extern u8 *get_sa(u8 *pframe); -extern signed int OnAction(_adapter *padapter, union recv_frame *precv_frame); -extern signed int DoReserved(_adapter *padapter, union recv_frame *precv_frame); -extern void mgt_dispatcher(_adapter *padapter, struct mlme_handler *ptable, union recv_frame *precv_frame); +extern signed int OnAction(_adapter *padapter, struct recv_frame *precv_frame); +extern signed int DoReserved(_adapter *padapter, struct recv_frame *precv_frame); +extern void mgt_dispatcher(_adapter *padapter, struct mlme_handler *ptable, struct recv_frame *precv_frame); extern int rtw_is_channel_set_contains_channel(RT_CHANNEL_INFO *channel_set, const uint32_t channel_num, int *pchannel_idx); extern int init_hw_mlme_ext(_adapter *padapter); extern unsigned int init_channel_set(_adapter *padapter, int ChannelPlan, RT_CHANNEL_INFO *channel_set); extern void free_mlme_ext_priv(struct mlme_ext_priv *pmlmeext); -//void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame, int a3); -extern unsigned int OnAction_public(_adapter *padapter, union recv_frame *precv_frame); -extern signed int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame); +//void mgt_dispatcher(_adapter *padapter, struct recv_frame *precv_frame, int a3); +extern unsigned int OnAction_public(_adapter *padapter, struct recv_frame *precv_frame); +extern signed int OnAction_p2p(_adapter *padapter, struct recv_frame *precv_frame); extern struct xmit_frame *alloc_mgtxmitframe(struct xmit_priv *pxmitpriv); extern struct xmit_frame *alloc_FwRsvdframe(struct xmit_priv *pxmitpriv, uint32_t size); extern void update_mgnt_tx_rate(_adapter *padapter, uint8_t rate); @@ -1078,36 +1078,36 @@ extern void issue_action_BSSCoexistPacket(_adapter *padapter); extern uint32_t update_hidden_ssid(uint8_t *ies, uint32_t ies_len, int hidden_ssid_mode); extern void issue_beacon(_adapter *padapter); extern void issue_probersp(_adapter *padapter, u8 *da, uint8_t is_valid_p2p_probereq); -extern signed int OnProbeReq(_adapter *padapter, union recv_frame *precv_frame); +extern signed int OnProbeReq(_adapter *padapter, struct recv_frame *precv_frame); extern void issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, int blnbc); extern void issue_auth(_adapter *padapter, struct sta_info *psta, int status); -extern signed int OnAuth(_adapter *padapter, union recv_frame *precv_frame); +extern signed int OnAuth(_adapter *padapter, struct recv_frame *precv_frame); extern void issue_asocrsp(_adapter *padapter, uint16_t status, struct sta_info *pstat, int pkt_type); extern void issue_assocreq(_adapter *padapter); extern void issue_nulldata(_adapter *padapter, unsigned int power_mode); extern void issue_qos_nulldata(_adapter *padapter, u8 *da, uint16_t tid); extern void issue_deauth(_adapter *padapter, u8 *da, uint32_t reason); extern void issue_action_BA(_adapter *padapter, u8 *raddr, u8 action, uint16_t status); -extern signed int OnAction_back(_adapter *padapter, union recv_frame *precv_frame); +extern signed int OnAction_back(_adapter *padapter, struct recv_frame *precv_frame); extern signed int send_beacon(_adapter *padapter); -extern signed int collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSID_EX *bssid); +extern signed int collect_bss_info(_adapter *padapter, struct recv_frame *precv_frame, WLAN_BSSID_EX *bssid); extern void start_clnt_auth(_adapter *padapter); extern void start_clnt_assoc(_adapter *padapter); -extern signed int OnAuthClient(_adapter *padapter, union recv_frame *precv_frame); +extern signed int OnAuthClient(_adapter *padapter, struct recv_frame *precv_frame); extern int report_scan_result_one(_adapter *padapter, WLAN_BSSID_EX *bssid); extern int add_site_survey(_adapter *padapter, WLAN_BSSID_EX *bssid); -extern void report_survey_event(_adapter *padapter, union recv_frame *precv_frame); -extern signed int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame); +extern void report_survey_event(_adapter *padapter, struct recv_frame *precv_frame); +extern signed int OnProbeRsp(_adapter *padapter, struct recv_frame *precv_frame); extern void report_surveydone_event(_adapter *padapter); extern void report_join_res(_adapter *padapter, int res); -extern signed int OnAssocRsp(_adapter *padapter, union recv_frame *precv_frame); +extern signed int OnAssocRsp(_adapter *padapter, struct recv_frame *precv_frame); extern void report_del_sta_event(_adapter *padapter, u8 *MacAddr, uint16_t reason); extern signed int receive_disconnect(_adapter *padapter, u8 *MacAddr, uint16_t reason); -extern signed int OnBeacon(_adapter *padapter, union recv_frame *precv_frame); -extern signed int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame); -extern signed int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame); +extern signed int OnBeacon(_adapter *padapter, struct recv_frame *precv_frame); +extern signed int OnDeAuth(_adapter *padapter, struct recv_frame *precv_frame); +extern signed int OnDisassoc(_adapter *padapter, struct recv_frame *precv_frame); extern void report_add_sta_event(_adapter *padapter, u8 *MacAddr, int cam_idx); -extern signed int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame); +extern signed int OnAssocReq(_adapter *padapter, struct recv_frame *precv_frame); extern signed int rtw_port_switch_chk(_adapter *adapter); extern void update_sta_info(_adapter *padapter, struct sta_info *psta); extern void mlmeext_sta_del_event_callback(_adapter *padapter); @@ -1222,10 +1222,10 @@ extern const struct fwevent wlanevents[24]; /* = extern u8 *get_hdr_bssid(u8 *pframe); extern int filter_packet(u8 *buf, int length); extern signed int promisc_get_encrypt(_adapter *padapter, uint8_t *bssid); -extern void promisc_info_get(_adapter *padapter, union recv_frame *prframe, ieee80211_frame_info_t *ppromisc_info, int a4); +extern void promisc_info_get(_adapter *padapter, struct recv_frame *prframe, ieee80211_frame_info_t *ppromisc_info, int a4); extern void promisc_set_enable(_adapter *padapter, int enabled, int len_used); extern void promisc_deinit(_adapter *padapter); -extern int promisc_recv_func(_adapter *padapter, union recv_frame *rframe); +extern int promisc_recv_func(_adapter *padapter, struct recv_frame *rframe); extern int promisc_set(rtw_rcr_level_t enabled, void (*callback)(u8 *, unsigned int, void *), int len_used); extern int promisc_set_mgntframe(int result); extern int is_promisc_enabled(); @@ -1306,9 +1306,9 @@ extern sint rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter); extern void rtw_mfree_recv_priv_lock(struct recv_priv *precvpriv); extern struct list_head *rtw_alloc_recvframe(_queue *pfree_recv_queue); //struct list_head *rtw_alloc_recvframe(_queue *pfree_recv_queue, _irqL a2, int a3); -extern int rtw_free_recvframe(union recv_frame *precvframe, _queue *pfree_recv_queue); -extern sint rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue); -extern sint rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue); +extern int rtw_free_recvframe(struct recv_frame *precvframe, _queue *pfree_recv_queue); +extern sint rtw_enqueue_recvframe(struct recv_frame *precvframe, _queue *queue); +extern sint rtw_enqueue_recvframe(struct recv_frame *precvframe, _queue *queue); extern void rtw_free_recvframe_queue(_queue *pframequeue, _queue *pfree_recv_queue); extern int rtw_free_uc_swdec_pending_queue(_adapter *adapter, _irqL a2, int a3); extern void rtw_free_recv_priv(struct recv_priv *precvpriv); @@ -1316,34 +1316,34 @@ extern sint rtw_enqueue_recvbuf_to_head(struct recv_buf *precvbuf, _queue *queue extern uint32_t rtw_free_buf_pending_queue(_adapter *adapter); extern sint rtw_enqueue_recvbuf(struct recv_buf *precvbuf, _queue *queue); extern struct list_head *rtw_dequeue_recvbuf(_queue *queue, _irqL a2, int a3); -extern sint recvframe_chkmic(_adapter *adapter, union recv_frame *precvframe, int a3, int a4); -extern union recv_frame *decryptor(_adapter *padapter, union recv_frame *precv_frame); -extern union recv_frame *portctrl(_adapter *adapter, union recv_frame *precv_frame); -extern sint recv_decache(union recv_frame *precv_frame, uint8_t bretry, struct stainfo_rxcache *prxcache); -extern void process_pwrbit_data(_adapter *padapter, union recv_frame *precv_frame, int a3, int a4); -extern void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame); -extern void count_rx_stats(_adapter *padapter, union recv_frame *prframe, struct sta_info *sta); -extern sint sta2sta_data_frame(_adapter *adapter, union recv_frame *precv_frame, struct sta_info **psta, int a4); -extern sint ap2sta_data_frame(_adapter *adapter, union recv_frame *precv_frame, struct sta_info **psta); -extern sint sta2ap_data_frame(_adapter *adapter, union recv_frame *precv_frame, struct sta_info **psta); -extern sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame); -extern sint validate_recv_data_frame(_adapter *adapter, union recv_frame *precv_frame); -extern sint wlanhdr_to_ethhdr(union recv_frame *precvframe, int a2, int a3); -extern union recv_frame *recvframe_defrag(_adapter *adapter, _queue *defrag_q); -extern _queue *recvframe_chk_defrag(PADAPTER padapter, union recv_frame *precv_frame); -extern sint validate_recv_mgnt_frame(PADAPTER padapter, union recv_frame **pprecv_frame); -extern sint validate_recv_frame(_adapter *adapter, union recv_frame **pprecv_frame); -extern int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe); +extern sint recvframe_chkmic(_adapter *adapter, struct recv_frame *precvframe, int a3, int a4); +extern struct recv_frame *decryptor(_adapter *padapter, struct recv_frame *precv_frame); +extern struct recv_frame *portctrl(_adapter *adapter, struct recv_frame *precv_frame); +extern sint recv_decache(struct recv_frame *precv_frame, uint8_t bretry, struct stainfo_rxcache *prxcache); +extern void process_pwrbit_data(_adapter *padapter, struct recv_frame *precv_frame, int a3, int a4); +extern void process_wmmps_data(_adapter *padapter, struct recv_frame *precv_frame); +extern void count_rx_stats(_adapter *padapter, struct recv_frame *prframe, struct sta_info *sta); +extern sint sta2sta_data_frame(_adapter *adapter, struct recv_frame *precv_frame, struct sta_info **psta, int a4); +extern sint ap2sta_data_frame(_adapter *adapter, struct recv_frame *precv_frame, struct sta_info **psta); +extern sint sta2ap_data_frame(_adapter *adapter, struct recv_frame *precv_frame, struct sta_info **psta); +extern sint validate_recv_ctrl_frame(_adapter *padapter, struct recv_frame *precv_frame); +extern sint validate_recv_data_frame(_adapter *adapter, struct recv_frame *precv_frame); +extern sint wlanhdr_to_ethhdr(struct recv_frame *precvframe, int a2, int a3); +extern struct recv_frame *recvframe_defrag(_adapter *adapter, _queue *defrag_q); +extern _queue *recvframe_chk_defrag(PADAPTER padapter, struct recv_frame *precv_frame); +extern sint validate_recv_mgnt_frame(PADAPTER padapter, struct recv_frame **pprecv_frame); +extern sint validate_recv_frame(_adapter *adapter, struct recv_frame **pprecv_frame); +extern int amsdu_to_msdu(_adapter *padapter, struct recv_frame *prframe); extern int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, int seq_num); -extern int enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, union recv_frame *prframe); +extern int enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, struct recv_frame *prframe); extern int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *preorder_ctrl, int bforced); -extern int recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe, int a3); +extern int recv_indicatepkt_reorder(_adapter *padapter, struct recv_frame *prframe, int a3); extern void rtw_reordering_ctrl_timeout_handler(void *pcontext, _irqL a2); -extern int process_recv_indicatepkts(_adapter *padapter, union recv_frame *prframe, int a3); -extern int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe, int a3); -extern int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe); -extern int recv_func(_adapter *padapter, union recv_frame *rframe, int a3); -extern int32_t rtw_recv_entry(union recv_frame *precvframe, int a2, int a3); +extern int process_recv_indicatepkts(_adapter *padapter, struct recv_frame *prframe, int a3); +extern int recv_func_prehandle(_adapter *padapter, struct recv_frame *rframe, int a3); +extern int recv_func_posthandle(_adapter *padapter, struct recv_frame *prframe); +extern int recv_func(_adapter *padapter, struct recv_frame *rframe, int a3); +extern int32_t rtw_recv_entry(struct recv_frame *precvframe, int a2, int a3); extern void rtw_recv_tasklet(thread_context context); // Data declarations extern const uint8_t SNAP_ETH_TYPE_APPLETALK_AARP[2]; // = { 128u, 243u }; diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/wrapper.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/wrapper.h index 4922122..bc4dbf4 100644 --- a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/wrapper.h +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/freertos/wrapper.h @@ -392,24 +392,24 @@ struct net_device_stats { }; struct net_device { - char name[16]; - void *priv; /* pointer to private data */ - unsigned char dev_addr[6]; /* set during bootup */ - int (*init)(void); - int (*open)(struct net_device *dev); - int (*stop)(struct net_device *dev); - int (*hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); - int (*do_ioctl)(struct net_device *dev, struct iwreq *ifr, int cmd); - struct net_device_stats* (*get_stats)(struct net_device *dev); + char name[16]; //+0 + void *priv; //+16 _adapter /* pointer to private data */ + unsigned char dev_addr[6]; //+20 /* set during bootup */ + int (*init)(void); //+28 + int (*open)(struct net_device *dev); //+32 + int (*stop)(struct net_device *dev); //+36 + int (*hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); //+40 + int (*do_ioctl)(struct net_device *dev, struct iwreq *ifr, int cmd); //+44 + struct net_device_stats* (*get_stats)(struct net_device *dev); //+48 }; typedef struct { - struct net_device *dev; /* Binding wlan driver netdev */ - void *skb; /* pending Rx packet */ - unsigned int tx_busy; - unsigned int rx_busy; - unsigned char enable; - unsigned char mac[6]; + struct net_device *dev; //+0 /* Binding wlan driver netdev */ + void *skb; //+4 /* pending Rx packet */ + unsigned int tx_busy; //+8 + unsigned int rx_busy; //+12 + unsigned char enable; //+16 + unsigned char mac[6]; //+17..23 } Rltk_wlan_t; #define netdev_priv(dev) dev->priv diff --git a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/wlan_intf.h b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/wlan_intf.h index 7e461b0..02d6def 100644 --- a/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/wlan_intf.h +++ b/RTL00_SDKV35a/component/common/drivers/wlan/realtek/src/osdep/wlan_intf.h @@ -38,7 +38,7 @@ struct sk_buff { /************************************************************/ // #include "wrapper.h" -extern struct net_device *rltk_wlan_info; +//extern Rltk_wlan_t rltk_wlan_info[2]; //----- ------------------------------------------------------------------ // Wlan Interface opened for upper layer diff --git a/RTL00_SDKV35a/component/os/os_dep/include/osdep_service.h b/RTL00_SDKV35a/component/os/os_dep/include/osdep_service.h index c7298c5..c51bee3 100644 --- a/RTL00_SDKV35a/component/os/os_dep/include/osdep_service.h +++ b/RTL00_SDKV35a/component/os/os_dep/include/osdep_service.h @@ -113,7 +113,7 @@ struct timer_list { _timerHandle timer_hdl; - unsigned long data; + unsigned long data; // unsigned int data; ? void (*function)(void *); }; diff --git a/RTL00_SDKV35a/component/soc/realtek/8195a/misc/bsp/lib/common/GCC/export-rom_v04.txt b/RTL00_SDKV35a/component/soc/realtek/8195a/misc/bsp/lib/common/GCC/export-rom_v04.txt index 691ae6f..56a467a 100644 --- a/RTL00_SDKV35a/component/soc/realtek/8195a/misc/bsp/lib/common/GCC/export-rom_v04.txt +++ b/RTL00_SDKV35a/component/soc/realtek/8195a/misc/bsp/lib/common/GCC/export-rom_v04.txt @@ -624,7 +624,9 @@ SECTIONS rom_wps_rcons = 0x35d88; rom_wps_Td4s = 0x35d94; rom_wps_Td0 = 0x35e94; - str_rom_hex_addr = 0x442D6; + str_rom_0123456789ABCDEF = 0x3ec24; /* "0123456789ABCDEF" */ + str_rom_hex_addr = 0x442D6; /* "[Addr] .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F\r\n" */ + str_rom_0123456789abcdef = 0x44660; /* "0123456789abcdef" */ __rom_b_cut_end__ = 0x4467c; __rom_c_cut_text_start__ = 0x4467c; HalInitPlatformLogUartV02 = 0x4467d; diff --git a/RTL00_SDKV35a/component/soc/realtek/8195a/misc/driver/rtl_consol.h b/RTL00_SDKV35a/component/soc/realtek/8195a/misc/driver/rtl_consol.h index 56606ad..5593a36 100644 --- a/RTL00_SDKV35a/component/soc/realtek/8195a/misc/driver/rtl_consol.h +++ b/RTL00_SDKV35a/component/soc/realtek/8195a/misc/driver/rtl_consol.h @@ -29,7 +29,7 @@ #define UART_LOG_CMD_BUFLEN 127 #define MAX_ARGV 10 -extern COMMAND_TABLE UartLogRomCmdTable[6]; // in ROM (hal_diag.h) +//extern COMMAND_TABLE UartLogRomCmdTable[6]; // in ROM (hal_diag.h) typedef u32 (*ECHOFUNC)(IN u8*,...); //UART LOG echo-function type. diff --git a/build/bin/ota.bin b/build/bin/ota.bin index 5519ba703efeb3bd1b52b6a8d35328b3db92dce6..539679dbb78e17e9cf5f7057b88909cb09009258 100644 GIT binary patch delta 28508 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 delta 30499 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 z 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ξMRnH2YzPRiZsb{&wO15gB2V%7i@+%C-cxBp)z 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 diff --git a/build/bin/ram_2.ns.bin b/build/bin/ram_2.ns.bin index 009b4b63074e33a182113409aef9a1641c29dbd0..fc8d35f8b418ffc52ecb51dc6f5193b1f14e8c13 100644 GIT binary patch delta 28504 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 delta 30495 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 diff --git a/build/bin/ram_2.p.bin b/build/bin/ram_2.p.bin index b5d02405dd0bc17ec17418e09bc4d15fb0b9b364..8f03bc159e8ca6d4261017cf2d8a9e7b887f808c 100644 GIT binary patch delta 28504 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 delta 30495 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 diff --git a/build/bin/ram_all.bin b/build/bin/ram_all.bin index 7fa05483d364708712a8721b66b006f7dd92e18e..ae5e2cdbe6057007cc5a70af371aeb987071231e 100644 GIT binary patch delta 28676 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 delta 30658 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�ve*^1=H(cgzgE z_>K^|{%$|d>bFnov4yFnJ+{TO2_o7fK&;`r(||znH(^VY+88KS;$Ci0PfB7>KByYP zSX`PIn#0v*e#{-POVlSwEEldiXho3tk-kW?V(6AZ~+45e@&#>M~L*!ZFOlE5!1<# zYVImFGO5OHB4(j#9V*tN-0-F24PrMsFcKD);te>}vs14KoG!4_=Erav&8T{IvNQG& z6WNTDu;wLLbQXKiLz)yjl`*L-MlE90B1Q!>`BRKq&M1+cda+YHOEs7Ui0sshv8PzH z3oLXIJB?<31GTu?iG>c-($M0vlgQY37Fwn$Wvrc@dNIFxcCu^2%x@qQ5gD7s*fJJ6 z+8{nkFFq!=r>9t`9VbCKw)0>bQO`t)^-CR-^F-+=&@LA6G+$K-h#UoevF<8_Z7tXcl1((i_p^zvZD9!@$vEV^V93~{_4n2#iBnM zjx2XyaCXtlmbq!n%5(7^e@5FEqED9^>^R=W@9JA_SrOrr7q`-b-)^OUSlUW2Dr}{@ zz0gX3^7mGH$oy6sYVRFoNFR&?rkXi!^Q-8h!1dBX8=7U->(5*-?bC+#YeVbX&;cHL zo{f!I-EkSMyGIWZC9fhDfOo`N0*v-5WpukX{*TKbDczV7H^MkBAwAs~KSj>ZH)qL1<>WEXJ{zT}_2hslXq8XDC$HFS zxi&pVPlV}09C~hC!uZiKGE)hW*fFD%40$G-X_g$GCC@ck<|uOi!tlaKIoo8mC|QvY zs!WbciBEtAWJ9sbGnKz-f^DT(Mq8ykiF@lt+$AlJbd3dQF$Z=v?!l*w^_WlsZz4nYOr^m%6|8b=ILfj2D&SZVeF3-~HOP;07 z%C-HiZ61Di(fZ0Z#Xd9~_e6N~pnMMZNVa);23_qGd;is~@wv9Tytk-g&7CtnN6)3& z%yUh4MSf1n&o@n1V&w3AJw5FdPdZw!2a1poo0{@0Y8JQU?;0|KMN$0!JujM$p!zFHrVP?OWQ8Q)^jF|$Py$jQK zfCG31SOTm8wgMjl!4)_uL&%lpJ@F3s>z6F*63a|~B4_t=KD8#>p zI4)%3AIR_|(35Bc0zu3M<^U@2DzFCF2OI>x0I1v|c2tX+#bp6e=~!^giuM0-mmC~M zs{?dm%#vt9>u9Y(v`;OiY(5=;Xz{E~_2>yJGt_{?Mbot^KFLeOV4yK459f5ww)uVwr7>C?(Ol@wj z+sKP|&SPWp!65@v;IgdTy5zoMcYop~fAFh+cDw(A3-;dOj+d-HAEbLGTspXkNOysu zn~AgppmiN|!Rqn9>dyG+*J2p80oZ(-?s`fW;b_1B&2Itg4RR>6d{5(h_;eQY4O@nf zP=dbb;S-i}(yyR%ui!HsIIb<{Bs=JrJ$%s;PI?`5k%up#oU|5nDZuoVyv<2FK>z6G z$8qhT@B)~Q_;?cQNpo<_K2cKR;w-3{Gag2&4QgMGGb$^0Lb^VC+K2Q>c&uaC-*Ej$ke4odO zGzES-U_aC)k9Y|P*nmAi3lLY0NpIjaU^B2E zs01zmR{{3@yIXJr&La)rX<+<$2b6$#1K0%Y18RYYpCABC0P=u0fD+(ypc=RX`2Q?Q zoq#^Ta9|>k54;Mj13m-}0N(<50W3uUMnC};1ABpU4xIRl*kTF12J8ZA0O=A+1k48x z0d;_M8JPl>0lxrG{el-+zyaVlpwktE12X{%{10#w=>98S2>=eD91wm(!GKbr_oG)~ zpbwY~{2eF(4g;5gPMGnX