static int wifi_connect_bssid_local(rtw_network_info_t *pWifi) { int ret = 0; u8 bssid[12] = {0}; if(is_promisc_enabled()) promisc_set(0, NULL, 0); if(!pWifi) return -1; switch(pWifi->security_type){ case RTW_SECURITY_OPEN: ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_NONE, NULL, 0, 0, 0, 0, NULL, 0); break; case RTW_SECURITY_WEP_PSK: case RTW_SECURITY_WEP_SHARED: ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_SHARED_KEY); if(ret == 0) ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_WEP, NULL, pWifi->key_id, 1 /* set tx key */, 0, 0, pWifi->password, pWifi->password_len); break; case RTW_SECURITY_WPA_TKIP_PSK: case RTW_SECURITY_WPA2_TKIP_PSK: ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_OPEN_SYSTEM); if(ret == 0) ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_TKIP, NULL, 0, 0, 0, 0, NULL, 0); if(ret == 0) ret = wext_set_passphrase(WLAN0_NAME, pWifi->password, pWifi->password_len); break; case RTW_SECURITY_WPA_AES_PSK: case RTW_SECURITY_WPA2_AES_PSK: case RTW_SECURITY_WPA2_MIXED_PSK: ret = wext_set_auth_param(WLAN0_NAME, IW_AUTH_80211_AUTH_ALG, IW_AUTH_ALG_OPEN_SYSTEM); if(ret == 0) ret = wext_set_key_ext(WLAN0_NAME, IW_ENCODE_ALG_CCMP, NULL, 0, 0, 0, 0, NULL, 0); if(ret == 0) ret = wext_set_passphrase(WLAN0_NAME, pWifi->password, pWifi->password_len); break; default: ret = -1; printf("\n\rWIFICONF: security type(0x%x) is not supported.\n\r", pWifi->security_type); break; } if(ret == 0){ memcpy(bssid, pWifi->bssid.octet, ETH_ALEN); if(pWifi->ssid.len){ bssid[ETH_ALEN] = '#'; bssid[ETH_ALEN + 1] = '@'; memcpy(bssid + ETH_ALEN + 2, &pWifi, sizeof(pWifi)); } ret = wext_set_bssid(WLAN0_NAME, bssid); } return ret; }
static int rthw_wifi_disconnect(char *name) { char essid[33]; int timeout = 20; const rt_uint8_t null_bssid[ETH_ALEN + 2] = {0, 0, 0, 0, 0, 1, 0, 0}; if (name == RT_NULL) return -1; if (wext_get_ssid(name, (unsigned char *) essid) < 0) { rt_kprintf("\nWIFI disconnected!\n"); return -1; } if (wext_set_bssid(name, null_bssid) < 0) { rt_kprintf("Failed to set bogus BSSID to disconnect"); return -1; } while (1) { if(wext_get_ssid(name, (unsigned char *) essid) < 0) { rt_kprintf("WIFI disconnected!\n"); break; } if(timeout == 0) { rt_kprintf("ERROR: Deassoc timeout!\n"); return -1; } rt_thread_delay(10); timeout --; } return 0; }