mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Jun 21 17:46:44 2017 +0100
Revision:
167:e84263d55307
Child:
169:e3b6fe271b81
This updates the lib to the mbed lib v 145

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /* Copyright (c) 2013-2016 Realtek Semiconductor Corp.
AnnaBridge 167:e84263d55307 2 *
AnnaBridge 167:e84263d55307 3 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 167:e84263d55307 4 * you may not use this file except in compliance with the License.
AnnaBridge 167:e84263d55307 5 * You may obtain a copy of the License at
AnnaBridge 167:e84263d55307 6 *
AnnaBridge 167:e84263d55307 7 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 167:e84263d55307 8 *
AnnaBridge 167:e84263d55307 9 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 167:e84263d55307 10 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 167:e84263d55307 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 167:e84263d55307 12 * See the License for the specific language governing permissions and
AnnaBridge 167:e84263d55307 13 * limitations under the License.
AnnaBridge 167:e84263d55307 14 */
AnnaBridge 167:e84263d55307 15
AnnaBridge 167:e84263d55307 16 #include <dhcp/dhcps.h>
AnnaBridge 167:e84263d55307 17 //#include <flash/stm32_flash.h>
AnnaBridge 167:e84263d55307 18 #include <platform/platform_stdlib.h>
AnnaBridge 167:e84263d55307 19 #include <wifi/wifi_conf.h>
AnnaBridge 167:e84263d55307 20 #include <wifi/wifi_util.h>
AnnaBridge 167:e84263d55307 21 #include <wifi/wifi_ind.h>
AnnaBridge 167:e84263d55307 22 #include "tcpip.h"
AnnaBridge 167:e84263d55307 23 #include <osdep_service.h>
AnnaBridge 167:e84263d55307 24 #ifndef CONFIG_MBED_ENABLED
AnnaBridge 167:e84263d55307 25 #include <lwip_netconf.h>//
AnnaBridge 167:e84263d55307 26 #endif
AnnaBridge 167:e84263d55307 27 #if CONFIG_EXAMPLE_WLAN_FAST_CONNECT || CONFIG_JD_SMART
AnnaBridge 167:e84263d55307 28 #include "wlan_fast_connect/example_wlan_fast_connect.h"
AnnaBridge 167:e84263d55307 29 #endif
AnnaBridge 167:e84263d55307 30 #if CONFIG_EXAMPLE_UART_ATCMD
AnnaBridge 167:e84263d55307 31 #include "at_cmd/atcmd_wifi.h"
AnnaBridge 167:e84263d55307 32 #endif
AnnaBridge 167:e84263d55307 33 #if CONFIG_INIC_EN
AnnaBridge 167:e84263d55307 34 extern int inic_start(void);
AnnaBridge 167:e84263d55307 35 extern int inic_stop(void);
AnnaBridge 167:e84263d55307 36 #endif
AnnaBridge 167:e84263d55307 37
AnnaBridge 167:e84263d55307 38 /******************************************************
AnnaBridge 167:e84263d55307 39 * Constants
AnnaBridge 167:e84263d55307 40 ******************************************************/
AnnaBridge 167:e84263d55307 41 #define SCAN_USE_SEMAPHORE 0
AnnaBridge 167:e84263d55307 42
AnnaBridge 167:e84263d55307 43 #define RTW_JOIN_TIMEOUT 15000
AnnaBridge 167:e84263d55307 44
AnnaBridge 167:e84263d55307 45 #define JOIN_ASSOCIATED (uint32_t)(1 << 0)
AnnaBridge 167:e84263d55307 46 #define JOIN_AUTHENTICATED (uint32_t)(1 << 1)
AnnaBridge 167:e84263d55307 47 #define JOIN_LINK_READY (uint32_t)(1 << 2)
AnnaBridge 167:e84263d55307 48 #define JOIN_SECURITY_COMPLETE (uint32_t)(1 << 3)
AnnaBridge 167:e84263d55307 49 #define JOIN_COMPLETE (uint32_t)(1 << 4)
AnnaBridge 167:e84263d55307 50 #define JOIN_NO_NETWORKS (uint32_t)(1 << 5)
AnnaBridge 167:e84263d55307 51 #define JOIN_WRONG_SECURITY (uint32_t)(1 << 6)
AnnaBridge 167:e84263d55307 52 #define JOIN_HANDSHAKE_DONE (uint32_t)(1 << 7)
AnnaBridge 167:e84263d55307 53 #define JOIN_SIMPLE_CONFIG (uint32_t)(1 << 8)
AnnaBridge 167:e84263d55307 54 #define JOIN_AIRKISS (uint32_t)(1 << 9)
AnnaBridge 167:e84263d55307 55
AnnaBridge 167:e84263d55307 56 /******************************************************
AnnaBridge 167:e84263d55307 57 * Type Definitions
AnnaBridge 167:e84263d55307 58 ******************************************************/
AnnaBridge 167:e84263d55307 59
AnnaBridge 167:e84263d55307 60 /******************************************************
AnnaBridge 167:e84263d55307 61 * Variables Declarations
AnnaBridge 167:e84263d55307 62 ******************************************************/
AnnaBridge 167:e84263d55307 63 #if DEVICE_EMAC
AnnaBridge 167:e84263d55307 64 //extern struct netif *xnetif[];
AnnaBridge 167:e84263d55307 65 #else
AnnaBridge 167:e84263d55307 66 extern struct netif xnetif[NET_IF_NUM];
AnnaBridge 167:e84263d55307 67 #endif
AnnaBridge 167:e84263d55307 68 /******************************************************
AnnaBridge 167:e84263d55307 69 * Variables Definitions
AnnaBridge 167:e84263d55307 70 ******************************************************/
AnnaBridge 167:e84263d55307 71 static internal_scan_handler_t scan_result_handler_ptr = {0, 0, 0, RTW_FALSE, 0, 0, 0, 0, 0};
AnnaBridge 167:e84263d55307 72 static internal_join_result_t* join_user_data;
AnnaBridge 167:e84263d55307 73 #ifdef CONFIG_MBED_ENABLED
AnnaBridge 167:e84263d55307 74 static rtw_mode_t wifi_mode = RTW_MODE_STA;
AnnaBridge 167:e84263d55307 75 #else
AnnaBridge 167:e84263d55307 76 extern rtw_mode_t wifi_mode;
AnnaBridge 167:e84263d55307 77 #endif
AnnaBridge 167:e84263d55307 78 int error_flag = RTW_UNKNOWN;
AnnaBridge 167:e84263d55307 79 uint32_t rtw_join_status;
AnnaBridge 167:e84263d55307 80 #if ATCMD_VER == ATVER_2
AnnaBridge 167:e84263d55307 81 extern unsigned char dhcp_mode_sta;
AnnaBridge 167:e84263d55307 82 #endif
AnnaBridge 167:e84263d55307 83
AnnaBridge 167:e84263d55307 84 /******************************************************
AnnaBridge 167:e84263d55307 85 * Variables Definitions
AnnaBridge 167:e84263d55307 86 ******************************************************/
AnnaBridge 167:e84263d55307 87
AnnaBridge 167:e84263d55307 88 #ifndef WLAN0_NAME
AnnaBridge 167:e84263d55307 89 #define WLAN0_NAME "wlan0"
AnnaBridge 167:e84263d55307 90 #endif
AnnaBridge 167:e84263d55307 91 #ifndef WLAN1_NAME
AnnaBridge 167:e84263d55307 92 #define WLAN1_NAME "wlan1"
AnnaBridge 167:e84263d55307 93 #endif
AnnaBridge 167:e84263d55307 94 /* Give default value if not defined */
AnnaBridge 167:e84263d55307 95 #ifndef NET_IF_NUM
AnnaBridge 167:e84263d55307 96 #ifdef CONFIG_CONCURRENT_MODE
AnnaBridge 167:e84263d55307 97 #define NET_IF_NUM 2
AnnaBridge 167:e84263d55307 98 #else
AnnaBridge 167:e84263d55307 99 #define NET_IF_NUM 1
AnnaBridge 167:e84263d55307 100 #endif
AnnaBridge 167:e84263d55307 101 #endif
AnnaBridge 167:e84263d55307 102
AnnaBridge 167:e84263d55307 103 /*Static IP ADDRESS*/
AnnaBridge 167:e84263d55307 104 #ifndef IP_ADDR0
AnnaBridge 167:e84263d55307 105 #define IP_ADDR0 192
AnnaBridge 167:e84263d55307 106 #define IP_ADDR1 168
AnnaBridge 167:e84263d55307 107 #define IP_ADDR2 1
AnnaBridge 167:e84263d55307 108 #define IP_ADDR3 80
AnnaBridge 167:e84263d55307 109 #endif
AnnaBridge 167:e84263d55307 110
AnnaBridge 167:e84263d55307 111 /*NETMASK*/
AnnaBridge 167:e84263d55307 112 #ifndef NETMASK_ADDR0
AnnaBridge 167:e84263d55307 113 #define NETMASK_ADDR0 255
AnnaBridge 167:e84263d55307 114 #define NETMASK_ADDR1 255
AnnaBridge 167:e84263d55307 115 #define NETMASK_ADDR2 255
AnnaBridge 167:e84263d55307 116 #define NETMASK_ADDR3 0
AnnaBridge 167:e84263d55307 117 #endif
AnnaBridge 167:e84263d55307 118
AnnaBridge 167:e84263d55307 119 /*Gateway Address*/
AnnaBridge 167:e84263d55307 120 #ifndef GW_ADDR0
AnnaBridge 167:e84263d55307 121 #define GW_ADDR0 192
AnnaBridge 167:e84263d55307 122 #define GW_ADDR1 168
AnnaBridge 167:e84263d55307 123 #define GW_ADDR2 1
AnnaBridge 167:e84263d55307 124 #define GW_ADDR3 1
AnnaBridge 167:e84263d55307 125 #endif
AnnaBridge 167:e84263d55307 126
AnnaBridge 167:e84263d55307 127 /*Static IP ADDRESS*/
AnnaBridge 167:e84263d55307 128 #ifndef AP_IP_ADDR0
AnnaBridge 167:e84263d55307 129 #define AP_IP_ADDR0 192
AnnaBridge 167:e84263d55307 130 #define AP_IP_ADDR1 168
AnnaBridge 167:e84263d55307 131 #define AP_IP_ADDR2 43
AnnaBridge 167:e84263d55307 132 #define AP_IP_ADDR3 1
AnnaBridge 167:e84263d55307 133 #endif
AnnaBridge 167:e84263d55307 134
AnnaBridge 167:e84263d55307 135 /*NETMASK*/
AnnaBridge 167:e84263d55307 136 #ifndef AP_NETMASK_ADDR0
AnnaBridge 167:e84263d55307 137 #define AP_NETMASK_ADDR0 255
AnnaBridge 167:e84263d55307 138 #define AP_NETMASK_ADDR1 255
AnnaBridge 167:e84263d55307 139 #define AP_NETMASK_ADDR2 255
AnnaBridge 167:e84263d55307 140 #define AP_NETMASK_ADDR3 0
AnnaBridge 167:e84263d55307 141 #endif
AnnaBridge 167:e84263d55307 142
AnnaBridge 167:e84263d55307 143 /*Gateway Address*/
AnnaBridge 167:e84263d55307 144 #ifndef AP_GW_ADDR0
AnnaBridge 167:e84263d55307 145 #define AP_GW_ADDR0 192
AnnaBridge 167:e84263d55307 146 #define AP_GW_ADDR1 168
AnnaBridge 167:e84263d55307 147 #define AP_GW_ADDR2 43
AnnaBridge 167:e84263d55307 148 #define AP_GW_ADDR3 1
AnnaBridge 167:e84263d55307 149 #endif
AnnaBridge 167:e84263d55307 150
AnnaBridge 167:e84263d55307 151 /******************************************************
AnnaBridge 167:e84263d55307 152 * Function Definitions
AnnaBridge 167:e84263d55307 153 ******************************************************/
AnnaBridge 167:e84263d55307 154
AnnaBridge 167:e84263d55307 155 #if CONFIG_WLAN
AnnaBridge 167:e84263d55307 156 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 157 static int wifi_connect_local(rtw_network_info_t *pWifi)
AnnaBridge 167:e84263d55307 158 {
AnnaBridge 167:e84263d55307 159 int ret = 0;
AnnaBridge 167:e84263d55307 160
AnnaBridge 167:e84263d55307 161 if(is_promisc_enabled())
AnnaBridge 167:e84263d55307 162 promisc_set(0, NULL, 0);
AnnaBridge 167:e84263d55307 163
AnnaBridge 167:e84263d55307 164 /* lock 4s to forbid suspend under linking */
AnnaBridge 167:e84263d55307 165 rtw_wakelock_timeout(4 *1000);
AnnaBridge 167:e84263d55307 166
AnnaBridge 167:e84263d55307 167 if(!pWifi) return -1;
AnnaBridge 167:e84263d55307 168 switch(pWifi->security_type){
AnnaBridge 167:e84263d55307 169 case RTW_SECURITY_OPEN:
AnnaBridge 167:e84263d55307 170 ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_NONE, NULL, 0, 0, 0, 0, NULL, 0);
AnnaBridge 167:e84263d55307 171 break;
AnnaBridge 167:e84263d55307 172 case RTW_SECURITY_WEP_PSK:
AnnaBridge 167:e84263d55307 173 case RTW_SECURITY_WEP_SHARED:
AnnaBridge 167:e84263d55307 174 ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_SHARED_KEY);
AnnaBridge 167:e84263d55307 175 if(ret == 0)
AnnaBridge 167:e84263d55307 176 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);
AnnaBridge 167:e84263d55307 177 break;
AnnaBridge 167:e84263d55307 178 case RTW_SECURITY_WPA_TKIP_PSK:
AnnaBridge 167:e84263d55307 179 case RTW_SECURITY_WPA2_TKIP_PSK:
AnnaBridge 167:e84263d55307 180 ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_OPEN_SYSTEM);
AnnaBridge 167:e84263d55307 181 if(ret == 0)
AnnaBridge 167:e84263d55307 182 ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_TKIP, NULL, 0, 0, 0, 0, NULL, 0);
AnnaBridge 167:e84263d55307 183 if(ret == 0)
AnnaBridge 167:e84263d55307 184 ret = wext_set_passphrase(WLAN0_NAME, pWifi->password, pWifi->password_len);
AnnaBridge 167:e84263d55307 185 break;
AnnaBridge 167:e84263d55307 186 case RTW_SECURITY_WPA_AES_PSK:
AnnaBridge 167:e84263d55307 187 case RTW_SECURITY_WPA2_AES_PSK:
AnnaBridge 167:e84263d55307 188 case RTW_SECURITY_WPA2_MIXED_PSK:
AnnaBridge 167:e84263d55307 189 case RTW_SECURITY_WPA_WPA2_MIXED:
AnnaBridge 167:e84263d55307 190 ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_OPEN_SYSTEM);
AnnaBridge 167:e84263d55307 191 if(ret == 0)
AnnaBridge 167:e84263d55307 192 ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_CCMP, NULL, 0, 0, 0, 0, NULL, 0);
AnnaBridge 167:e84263d55307 193 if(ret == 0)
AnnaBridge 167:e84263d55307 194 ret = wext_set_passphrase(WLAN0_NAME, pWifi->password, pWifi->password_len);
AnnaBridge 167:e84263d55307 195 break;
AnnaBridge 167:e84263d55307 196 default:
AnnaBridge 167:e84263d55307 197 ret = -1;
AnnaBridge 167:e84263d55307 198 printf("\n\rWIFICONF: security type(0x%x) is not supported.\n\r", pWifi->security_type);
AnnaBridge 167:e84263d55307 199 break;
AnnaBridge 167:e84263d55307 200 }
AnnaBridge 167:e84263d55307 201 if(ret == 0)
AnnaBridge 167:e84263d55307 202 ret = wext_set_ssid(WLAN0_NAME, pWifi->ssid.val, pWifi->ssid.len);
AnnaBridge 167:e84263d55307 203 return ret;
AnnaBridge 167:e84263d55307 204 }
AnnaBridge 167:e84263d55307 205
AnnaBridge 167:e84263d55307 206 static int wifi_connect_bssid_local(rtw_network_info_t *pWifi)
AnnaBridge 167:e84263d55307 207 {
AnnaBridge 167:e84263d55307 208 int ret = 0;
AnnaBridge 167:e84263d55307 209 u8 bssid[12] = {0};
AnnaBridge 167:e84263d55307 210
AnnaBridge 167:e84263d55307 211 if(is_promisc_enabled())
AnnaBridge 167:e84263d55307 212 promisc_set(0, NULL, 0);
AnnaBridge 167:e84263d55307 213
AnnaBridge 167:e84263d55307 214 /* lock 4s to forbid suspend under linking */
AnnaBridge 167:e84263d55307 215 rtw_wakelock_timeout(4 *1000);
AnnaBridge 167:e84263d55307 216
AnnaBridge 167:e84263d55307 217 if(!pWifi) return -1;
AnnaBridge 167:e84263d55307 218 switch(pWifi->security_type){
AnnaBridge 167:e84263d55307 219 case RTW_SECURITY_OPEN:
AnnaBridge 167:e84263d55307 220 ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_NONE, NULL, 0, 0, 0, 0, NULL, 0);
AnnaBridge 167:e84263d55307 221 break;
AnnaBridge 167:e84263d55307 222 case RTW_SECURITY_WEP_PSK:
AnnaBridge 167:e84263d55307 223 case RTW_SECURITY_WEP_SHARED:
AnnaBridge 167:e84263d55307 224 ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_SHARED_KEY);
AnnaBridge 167:e84263d55307 225 if(ret == 0)
AnnaBridge 167:e84263d55307 226 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);
AnnaBridge 167:e84263d55307 227 break;
AnnaBridge 167:e84263d55307 228 case RTW_SECURITY_WPA_TKIP_PSK:
AnnaBridge 167:e84263d55307 229 case RTW_SECURITY_WPA2_TKIP_PSK:
AnnaBridge 167:e84263d55307 230 ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_OPEN_SYSTEM);
AnnaBridge 167:e84263d55307 231 if(ret == 0)
AnnaBridge 167:e84263d55307 232 ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_TKIP, NULL, 0, 0, 0, 0, NULL, 0);
AnnaBridge 167:e84263d55307 233 if(ret == 0)
AnnaBridge 167:e84263d55307 234 ret = wext_set_passphrase(WLAN0_NAME, pWifi->password, pWifi->password_len);
AnnaBridge 167:e84263d55307 235 break;
AnnaBridge 167:e84263d55307 236 case RTW_SECURITY_WPA_AES_PSK:
AnnaBridge 167:e84263d55307 237 case RTW_SECURITY_WPA2_AES_PSK:
AnnaBridge 167:e84263d55307 238 case RTW_SECURITY_WPA2_MIXED_PSK:
AnnaBridge 167:e84263d55307 239 ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_OPEN_SYSTEM);
AnnaBridge 167:e84263d55307 240 if(ret == 0)
AnnaBridge 167:e84263d55307 241 ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_CCMP, NULL, 0, 0, 0, 0, NULL, 0);
AnnaBridge 167:e84263d55307 242 if(ret == 0)
AnnaBridge 167:e84263d55307 243 ret = wext_set_passphrase(WLAN0_NAME, pWifi->password, pWifi->password_len);
AnnaBridge 167:e84263d55307 244 break;
AnnaBridge 167:e84263d55307 245 default:
AnnaBridge 167:e84263d55307 246 ret = -1;
AnnaBridge 167:e84263d55307 247 printf("\n\rWIFICONF: security type(0x%x) is not supported.\n\r", pWifi->security_type);
AnnaBridge 167:e84263d55307 248 break;
AnnaBridge 167:e84263d55307 249 }
AnnaBridge 167:e84263d55307 250 if(ret == 0){
AnnaBridge 167:e84263d55307 251 memcpy(bssid, pWifi->bssid.octet, ETH_ALEN);
AnnaBridge 167:e84263d55307 252 if(pWifi->ssid.len){
AnnaBridge 167:e84263d55307 253 bssid[ETH_ALEN] = '#';
AnnaBridge 167:e84263d55307 254 bssid[ETH_ALEN + 1] = '@';
AnnaBridge 167:e84263d55307 255 memcpy(bssid + ETH_ALEN + 2, &pWifi, sizeof(pWifi));
AnnaBridge 167:e84263d55307 256 }
AnnaBridge 167:e84263d55307 257 ret = wext_set_bssid(WLAN0_NAME, bssid);
AnnaBridge 167:e84263d55307 258 }
AnnaBridge 167:e84263d55307 259 return ret;
AnnaBridge 167:e84263d55307 260 }
AnnaBridge 167:e84263d55307 261
AnnaBridge 167:e84263d55307 262 void wifi_rx_beacon_hdl( char* buf, int buf_len, int flags, void* userdata) {
AnnaBridge 167:e84263d55307 263 //printf("Beacon!\n");
AnnaBridge 167:e84263d55307 264 }
AnnaBridge 167:e84263d55307 265
AnnaBridge 167:e84263d55307 266
AnnaBridge 167:e84263d55307 267 static void wifi_no_network_hdl(char* buf, int buf_len, int flags, void* userdata)
AnnaBridge 167:e84263d55307 268 {
AnnaBridge 167:e84263d55307 269 if(join_user_data!=NULL)
AnnaBridge 167:e84263d55307 270 rtw_join_status = JOIN_NO_NETWORKS;
AnnaBridge 167:e84263d55307 271 }
AnnaBridge 167:e84263d55307 272
AnnaBridge 167:e84263d55307 273 static void wifi_connected_hdl( char* buf, int buf_len, int flags, void* userdata)
AnnaBridge 167:e84263d55307 274 {
AnnaBridge 167:e84263d55307 275 #ifdef CONFIG_ENABLE_EAP
AnnaBridge 167:e84263d55307 276 if(get_eap_phase()){
AnnaBridge 167:e84263d55307 277 rtw_join_status = JOIN_COMPLETE | JOIN_SECURITY_COMPLETE | JOIN_ASSOCIATED | JOIN_AUTHENTICATED | JOIN_LINK_READY;
AnnaBridge 167:e84263d55307 278 return;
AnnaBridge 167:e84263d55307 279 }
AnnaBridge 167:e84263d55307 280 #endif /* CONFIG_ENABLE_EAP */
AnnaBridge 167:e84263d55307 281
AnnaBridge 167:e84263d55307 282 if((join_user_data!=NULL)&&((join_user_data->network_info.security_type == RTW_SECURITY_OPEN) ||
AnnaBridge 167:e84263d55307 283 (join_user_data->network_info.security_type == RTW_SECURITY_WEP_PSK) ||
AnnaBridge 167:e84263d55307 284 (join_user_data->network_info.security_type == RTW_SECURITY_WEP_SHARED))){
AnnaBridge 167:e84263d55307 285 rtw_join_status = JOIN_COMPLETE | JOIN_SECURITY_COMPLETE | JOIN_ASSOCIATED | JOIN_AUTHENTICATED | JOIN_LINK_READY;
AnnaBridge 167:e84263d55307 286 rtw_up_sema(&join_user_data->join_sema);
AnnaBridge 167:e84263d55307 287 }else if((join_user_data!=NULL)&&((join_user_data->network_info.security_type == RTW_SECURITY_WPA2_AES_PSK) )){
AnnaBridge 167:e84263d55307 288 rtw_join_status = JOIN_COMPLETE | JOIN_SECURITY_COMPLETE | JOIN_ASSOCIATED | JOIN_AUTHENTICATED | JOIN_LINK_READY;
AnnaBridge 167:e84263d55307 289 }
AnnaBridge 167:e84263d55307 290 }
AnnaBridge 167:e84263d55307 291 static void wifi_handshake_done_hdl( char* buf, int buf_len, int flags, void* userdata)
AnnaBridge 167:e84263d55307 292 {
AnnaBridge 167:e84263d55307 293 rtw_join_status = JOIN_COMPLETE | JOIN_SECURITY_COMPLETE | JOIN_ASSOCIATED | JOIN_AUTHENTICATED | JOIN_LINK_READY|JOIN_HANDSHAKE_DONE;
AnnaBridge 167:e84263d55307 294 if(join_user_data != NULL)
AnnaBridge 167:e84263d55307 295 rtw_up_sema(&join_user_data->join_sema);
AnnaBridge 167:e84263d55307 296 }
AnnaBridge 167:e84263d55307 297
AnnaBridge 167:e84263d55307 298 static void wifi_disconn_hdl( char* buf, int buf_len, int flags, void* userdata)
AnnaBridge 167:e84263d55307 299 {
AnnaBridge 167:e84263d55307 300 if(join_user_data != NULL){
AnnaBridge 167:e84263d55307 301 if(join_user_data->network_info.security_type == RTW_SECURITY_OPEN){
AnnaBridge 167:e84263d55307 302
AnnaBridge 167:e84263d55307 303 if(rtw_join_status == JOIN_NO_NETWORKS)
AnnaBridge 167:e84263d55307 304 error_flag = RTW_NONE_NETWORK;
AnnaBridge 167:e84263d55307 305
AnnaBridge 167:e84263d55307 306 }else if(join_user_data->network_info.security_type == RTW_SECURITY_WEP_PSK){
AnnaBridge 167:e84263d55307 307
AnnaBridge 167:e84263d55307 308 if(rtw_join_status == JOIN_NO_NETWORKS)
AnnaBridge 167:e84263d55307 309 error_flag = RTW_NONE_NETWORK;
AnnaBridge 167:e84263d55307 310
AnnaBridge 167:e84263d55307 311 else if(rtw_join_status == 0)
AnnaBridge 167:e84263d55307 312 error_flag = RTW_CONNECT_FAIL;
AnnaBridge 167:e84263d55307 313
AnnaBridge 167:e84263d55307 314 }else if(join_user_data->network_info.security_type == RTW_SECURITY_WPA2_AES_PSK){
AnnaBridge 167:e84263d55307 315
AnnaBridge 167:e84263d55307 316 if(rtw_join_status ==JOIN_NO_NETWORKS)
AnnaBridge 167:e84263d55307 317 error_flag = RTW_NONE_NETWORK;
AnnaBridge 167:e84263d55307 318
AnnaBridge 167:e84263d55307 319 else if(rtw_join_status == 0)
AnnaBridge 167:e84263d55307 320 error_flag = RTW_CONNECT_FAIL;
AnnaBridge 167:e84263d55307 321
AnnaBridge 167:e84263d55307 322 else if(rtw_join_status ==JOIN_COMPLETE | JOIN_SECURITY_COMPLETE | JOIN_ASSOCIATED | JOIN_AUTHENTICATED | JOIN_LINK_READY)
AnnaBridge 167:e84263d55307 323 error_flag = RTW_WRONG_PASSWORD;
AnnaBridge 167:e84263d55307 324 }
AnnaBridge 167:e84263d55307 325
AnnaBridge 167:e84263d55307 326 }else{
AnnaBridge 167:e84263d55307 327 if(error_flag == RTW_NO_ERROR) //wifi_disconn_hdl will be dispatched one more time after join_user_data = NULL add by frankie
AnnaBridge 167:e84263d55307 328 error_flag = RTW_UNKNOWN;
AnnaBridge 167:e84263d55307 329 }
AnnaBridge 167:e84263d55307 330
AnnaBridge 167:e84263d55307 331 if(join_user_data != NULL)
AnnaBridge 167:e84263d55307 332 rtw_up_sema(&join_user_data->join_sema);
AnnaBridge 167:e84263d55307 333 //printf("\r\nWiFi Disconnect. Error flag is %d.\n", error_flag);
AnnaBridge 167:e84263d55307 334 }
AnnaBridge 167:e84263d55307 335
AnnaBridge 167:e84263d55307 336 #if CONFIG_EXAMPLE_WLAN_FAST_CONNECT || CONFIG_JD_SMART
AnnaBridge 167:e84263d55307 337 #define WLAN0_NAME "wlan0"
AnnaBridge 167:e84263d55307 338
AnnaBridge 167:e84263d55307 339 void restore_wifi_info_to_flash()
AnnaBridge 167:e84263d55307 340 {
AnnaBridge 167:e84263d55307 341
AnnaBridge 167:e84263d55307 342 struct wlan_fast_reconnect * data_to_flash;
AnnaBridge 167:e84263d55307 343 u32 channel = 0;
AnnaBridge 167:e84263d55307 344 u8 index = 0;
AnnaBridge 167:e84263d55307 345 u8 *ifname[1] = {WLAN0_NAME};
AnnaBridge 167:e84263d55307 346 rtw_wifi_setting_t setting;
AnnaBridge 167:e84263d55307 347 //struct security_priv *psecuritypriv = &padapter->securitypriv;
AnnaBridge 167:e84263d55307 348 //WLAN_BSSID_EX *pcur_bss = pmlmepriv->cur_network.network;
AnnaBridge 167:e84263d55307 349
AnnaBridge 167:e84263d55307 350 data_to_flash = (struct wlan_fast_reconnect *)rtw_zmalloc(sizeof(struct wlan_fast_reconnect));
AnnaBridge 167:e84263d55307 351
AnnaBridge 167:e84263d55307 352 if(data_to_flash && p_write_reconnect_ptr){
AnnaBridge 167:e84263d55307 353 if(wifi_get_setting((const char*)ifname[0],&setting) || setting.mode == RTW_MODE_AP){
AnnaBridge 167:e84263d55307 354 printf("\r\n %s():wifi_get_setting fail or ap mode", __func__);
AnnaBridge 167:e84263d55307 355 return;
AnnaBridge 167:e84263d55307 356 }
AnnaBridge 167:e84263d55307 357 channel = setting.channel;
AnnaBridge 167:e84263d55307 358
AnnaBridge 167:e84263d55307 359 rtw_memset(psk_essid[index], 0, sizeof(psk_essid[index]));
AnnaBridge 167:e84263d55307 360 strncpy(psk_essid[index], setting.ssid, strlen(setting.ssid));
AnnaBridge 167:e84263d55307 361 switch(setting.security_type){
AnnaBridge 167:e84263d55307 362 case RTW_SECURITY_OPEN:
AnnaBridge 167:e84263d55307 363 rtw_memset(psk_passphrase[index], 0, sizeof(psk_passphrase[index]));
AnnaBridge 167:e84263d55307 364 rtw_memset(wpa_global_PSK[index], 0, sizeof(wpa_global_PSK[index]));
AnnaBridge 167:e84263d55307 365 data_to_flash->security_type = RTW_SECURITY_OPEN;
AnnaBridge 167:e84263d55307 366 break;
AnnaBridge 167:e84263d55307 367 case RTW_SECURITY_WEP_PSK:
AnnaBridge 167:e84263d55307 368 channel |= (setting.key_idx) << 28;
AnnaBridge 167:e84263d55307 369 rtw_memset(psk_passphrase[index], 0, sizeof(psk_passphrase[index]));
AnnaBridge 167:e84263d55307 370 rtw_memset(wpa_global_PSK[index], 0, sizeof(wpa_global_PSK[index]));
AnnaBridge 167:e84263d55307 371 rtw_memcpy(psk_passphrase[index], setting.password, sizeof(psk_passphrase[index]));
AnnaBridge 167:e84263d55307 372 data_to_flash->security_type = RTW_SECURITY_WEP_PSK;
AnnaBridge 167:e84263d55307 373 break;
AnnaBridge 167:e84263d55307 374 case RTW_SECURITY_WPA_TKIP_PSK:
AnnaBridge 167:e84263d55307 375 data_to_flash->security_type = RTW_SECURITY_WPA_TKIP_PSK;
AnnaBridge 167:e84263d55307 376 break;
AnnaBridge 167:e84263d55307 377 case RTW_SECURITY_WPA2_AES_PSK:
AnnaBridge 167:e84263d55307 378 data_to_flash->security_type = RTW_SECURITY_WPA2_AES_PSK;
AnnaBridge 167:e84263d55307 379 break;
AnnaBridge 167:e84263d55307 380 default:
AnnaBridge 167:e84263d55307 381 break;
AnnaBridge 167:e84263d55307 382 }
AnnaBridge 167:e84263d55307 383
AnnaBridge 167:e84263d55307 384 memcpy(data_to_flash->psk_essid, psk_essid[index], sizeof(data_to_flash->psk_essid));
AnnaBridge 167:e84263d55307 385 if (strlen(psk_passphrase64) == 64) {
AnnaBridge 167:e84263d55307 386 memcpy(data_to_flash->psk_passphrase, psk_passphrase64, sizeof(data_to_flash->psk_passphrase));
AnnaBridge 167:e84263d55307 387 } else {
AnnaBridge 167:e84263d55307 388 memcpy(data_to_flash->psk_passphrase, psk_passphrase[index], sizeof(data_to_flash->psk_passphrase));
AnnaBridge 167:e84263d55307 389 }
AnnaBridge 167:e84263d55307 390 memcpy(data_to_flash->wpa_global_PSK, wpa_global_PSK[index], sizeof(data_to_flash->wpa_global_PSK));
AnnaBridge 167:e84263d55307 391 memcpy(&(data_to_flash->channel), &channel, 4);
AnnaBridge 167:e84263d55307 392
AnnaBridge 167:e84263d55307 393 //call callback function in user program
AnnaBridge 167:e84263d55307 394 p_write_reconnect_ptr((u8 *)data_to_flash, sizeof(struct wlan_fast_reconnect));
AnnaBridge 167:e84263d55307 395
AnnaBridge 167:e84263d55307 396 }
AnnaBridge 167:e84263d55307 397 if(data_to_flash)
AnnaBridge 167:e84263d55307 398 rtw_free(data_to_flash);
AnnaBridge 167:e84263d55307 399 }
AnnaBridge 167:e84263d55307 400
AnnaBridge 167:e84263d55307 401 #endif
AnnaBridge 167:e84263d55307 402
AnnaBridge 167:e84263d55307 403 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 404 int wifi_connect(
AnnaBridge 167:e84263d55307 405 char *ssid,
AnnaBridge 167:e84263d55307 406 rtw_security_t security_type,
AnnaBridge 167:e84263d55307 407 char *password,
AnnaBridge 167:e84263d55307 408 int ssid_len,
AnnaBridge 167:e84263d55307 409 int password_len,
AnnaBridge 167:e84263d55307 410 int key_id,
AnnaBridge 167:e84263d55307 411 void *semaphore)
AnnaBridge 167:e84263d55307 412 {
AnnaBridge 167:e84263d55307 413 _sema join_semaphore;
AnnaBridge 167:e84263d55307 414 rtw_result_t result = RTW_SUCCESS;
AnnaBridge 167:e84263d55307 415 u8 wep_hex = 0;
AnnaBridge 167:e84263d55307 416 u8 wep_pwd[14] = {0};
AnnaBridge 167:e84263d55307 417
AnnaBridge 167:e84263d55307 418 if(rtw_join_status & JOIN_SIMPLE_CONFIG || rtw_join_status & JOIN_AIRKISS){
AnnaBridge 167:e84263d55307 419 return RTW_ERROR;
AnnaBridge 167:e84263d55307 420 }
AnnaBridge 167:e84263d55307 421
AnnaBridge 167:e84263d55307 422 rtw_join_status = 0;//clear for last connect status
AnnaBridge 167:e84263d55307 423 error_flag = RTW_UNKNOWN ;//clear for last connect status
AnnaBridge 167:e84263d55307 424 if ( ( ( ( password_len > RTW_MAX_PSK_LEN ) ||
AnnaBridge 167:e84263d55307 425 ( password_len < RTW_MIN_PSK_LEN ) ) &&
AnnaBridge 167:e84263d55307 426 ( ( security_type == RTW_SECURITY_WPA_TKIP_PSK ) ||
AnnaBridge 167:e84263d55307 427 ( security_type == RTW_SECURITY_WPA_AES_PSK ) ||
AnnaBridge 167:e84263d55307 428 ( security_type == RTW_SECURITY_WPA2_AES_PSK ) ||
AnnaBridge 167:e84263d55307 429 ( security_type == RTW_SECURITY_WPA2_TKIP_PSK ) ||
AnnaBridge 167:e84263d55307 430 ( security_type == RTW_SECURITY_WPA2_MIXED_PSK ) ) )) {
AnnaBridge 167:e84263d55307 431 error_flag = RTW_WRONG_PASSWORD;
AnnaBridge 167:e84263d55307 432 return RTW_INVALID_KEY;
AnnaBridge 167:e84263d55307 433 }
AnnaBridge 167:e84263d55307 434
AnnaBridge 167:e84263d55307 435 if ((security_type == RTW_SECURITY_WEP_PSK)||
AnnaBridge 167:e84263d55307 436 (security_type ==RTW_SECURITY_WEP_SHARED)) {
AnnaBridge 167:e84263d55307 437 if ((password_len != 5) && (password_len != 13) &&
AnnaBridge 167:e84263d55307 438 (password_len != 10)&& (password_len != 26)) {
AnnaBridge 167:e84263d55307 439 error_flag = RTW_WRONG_PASSWORD;
AnnaBridge 167:e84263d55307 440 return RTW_INVALID_KEY;
AnnaBridge 167:e84263d55307 441 } else {
AnnaBridge 167:e84263d55307 442
AnnaBridge 167:e84263d55307 443 if(password_len == 10) {
AnnaBridge 167:e84263d55307 444
AnnaBridge 167:e84263d55307 445 u32 p[5] = {0};
AnnaBridge 167:e84263d55307 446 u8 i = 0;
AnnaBridge 167:e84263d55307 447 sscanf((const char*)password, "%02x%02x%02x%02x%02x", &p[0], &p[1], &p[2], &p[3], &p[4]);
AnnaBridge 167:e84263d55307 448 for(i=0; i< 5; i++)
AnnaBridge 167:e84263d55307 449 wep_pwd[i] = (u8)p[i];
AnnaBridge 167:e84263d55307 450 wep_pwd[5] = '\0';
AnnaBridge 167:e84263d55307 451 password_len = 5;
AnnaBridge 167:e84263d55307 452 wep_hex = 1;
AnnaBridge 167:e84263d55307 453 } else if (password_len == 26) {
AnnaBridge 167:e84263d55307 454 u32 p[13] = {0};
AnnaBridge 167:e84263d55307 455 u8 i = 0;
AnnaBridge 167:e84263d55307 456 sscanf((const char*)password, "%02x%02x%02x%02x%02x%02x%02x"\
AnnaBridge 167:e84263d55307 457 "%02x%02x%02x%02x%02x%02x", &p[0], &p[1], &p[2], &p[3], &p[4],\
AnnaBridge 167:e84263d55307 458 &p[5], &p[6], &p[7], &p[8], &p[9], &p[10], &p[11], &p[12]);
AnnaBridge 167:e84263d55307 459 for(i=0; i< 13; i++)
AnnaBridge 167:e84263d55307 460 wep_pwd[i] = (u8)p[i];
AnnaBridge 167:e84263d55307 461 wep_pwd[13] = '\0';
AnnaBridge 167:e84263d55307 462 password_len = 13;
AnnaBridge 167:e84263d55307 463 wep_hex = 1;
AnnaBridge 167:e84263d55307 464 }
AnnaBridge 167:e84263d55307 465 }
AnnaBridge 167:e84263d55307 466 }
AnnaBridge 167:e84263d55307 467
AnnaBridge 167:e84263d55307 468 internal_join_result_t *join_result = (internal_join_result_t *)rtw_zmalloc(sizeof(internal_join_result_t));
AnnaBridge 167:e84263d55307 469 if(!join_result) {
AnnaBridge 167:e84263d55307 470 return RTW_NOMEM;
AnnaBridge 167:e84263d55307 471 }
AnnaBridge 167:e84263d55307 472
AnnaBridge 167:e84263d55307 473 join_result->network_info.ssid.len = ssid_len > 32 ? 32 : ssid_len;
AnnaBridge 167:e84263d55307 474 rtw_memcpy(join_result->network_info.ssid.val, ssid, ssid_len);
AnnaBridge 167:e84263d55307 475
AnnaBridge 167:e84263d55307 476 join_result->network_info.password_len = password_len;
AnnaBridge 167:e84263d55307 477 if(password_len) {
AnnaBridge 167:e84263d55307 478 /* add \0 to the end */
AnnaBridge 167:e84263d55307 479 join_result->network_info.password = rtw_zmalloc(password_len + 1);
AnnaBridge 167:e84263d55307 480 if(!join_result->network_info.password) {
AnnaBridge 167:e84263d55307 481 result = RTW_NOMEM;
AnnaBridge 167:e84263d55307 482 goto error;
AnnaBridge 167:e84263d55307 483 }
AnnaBridge 167:e84263d55307 484 if (0 == wep_hex)
AnnaBridge 167:e84263d55307 485 rtw_memcpy(join_result->network_info.password, password, password_len);
AnnaBridge 167:e84263d55307 486 else
AnnaBridge 167:e84263d55307 487 rtw_memcpy(join_result->network_info.password, wep_pwd, password_len);
AnnaBridge 167:e84263d55307 488
AnnaBridge 167:e84263d55307 489 }
AnnaBridge 167:e84263d55307 490
AnnaBridge 167:e84263d55307 491 join_result->network_info.security_type = security_type;
AnnaBridge 167:e84263d55307 492 join_result->network_info.key_id = key_id;
AnnaBridge 167:e84263d55307 493
AnnaBridge 167:e84263d55307 494 if(semaphore == NULL) {
AnnaBridge 167:e84263d55307 495 rtw_init_sema( &join_result->join_sema, 0 );
AnnaBridge 167:e84263d55307 496 if(!join_result->join_sema){
AnnaBridge 167:e84263d55307 497 result = RTW_NORESOURCE;
AnnaBridge 167:e84263d55307 498 goto error;
AnnaBridge 167:e84263d55307 499 }
AnnaBridge 167:e84263d55307 500 join_semaphore = join_result->join_sema;
AnnaBridge 167:e84263d55307 501 } else {
AnnaBridge 167:e84263d55307 502 join_result->join_sema = semaphore;
AnnaBridge 167:e84263d55307 503 }
AnnaBridge 167:e84263d55307 504 wifi_reg_event_handler(WIFI_EVENT_NO_NETWORK,wifi_no_network_hdl,NULL);
AnnaBridge 167:e84263d55307 505 wifi_reg_event_handler(WIFI_EVENT_CONNECT, wifi_connected_hdl, NULL);
AnnaBridge 167:e84263d55307 506 wifi_reg_event_handler(WIFI_EVENT_DISCONNECT, wifi_disconn_hdl, NULL);
AnnaBridge 167:e84263d55307 507 wifi_reg_event_handler(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, wifi_handshake_done_hdl, NULL);
AnnaBridge 167:e84263d55307 508
AnnaBridge 167:e84263d55307 509 wifi_connect_local(&join_result->network_info);
AnnaBridge 167:e84263d55307 510
AnnaBridge 167:e84263d55307 511 join_user_data = join_result;
AnnaBridge 167:e84263d55307 512
AnnaBridge 167:e84263d55307 513 if(semaphore == NULL) {
AnnaBridge 167:e84263d55307 514 // for eap connection, timeout should be longer (default value in wpa_supplicant: 60s)
AnnaBridge 167:e84263d55307 515 #ifdef CONFIG_ENABLE_EAP
AnnaBridge 167:e84263d55307 516 if(get_eap_phase()){
AnnaBridge 167:e84263d55307 517 if(rtw_down_timeout_sema( &join_result->join_sema, 60000 ) == RTW_FALSE) {
AnnaBridge 167:e84263d55307 518 printf("RTW API: Join bss timeout\r\n");
AnnaBridge 167:e84263d55307 519 if(password_len) {
AnnaBridge 167:e84263d55307 520 rtw_free(join_result->network_info.password);
AnnaBridge 167:e84263d55307 521 }
AnnaBridge 167:e84263d55307 522 result = RTW_TIMEOUT;
AnnaBridge 167:e84263d55307 523 goto error;
AnnaBridge 167:e84263d55307 524 } else {
AnnaBridge 167:e84263d55307 525 if(wifi_is_connected_to_ap( ) != RTW_SUCCESS) {
AnnaBridge 167:e84263d55307 526 result = RTW_ERROR;
AnnaBridge 167:e84263d55307 527 goto error;
AnnaBridge 167:e84263d55307 528 }
AnnaBridge 167:e84263d55307 529 }
AnnaBridge 167:e84263d55307 530 }
AnnaBridge 167:e84263d55307 531 else
AnnaBridge 167:e84263d55307 532 #endif
AnnaBridge 167:e84263d55307 533 if(rtw_down_timeout_sema( &join_result->join_sema, RTW_JOIN_TIMEOUT ) == RTW_FALSE) {
AnnaBridge 167:e84263d55307 534 printf("RTW API: Join bss timeout\r\n");
AnnaBridge 167:e84263d55307 535 if(password_len) {
AnnaBridge 167:e84263d55307 536 rtw_free(join_result->network_info.password);
AnnaBridge 167:e84263d55307 537 }
AnnaBridge 167:e84263d55307 538 result = RTW_TIMEOUT;
AnnaBridge 167:e84263d55307 539 goto error;
AnnaBridge 167:e84263d55307 540 } else {
AnnaBridge 167:e84263d55307 541 if(join_result->network_info.password_len) {
AnnaBridge 167:e84263d55307 542 rtw_free(join_result->network_info.password);
AnnaBridge 167:e84263d55307 543 }
AnnaBridge 167:e84263d55307 544 if(wifi_is_connected_to_ap( ) != RTW_SUCCESS) {
AnnaBridge 167:e84263d55307 545 result = RTW_ERROR;
AnnaBridge 167:e84263d55307 546 goto error;
AnnaBridge 167:e84263d55307 547 }
AnnaBridge 167:e84263d55307 548 }
AnnaBridge 167:e84263d55307 549 }
AnnaBridge 167:e84263d55307 550
AnnaBridge 167:e84263d55307 551 result = RTW_SUCCESS;
AnnaBridge 167:e84263d55307 552
AnnaBridge 167:e84263d55307 553 #if CONFIG_EXAMPLE_WLAN_FAST_CONNECT || CONFIG_JD_SMART
AnnaBridge 167:e84263d55307 554 restore_wifi_info_to_flash();
AnnaBridge 167:e84263d55307 555 #endif
AnnaBridge 167:e84263d55307 556
AnnaBridge 167:e84263d55307 557 error:
AnnaBridge 167:e84263d55307 558 if(semaphore == NULL){
AnnaBridge 167:e84263d55307 559 rtw_free_sema( &join_semaphore);
AnnaBridge 167:e84263d55307 560 }
AnnaBridge 167:e84263d55307 561 join_user_data = NULL;
AnnaBridge 167:e84263d55307 562 rtw_free((u8*)join_result);
AnnaBridge 167:e84263d55307 563 wifi_unreg_event_handler(WIFI_EVENT_CONNECT, wifi_connected_hdl);
AnnaBridge 167:e84263d55307 564 wifi_unreg_event_handler(WIFI_EVENT_NO_NETWORK,wifi_no_network_hdl);
AnnaBridge 167:e84263d55307 565 wifi_unreg_event_handler(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, wifi_handshake_done_hdl);
AnnaBridge 167:e84263d55307 566 return result;
AnnaBridge 167:e84263d55307 567 }
AnnaBridge 167:e84263d55307 568
AnnaBridge 167:e84263d55307 569 int wifi_connect_bssid(
AnnaBridge 167:e84263d55307 570 unsigned char bssid[ETH_ALEN],
AnnaBridge 167:e84263d55307 571 char *ssid,
AnnaBridge 167:e84263d55307 572 rtw_security_t security_type,
AnnaBridge 167:e84263d55307 573 char *password,
AnnaBridge 167:e84263d55307 574 int bssid_len,
AnnaBridge 167:e84263d55307 575 int ssid_len,
AnnaBridge 167:e84263d55307 576 int password_len,
AnnaBridge 167:e84263d55307 577 int key_id,
AnnaBridge 167:e84263d55307 578 void *semaphore)
AnnaBridge 167:e84263d55307 579 {
AnnaBridge 167:e84263d55307 580 _sema join_semaphore;
AnnaBridge 167:e84263d55307 581 rtw_result_t result = RTW_SUCCESS;
AnnaBridge 167:e84263d55307 582
AnnaBridge 167:e84263d55307 583 if(rtw_join_status & JOIN_SIMPLE_CONFIG || rtw_join_status & JOIN_AIRKISS){
AnnaBridge 167:e84263d55307 584 return RTW_ERROR;
AnnaBridge 167:e84263d55307 585 }
AnnaBridge 167:e84263d55307 586
AnnaBridge 167:e84263d55307 587 rtw_join_status = 0;//clear for last connect status
AnnaBridge 167:e84263d55307 588 error_flag = RTW_UNKNOWN;//clear for last connect status
AnnaBridge 167:e84263d55307 589 internal_join_result_t *join_result = (internal_join_result_t *)rtw_zmalloc(sizeof(internal_join_result_t));
AnnaBridge 167:e84263d55307 590 if(!join_result) {
AnnaBridge 167:e84263d55307 591 return RTW_NOMEM;
AnnaBridge 167:e84263d55307 592 }
AnnaBridge 167:e84263d55307 593 if(ssid_len && ssid){
AnnaBridge 167:e84263d55307 594 join_result->network_info.ssid.len = ssid_len > 32 ? 32 : ssid_len;
AnnaBridge 167:e84263d55307 595 rtw_memcpy(join_result->network_info.ssid.val, ssid, ssid_len);
AnnaBridge 167:e84263d55307 596 }
AnnaBridge 167:e84263d55307 597 rtw_memcpy(join_result->network_info.bssid.octet, bssid, bssid_len);
AnnaBridge 167:e84263d55307 598
AnnaBridge 167:e84263d55307 599 if ( ( ( ( password_len > RTW_MAX_PSK_LEN ) ||
AnnaBridge 167:e84263d55307 600 ( password_len < RTW_MIN_PSK_LEN ) ) &&
AnnaBridge 167:e84263d55307 601 ( ( security_type == RTW_SECURITY_WPA_TKIP_PSK ) ||
AnnaBridge 167:e84263d55307 602 ( security_type == RTW_SECURITY_WPA_AES_PSK ) ||
AnnaBridge 167:e84263d55307 603 ( security_type == RTW_SECURITY_WPA2_AES_PSK ) ||
AnnaBridge 167:e84263d55307 604 ( security_type == RTW_SECURITY_WPA2_TKIP_PSK ) ||
AnnaBridge 167:e84263d55307 605 ( security_type == RTW_SECURITY_WPA2_MIXED_PSK ) ) )||
AnnaBridge 167:e84263d55307 606 (((password_len != 5)&& (password_len != 13))&&
AnnaBridge 167:e84263d55307 607 ((security_type == RTW_SECURITY_WEP_PSK)||
AnnaBridge 167:e84263d55307 608 (security_type ==RTW_SECURITY_WEP_SHARED ) ))) {
AnnaBridge 167:e84263d55307 609 return RTW_INVALID_KEY;
AnnaBridge 167:e84263d55307 610 }
AnnaBridge 167:e84263d55307 611 join_result->network_info.password_len = password_len;
AnnaBridge 167:e84263d55307 612 if(password_len) {
AnnaBridge 167:e84263d55307 613 /* add \0 to the end */
AnnaBridge 167:e84263d55307 614 join_result->network_info.password = rtw_zmalloc(password_len + 1);
AnnaBridge 167:e84263d55307 615 if(!join_result->network_info.password) {
AnnaBridge 167:e84263d55307 616 return RTW_NOMEM;
AnnaBridge 167:e84263d55307 617 }
AnnaBridge 167:e84263d55307 618 rtw_memcpy(join_result->network_info.password, password, password_len);
AnnaBridge 167:e84263d55307 619 }
AnnaBridge 167:e84263d55307 620
AnnaBridge 167:e84263d55307 621 join_result->network_info.security_type = security_type;
AnnaBridge 167:e84263d55307 622 join_result->network_info.key_id = key_id;
AnnaBridge 167:e84263d55307 623
AnnaBridge 167:e84263d55307 624 if(semaphore == NULL) {
AnnaBridge 167:e84263d55307 625 rtw_init_sema( &join_result->join_sema, 0 );
AnnaBridge 167:e84263d55307 626 if(!join_result->join_sema){
AnnaBridge 167:e84263d55307 627 return RTW_NORESOURCE;
AnnaBridge 167:e84263d55307 628 }
AnnaBridge 167:e84263d55307 629 join_semaphore = join_result->join_sema;
AnnaBridge 167:e84263d55307 630 } else {
AnnaBridge 167:e84263d55307 631 join_result->join_sema = semaphore;
AnnaBridge 167:e84263d55307 632 }
AnnaBridge 167:e84263d55307 633 wifi_reg_event_handler(WIFI_EVENT_NO_NETWORK,wifi_no_network_hdl,NULL);
AnnaBridge 167:e84263d55307 634 wifi_reg_event_handler(WIFI_EVENT_CONNECT, wifi_connected_hdl, NULL);
AnnaBridge 167:e84263d55307 635 wifi_reg_event_handler(WIFI_EVENT_DISCONNECT, wifi_disconn_hdl, NULL);
AnnaBridge 167:e84263d55307 636 wifi_reg_event_handler(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, wifi_handshake_done_hdl, NULL);
AnnaBridge 167:e84263d55307 637
AnnaBridge 167:e84263d55307 638 wifi_connect_bssid_local(&join_result->network_info);
AnnaBridge 167:e84263d55307 639
AnnaBridge 167:e84263d55307 640 join_user_data = join_result;
AnnaBridge 167:e84263d55307 641
AnnaBridge 167:e84263d55307 642 if(semaphore == NULL) {
AnnaBridge 167:e84263d55307 643 if(rtw_down_timeout_sema( &join_result->join_sema, RTW_JOIN_TIMEOUT ) == RTW_FALSE) {
AnnaBridge 167:e84263d55307 644 printf("RTW API: Join bss timeout\r\n");
AnnaBridge 167:e84263d55307 645 if(password_len) {
AnnaBridge 167:e84263d55307 646 rtw_free(join_result->network_info.password);
AnnaBridge 167:e84263d55307 647 }
AnnaBridge 167:e84263d55307 648 rtw_free((u8*)join_result);
AnnaBridge 167:e84263d55307 649 rtw_free_sema( &join_semaphore);
AnnaBridge 167:e84263d55307 650 result = RTW_TIMEOUT;
AnnaBridge 167:e84263d55307 651 goto error;
AnnaBridge 167:e84263d55307 652 } else {
AnnaBridge 167:e84263d55307 653 rtw_free_sema( &join_semaphore );
AnnaBridge 167:e84263d55307 654 if(join_result->network_info.password_len) {
AnnaBridge 167:e84263d55307 655 rtw_free(join_result->network_info.password);
AnnaBridge 167:e84263d55307 656 }
AnnaBridge 167:e84263d55307 657 rtw_free((u8*)join_result);
AnnaBridge 167:e84263d55307 658 if( wifi_is_connected_to_ap( ) != RTW_SUCCESS) {
AnnaBridge 167:e84263d55307 659 result = RTW_ERROR;
AnnaBridge 167:e84263d55307 660 goto error;
AnnaBridge 167:e84263d55307 661 }
AnnaBridge 167:e84263d55307 662 }
AnnaBridge 167:e84263d55307 663 }
AnnaBridge 167:e84263d55307 664
AnnaBridge 167:e84263d55307 665 result = RTW_SUCCESS;
AnnaBridge 167:e84263d55307 666
AnnaBridge 167:e84263d55307 667 #if CONFIG_EXAMPLE_WLAN_FAST_CONNECT || CONFIG_JD_SMART
AnnaBridge 167:e84263d55307 668 restore_wifi_info_to_flash();
AnnaBridge 167:e84263d55307 669 #endif
AnnaBridge 167:e84263d55307 670
AnnaBridge 167:e84263d55307 671 error:
AnnaBridge 167:e84263d55307 672 join_user_data = NULL;
AnnaBridge 167:e84263d55307 673 wifi_unreg_event_handler(WIFI_EVENT_CONNECT, wifi_connected_hdl);
AnnaBridge 167:e84263d55307 674 wifi_unreg_event_handler(WIFI_EVENT_NO_NETWORK,wifi_no_network_hdl);
AnnaBridge 167:e84263d55307 675 wifi_unreg_event_handler(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, wifi_handshake_done_hdl);
AnnaBridge 167:e84263d55307 676 return result;
AnnaBridge 167:e84263d55307 677 }
AnnaBridge 167:e84263d55307 678
AnnaBridge 167:e84263d55307 679 int wifi_disconnect(void)
AnnaBridge 167:e84263d55307 680 {
AnnaBridge 167:e84263d55307 681 int ret = 0;
AnnaBridge 167:e84263d55307 682
AnnaBridge 167:e84263d55307 683 //set MAC address last byte to 1 since driver will filter the mac with all 0x00 or 0xff
AnnaBridge 167:e84263d55307 684 //add extra 2 zero byte for check of #@ in wext_set_bssid()
AnnaBridge 167:e84263d55307 685 const __u8 null_bssid[ETH_ALEN + 2] = {0, 0, 0, 0, 0, 1, 0, 0};
AnnaBridge 167:e84263d55307 686
AnnaBridge 167:e84263d55307 687 if (wext_set_bssid(WLAN0_NAME, null_bssid) < 0){
AnnaBridge 167:e84263d55307 688 printf("\n\rWEXT: Failed to set bogus BSSID to disconnect");
AnnaBridge 167:e84263d55307 689 ret = -1;
AnnaBridge 167:e84263d55307 690 }
AnnaBridge 167:e84263d55307 691 return ret;
AnnaBridge 167:e84263d55307 692 }
AnnaBridge 167:e84263d55307 693
AnnaBridge 167:e84263d55307 694 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 695 int wifi_is_connected_to_ap( void )
AnnaBridge 167:e84263d55307 696 {
AnnaBridge 167:e84263d55307 697 return rltk_wlan_is_connected_to_ap();
AnnaBridge 167:e84263d55307 698 }
AnnaBridge 167:e84263d55307 699
AnnaBridge 167:e84263d55307 700 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 701 int wifi_is_up(rtw_interface_t interface)
AnnaBridge 167:e84263d55307 702 {
AnnaBridge 167:e84263d55307 703 if(interface == RTW_AP_INTERFACE) {
AnnaBridge 167:e84263d55307 704 if(wifi_mode == RTW_MODE_STA_AP) {
AnnaBridge 167:e84263d55307 705 return rltk_wlan_running(WLAN1_IDX);
AnnaBridge 167:e84263d55307 706 }
AnnaBridge 167:e84263d55307 707 }
AnnaBridge 167:e84263d55307 708
AnnaBridge 167:e84263d55307 709 return rltk_wlan_running(WLAN0_IDX);
AnnaBridge 167:e84263d55307 710 }
AnnaBridge 167:e84263d55307 711
AnnaBridge 167:e84263d55307 712 int wifi_is_ready_to_transceive(rtw_interface_t interface)
AnnaBridge 167:e84263d55307 713 {
AnnaBridge 167:e84263d55307 714 switch ( interface )
AnnaBridge 167:e84263d55307 715 {
AnnaBridge 167:e84263d55307 716 case RTW_AP_INTERFACE:
AnnaBridge 167:e84263d55307 717 return ( wifi_is_up(interface) == RTW_TRUE ) ? RTW_SUCCESS : RTW_ERROR;
AnnaBridge 167:e84263d55307 718
AnnaBridge 167:e84263d55307 719 case RTW_STA_INTERFACE:
AnnaBridge 167:e84263d55307 720 switch ( error_flag)
AnnaBridge 167:e84263d55307 721 {
AnnaBridge 167:e84263d55307 722 case RTW_NO_ERROR:
AnnaBridge 167:e84263d55307 723 return RTW_SUCCESS;
AnnaBridge 167:e84263d55307 724
AnnaBridge 167:e84263d55307 725 default:
AnnaBridge 167:e84263d55307 726 return RTW_ERROR;
AnnaBridge 167:e84263d55307 727 }
AnnaBridge 167:e84263d55307 728 default:
AnnaBridge 167:e84263d55307 729 return RTW_ERROR;
AnnaBridge 167:e84263d55307 730 }
AnnaBridge 167:e84263d55307 731 }
AnnaBridge 167:e84263d55307 732
AnnaBridge 167:e84263d55307 733 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 734 int wifi_set_mac_address(char * mac)
AnnaBridge 167:e84263d55307 735 {
AnnaBridge 167:e84263d55307 736 char buf[13+17+1];
AnnaBridge 167:e84263d55307 737 rtw_memset(buf, 0, sizeof(buf));
AnnaBridge 167:e84263d55307 738 snprintf(buf, 13+17, "write_mac %s", mac);
AnnaBridge 167:e84263d55307 739 return wext_private_command(WLAN0_NAME, buf, 0);
AnnaBridge 167:e84263d55307 740 }
AnnaBridge 167:e84263d55307 741
AnnaBridge 167:e84263d55307 742 int wifi_get_mac_address(char * mac)
AnnaBridge 167:e84263d55307 743 {
AnnaBridge 167:e84263d55307 744 int ret = 0;
AnnaBridge 167:e84263d55307 745 char buf[32];
AnnaBridge 167:e84263d55307 746 rtw_memset(buf, 0, sizeof(buf));
AnnaBridge 167:e84263d55307 747 rtw_memcpy(buf, "read_mac", 8);
AnnaBridge 167:e84263d55307 748 ret = wext_private_command_with_retval(WLAN0_NAME, buf, buf, 32);
AnnaBridge 167:e84263d55307 749 strcpy(mac, buf);
AnnaBridge 167:e84263d55307 750 return ret;
AnnaBridge 167:e84263d55307 751 }
AnnaBridge 167:e84263d55307 752
AnnaBridge 167:e84263d55307 753 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 754 int wifi_enable_powersave(void)
AnnaBridge 167:e84263d55307 755 {
AnnaBridge 167:e84263d55307 756 return wext_enable_powersave(WLAN0_NAME, 1, 1);
AnnaBridge 167:e84263d55307 757 }
AnnaBridge 167:e84263d55307 758
AnnaBridge 167:e84263d55307 759 int wifi_disable_powersave(void)
AnnaBridge 167:e84263d55307 760 {
AnnaBridge 167:e84263d55307 761 return wext_disable_powersave(WLAN0_NAME);
AnnaBridge 167:e84263d55307 762 }
AnnaBridge 167:e84263d55307 763
AnnaBridge 167:e84263d55307 764 #if 0 //Not ready
AnnaBridge 167:e84263d55307 765 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 766 int wifi_get_txpower(int *poweridx)
AnnaBridge 167:e84263d55307 767 {
AnnaBridge 167:e84263d55307 768 int ret = 0;
AnnaBridge 167:e84263d55307 769 char buf[11];
AnnaBridge 167:e84263d55307 770
AnnaBridge 167:e84263d55307 771 rtw_memset(buf, 0, sizeof(buf));
AnnaBridge 167:e84263d55307 772 rtw_memcpy(buf, "txpower", 11);
AnnaBridge 167:e84263d55307 773 ret = wext_private_command_with_retval(WLAN0_NAME, buf, buf, 11);
AnnaBridge 167:e84263d55307 774 sscanf(buf, "%d", poweridx);
AnnaBridge 167:e84263d55307 775
AnnaBridge 167:e84263d55307 776 return ret;
AnnaBridge 167:e84263d55307 777 }
AnnaBridge 167:e84263d55307 778
AnnaBridge 167:e84263d55307 779 int wifi_set_txpower(int poweridx)
AnnaBridge 167:e84263d55307 780 {
AnnaBridge 167:e84263d55307 781 int ret = 0;
AnnaBridge 167:e84263d55307 782 char buf[24];
AnnaBridge 167:e84263d55307 783
AnnaBridge 167:e84263d55307 784 rtw_memset(buf, 0, sizeof(buf));
AnnaBridge 167:e84263d55307 785 snprintf(buf, 24, "txpower patha=%d", poweridx);
AnnaBridge 167:e84263d55307 786 ret = wext_private_command(WLAN0_NAME, buf, 0);
AnnaBridge 167:e84263d55307 787
AnnaBridge 167:e84263d55307 788 return ret;
AnnaBridge 167:e84263d55307 789 }
AnnaBridge 167:e84263d55307 790 #endif
AnnaBridge 167:e84263d55307 791
AnnaBridge 167:e84263d55307 792 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 793 int wifi_get_associated_client_list(void * client_list_buffer, uint16_t buffer_length)
AnnaBridge 167:e84263d55307 794 {
AnnaBridge 167:e84263d55307 795 const char * ifname = WLAN0_NAME;
AnnaBridge 167:e84263d55307 796 int ret = 0;
AnnaBridge 167:e84263d55307 797 char buf[25];
AnnaBridge 167:e84263d55307 798
AnnaBridge 167:e84263d55307 799 if(wifi_mode == RTW_MODE_STA_AP) {
AnnaBridge 167:e84263d55307 800 ifname = WLAN1_NAME;
AnnaBridge 167:e84263d55307 801 }
AnnaBridge 167:e84263d55307 802
AnnaBridge 167:e84263d55307 803 rtw_memset(buf, 0, sizeof(buf));
AnnaBridge 167:e84263d55307 804 snprintf(buf, 25, "get_client_list %x", client_list_buffer);
AnnaBridge 167:e84263d55307 805 ret = wext_private_command(ifname, buf, 0);
AnnaBridge 167:e84263d55307 806
AnnaBridge 167:e84263d55307 807 return ret;
AnnaBridge 167:e84263d55307 808 }
AnnaBridge 167:e84263d55307 809
AnnaBridge 167:e84263d55307 810 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 811 int wifi_get_ap_info(rtw_bss_info_t * ap_info, rtw_security_t* security)
AnnaBridge 167:e84263d55307 812 {
AnnaBridge 167:e84263d55307 813 const char * ifname = WLAN0_NAME;
AnnaBridge 167:e84263d55307 814 int ret = 0;
AnnaBridge 167:e84263d55307 815 char buf[24];
AnnaBridge 167:e84263d55307 816
AnnaBridge 167:e84263d55307 817 if(wifi_mode == RTW_MODE_STA_AP) {
AnnaBridge 167:e84263d55307 818 ifname = WLAN1_NAME;
AnnaBridge 167:e84263d55307 819 }
AnnaBridge 167:e84263d55307 820
AnnaBridge 167:e84263d55307 821 rtw_memset(buf, 0, sizeof(buf));
AnnaBridge 167:e84263d55307 822 snprintf(buf, 24, "get_ap_info %x", ap_info);
AnnaBridge 167:e84263d55307 823 ret = wext_private_command(ifname, buf, 0);
AnnaBridge 167:e84263d55307 824
AnnaBridge 167:e84263d55307 825 snprintf(buf, 24, "get_security");
AnnaBridge 167:e84263d55307 826 ret = wext_private_command_with_retval(ifname, buf, buf, 24);
AnnaBridge 167:e84263d55307 827 sscanf(buf, "%d", security);
AnnaBridge 167:e84263d55307 828
AnnaBridge 167:e84263d55307 829 return ret;
AnnaBridge 167:e84263d55307 830 }
AnnaBridge 167:e84263d55307 831
AnnaBridge 167:e84263d55307 832 int wifi_get_drv_ability(uint32_t *ability)
AnnaBridge 167:e84263d55307 833 {
AnnaBridge 167:e84263d55307 834 return wext_get_drv_ability(WLAN0_NAME, ability);
AnnaBridge 167:e84263d55307 835 }
AnnaBridge 167:e84263d55307 836
AnnaBridge 167:e84263d55307 837 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 838 int wifi_set_country(rtw_country_code_t country_code)
AnnaBridge 167:e84263d55307 839 {
AnnaBridge 167:e84263d55307 840 int ret;
AnnaBridge 167:e84263d55307 841
AnnaBridge 167:e84263d55307 842 ret = wext_set_country(WLAN0_NAME, country_code);
AnnaBridge 167:e84263d55307 843
AnnaBridge 167:e84263d55307 844 return ret;
AnnaBridge 167:e84263d55307 845 }
AnnaBridge 167:e84263d55307 846
AnnaBridge 167:e84263d55307 847 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 848 int wifi_set_channel_plan(uint8_t channel_plan)
AnnaBridge 167:e84263d55307 849 {
AnnaBridge 167:e84263d55307 850 const char * ifname = WLAN0_NAME;
AnnaBridge 167:e84263d55307 851 int ret = 0;
AnnaBridge 167:e84263d55307 852 char buf[24];
AnnaBridge 167:e84263d55307 853
AnnaBridge 167:e84263d55307 854 rtw_memset(buf, 0, sizeof(buf));
AnnaBridge 167:e84263d55307 855 snprintf(buf, 24, "set_ch_plan %x", channel_plan);
AnnaBridge 167:e84263d55307 856 ret = wext_private_command(ifname, buf, 0);
AnnaBridge 167:e84263d55307 857 return ret;
AnnaBridge 167:e84263d55307 858 }
AnnaBridge 167:e84263d55307 859
AnnaBridge 167:e84263d55307 860 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 861 int wifi_get_rssi(int *pRSSI)
AnnaBridge 167:e84263d55307 862 {
AnnaBridge 167:e84263d55307 863 return wext_get_rssi(WLAN0_NAME, pRSSI);
AnnaBridge 167:e84263d55307 864 }
AnnaBridge 167:e84263d55307 865
AnnaBridge 167:e84263d55307 866 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 867 int wifi_set_channel(int channel)
AnnaBridge 167:e84263d55307 868 {
AnnaBridge 167:e84263d55307 869 return wext_set_channel(WLAN0_NAME, channel);
AnnaBridge 167:e84263d55307 870 }
AnnaBridge 167:e84263d55307 871
AnnaBridge 167:e84263d55307 872 int wifi_get_channel(int *channel)
AnnaBridge 167:e84263d55307 873 {
AnnaBridge 167:e84263d55307 874 return wext_get_channel(WLAN0_NAME, (u8*)channel);
AnnaBridge 167:e84263d55307 875 }
AnnaBridge 167:e84263d55307 876
AnnaBridge 167:e84263d55307 877 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 878 int wifi_register_multicast_address(rtw_mac_t *mac)
AnnaBridge 167:e84263d55307 879 {
AnnaBridge 167:e84263d55307 880 return wext_register_multicast_address(WLAN0_NAME, mac);
AnnaBridge 167:e84263d55307 881 }
AnnaBridge 167:e84263d55307 882
AnnaBridge 167:e84263d55307 883 int wifi_unregister_multicast_address(rtw_mac_t *mac)
AnnaBridge 167:e84263d55307 884 {
AnnaBridge 167:e84263d55307 885 return wext_unregister_multicast_address(WLAN0_NAME, mac);
AnnaBridge 167:e84263d55307 886 }
AnnaBridge 167:e84263d55307 887
AnnaBridge 167:e84263d55307 888 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 889 void wifi_set_mib(void)
AnnaBridge 167:e84263d55307 890 {
AnnaBridge 167:e84263d55307 891 // adaptivity
AnnaBridge 167:e84263d55307 892 wext_set_adaptivity(RTW_ADAPTIVITY_DISABLE);
AnnaBridge 167:e84263d55307 893 }
AnnaBridge 167:e84263d55307 894
AnnaBridge 167:e84263d55307 895 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 896 int wifi_rf_on(void)
AnnaBridge 167:e84263d55307 897 {
AnnaBridge 167:e84263d55307 898 int ret;
AnnaBridge 167:e84263d55307 899 ret = rltk_wlan_rf_on();
AnnaBridge 167:e84263d55307 900 return ret;
AnnaBridge 167:e84263d55307 901 }
AnnaBridge 167:e84263d55307 902
AnnaBridge 167:e84263d55307 903 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 904 int wifi_rf_off(void)
AnnaBridge 167:e84263d55307 905 {
AnnaBridge 167:e84263d55307 906 int ret;
AnnaBridge 167:e84263d55307 907 ret = rltk_wlan_rf_off();
AnnaBridge 167:e84263d55307 908 return ret;
AnnaBridge 167:e84263d55307 909 }
AnnaBridge 167:e84263d55307 910
AnnaBridge 167:e84263d55307 911 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 912 int wifi_on(rtw_mode_t mode)
AnnaBridge 167:e84263d55307 913 {
AnnaBridge 167:e84263d55307 914 int ret = 1;
AnnaBridge 167:e84263d55307 915 int timeout = 20;
AnnaBridge 167:e84263d55307 916 int idx;
AnnaBridge 167:e84263d55307 917 int devnum = 1;
AnnaBridge 167:e84263d55307 918 static int event_init = 0;
AnnaBridge 167:e84263d55307 919
AnnaBridge 167:e84263d55307 920 if(rltk_wlan_running(WLAN0_IDX)) {
AnnaBridge 167:e84263d55307 921 printf("\n\rWIFI is already running");
AnnaBridge 167:e84263d55307 922 return 1;
AnnaBridge 167:e84263d55307 923 }
AnnaBridge 167:e84263d55307 924
AnnaBridge 167:e84263d55307 925 if(event_init == 0){
AnnaBridge 167:e84263d55307 926 init_event_callback_list();
AnnaBridge 167:e84263d55307 927 event_init = 1;
AnnaBridge 167:e84263d55307 928 }
AnnaBridge 167:e84263d55307 929
AnnaBridge 167:e84263d55307 930 wifi_mode = mode;
AnnaBridge 167:e84263d55307 931
AnnaBridge 167:e84263d55307 932 if(mode == RTW_MODE_STA_AP)
AnnaBridge 167:e84263d55307 933 devnum = 2;
AnnaBridge 167:e84263d55307 934
AnnaBridge 167:e84263d55307 935 // set wifi mib
AnnaBridge 167:e84263d55307 936 wifi_set_mib();
AnnaBridge 167:e84263d55307 937 printf("\n\rInitializing WIFI ...");
AnnaBridge 167:e84263d55307 938 for(idx=0;idx<devnum;idx++){
AnnaBridge 167:e84263d55307 939 ret = rltk_wlan_init(idx, mode);
AnnaBridge 167:e84263d55307 940 if(ret <0)
AnnaBridge 167:e84263d55307 941 return ret;
AnnaBridge 167:e84263d55307 942 }
AnnaBridge 167:e84263d55307 943 for(idx=0;idx<devnum;idx++){
AnnaBridge 167:e84263d55307 944 ret = rltk_wlan_start(idx);
AnnaBridge 167:e84263d55307 945 if(ret <0){
AnnaBridge 167:e84263d55307 946 printf("\n\rERROR: Start WIFI Failed!");
AnnaBridge 167:e84263d55307 947 rltk_wlan_deinit();
AnnaBridge 167:e84263d55307 948 return ret;
AnnaBridge 167:e84263d55307 949 }
AnnaBridge 167:e84263d55307 950 }
AnnaBridge 167:e84263d55307 951
AnnaBridge 167:e84263d55307 952 while(1) {
AnnaBridge 167:e84263d55307 953 if(rltk_wlan_running(devnum-1)) {
AnnaBridge 167:e84263d55307 954 printf("\n\rWIFI initialized\n");
AnnaBridge 167:e84263d55307 955
AnnaBridge 167:e84263d55307 956
AnnaBridge 167:e84263d55307 957 /*
AnnaBridge 167:e84263d55307 958 * printf("set country code here\n");
AnnaBridge 167:e84263d55307 959 * wifi_set_country(RTW_COUNTRY_US);
AnnaBridge 167:e84263d55307 960 */
AnnaBridge 167:e84263d55307 961 break;
AnnaBridge 167:e84263d55307 962 }
AnnaBridge 167:e84263d55307 963
AnnaBridge 167:e84263d55307 964 if(timeout == 0) {
AnnaBridge 167:e84263d55307 965 printf("\n\rERROR: Init WIFI timeout!");
AnnaBridge 167:e84263d55307 966 break;
AnnaBridge 167:e84263d55307 967 }
AnnaBridge 167:e84263d55307 968
AnnaBridge 167:e84263d55307 969 rtw_msleep_os(1000);
AnnaBridge 167:e84263d55307 970 timeout --;
AnnaBridge 167:e84263d55307 971 }
AnnaBridge 167:e84263d55307 972
AnnaBridge 167:e84263d55307 973 #if CONFIG_LWIP_LAYER
AnnaBridge 167:e84263d55307 974 #if DEVICE_EMAC
AnnaBridge 167:e84263d55307 975 #else
AnnaBridge 167:e84263d55307 976 netif_set_up(&xnetif[0]);
AnnaBridge 167:e84263d55307 977 if(mode == RTW_MODE_STA_AP) {
AnnaBridge 167:e84263d55307 978 netif_set_up(&xnetif[1]);
AnnaBridge 167:e84263d55307 979 }
AnnaBridge 167:e84263d55307 980 #endif
AnnaBridge 167:e84263d55307 981 #endif
AnnaBridge 167:e84263d55307 982
AnnaBridge 167:e84263d55307 983 #if CONFIG_INIC_EN
AnnaBridge 167:e84263d55307 984 inic_start();
AnnaBridge 167:e84263d55307 985 #endif
AnnaBridge 167:e84263d55307 986
AnnaBridge 167:e84263d55307 987 return ret;
AnnaBridge 167:e84263d55307 988 }
AnnaBridge 167:e84263d55307 989
AnnaBridge 167:e84263d55307 990 int wifi_off(void)
AnnaBridge 167:e84263d55307 991 {
AnnaBridge 167:e84263d55307 992 int ret = 0;
AnnaBridge 167:e84263d55307 993 int timeout = 20;
AnnaBridge 167:e84263d55307 994
AnnaBridge 167:e84263d55307 995 if((rltk_wlan_running(WLAN0_IDX) == 0) &&
AnnaBridge 167:e84263d55307 996 (rltk_wlan_running(WLAN1_IDX) == 0)) {
AnnaBridge 167:e84263d55307 997 printf("\n\rWIFI is not running");
AnnaBridge 167:e84263d55307 998 return 0;
AnnaBridge 167:e84263d55307 999 }
AnnaBridge 167:e84263d55307 1000 #if CONFIG_LWIP_LAYER
AnnaBridge 167:e84263d55307 1001 dhcps_deinit();
AnnaBridge 167:e84263d55307 1002 #if DEVICE_EMAC
AnnaBridge 167:e84263d55307 1003 // TODO:
AnnaBridge 167:e84263d55307 1004 #else
AnnaBridge 167:e84263d55307 1005 LwIP_DHCP(0, DHCP_STOP);
AnnaBridge 167:e84263d55307 1006 netif_set_down(&xnetif[0]);
AnnaBridge 167:e84263d55307 1007 netif_set_down(&xnetif[1]);
AnnaBridge 167:e84263d55307 1008 #endif
AnnaBridge 167:e84263d55307 1009 #endif
AnnaBridge 167:e84263d55307 1010 #if defined(CONFIG_ENABLE_WPS_AP) && CONFIG_ENABLE_WPS_AP
AnnaBridge 167:e84263d55307 1011 if((wifi_mode == RTW_MODE_AP) || (wifi_mode == RTW_MODE_STA_AP))
AnnaBridge 167:e84263d55307 1012 wpas_wps_deinit();
AnnaBridge 167:e84263d55307 1013 #endif
AnnaBridge 167:e84263d55307 1014 printf("\n\rDeinitializing WIFI ...");
AnnaBridge 167:e84263d55307 1015 rltk_wlan_deinit();
AnnaBridge 167:e84263d55307 1016
AnnaBridge 167:e84263d55307 1017 while(1) {
AnnaBridge 167:e84263d55307 1018 if((rltk_wlan_running(WLAN0_IDX) == 0) &&
AnnaBridge 167:e84263d55307 1019 (rltk_wlan_running(WLAN1_IDX) == 0)) {
AnnaBridge 167:e84263d55307 1020 printf("\n\rWIFI deinitialized");
AnnaBridge 167:e84263d55307 1021 break;
AnnaBridge 167:e84263d55307 1022 }
AnnaBridge 167:e84263d55307 1023
AnnaBridge 167:e84263d55307 1024 if(timeout == 0) {
AnnaBridge 167:e84263d55307 1025 printf("\n\rERROR: Deinit WIFI timeout!");
AnnaBridge 167:e84263d55307 1026 break;
AnnaBridge 167:e84263d55307 1027 }
AnnaBridge 167:e84263d55307 1028
AnnaBridge 167:e84263d55307 1029 rtw_msleep_os(1000);
AnnaBridge 167:e84263d55307 1030 timeout --;
AnnaBridge 167:e84263d55307 1031 }
AnnaBridge 167:e84263d55307 1032
AnnaBridge 167:e84263d55307 1033 wifi_mode = RTW_MODE_NONE;
AnnaBridge 167:e84263d55307 1034
AnnaBridge 167:e84263d55307 1035 #if CONFIG_INIC_EN
AnnaBridge 167:e84263d55307 1036 inic_stop();
AnnaBridge 167:e84263d55307 1037 #endif
AnnaBridge 167:e84263d55307 1038
AnnaBridge 167:e84263d55307 1039 return ret;
AnnaBridge 167:e84263d55307 1040 }
AnnaBridge 167:e84263d55307 1041
AnnaBridge 167:e84263d55307 1042 int wifi_off_fastly(void)
AnnaBridge 167:e84263d55307 1043 {
AnnaBridge 167:e84263d55307 1044 #if CONFIG_LWIP_LAYER
AnnaBridge 167:e84263d55307 1045 dhcps_deinit();
AnnaBridge 167:e84263d55307 1046 #if DEVICE_EMAC
AnnaBridge 167:e84263d55307 1047 // TODO:
AnnaBridge 167:e84263d55307 1048 #else
AnnaBridge 167:e84263d55307 1049 LwIP_DHCP(0, DHCP_STOP);
AnnaBridge 167:e84263d55307 1050 #endif
AnnaBridge 167:e84263d55307 1051 #endif
AnnaBridge 167:e84263d55307 1052 //printf("\n\rDeinitializing WIFI ...");
AnnaBridge 167:e84263d55307 1053 rltk_wlan_deinit_fastly();
AnnaBridge 167:e84263d55307 1054 return 0;
AnnaBridge 167:e84263d55307 1055 }
AnnaBridge 167:e84263d55307 1056
AnnaBridge 167:e84263d55307 1057
AnnaBridge 167:e84263d55307 1058 int wifi_set_power_mode(unsigned char ips_mode, unsigned char lps_mode)
AnnaBridge 167:e84263d55307 1059 {
AnnaBridge 167:e84263d55307 1060 return wext_enable_powersave(WLAN0_NAME, ips_mode, lps_mode);
AnnaBridge 167:e84263d55307 1061 }
AnnaBridge 167:e84263d55307 1062
AnnaBridge 167:e84263d55307 1063 int wifi_set_tdma_param(unsigned char slot_period, unsigned char rfon_period_len_1, unsigned char rfon_period_len_2, unsigned char rfon_period_len_3)
AnnaBridge 167:e84263d55307 1064 {
AnnaBridge 167:e84263d55307 1065 return wext_set_tdma_param(WLAN0_NAME, slot_period, rfon_period_len_1, rfon_period_len_2, rfon_period_len_3);
AnnaBridge 167:e84263d55307 1066 }
AnnaBridge 167:e84263d55307 1067
AnnaBridge 167:e84263d55307 1068 int wifi_set_lps_dtim(unsigned char dtim)
AnnaBridge 167:e84263d55307 1069 {
AnnaBridge 167:e84263d55307 1070 return wext_set_lps_dtim(WLAN0_NAME, dtim);
AnnaBridge 167:e84263d55307 1071 }
AnnaBridge 167:e84263d55307 1072
AnnaBridge 167:e84263d55307 1073 int wifi_get_lps_dtim(unsigned char *dtim)
AnnaBridge 167:e84263d55307 1074 {
AnnaBridge 167:e84263d55307 1075 return wext_get_lps_dtim(WLAN0_NAME, dtim);
AnnaBridge 167:e84263d55307 1076 }
AnnaBridge 167:e84263d55307 1077 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 1078 static void wifi_ap_sta_assoc_hdl( char* buf, int buf_len, int flags, void* userdata)
AnnaBridge 167:e84263d55307 1079 {
AnnaBridge 167:e84263d55307 1080 //USER TODO
AnnaBridge 167:e84263d55307 1081
AnnaBridge 167:e84263d55307 1082 }
AnnaBridge 167:e84263d55307 1083 static void wifi_ap_sta_disassoc_hdl( char* buf, int buf_len, int flags, void* userdata)
AnnaBridge 167:e84263d55307 1084 {
AnnaBridge 167:e84263d55307 1085 //USER TODO
AnnaBridge 167:e84263d55307 1086 }
AnnaBridge 167:e84263d55307 1087
AnnaBridge 167:e84263d55307 1088 int wifi_get_last_error(void)
AnnaBridge 167:e84263d55307 1089 {
AnnaBridge 167:e84263d55307 1090 return error_flag;
AnnaBridge 167:e84263d55307 1091 }
AnnaBridge 167:e84263d55307 1092
AnnaBridge 167:e84263d55307 1093
AnnaBridge 167:e84263d55307 1094 #if defined(CONFIG_ENABLE_WPS_AP) && CONFIG_ENABLE_WPS_AP
AnnaBridge 167:e84263d55307 1095 int wpas_wps_init(const char* ifname);
AnnaBridge 167:e84263d55307 1096 #endif
AnnaBridge 167:e84263d55307 1097
AnnaBridge 167:e84263d55307 1098 int wifi_start_ap(
AnnaBridge 167:e84263d55307 1099 char *ssid,
AnnaBridge 167:e84263d55307 1100 rtw_security_t security_type,
AnnaBridge 167:e84263d55307 1101 char *password,
AnnaBridge 167:e84263d55307 1102 int ssid_len,
AnnaBridge 167:e84263d55307 1103 int password_len,
AnnaBridge 167:e84263d55307 1104 int channel)
AnnaBridge 167:e84263d55307 1105 {
AnnaBridge 167:e84263d55307 1106 const char *ifname = WLAN0_NAME;
AnnaBridge 167:e84263d55307 1107 int ret = 0;
AnnaBridge 167:e84263d55307 1108
AnnaBridge 167:e84263d55307 1109 if(wifi_mode == RTW_MODE_STA_AP) {
AnnaBridge 167:e84263d55307 1110 ifname = WLAN1_NAME;
AnnaBridge 167:e84263d55307 1111 }
AnnaBridge 167:e84263d55307 1112
AnnaBridge 167:e84263d55307 1113 if(is_promisc_enabled())
AnnaBridge 167:e84263d55307 1114 promisc_set(0, NULL, 0);
AnnaBridge 167:e84263d55307 1115
AnnaBridge 167:e84263d55307 1116 wifi_reg_event_handler(WIFI_EVENT_STA_ASSOC, wifi_ap_sta_assoc_hdl, NULL);
AnnaBridge 167:e84263d55307 1117 wifi_reg_event_handler(WIFI_EVENT_STA_DISASSOC, wifi_ap_sta_disassoc_hdl, NULL);
AnnaBridge 167:e84263d55307 1118
AnnaBridge 167:e84263d55307 1119 ret = wext_set_mode(ifname, IW_MODE_MASTER);
AnnaBridge 167:e84263d55307 1120 if(ret < 0) goto exit;
AnnaBridge 167:e84263d55307 1121 ret = wext_set_channel(ifname, channel); //Set channel before starting ap
AnnaBridge 167:e84263d55307 1122 if(ret < 0) goto exit;
AnnaBridge 167:e84263d55307 1123
AnnaBridge 167:e84263d55307 1124 switch(security_type) {
AnnaBridge 167:e84263d55307 1125 case RTW_SECURITY_OPEN:
AnnaBridge 167:e84263d55307 1126 break;
AnnaBridge 167:e84263d55307 1127 case RTW_SECURITY_WPA2_AES_PSK:
AnnaBridge 167:e84263d55307 1128 ret = wext_set_auth_param(ifname, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_OPEN_SYSTEM);
AnnaBridge 167:e84263d55307 1129 if(ret == 0)
AnnaBridge 167:e84263d55307 1130 ret = wext_set_key_ext(ifname, IW_ENCODE_ALG_CCMP, NULL, 0, 0, 0, 0, NULL, 0);
AnnaBridge 167:e84263d55307 1131 if(ret == 0)
AnnaBridge 167:e84263d55307 1132 ret = wext_set_passphrase(ifname, (u8*)password, password_len);
AnnaBridge 167:e84263d55307 1133 break;
AnnaBridge 167:e84263d55307 1134 default:
AnnaBridge 167:e84263d55307 1135 ret = -1;
AnnaBridge 167:e84263d55307 1136 printf("\n\rWIFICONF: security type is not supported");
AnnaBridge 167:e84263d55307 1137 break;
AnnaBridge 167:e84263d55307 1138 }
AnnaBridge 167:e84263d55307 1139 if(ret < 0) goto exit;
AnnaBridge 167:e84263d55307 1140
AnnaBridge 167:e84263d55307 1141 ret = wext_set_ap_ssid(ifname, (u8*)ssid, ssid_len);
AnnaBridge 167:e84263d55307 1142 #if defined(CONFIG_ENABLE_WPS_AP) && CONFIG_ENABLE_WPS_AP
AnnaBridge 167:e84263d55307 1143 wpas_wps_init(ifname);
AnnaBridge 167:e84263d55307 1144 #endif
AnnaBridge 167:e84263d55307 1145 exit:
AnnaBridge 167:e84263d55307 1146 return ret;
AnnaBridge 167:e84263d55307 1147 }
AnnaBridge 167:e84263d55307 1148
AnnaBridge 167:e84263d55307 1149 int wifi_start_ap_with_hidden_ssid(
AnnaBridge 167:e84263d55307 1150 char *ssid,
AnnaBridge 167:e84263d55307 1151 rtw_security_t security_type,
AnnaBridge 167:e84263d55307 1152 char *password,
AnnaBridge 167:e84263d55307 1153 int ssid_len,
AnnaBridge 167:e84263d55307 1154 int password_len,
AnnaBridge 167:e84263d55307 1155 int channel)
AnnaBridge 167:e84263d55307 1156 {
AnnaBridge 167:e84263d55307 1157 const char *ifname = WLAN0_NAME;
AnnaBridge 167:e84263d55307 1158 int ret = 0;
AnnaBridge 167:e84263d55307 1159
AnnaBridge 167:e84263d55307 1160 if(wifi_mode == RTW_MODE_STA_AP) {
AnnaBridge 167:e84263d55307 1161 ifname = WLAN1_NAME;
AnnaBridge 167:e84263d55307 1162 }
AnnaBridge 167:e84263d55307 1163
AnnaBridge 167:e84263d55307 1164 if(is_promisc_enabled())
AnnaBridge 167:e84263d55307 1165 promisc_set(0, NULL, 0);
AnnaBridge 167:e84263d55307 1166
AnnaBridge 167:e84263d55307 1167 wifi_reg_event_handler(WIFI_EVENT_STA_ASSOC, wifi_ap_sta_assoc_hdl, NULL);
AnnaBridge 167:e84263d55307 1168 wifi_reg_event_handler(WIFI_EVENT_STA_DISASSOC, wifi_ap_sta_disassoc_hdl, NULL);
AnnaBridge 167:e84263d55307 1169
AnnaBridge 167:e84263d55307 1170 ret = wext_set_mode(ifname, IW_MODE_MASTER);
AnnaBridge 167:e84263d55307 1171 if(ret < 0) goto exit;
AnnaBridge 167:e84263d55307 1172 ret = wext_set_channel(ifname, channel); //Set channel before starting ap
AnnaBridge 167:e84263d55307 1173 if(ret < 0) goto exit;
AnnaBridge 167:e84263d55307 1174
AnnaBridge 167:e84263d55307 1175 switch(security_type) {
AnnaBridge 167:e84263d55307 1176 case RTW_SECURITY_OPEN:
AnnaBridge 167:e84263d55307 1177 break;
AnnaBridge 167:e84263d55307 1178 case RTW_SECURITY_WPA2_AES_PSK:
AnnaBridge 167:e84263d55307 1179 ret = wext_set_auth_param(ifname, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_OPEN_SYSTEM);
AnnaBridge 167:e84263d55307 1180 if(ret == 0)
AnnaBridge 167:e84263d55307 1181 ret = wext_set_key_ext(ifname, IW_ENCODE_ALG_CCMP, NULL, 0, 0, 0, 0, NULL, 0);
AnnaBridge 167:e84263d55307 1182 if(ret == 0)
AnnaBridge 167:e84263d55307 1183 ret = wext_set_passphrase(ifname, (u8*)password, password_len);
AnnaBridge 167:e84263d55307 1184 break;
AnnaBridge 167:e84263d55307 1185 default:
AnnaBridge 167:e84263d55307 1186 ret = -1;
AnnaBridge 167:e84263d55307 1187 printf("\n\rWIFICONF: security type is not supported");
AnnaBridge 167:e84263d55307 1188 break;
AnnaBridge 167:e84263d55307 1189 }
AnnaBridge 167:e84263d55307 1190 if(ret < 0) goto exit;
AnnaBridge 167:e84263d55307 1191
AnnaBridge 167:e84263d55307 1192 ret = set_hidden_ssid(ifname, 1);
AnnaBridge 167:e84263d55307 1193 if(ret < 0) goto exit;
AnnaBridge 167:e84263d55307 1194
AnnaBridge 167:e84263d55307 1195 ret = wext_set_ap_ssid(ifname, (u8*)ssid, ssid_len);
AnnaBridge 167:e84263d55307 1196 #if defined(CONFIG_ENABLE_WPS_AP) && CONFIG_ENABLE_WPS_AP
AnnaBridge 167:e84263d55307 1197 wpas_wps_init(ifname);
AnnaBridge 167:e84263d55307 1198 #endif
AnnaBridge 167:e84263d55307 1199 exit:
AnnaBridge 167:e84263d55307 1200 return ret;
AnnaBridge 167:e84263d55307 1201 }
AnnaBridge 167:e84263d55307 1202
AnnaBridge 167:e84263d55307 1203 void wifi_scan_each_report_hdl( char* buf, int buf_len, int flags, void* userdata)
AnnaBridge 167:e84263d55307 1204 {
AnnaBridge 167:e84263d55307 1205 int i =0;
AnnaBridge 167:e84263d55307 1206 int j =0;
AnnaBridge 167:e84263d55307 1207 int insert_pos = 0;
AnnaBridge 167:e84263d55307 1208 rtw_scan_result_t** result_ptr = (rtw_scan_result_t**)buf;
AnnaBridge 167:e84263d55307 1209 rtw_scan_result_t* temp = NULL;
AnnaBridge 167:e84263d55307 1210
AnnaBridge 167:e84263d55307 1211 for(i=0; i<scan_result_handler_ptr.scan_cnt; i++){
AnnaBridge 167:e84263d55307 1212 if(CMP_MAC(scan_result_handler_ptr.pap_details[i]->BSSID.octet, (*result_ptr)->BSSID.octet)){
AnnaBridge 167:e84263d55307 1213 if((*result_ptr)->signal_strength > scan_result_handler_ptr.pap_details[i]->signal_strength){
AnnaBridge 167:e84263d55307 1214 temp = scan_result_handler_ptr.pap_details[i];
AnnaBridge 167:e84263d55307 1215 for(j = i-1; j >= 0; j--){
AnnaBridge 167:e84263d55307 1216 if(scan_result_handler_ptr.pap_details[j]->signal_strength >= (*result_ptr)->signal_strength)
AnnaBridge 167:e84263d55307 1217 break;
AnnaBridge 167:e84263d55307 1218 else
AnnaBridge 167:e84263d55307 1219 scan_result_handler_ptr.pap_details[j+1] = scan_result_handler_ptr.pap_details[j];
AnnaBridge 167:e84263d55307 1220 }
AnnaBridge 167:e84263d55307 1221 scan_result_handler_ptr.pap_details[j+1] = temp;
AnnaBridge 167:e84263d55307 1222 scan_result_handler_ptr.pap_details[j+1]->signal_strength = (*result_ptr)->signal_strength;
AnnaBridge 167:e84263d55307 1223 }
AnnaBridge 167:e84263d55307 1224 memset(*result_ptr, 0, sizeof(rtw_scan_result_t));
AnnaBridge 167:e84263d55307 1225 return;
AnnaBridge 167:e84263d55307 1226 }
AnnaBridge 167:e84263d55307 1227 }
AnnaBridge 167:e84263d55307 1228
AnnaBridge 167:e84263d55307 1229 scan_result_handler_ptr.scan_cnt++;
AnnaBridge 167:e84263d55307 1230
AnnaBridge 167:e84263d55307 1231 if(scan_result_handler_ptr.scan_cnt > scan_result_handler_ptr.max_ap_size){
AnnaBridge 167:e84263d55307 1232 scan_result_handler_ptr.scan_cnt = scan_result_handler_ptr.max_ap_size;
AnnaBridge 167:e84263d55307 1233 if((*result_ptr)->signal_strength > scan_result_handler_ptr.pap_details[scan_result_handler_ptr.max_ap_size-1]->signal_strength){
AnnaBridge 167:e84263d55307 1234 rtw_memcpy(scan_result_handler_ptr.pap_details[scan_result_handler_ptr.max_ap_size-1], *result_ptr, sizeof(rtw_scan_result_t));
AnnaBridge 167:e84263d55307 1235 temp = scan_result_handler_ptr.pap_details[scan_result_handler_ptr.max_ap_size -1];
AnnaBridge 167:e84263d55307 1236 }else
AnnaBridge 167:e84263d55307 1237 return;
AnnaBridge 167:e84263d55307 1238 }else{
AnnaBridge 167:e84263d55307 1239 rtw_memcpy(&scan_result_handler_ptr.ap_details[scan_result_handler_ptr.scan_cnt-1], *result_ptr, sizeof(rtw_scan_result_t));
AnnaBridge 167:e84263d55307 1240 }
AnnaBridge 167:e84263d55307 1241
AnnaBridge 167:e84263d55307 1242 for(i=0; i< scan_result_handler_ptr.scan_cnt-1; i++){
AnnaBridge 167:e84263d55307 1243 if((*result_ptr)->signal_strength > scan_result_handler_ptr.pap_details[i]->signal_strength)
AnnaBridge 167:e84263d55307 1244 break;
AnnaBridge 167:e84263d55307 1245 }
AnnaBridge 167:e84263d55307 1246 insert_pos = i;
AnnaBridge 167:e84263d55307 1247
AnnaBridge 167:e84263d55307 1248 for(i = scan_result_handler_ptr.scan_cnt-1; i>insert_pos; i--)
AnnaBridge 167:e84263d55307 1249 scan_result_handler_ptr.pap_details[i] = scan_result_handler_ptr.pap_details[i-1];
AnnaBridge 167:e84263d55307 1250
AnnaBridge 167:e84263d55307 1251 if(temp != NULL)
AnnaBridge 167:e84263d55307 1252 scan_result_handler_ptr.pap_details[insert_pos] = temp;
AnnaBridge 167:e84263d55307 1253 else
AnnaBridge 167:e84263d55307 1254 scan_result_handler_ptr.pap_details[insert_pos] = &scan_result_handler_ptr.ap_details[scan_result_handler_ptr.scan_cnt-1];
AnnaBridge 167:e84263d55307 1255 rtw_memset(*result_ptr, 0, sizeof(rtw_scan_result_t));
AnnaBridge 167:e84263d55307 1256 }
AnnaBridge 167:e84263d55307 1257
AnnaBridge 167:e84263d55307 1258 void wifi_scan_done_hdl( char* buf, int buf_len, int flags, void* userdata)
AnnaBridge 167:e84263d55307 1259 {
AnnaBridge 167:e84263d55307 1260 int i = 0;
AnnaBridge 167:e84263d55307 1261 rtw_scan_handler_result_t scan_result_report;
AnnaBridge 167:e84263d55307 1262
AnnaBridge 167:e84263d55307 1263 for(i=0; i<scan_result_handler_ptr.scan_cnt; i++){
AnnaBridge 167:e84263d55307 1264 rtw_memcpy(&scan_result_report.ap_details, scan_result_handler_ptr.pap_details[i], sizeof(rtw_scan_result_t));
AnnaBridge 167:e84263d55307 1265 scan_result_report.scan_complete = scan_result_handler_ptr.scan_complete;
AnnaBridge 167:e84263d55307 1266 scan_result_report.user_data = scan_result_handler_ptr.user_data;
AnnaBridge 167:e84263d55307 1267 (*scan_result_handler_ptr.gscan_result_handler)(&scan_result_report);
AnnaBridge 167:e84263d55307 1268 }
AnnaBridge 167:e84263d55307 1269
AnnaBridge 167:e84263d55307 1270 scan_result_handler_ptr.scan_complete = RTW_TRUE;
AnnaBridge 167:e84263d55307 1271 scan_result_report.scan_complete = RTW_TRUE;
AnnaBridge 167:e84263d55307 1272 (*scan_result_handler_ptr.gscan_result_handler)(&scan_result_report);
AnnaBridge 167:e84263d55307 1273
AnnaBridge 167:e84263d55307 1274 rtw_free(scan_result_handler_ptr.ap_details);
AnnaBridge 167:e84263d55307 1275 rtw_free(scan_result_handler_ptr.pap_details);
AnnaBridge 167:e84263d55307 1276 #if SCAN_USE_SEMAPHORE
AnnaBridge 167:e84263d55307 1277 rtw_up_sema(&scan_result_handler_ptr.scan_semaphore);
AnnaBridge 167:e84263d55307 1278 #else
AnnaBridge 167:e84263d55307 1279 scan_result_handler_ptr.scan_running = 0;
AnnaBridge 167:e84263d55307 1280 #endif
AnnaBridge 167:e84263d55307 1281 wifi_unreg_event_handler(WIFI_EVENT_SCAN_RESULT_REPORT, wifi_scan_each_report_hdl);
AnnaBridge 167:e84263d55307 1282 wifi_unreg_event_handler(WIFI_EVENT_SCAN_DONE, wifi_scan_done_hdl);
AnnaBridge 167:e84263d55307 1283 return;
AnnaBridge 167:e84263d55307 1284 }
AnnaBridge 167:e84263d55307 1285
AnnaBridge 167:e84263d55307 1286 //int rtk_wifi_scan(char *buf, int buf_len, xSemaphoreHandle * semaphore)
AnnaBridge 167:e84263d55307 1287 int wifi_scan(rtw_scan_type_t scan_type,
AnnaBridge 167:e84263d55307 1288 rtw_bss_type_t bss_type,
AnnaBridge 167:e84263d55307 1289 void* result_ptr)
AnnaBridge 167:e84263d55307 1290 {
AnnaBridge 167:e84263d55307 1291 int ret;
AnnaBridge 167:e84263d55307 1292 scan_buf_arg * pscan_buf;
AnnaBridge 167:e84263d55307 1293 u16 flags = scan_type | (bss_type << 8);
AnnaBridge 167:e84263d55307 1294 if(result_ptr != NULL){
AnnaBridge 167:e84263d55307 1295 pscan_buf = (scan_buf_arg *)result_ptr;
AnnaBridge 167:e84263d55307 1296 ret = wext_set_scan(WLAN0_NAME, (char*)pscan_buf->buf, pscan_buf->buf_len, flags);
AnnaBridge 167:e84263d55307 1297 }else{
AnnaBridge 167:e84263d55307 1298 wifi_reg_event_handler(WIFI_EVENT_SCAN_RESULT_REPORT, wifi_scan_each_report_hdl, NULL);
AnnaBridge 167:e84263d55307 1299 wifi_reg_event_handler(WIFI_EVENT_SCAN_DONE, wifi_scan_done_hdl, NULL);
AnnaBridge 167:e84263d55307 1300 ret = wext_set_scan(WLAN0_NAME, NULL, 0, flags);
AnnaBridge 167:e84263d55307 1301 }
AnnaBridge 167:e84263d55307 1302
AnnaBridge 167:e84263d55307 1303 if(ret == 0) {
AnnaBridge 167:e84263d55307 1304 if(result_ptr != NULL){
AnnaBridge 167:e84263d55307 1305 ret = wext_get_scan(WLAN0_NAME, pscan_buf->buf, pscan_buf->buf_len);
AnnaBridge 167:e84263d55307 1306 }
AnnaBridge 167:e84263d55307 1307 }
AnnaBridge 167:e84263d55307 1308 else if(ret == -1){
AnnaBridge 167:e84263d55307 1309 if(result_ptr == NULL){
AnnaBridge 167:e84263d55307 1310 wifi_unreg_event_handler(WIFI_EVENT_SCAN_RESULT_REPORT, wifi_scan_each_report_hdl);
AnnaBridge 167:e84263d55307 1311 wifi_unreg_event_handler(WIFI_EVENT_SCAN_DONE, wifi_scan_done_hdl);
AnnaBridge 167:e84263d55307 1312 }
AnnaBridge 167:e84263d55307 1313 }
AnnaBridge 167:e84263d55307 1314 return ret;
AnnaBridge 167:e84263d55307 1315 }
AnnaBridge 167:e84263d55307 1316
AnnaBridge 167:e84263d55307 1317 int wifi_scan_networks_with_ssid(int (results_handler)(char*buf, int buflen, char *ssid, void *user_data),
AnnaBridge 167:e84263d55307 1318 OUT void* user_data, IN int scan_buflen, IN char* ssid, IN int ssid_len)
AnnaBridge 167:e84263d55307 1319 {
AnnaBridge 167:e84263d55307 1320 int scan_cnt = 0, add_cnt = 0;
AnnaBridge 167:e84263d55307 1321 scan_buf_arg scan_buf;
AnnaBridge 167:e84263d55307 1322 int ret;
AnnaBridge 167:e84263d55307 1323
AnnaBridge 167:e84263d55307 1324 scan_buf.buf_len = scan_buflen;
AnnaBridge 167:e84263d55307 1325 scan_buf.buf = (char*)rtw_malloc(scan_buf.buf_len);
AnnaBridge 167:e84263d55307 1326 if(!scan_buf.buf){
AnnaBridge 167:e84263d55307 1327 printf("\n\rERROR: Can't malloc memory(%d)", scan_buf.buf_len);
AnnaBridge 167:e84263d55307 1328 return RTW_NOMEM;
AnnaBridge 167:e84263d55307 1329 }
AnnaBridge 167:e84263d55307 1330 //set ssid
AnnaBridge 167:e84263d55307 1331 memset(scan_buf.buf, 0, scan_buf.buf_len);
AnnaBridge 167:e84263d55307 1332 memcpy(scan_buf.buf, &ssid_len, sizeof(int));
AnnaBridge 167:e84263d55307 1333 memcpy(scan_buf.buf+sizeof(int), ssid, ssid_len);
AnnaBridge 167:e84263d55307 1334
AnnaBridge 167:e84263d55307 1335 //Scan channel
AnnaBridge 167:e84263d55307 1336 if(scan_cnt = (wifi_scan(RTW_SCAN_TYPE_ACTIVE, RTW_BSS_TYPE_ANY, &scan_buf)) < 0){
AnnaBridge 167:e84263d55307 1337 printf("\n\rERROR: wifi scan failed");
AnnaBridge 167:e84263d55307 1338 ret = RTW_ERROR;
AnnaBridge 167:e84263d55307 1339 }else{
AnnaBridge 167:e84263d55307 1340 if(NULL == results_handler)
AnnaBridge 167:e84263d55307 1341 {
AnnaBridge 167:e84263d55307 1342 int plen = 0;
AnnaBridge 167:e84263d55307 1343 while(plen < scan_buf.buf_len){
AnnaBridge 167:e84263d55307 1344 int len, rssi, ssid_len, i, security_mode;
AnnaBridge 167:e84263d55307 1345 int wps_password_id;
AnnaBridge 167:e84263d55307 1346 char *mac, *ssid;
AnnaBridge 167:e84263d55307 1347 //u8 *security_mode;
AnnaBridge 167:e84263d55307 1348 printf("\n\r");
AnnaBridge 167:e84263d55307 1349 // len
AnnaBridge 167:e84263d55307 1350 len = (int)*(scan_buf.buf + plen);
AnnaBridge 167:e84263d55307 1351 printf("len = %d,\t", len);
AnnaBridge 167:e84263d55307 1352 // check end
AnnaBridge 167:e84263d55307 1353 if(len == 0) break;
AnnaBridge 167:e84263d55307 1354 // mac
AnnaBridge 167:e84263d55307 1355 mac = scan_buf.buf + plen + 1;
AnnaBridge 167:e84263d55307 1356 printf("mac = ");
AnnaBridge 167:e84263d55307 1357 for(i=0; i<6; i++)
AnnaBridge 167:e84263d55307 1358 printf("%02x ", (u8)*(mac+i));
AnnaBridge 167:e84263d55307 1359 printf(",\t");
AnnaBridge 167:e84263d55307 1360 // rssi
AnnaBridge 167:e84263d55307 1361 rssi = *(int*)(scan_buf.buf + plen + 1 + 6);
AnnaBridge 167:e84263d55307 1362 printf(" rssi = %d,\t", rssi);
AnnaBridge 167:e84263d55307 1363 // security_mode
AnnaBridge 167:e84263d55307 1364 security_mode = (int)*(scan_buf.buf + plen + 1 + 6 + 4);
AnnaBridge 167:e84263d55307 1365 switch (security_mode) {
AnnaBridge 167:e84263d55307 1366 case IW_ENCODE_ALG_NONE:
AnnaBridge 167:e84263d55307 1367 printf("sec = open ,\t");
AnnaBridge 167:e84263d55307 1368 break;
AnnaBridge 167:e84263d55307 1369 case IW_ENCODE_ALG_WEP:
AnnaBridge 167:e84263d55307 1370 printf("sec = wep ,\t");
AnnaBridge 167:e84263d55307 1371 break;
AnnaBridge 167:e84263d55307 1372 case IW_ENCODE_ALG_CCMP:
AnnaBridge 167:e84263d55307 1373 printf("sec = wpa/wpa2,\t");
AnnaBridge 167:e84263d55307 1374 break;
AnnaBridge 167:e84263d55307 1375 }
AnnaBridge 167:e84263d55307 1376 // password id
AnnaBridge 167:e84263d55307 1377 wps_password_id = (int)*(scan_buf.buf + plen + 1 + 6 + 4 + 1);
AnnaBridge 167:e84263d55307 1378 printf("wps password id = %d,\t", wps_password_id);
AnnaBridge 167:e84263d55307 1379
AnnaBridge 167:e84263d55307 1380 printf("channel = %d,\t", *(scan_buf.buf + plen + 1 + 6 + 4 + 1 + 1));
AnnaBridge 167:e84263d55307 1381 // ssid
AnnaBridge 167:e84263d55307 1382 ssid_len = len - 1 - 6 - 4 - 1 - 1 - 1;
AnnaBridge 167:e84263d55307 1383 ssid = scan_buf.buf + plen + 1 + 6 + 4 + 1 + 1 + 1;
AnnaBridge 167:e84263d55307 1384 printf("ssid = ");
AnnaBridge 167:e84263d55307 1385 for(i=0; i<ssid_len; i++)
AnnaBridge 167:e84263d55307 1386 printf("%c", *(ssid+i));
AnnaBridge 167:e84263d55307 1387 plen += len;
AnnaBridge 167:e84263d55307 1388 add_cnt++;
AnnaBridge 167:e84263d55307 1389 }
AnnaBridge 167:e84263d55307 1390
AnnaBridge 167:e84263d55307 1391 printf("\n\rwifi_scan: add count = %d, scan count = %d", add_cnt, scan_cnt);
AnnaBridge 167:e84263d55307 1392 }
AnnaBridge 167:e84263d55307 1393 ret = RTW_SUCCESS;
AnnaBridge 167:e84263d55307 1394 }
AnnaBridge 167:e84263d55307 1395 if(results_handler)
AnnaBridge 167:e84263d55307 1396 results_handler(scan_buf.buf, scan_buf.buf_len, ssid, user_data);
AnnaBridge 167:e84263d55307 1397
AnnaBridge 167:e84263d55307 1398 if(scan_buf.buf)
AnnaBridge 167:e84263d55307 1399 rtw_mfree(scan_buf.buf, scan_buf.buf_len);
AnnaBridge 167:e84263d55307 1400
AnnaBridge 167:e84263d55307 1401 return ret;
AnnaBridge 167:e84263d55307 1402 }
AnnaBridge 167:e84263d55307 1403
AnnaBridge 167:e84263d55307 1404 int wifi_scan_networks(rtw_scan_result_handler_t results_handler, void* user_data)
AnnaBridge 167:e84263d55307 1405 {
AnnaBridge 167:e84263d55307 1406 unsigned int max_ap_size = 64;
AnnaBridge 167:e84263d55307 1407
AnnaBridge 167:e84263d55307 1408 /* lock 2s to forbid suspend under scan */
AnnaBridge 167:e84263d55307 1409 rtw_wakelock_timeout(2*1000);
AnnaBridge 167:e84263d55307 1410
AnnaBridge 167:e84263d55307 1411 #if SCAN_USE_SEMAPHORE
AnnaBridge 167:e84263d55307 1412 rtw_bool_t result;
AnnaBridge 167:e84263d55307 1413 if(NULL == scan_result_handler_ptr.scan_semaphore)
AnnaBridge 167:e84263d55307 1414 rtw_init_sema(&scan_result_handler_ptr.scan_semaphore, 1);
AnnaBridge 167:e84263d55307 1415
AnnaBridge 167:e84263d55307 1416 scan_result_handler_ptr.scan_start_time = rtw_get_current_time();
AnnaBridge 167:e84263d55307 1417 /* Initialise the semaphore that will prevent simultaneous access - cannot be a mutex, since
AnnaBridge 167:e84263d55307 1418 * we don't want to allow the same thread to start a new scan */
AnnaBridge 167:e84263d55307 1419 result = (rtw_bool_t)rtw_down_timeout_sema(&scan_result_handler_ptr.scan_semaphore, SCAN_LONGEST_WAIT_TIME);
AnnaBridge 167:e84263d55307 1420 if ( result != RTW_TRUE )
AnnaBridge 167:e84263d55307 1421 {
AnnaBridge 167:e84263d55307 1422 /* Return error result, but set the semaphore to work the next time */
AnnaBridge 167:e84263d55307 1423 rtw_up_sema(&scan_result_handler_ptr.scan_semaphore);
AnnaBridge 167:e84263d55307 1424 return RTW_TIMEOUT;
AnnaBridge 167:e84263d55307 1425 }
AnnaBridge 167:e84263d55307 1426 #else
AnnaBridge 167:e84263d55307 1427 if(scan_result_handler_ptr.scan_running){
AnnaBridge 167:e84263d55307 1428 int count = 100;
AnnaBridge 167:e84263d55307 1429 while(scan_result_handler_ptr.scan_running && count > 0)
AnnaBridge 167:e84263d55307 1430 {
AnnaBridge 167:e84263d55307 1431 rtw_msleep_os(20);
AnnaBridge 167:e84263d55307 1432 count --;
AnnaBridge 167:e84263d55307 1433 }
AnnaBridge 167:e84263d55307 1434 if(count == 0){
AnnaBridge 167:e84263d55307 1435 printf("\n\r[%d]WiFi: Scan is running. Wait 2s timeout.", rtw_get_current_time());
AnnaBridge 167:e84263d55307 1436 return RTW_TIMEOUT;
AnnaBridge 167:e84263d55307 1437 }
AnnaBridge 167:e84263d55307 1438 }
AnnaBridge 167:e84263d55307 1439 scan_result_handler_ptr.scan_start_time = rtw_get_current_time();
AnnaBridge 167:e84263d55307 1440 scan_result_handler_ptr.scan_running = 1;
AnnaBridge 167:e84263d55307 1441 #endif
AnnaBridge 167:e84263d55307 1442
AnnaBridge 167:e84263d55307 1443 scan_result_handler_ptr.gscan_result_handler = results_handler;
AnnaBridge 167:e84263d55307 1444
AnnaBridge 167:e84263d55307 1445 scan_result_handler_ptr.max_ap_size = max_ap_size;
AnnaBridge 167:e84263d55307 1446 scan_result_handler_ptr.ap_details = (rtw_scan_result_t*)rtw_zmalloc(max_ap_size*sizeof(rtw_scan_result_t));
AnnaBridge 167:e84263d55307 1447 if(scan_result_handler_ptr.ap_details == NULL){
AnnaBridge 167:e84263d55307 1448 goto err_exit;
AnnaBridge 167:e84263d55307 1449 }
AnnaBridge 167:e84263d55307 1450 rtw_memset(scan_result_handler_ptr.ap_details, 0, max_ap_size*sizeof(rtw_scan_result_t));
AnnaBridge 167:e84263d55307 1451
AnnaBridge 167:e84263d55307 1452 scan_result_handler_ptr.pap_details = (rtw_scan_result_t**)rtw_zmalloc(max_ap_size*sizeof(rtw_scan_result_t*));
AnnaBridge 167:e84263d55307 1453 if(scan_result_handler_ptr.pap_details == NULL)
AnnaBridge 167:e84263d55307 1454 goto error2_with_result_ptr;
AnnaBridge 167:e84263d55307 1455 rtw_memset(scan_result_handler_ptr.pap_details, 0, max_ap_size);
AnnaBridge 167:e84263d55307 1456
AnnaBridge 167:e84263d55307 1457 scan_result_handler_ptr.scan_cnt = 0;
AnnaBridge 167:e84263d55307 1458
AnnaBridge 167:e84263d55307 1459 scan_result_handler_ptr.scan_complete = RTW_FALSE;
AnnaBridge 167:e84263d55307 1460 scan_result_handler_ptr.user_data = user_data;
AnnaBridge 167:e84263d55307 1461
AnnaBridge 167:e84263d55307 1462 if (wifi_scan( RTW_SCAN_COMMAMD<<4 | RTW_SCAN_TYPE_ACTIVE, RTW_BSS_TYPE_ANY, NULL) != RTW_SUCCESS)
AnnaBridge 167:e84263d55307 1463 {
AnnaBridge 167:e84263d55307 1464 goto error1_with_result_ptr;
AnnaBridge 167:e84263d55307 1465 }
AnnaBridge 167:e84263d55307 1466
AnnaBridge 167:e84263d55307 1467 return RTW_SUCCESS;
AnnaBridge 167:e84263d55307 1468
AnnaBridge 167:e84263d55307 1469 error1_with_result_ptr:
AnnaBridge 167:e84263d55307 1470 rtw_free((u8*)scan_result_handler_ptr.pap_details);
AnnaBridge 167:e84263d55307 1471 scan_result_handler_ptr.pap_details = NULL;
AnnaBridge 167:e84263d55307 1472
AnnaBridge 167:e84263d55307 1473 error2_with_result_ptr:
AnnaBridge 167:e84263d55307 1474 rtw_free((u8*)scan_result_handler_ptr.ap_details);
AnnaBridge 167:e84263d55307 1475 scan_result_handler_ptr.ap_details = NULL;
AnnaBridge 167:e84263d55307 1476
AnnaBridge 167:e84263d55307 1477 err_exit:
AnnaBridge 167:e84263d55307 1478 rtw_memset((void *)&scan_result_handler_ptr, 0, sizeof(scan_result_handler_ptr));
AnnaBridge 167:e84263d55307 1479 return RTW_ERROR;
AnnaBridge 167:e84263d55307 1480 }
AnnaBridge 167:e84263d55307 1481 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 1482 int wifi_set_pscan_chan(__u8 * channel_list,__u8 * pscan_config, __u8 length)
AnnaBridge 167:e84263d55307 1483 {
AnnaBridge 167:e84263d55307 1484 if(channel_list)
AnnaBridge 167:e84263d55307 1485 return wext_set_pscan_channel(WLAN0_NAME, channel_list, pscan_config, length);
AnnaBridge 167:e84263d55307 1486 else
AnnaBridge 167:e84263d55307 1487 return -1;
AnnaBridge 167:e84263d55307 1488 }
AnnaBridge 167:e84263d55307 1489
AnnaBridge 167:e84263d55307 1490 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 1491 int wifi_get_setting(const char *ifname, rtw_wifi_setting_t *pSetting)
AnnaBridge 167:e84263d55307 1492 {
AnnaBridge 167:e84263d55307 1493 int ret = 0;
AnnaBridge 167:e84263d55307 1494 int mode = 0;
AnnaBridge 167:e84263d55307 1495 unsigned short security = 0;
AnnaBridge 167:e84263d55307 1496
AnnaBridge 167:e84263d55307 1497 memset(pSetting, 0, sizeof(rtw_wifi_setting_t));
AnnaBridge 167:e84263d55307 1498 if(wext_get_mode(ifname, &mode) < 0)
AnnaBridge 167:e84263d55307 1499 ret = -1;
AnnaBridge 167:e84263d55307 1500
AnnaBridge 167:e84263d55307 1501 switch(mode) {
AnnaBridge 167:e84263d55307 1502 case IW_MODE_MASTER:
AnnaBridge 167:e84263d55307 1503 pSetting->mode = RTW_MODE_AP;
AnnaBridge 167:e84263d55307 1504 break;
AnnaBridge 167:e84263d55307 1505 case IW_MODE_INFRA:
AnnaBridge 167:e84263d55307 1506 default:
AnnaBridge 167:e84263d55307 1507 pSetting->mode = RTW_MODE_STA;
AnnaBridge 167:e84263d55307 1508 break;
AnnaBridge 167:e84263d55307 1509 //default:
AnnaBridge 167:e84263d55307 1510 //printf("\r\n%s(): Unknown mode %d\n", __func__, mode);
AnnaBridge 167:e84263d55307 1511 //break;
AnnaBridge 167:e84263d55307 1512 }
AnnaBridge 167:e84263d55307 1513
AnnaBridge 167:e84263d55307 1514 if(wext_get_ssid(ifname, pSetting->ssid) < 0)
AnnaBridge 167:e84263d55307 1515 ret = -1;
AnnaBridge 167:e84263d55307 1516 if(wext_get_channel(ifname, &pSetting->channel) < 0)
AnnaBridge 167:e84263d55307 1517 ret = -1;
AnnaBridge 167:e84263d55307 1518 if(wext_get_enc_ext(ifname, &security, &pSetting->key_idx, pSetting->password) < 0)
AnnaBridge 167:e84263d55307 1519 ret = -1;
AnnaBridge 167:e84263d55307 1520
AnnaBridge 167:e84263d55307 1521 switch(security){
AnnaBridge 167:e84263d55307 1522 case IW_ENCODE_ALG_NONE:
AnnaBridge 167:e84263d55307 1523 pSetting->security_type = RTW_SECURITY_OPEN;
AnnaBridge 167:e84263d55307 1524 break;
AnnaBridge 167:e84263d55307 1525 case IW_ENCODE_ALG_WEP:
AnnaBridge 167:e84263d55307 1526 pSetting->security_type = RTW_SECURITY_WEP_PSK;
AnnaBridge 167:e84263d55307 1527 break;
AnnaBridge 167:e84263d55307 1528 case IW_ENCODE_ALG_TKIP:
AnnaBridge 167:e84263d55307 1529 pSetting->security_type = RTW_SECURITY_WPA_TKIP_PSK;
AnnaBridge 167:e84263d55307 1530 break;
AnnaBridge 167:e84263d55307 1531 case IW_ENCODE_ALG_CCMP:
AnnaBridge 167:e84263d55307 1532 pSetting->security_type = RTW_SECURITY_WPA2_AES_PSK;
AnnaBridge 167:e84263d55307 1533 break;
AnnaBridge 167:e84263d55307 1534 default:
AnnaBridge 167:e84263d55307 1535 break;
AnnaBridge 167:e84263d55307 1536 }
AnnaBridge 167:e84263d55307 1537
AnnaBridge 167:e84263d55307 1538 if(security == IW_ENCODE_ALG_TKIP || security == IW_ENCODE_ALG_CCMP)
AnnaBridge 167:e84263d55307 1539 if(wext_get_passphrase(ifname, pSetting->password) < 0)
AnnaBridge 167:e84263d55307 1540 ret = -1;
AnnaBridge 167:e84263d55307 1541
AnnaBridge 167:e84263d55307 1542 return ret;
AnnaBridge 167:e84263d55307 1543 }
AnnaBridge 167:e84263d55307 1544 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 1545 int wifi_show_setting(const char *ifname, rtw_wifi_setting_t *pSetting)
AnnaBridge 167:e84263d55307 1546 {
AnnaBridge 167:e84263d55307 1547 int ret = 0;
AnnaBridge 167:e84263d55307 1548
AnnaBridge 167:e84263d55307 1549 printf("\n\r\nWIFI %s Setting:",ifname);
AnnaBridge 167:e84263d55307 1550 printf("\n\r==============================");
AnnaBridge 167:e84263d55307 1551
AnnaBridge 167:e84263d55307 1552 switch(pSetting->mode) {
AnnaBridge 167:e84263d55307 1553 case RTW_MODE_AP:
AnnaBridge 167:e84263d55307 1554 #if CONFIG_EXAMPLE_UART_ATCMD
AnnaBridge 167:e84263d55307 1555 at_printf("\r\nAP,");
AnnaBridge 167:e84263d55307 1556 #endif
AnnaBridge 167:e84263d55307 1557 printf("\n\r MODE => AP");
AnnaBridge 167:e84263d55307 1558 break;
AnnaBridge 167:e84263d55307 1559 case RTW_MODE_STA:
AnnaBridge 167:e84263d55307 1560 #if CONFIG_EXAMPLE_UART_ATCMD
AnnaBridge 167:e84263d55307 1561 at_printf("\r\nSTA,");
AnnaBridge 167:e84263d55307 1562 #endif
AnnaBridge 167:e84263d55307 1563 printf("\n\r MODE => STATION");
AnnaBridge 167:e84263d55307 1564 break;
AnnaBridge 167:e84263d55307 1565 default:
AnnaBridge 167:e84263d55307 1566 #if CONFIG_EXAMPLE_UART_ATCMD
AnnaBridge 167:e84263d55307 1567 at_printf("\r\nUNKNOWN,");
AnnaBridge 167:e84263d55307 1568 #endif
AnnaBridge 167:e84263d55307 1569 printf("\n\r MODE => UNKNOWN");
AnnaBridge 167:e84263d55307 1570 }
AnnaBridge 167:e84263d55307 1571 #if CONFIG_EXAMPLE_UART_ATCMD
AnnaBridge 167:e84263d55307 1572 at_printf("%s,%d,", pSetting->ssid, pSetting->channel);
AnnaBridge 167:e84263d55307 1573 #endif
AnnaBridge 167:e84263d55307 1574 printf("\n\r SSID => %s", pSetting->ssid);
AnnaBridge 167:e84263d55307 1575 printf("\n\r CHANNEL => %d", pSetting->channel);
AnnaBridge 167:e84263d55307 1576
AnnaBridge 167:e84263d55307 1577 switch(pSetting->security_type) {
AnnaBridge 167:e84263d55307 1578 case RTW_SECURITY_OPEN:
AnnaBridge 167:e84263d55307 1579 #if CONFIG_EXAMPLE_UART_ATCMD
AnnaBridge 167:e84263d55307 1580 at_printf("OPEN,");
AnnaBridge 167:e84263d55307 1581 #endif
AnnaBridge 167:e84263d55307 1582 printf("\n\r SECURITY => OPEN");
AnnaBridge 167:e84263d55307 1583 break;
AnnaBridge 167:e84263d55307 1584 case RTW_SECURITY_WEP_PSK:
AnnaBridge 167:e84263d55307 1585 #if CONFIG_EXAMPLE_UART_ATCMD
AnnaBridge 167:e84263d55307 1586 at_printf("WEP,%d,", pSetting->key_idx);
AnnaBridge 167:e84263d55307 1587 #endif
AnnaBridge 167:e84263d55307 1588 printf("\n\r SECURITY => WEP");
AnnaBridge 167:e84263d55307 1589 printf("\n\r KEY INDEX => %d", pSetting->key_idx);
AnnaBridge 167:e84263d55307 1590 break;
AnnaBridge 167:e84263d55307 1591 case RTW_SECURITY_WPA_TKIP_PSK:
AnnaBridge 167:e84263d55307 1592 #if CONFIG_EXAMPLE_UART_ATCMD
AnnaBridge 167:e84263d55307 1593 at_printf("TKIP,");
AnnaBridge 167:e84263d55307 1594 #endif
AnnaBridge 167:e84263d55307 1595 printf("\n\r SECURITY => TKIP");
AnnaBridge 167:e84263d55307 1596 break;
AnnaBridge 167:e84263d55307 1597 case RTW_SECURITY_WPA2_AES_PSK:
AnnaBridge 167:e84263d55307 1598 #if CONFIG_EXAMPLE_UART_ATCMD
AnnaBridge 167:e84263d55307 1599 at_printf("AES,");
AnnaBridge 167:e84263d55307 1600 #endif
AnnaBridge 167:e84263d55307 1601 printf("\n\r SECURITY => AES");
AnnaBridge 167:e84263d55307 1602 break;
AnnaBridge 167:e84263d55307 1603 default:
AnnaBridge 167:e84263d55307 1604 #if CONFIG_EXAMPLE_UART_ATCMD
AnnaBridge 167:e84263d55307 1605 at_printf("UNKNOWN,");
AnnaBridge 167:e84263d55307 1606 #endif
AnnaBridge 167:e84263d55307 1607 printf("\n\r SECURITY => UNKNOWN");
AnnaBridge 167:e84263d55307 1608 }
AnnaBridge 167:e84263d55307 1609
AnnaBridge 167:e84263d55307 1610 #if CONFIG_EXAMPLE_UART_ATCMD
AnnaBridge 167:e84263d55307 1611 at_printf("%s,", pSetting->password);
AnnaBridge 167:e84263d55307 1612 #endif
AnnaBridge 167:e84263d55307 1613 printf("\n\r PASSWORD => %s", pSetting->password);
AnnaBridge 167:e84263d55307 1614 printf("\n\r");
AnnaBridge 167:e84263d55307 1615
AnnaBridge 167:e84263d55307 1616 return ret;
AnnaBridge 167:e84263d55307 1617 }
AnnaBridge 167:e84263d55307 1618
AnnaBridge 167:e84263d55307 1619 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 1620 int wifi_set_network_mode(rtw_network_mode_t mode)
AnnaBridge 167:e84263d55307 1621 {
AnnaBridge 167:e84263d55307 1622 if((mode == RTW_NETWORK_B) || (mode == RTW_NETWORK_BG) || (mode == RTW_NETWORK_BGN))
AnnaBridge 167:e84263d55307 1623 return rltk_wlan_wireless_mode((unsigned char) mode);
AnnaBridge 167:e84263d55307 1624
AnnaBridge 167:e84263d55307 1625 return -1;
AnnaBridge 167:e84263d55307 1626 }
AnnaBridge 167:e84263d55307 1627
AnnaBridge 167:e84263d55307 1628 int wifi_set_wps_phase(unsigned char is_trigger_wps)
AnnaBridge 167:e84263d55307 1629 {
AnnaBridge 167:e84263d55307 1630 return rltk_wlan_set_wps_phase(is_trigger_wps);
AnnaBridge 167:e84263d55307 1631 }
AnnaBridge 167:e84263d55307 1632
AnnaBridge 167:e84263d55307 1633 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 1634 int wifi_set_promisc(rtw_rcr_level_t enabled, void (*callback)(unsigned char*, unsigned int, void*), unsigned char len_used)
AnnaBridge 167:e84263d55307 1635 {
AnnaBridge 167:e84263d55307 1636 return promisc_set(enabled, callback, len_used);
AnnaBridge 167:e84263d55307 1637 }
AnnaBridge 167:e84263d55307 1638
AnnaBridge 167:e84263d55307 1639 void wifi_enter_promisc_mode(){
AnnaBridge 167:e84263d55307 1640 int mode = 0;
AnnaBridge 167:e84263d55307 1641 unsigned char ssid[33];
AnnaBridge 167:e84263d55307 1642
AnnaBridge 167:e84263d55307 1643 if(wifi_mode == RTW_MODE_STA_AP){
AnnaBridge 167:e84263d55307 1644 wifi_off();
AnnaBridge 167:e84263d55307 1645 rtw_msleep_os(20);
AnnaBridge 167:e84263d55307 1646 wifi_on(RTW_MODE_PROMISC);
AnnaBridge 167:e84263d55307 1647 }else{
AnnaBridge 167:e84263d55307 1648 wext_get_mode(WLAN0_NAME, &mode);
AnnaBridge 167:e84263d55307 1649
AnnaBridge 167:e84263d55307 1650 switch(mode) {
AnnaBridge 167:e84263d55307 1651 case IW_MODE_MASTER: //In AP mode
AnnaBridge 167:e84263d55307 1652 //rltk_wlan_deinit();
AnnaBridge 167:e84263d55307 1653 wifi_off();//modified by Chris Yang for iNIC
AnnaBridge 167:e84263d55307 1654 rtw_msleep_os(20);
AnnaBridge 167:e84263d55307 1655 //rltk_wlan_init(0, RTW_MODE_PROMISC);
AnnaBridge 167:e84263d55307 1656 //rltk_wlan_start(0);
AnnaBridge 167:e84263d55307 1657 wifi_on(RTW_MODE_PROMISC);
AnnaBridge 167:e84263d55307 1658 break;
AnnaBridge 167:e84263d55307 1659 case IW_MODE_INFRA: //In STA mode
AnnaBridge 167:e84263d55307 1660 if(wext_get_ssid(WLAN0_NAME, ssid) > 0)
AnnaBridge 167:e84263d55307 1661 wifi_disconnect();
AnnaBridge 167:e84263d55307 1662 }
AnnaBridge 167:e84263d55307 1663 }
AnnaBridge 167:e84263d55307 1664 }
AnnaBridge 167:e84263d55307 1665
AnnaBridge 167:e84263d55307 1666 int wifi_restart_ap(
AnnaBridge 167:e84263d55307 1667 unsigned char *ssid,
AnnaBridge 167:e84263d55307 1668 rtw_security_t security_type,
AnnaBridge 167:e84263d55307 1669 unsigned char *password,
AnnaBridge 167:e84263d55307 1670 int ssid_len,
AnnaBridge 167:e84263d55307 1671 int password_len,
AnnaBridge 167:e84263d55307 1672 int channel)
AnnaBridge 167:e84263d55307 1673 {
AnnaBridge 167:e84263d55307 1674 unsigned char idx = 0;
AnnaBridge 167:e84263d55307 1675 ip_addr_t ipaddr;
AnnaBridge 167:e84263d55307 1676 ip_addr_t netmask;
AnnaBridge 167:e84263d55307 1677 ip_addr_t gw;
AnnaBridge 167:e84263d55307 1678 #if DEVICE_EMAC
AnnaBridge 167:e84263d55307 1679 //struct netif * pnetif = xnetif[0];
AnnaBridge 167:e84263d55307 1680 #else
AnnaBridge 167:e84263d55307 1681 struct netif * pnetif = &xnetif[0];
AnnaBridge 167:e84263d55307 1682 #endif
AnnaBridge 167:e84263d55307 1683 #ifdef CONFIG_CONCURRENT_MODE
AnnaBridge 167:e84263d55307 1684 rtw_wifi_setting_t setting;
AnnaBridge 167:e84263d55307 1685 int sta_linked = 0;
AnnaBridge 167:e84263d55307 1686 #endif
AnnaBridge 167:e84263d55307 1687
AnnaBridge 167:e84263d55307 1688 if(rltk_wlan_running(WLAN1_IDX)){
AnnaBridge 167:e84263d55307 1689 idx = 1;
AnnaBridge 167:e84263d55307 1690 }
AnnaBridge 167:e84263d55307 1691
AnnaBridge 167:e84263d55307 1692 // stop dhcp server
AnnaBridge 167:e84263d55307 1693 dhcps_deinit();
AnnaBridge 167:e84263d55307 1694
AnnaBridge 167:e84263d55307 1695 #ifdef CONFIG_CONCURRENT_MODE
AnnaBridge 167:e84263d55307 1696 if(idx > 0){
AnnaBridge 167:e84263d55307 1697 sta_linked = wifi_get_setting(WLAN0_NAME, &setting);
AnnaBridge 167:e84263d55307 1698 wifi_off();
AnnaBridge 167:e84263d55307 1699 rtw_msleep_os(20);
AnnaBridge 167:e84263d55307 1700 wifi_on(RTW_MODE_STA_AP);
AnnaBridge 167:e84263d55307 1701 }
AnnaBridge 167:e84263d55307 1702 else
AnnaBridge 167:e84263d55307 1703 #endif
AnnaBridge 167:e84263d55307 1704 {
AnnaBridge 167:e84263d55307 1705 #if DEVICE_EMAC
AnnaBridge 167:e84263d55307 1706 #else
AnnaBridge 167:e84263d55307 1707 IP4_ADDR(&ipaddr, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
AnnaBridge 167:e84263d55307 1708 IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1 , NETMASK_ADDR2, NETMASK_ADDR3);
AnnaBridge 167:e84263d55307 1709 IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
AnnaBridge 167:e84263d55307 1710 netif_set_addr(pnetif, &ipaddr, &netmask,&gw);
AnnaBridge 167:e84263d55307 1711 #endif
AnnaBridge 167:e84263d55307 1712 wifi_off();
AnnaBridge 167:e84263d55307 1713 rtw_msleep_os(20);
AnnaBridge 167:e84263d55307 1714 wifi_on(RTW_MODE_AP);
AnnaBridge 167:e84263d55307 1715 }
AnnaBridge 167:e84263d55307 1716 // start ap
AnnaBridge 167:e84263d55307 1717 if(wifi_start_ap((char*)ssid, security_type, (char*)password, ssid_len, password_len, channel) < 0) {
AnnaBridge 167:e84263d55307 1718 printf("\n\rERROR: Operation failed!");
AnnaBridge 167:e84263d55307 1719 return -1;
AnnaBridge 167:e84263d55307 1720 }
AnnaBridge 167:e84263d55307 1721
AnnaBridge 167:e84263d55307 1722 #if (INCLUDE_uxTaskGetStackHighWaterMark == 1)
AnnaBridge 167:e84263d55307 1723 printf("\r\nWebServer Thread: High Water Mark is %ld\n", uxTaskGetStackHighWaterMark(NULL));
AnnaBridge 167:e84263d55307 1724 #endif
AnnaBridge 167:e84263d55307 1725 #ifdef CONFIG_CONCURRENT_MODE
AnnaBridge 167:e84263d55307 1726 // connect to ap if wlan0 was linked with ap
AnnaBridge 167:e84263d55307 1727 if(idx > 0 && sta_linked == 0){
AnnaBridge 167:e84263d55307 1728 int ret;
AnnaBridge 167:e84263d55307 1729 printf("\r\nAP: ssid=%s", (char*)setting.ssid);
AnnaBridge 167:e84263d55307 1730 printf("\r\nAP: security_type=%d", setting.security_type);
AnnaBridge 167:e84263d55307 1731 printf("\r\nAP: password=%s", (char*)setting.password);
AnnaBridge 167:e84263d55307 1732 printf("\r\nAP: key_idx =%d\n", setting.key_idx);
AnnaBridge 167:e84263d55307 1733 ret = wifi_connect((char*)setting.ssid,
AnnaBridge 167:e84263d55307 1734 setting.security_type,
AnnaBridge 167:e84263d55307 1735 (char*)setting.password,
AnnaBridge 167:e84263d55307 1736 strlen((char*)setting.ssid),
AnnaBridge 167:e84263d55307 1737 strlen((char*)setting.password),
AnnaBridge 167:e84263d55307 1738 setting.key_idx,
AnnaBridge 167:e84263d55307 1739 NULL);
AnnaBridge 167:e84263d55307 1740 #if CONFIG_DHCP_CLIENT
AnnaBridge 167:e84263d55307 1741 if(ret == RTW_SUCCESS) {
AnnaBridge 167:e84263d55307 1742 /* Start DHCPClient */
AnnaBridge 167:e84263d55307 1743 LwIP_DHCP(0, DHCP_START);
AnnaBridge 167:e84263d55307 1744 }
AnnaBridge 167:e84263d55307 1745 #endif
AnnaBridge 167:e84263d55307 1746 }
AnnaBridge 167:e84263d55307 1747 #endif
AnnaBridge 167:e84263d55307 1748 #if (INCLUDE_uxTaskGetStackHighWaterMark == 1)
AnnaBridge 167:e84263d55307 1749 printf("\r\nWebServer Thread: High Water Mark is %ld\n", uxTaskGetStackHighWaterMark(NULL));
AnnaBridge 167:e84263d55307 1750 #endif
AnnaBridge 167:e84263d55307 1751 #if DEVICE_EMAC
AnnaBridge 167:e84263d55307 1752 // start dhcp server
AnnaBridge 167:e84263d55307 1753 //dhcps_init(xnetif[idx]);
AnnaBridge 167:e84263d55307 1754 #else
AnnaBridge 167:e84263d55307 1755 // start dhcp server
AnnaBridge 167:e84263d55307 1756 dhcps_init(&xnetif[idx]);
AnnaBridge 167:e84263d55307 1757 #endif
AnnaBridge 167:e84263d55307 1758 return 0;
AnnaBridge 167:e84263d55307 1759 }
AnnaBridge 167:e84263d55307 1760
AnnaBridge 167:e84263d55307 1761 #if CONFIG_AUTO_RECONNECT
AnnaBridge 167:e84263d55307 1762 struct task_struct g_wifi_auto_reconnect_task;
AnnaBridge 167:e84263d55307 1763
AnnaBridge 167:e84263d55307 1764 extern void (*p_wlan_autoreconnect_hdl)(rtw_security_t, char*, int, char*, int, int);
AnnaBridge 167:e84263d55307 1765
AnnaBridge 167:e84263d55307 1766 struct wifi_autoreconnect_param {
AnnaBridge 167:e84263d55307 1767 rtw_security_t security_type;
AnnaBridge 167:e84263d55307 1768 char *ssid;
AnnaBridge 167:e84263d55307 1769 int ssid_len;
AnnaBridge 167:e84263d55307 1770 char *password;
AnnaBridge 167:e84263d55307 1771 int password_len;
AnnaBridge 167:e84263d55307 1772 int key_id;
AnnaBridge 167:e84263d55307 1773 };
AnnaBridge 167:e84263d55307 1774
AnnaBridge 167:e84263d55307 1775 static void wifi_autoreconnect_thread(void *param)
AnnaBridge 167:e84263d55307 1776 {
AnnaBridge 167:e84263d55307 1777 int ret = RTW_ERROR;
AnnaBridge 167:e84263d55307 1778 struct wifi_autoreconnect_param *reconnect_param = (struct wifi_autoreconnect_param *) param;
AnnaBridge 167:e84263d55307 1779 printf("\n\rauto reconnect ...\n");
AnnaBridge 167:e84263d55307 1780 ret = wifi_connect(reconnect_param->ssid, reconnect_param->security_type, reconnect_param->password,
AnnaBridge 167:e84263d55307 1781 reconnect_param->ssid_len, reconnect_param->password_len, reconnect_param->key_id, NULL);
AnnaBridge 167:e84263d55307 1782 #if DEVICE_EMAC
AnnaBridge 167:e84263d55307 1783 // call wlan_emac API
AnnaBridge 167:e84263d55307 1784 #else
AnnaBridge 167:e84263d55307 1785 #if CONFIG_LWIP_LAYER
AnnaBridge 167:e84263d55307 1786 if(ret == RTW_SUCCESS) {
AnnaBridge 167:e84263d55307 1787 #if ATCMD_VER == ATVER_2
AnnaBridge 167:e84263d55307 1788 if (dhcp_mode_sta == 2){
AnnaBridge 167:e84263d55307 1789 struct netif * pnetif = &xnetif[0];
AnnaBridge 167:e84263d55307 1790 LwIP_UseStaticIP(pnetif);
AnnaBridge 167:e84263d55307 1791 dhcps_init(pnetif);
AnnaBridge 167:e84263d55307 1792 }
AnnaBridge 167:e84263d55307 1793 else
AnnaBridge 167:e84263d55307 1794 #endif
AnnaBridge 167:e84263d55307 1795 {
AnnaBridge 167:e84263d55307 1796 LwIP_DHCP(0, DHCP_START);
AnnaBridge 167:e84263d55307 1797 #if LWIP_AUTOIP
AnnaBridge 167:e84263d55307 1798 uint8_t *ip = LwIP_GetIP(&xnetif[0]);
AnnaBridge 167:e84263d55307 1799 if((ip[0] == 0) && (ip[1] == 0) && (ip[2] == 0) && (ip[3] == 0)) {
AnnaBridge 167:e84263d55307 1800 printf("\n\nIPv4 AUTOIP ...");
AnnaBridge 167:e84263d55307 1801 LwIP_AUTOIP(&xnetif[0]);
AnnaBridge 167:e84263d55307 1802 }
AnnaBridge 167:e84263d55307 1803 #endif
AnnaBridge 167:e84263d55307 1804 }
AnnaBridge 167:e84263d55307 1805 }
AnnaBridge 167:e84263d55307 1806 #endif //#if CONFIG_LWIP_LAYER
AnnaBridge 167:e84263d55307 1807 #endif
AnnaBridge 167:e84263d55307 1808 rtw_delete_task(&g_wifi_auto_reconnect_task);
AnnaBridge 167:e84263d55307 1809 }
AnnaBridge 167:e84263d55307 1810
AnnaBridge 167:e84263d55307 1811 void wifi_autoreconnect_hdl(rtw_security_t security_type,
AnnaBridge 167:e84263d55307 1812 char *ssid, int ssid_len,
AnnaBridge 167:e84263d55307 1813 char *password, int password_len,
AnnaBridge 167:e84263d55307 1814 int key_id)
AnnaBridge 167:e84263d55307 1815 {
AnnaBridge 167:e84263d55307 1816 static struct wifi_autoreconnect_param param;
AnnaBridge 167:e84263d55307 1817 param.security_type = security_type;
AnnaBridge 167:e84263d55307 1818 param.ssid = ssid;
AnnaBridge 167:e84263d55307 1819 param.ssid_len = ssid_len;
AnnaBridge 167:e84263d55307 1820 param.password = password;
AnnaBridge 167:e84263d55307 1821 param.password_len = password_len;
AnnaBridge 167:e84263d55307 1822 param.key_id = key_id;
AnnaBridge 167:e84263d55307 1823
AnnaBridge 167:e84263d55307 1824 if(!rtw_create_task(&g_wifi_auto_reconnect_task,"wifi_autoreconnect",512,TASK_PRORITY_IDEL+1,wifi_autoreconnect_thread, &param))
AnnaBridge 167:e84263d55307 1825 printf("\n\rTCP ERROR: Create TCP server task failed.");
AnnaBridge 167:e84263d55307 1826 }
AnnaBridge 167:e84263d55307 1827
AnnaBridge 167:e84263d55307 1828 int wifi_config_autoreconnect(__u8 mode, __u8 retry_times, __u16 timeout)
AnnaBridge 167:e84263d55307 1829 {
AnnaBridge 167:e84263d55307 1830 p_wlan_autoreconnect_hdl = wifi_autoreconnect_hdl;
AnnaBridge 167:e84263d55307 1831 return wext_set_autoreconnect(WLAN0_NAME, mode, retry_times, timeout);
AnnaBridge 167:e84263d55307 1832 }
AnnaBridge 167:e84263d55307 1833
AnnaBridge 167:e84263d55307 1834 int wifi_set_autoreconnect(__u8 mode)
AnnaBridge 167:e84263d55307 1835 {
AnnaBridge 167:e84263d55307 1836 p_wlan_autoreconnect_hdl = wifi_autoreconnect_hdl;
AnnaBridge 167:e84263d55307 1837 return wifi_config_autoreconnect(mode, 3, 5);//default retry 3 times, timeout 5 seconds
AnnaBridge 167:e84263d55307 1838 }
AnnaBridge 167:e84263d55307 1839
AnnaBridge 167:e84263d55307 1840 int wifi_get_autoreconnect(__u8 *mode)
AnnaBridge 167:e84263d55307 1841 {
AnnaBridge 167:e84263d55307 1842 return wext_get_autoreconnect(WLAN0_NAME, mode);
AnnaBridge 167:e84263d55307 1843 }
AnnaBridge 167:e84263d55307 1844 #endif
AnnaBridge 167:e84263d55307 1845
AnnaBridge 167:e84263d55307 1846 #ifdef CONFIG_CUSTOM_IE
AnnaBridge 167:e84263d55307 1847 /*
AnnaBridge 167:e84263d55307 1848 * Example for custom ie
AnnaBridge 167:e84263d55307 1849 *
AnnaBridge 167:e84263d55307 1850 * u8 test_1[] = {221, 2, 2, 2};
AnnaBridge 167:e84263d55307 1851 * u8 test_2[] = {221, 2, 1, 1};
AnnaBridge 167:e84263d55307 1852 * rtw_custom_ie_t buf[2] = {{test_1, PROBE_REQ},
AnnaBridge 167:e84263d55307 1853 * {test_2, PROBE_RSP | BEACON}};
AnnaBridge 167:e84263d55307 1854 * u8 buf_test2[] = {221, 2, 1, 3} ;
AnnaBridge 167:e84263d55307 1855 * rtw_custom_ie_t buf_update = {buf_test2, PROBE_REQ};
AnnaBridge 167:e84263d55307 1856 *
AnnaBridge 167:e84263d55307 1857 * add ie list
AnnaBridge 167:e84263d55307 1858 * static void cmd_add_ie(int argc, char **argv)
AnnaBridge 167:e84263d55307 1859 * {
AnnaBridge 167:e84263d55307 1860 * wifi_add_custom_ie((void *)buf, 2);
AnnaBridge 167:e84263d55307 1861 * }
AnnaBridge 167:e84263d55307 1862 *
AnnaBridge 167:e84263d55307 1863 * update current ie
AnnaBridge 167:e84263d55307 1864 * static void cmd_update_ie(int argc, char **argv)
AnnaBridge 167:e84263d55307 1865 * {
AnnaBridge 167:e84263d55307 1866 * wifi_update_custom_ie(&buf_update, 2);
AnnaBridge 167:e84263d55307 1867 * }
AnnaBridge 167:e84263d55307 1868 *
AnnaBridge 167:e84263d55307 1869 * delete all ie
AnnaBridge 167:e84263d55307 1870 * static void cmd_del_ie(int argc, char **argv)
AnnaBridge 167:e84263d55307 1871 * {
AnnaBridge 167:e84263d55307 1872 * wifi_del_custom_ie();
AnnaBridge 167:e84263d55307 1873 * }
AnnaBridge 167:e84263d55307 1874 */
AnnaBridge 167:e84263d55307 1875
AnnaBridge 167:e84263d55307 1876 int wifi_add_custom_ie(void *cus_ie, int ie_num)
AnnaBridge 167:e84263d55307 1877 {
AnnaBridge 167:e84263d55307 1878 return wext_add_custom_ie(WLAN0_NAME, cus_ie, ie_num);
AnnaBridge 167:e84263d55307 1879 }
AnnaBridge 167:e84263d55307 1880
AnnaBridge 167:e84263d55307 1881
AnnaBridge 167:e84263d55307 1882 int wifi_update_custom_ie(void *cus_ie, int ie_index)
AnnaBridge 167:e84263d55307 1883 {
AnnaBridge 167:e84263d55307 1884 return wext_update_custom_ie(WLAN0_NAME, cus_ie, ie_index);
AnnaBridge 167:e84263d55307 1885 }
AnnaBridge 167:e84263d55307 1886
AnnaBridge 167:e84263d55307 1887 int wifi_del_custom_ie()
AnnaBridge 167:e84263d55307 1888 {
AnnaBridge 167:e84263d55307 1889 return wext_del_custom_ie(WLAN0_NAME);
AnnaBridge 167:e84263d55307 1890 }
AnnaBridge 167:e84263d55307 1891
AnnaBridge 167:e84263d55307 1892 #endif
AnnaBridge 167:e84263d55307 1893
AnnaBridge 167:e84263d55307 1894 #ifdef CONFIG_PROMISC
AnnaBridge 167:e84263d55307 1895 extern void promisc_init_packet_filter(void);
AnnaBridge 167:e84263d55307 1896 extern int promisc_add_packet_filter(u8 filter_id, rtw_packet_filter_pattern_t *patt, rtw_packet_filter_rule_t rule);
AnnaBridge 167:e84263d55307 1897 extern int promisc_enable_packet_filter(u8 filter_id);
AnnaBridge 167:e84263d55307 1898 extern int promisc_disable_packet_filter(u8 filter_id);
AnnaBridge 167:e84263d55307 1899 extern int promisc_remove_packet_filter(u8 filter_id);
AnnaBridge 167:e84263d55307 1900 void wifi_init_packet_filter()
AnnaBridge 167:e84263d55307 1901 {
AnnaBridge 167:e84263d55307 1902 promisc_init_packet_filter();
AnnaBridge 167:e84263d55307 1903 }
AnnaBridge 167:e84263d55307 1904
AnnaBridge 167:e84263d55307 1905 int wifi_add_packet_filter(unsigned char filter_id, rtw_packet_filter_pattern_t *patt, rtw_packet_filter_rule_t rule)
AnnaBridge 167:e84263d55307 1906 {
AnnaBridge 167:e84263d55307 1907 return promisc_add_packet_filter(filter_id, patt, rule);
AnnaBridge 167:e84263d55307 1908 }
AnnaBridge 167:e84263d55307 1909
AnnaBridge 167:e84263d55307 1910 int wifi_enable_packet_filter(unsigned char filter_id)
AnnaBridge 167:e84263d55307 1911 {
AnnaBridge 167:e84263d55307 1912 return promisc_enable_packet_filter(filter_id);
AnnaBridge 167:e84263d55307 1913 }
AnnaBridge 167:e84263d55307 1914
AnnaBridge 167:e84263d55307 1915 int wifi_disable_packet_filter(unsigned char filter_id)
AnnaBridge 167:e84263d55307 1916 {
AnnaBridge 167:e84263d55307 1917 return promisc_disable_packet_filter(filter_id);
AnnaBridge 167:e84263d55307 1918 }
AnnaBridge 167:e84263d55307 1919
AnnaBridge 167:e84263d55307 1920 int wifi_remove_packet_filter(unsigned char filter_id)
AnnaBridge 167:e84263d55307 1921 {
AnnaBridge 167:e84263d55307 1922 return promisc_remove_packet_filter(filter_id);
AnnaBridge 167:e84263d55307 1923 }
AnnaBridge 167:e84263d55307 1924 #endif
AnnaBridge 167:e84263d55307 1925
AnnaBridge 167:e84263d55307 1926 #ifdef CONFIG_AP_MODE
AnnaBridge 167:e84263d55307 1927 int wifi_enable_forwarding(void)
AnnaBridge 167:e84263d55307 1928 {
AnnaBridge 167:e84263d55307 1929 return wext_enable_forwarding(WLAN0_NAME);
AnnaBridge 167:e84263d55307 1930 }
AnnaBridge 167:e84263d55307 1931
AnnaBridge 167:e84263d55307 1932 int wifi_disable_forwarding(void)
AnnaBridge 167:e84263d55307 1933 {
AnnaBridge 167:e84263d55307 1934 return wext_disable_forwarding(WLAN0_NAME);
AnnaBridge 167:e84263d55307 1935 }
AnnaBridge 167:e84263d55307 1936 #endif
AnnaBridge 167:e84263d55307 1937
AnnaBridge 167:e84263d55307 1938 /* API to set flag for concurrent mode wlan1 issue_deauth when channel switched by wlan0
AnnaBridge 167:e84263d55307 1939 * usage: wifi_set_ch_deauth(0) -> wlan0 wifi_connect -> wifi_set_ch_deauth(1)
AnnaBridge 167:e84263d55307 1940 */
AnnaBridge 167:e84263d55307 1941 #ifdef CONFIG_CONCURRENT_MODE
AnnaBridge 167:e84263d55307 1942 int wifi_set_ch_deauth(__u8 enable)
AnnaBridge 167:e84263d55307 1943 {
AnnaBridge 167:e84263d55307 1944 return wext_set_ch_deauth(WLAN1_NAME, enable);
AnnaBridge 167:e84263d55307 1945 }
AnnaBridge 167:e84263d55307 1946 #endif
AnnaBridge 167:e84263d55307 1947
AnnaBridge 167:e84263d55307 1948 void wifi_set_indicate_mgnt(int enable)
AnnaBridge 167:e84263d55307 1949 {
AnnaBridge 167:e84263d55307 1950 wext_set_indicate_mgnt(enable);
AnnaBridge 167:e84263d55307 1951 return;
AnnaBridge 167:e84263d55307 1952 }
AnnaBridge 167:e84263d55307 1953
AnnaBridge 167:e84263d55307 1954 //----------------------------------------------------------------------------//
AnnaBridge 167:e84263d55307 1955 #endif //#if CONFIG_WLAN
AnnaBridge 167:e84263d55307 1956