mbed library sources. Supersedes mbed-src.

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

Committer:
Kojto
Date:
Wed Jul 19 17:31:21 2017 +0100
Revision:
169:e3b6fe271b81
Parent:
167:e84263d55307
Child:
186:707f6e361f3e
This updates the lib to the mbed lib v 147

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