mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
wpa_supplicant: Add WPS Fixes
Add following bugfixes 1. Station not able to connect when WPS pin is pressed first on AP. 2. PBC overlap getting detected for selected registrar PIN APs. 3. Station not considering authorised MACs for PIN method. 4. For PIN methodm If no AP is found, station will loop through APs in its vicinity and try to do WPS with them one by one till WPS timeout occurs. This is for some APs which do not set selected registrar correctly.
This commit is contained in:
parent
6934a0164a
commit
757445422d
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileCopyrightText: 2019-2022 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
@ -76,6 +76,7 @@ void wifi_station_wps_msg_timeout_internal(void);
|
||||
void wifi_station_wps_success_internal(void);
|
||||
void wifi_wps_scan_internal(void);
|
||||
void wifi_station_wps_eapol_start_handle_internal(void);
|
||||
void wps_add_discard_ap(u8 *bssid);
|
||||
|
||||
struct wps_sm *gWpsSm = NULL;
|
||||
static wps_factory_information_t *s_factory_info = NULL;
|
||||
@ -296,8 +297,8 @@ static inline int wps_sm_ether_send(struct wps_sm *sm, const u8 *dest, u16 proto
|
||||
void *buffer = (void *)(data - sizeof(struct l2_ethhdr));
|
||||
struct l2_ethhdr *eth = (struct l2_ethhdr *)buffer;
|
||||
|
||||
memcpy(eth->h_dest, dest, ETH_ALEN);
|
||||
memcpy(eth->h_source, sm->ownaddr, ETH_ALEN);
|
||||
os_memcpy(eth->h_dest, dest, ETH_ALEN);
|
||||
os_memcpy(eth->h_source, sm->ownaddr, ETH_ALEN);
|
||||
eth->h_proto = host_to_be16(proto);
|
||||
|
||||
wps_sendto_wrapper(buffer, sizeof(struct l2_ethhdr) + data_len);
|
||||
@ -327,9 +328,9 @@ u8 *wps_sm_alloc_eapol(struct wps_sm *sm, u8 type,
|
||||
hdr->length = host_to_be16(data_len);
|
||||
|
||||
if (data) {
|
||||
memcpy(hdr + 1, data, data_len);
|
||||
os_memcpy(hdr + 1, data, data_len);
|
||||
} else {
|
||||
memset(hdr + 1, 0, data_len);
|
||||
os_memset(hdr + 1, 0, data_len);
|
||||
}
|
||||
|
||||
if (data_pos) {
|
||||
@ -380,10 +381,10 @@ struct wps_data *wps_init(void)
|
||||
data->registrar = 0; /* currently, we force to support enrollee only */
|
||||
|
||||
if (data->registrar) {
|
||||
memcpy(data->uuid_r, sm->uuid, WPS_UUID_LEN);
|
||||
os_memcpy(data->uuid_r, sm->uuid, WPS_UUID_LEN);
|
||||
} else {
|
||||
memcpy(data->mac_addr_e, sm->dev->mac_addr, ETH_ALEN);
|
||||
memcpy(data->uuid_e, sm->uuid, WPS_UUID_LEN);
|
||||
os_memcpy(data->mac_addr_e, sm->dev->mac_addr, ETH_ALEN);
|
||||
os_memcpy(data->uuid_e, sm->uuid, WPS_UUID_LEN);
|
||||
}
|
||||
|
||||
if (wps_get_type() == WPS_TYPE_PIN) {
|
||||
@ -403,10 +404,10 @@ struct wps_data *wps_init(void)
|
||||
do {
|
||||
char tmpp[9];
|
||||
os_bzero(tmpp, 9);
|
||||
memcpy(tmpp, data->dev_password, 8);
|
||||
os_memcpy(tmpp, data->dev_password, 8);
|
||||
wpa_printf(MSG_DEBUG, "WPS PIN [%s]", tmpp);
|
||||
wifi_event_sta_wps_er_pin_t evt;
|
||||
memcpy(evt.pin_code, data->dev_password, 8);
|
||||
os_memcpy(evt.pin_code, data->dev_password, 8);
|
||||
esp_event_send_internal(WIFI_EVENT, WIFI_EVENT_STA_WPS_ER_PIN, &evt, sizeof(evt), portMAX_DELAY);
|
||||
} while (0);
|
||||
} else if (wps_get_type() == WPS_TYPE_PBC) {
|
||||
@ -436,7 +437,7 @@ struct wps_data *wps_init(void)
|
||||
os_free(data);
|
||||
return NULL;
|
||||
}
|
||||
memcpy(data->dev_password,
|
||||
os_memcpy(data->dev_password,
|
||||
wpabuf_head(cfg->wps->ap_nfc_dev_pw),
|
||||
wpabuf_len(cfg->wps->ap_nfc_dev_pw));
|
||||
data->dev_password_len = wpabuf_len(cfg->wps->ap_nfc_dev_pw);
|
||||
@ -558,6 +559,10 @@ wps_parse_scan_result(struct wps_scan_ie *scan)
|
||||
wpa_printf(MSG_DEBUG, "wps parse scan: %s", tmp);
|
||||
#endif
|
||||
|
||||
if (!sm->is_wps_scan || !scan->bssid) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (wps_get_type() == WPS_TYPE_DISABLE
|
||||
|| (wps_get_status() != WPS_STATUS_DISABLE
|
||||
&& wps_get_status() != WPS_STATUS_SCANNING)
|
||||
@ -565,42 +570,61 @@ wps_parse_scan_result(struct wps_scan_ie *scan)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!scan->rsn && !scan->wpa && (scan->capinfo & WIFI_CAPINFO_PRIVACY)) {
|
||||
wpa_printf(MSG_INFO, "WEP not suppported in WPS");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (sm->wps_pin_war) {
|
||||
/* We have selected candidate for this scan */
|
||||
return false;
|
||||
}
|
||||
|
||||
esp_wifi_get_mode(&op_mode);
|
||||
if ((op_mode == WIFI_MODE_STA
|
||||
#ifdef CONFIG_ESP_WIFI_SOFTAP_SUPPORT
|
||||
|| op_mode == WIFI_MODE_APSTA
|
||||
#endif
|
||||
) && scan->wps) {
|
||||
bool ap_found = false;
|
||||
struct wpabuf *buf = wpabuf_alloc_copy(scan->wps + 6, scan->wps[1] - 4);
|
||||
int count;
|
||||
|
||||
if (wps_is_selected_pbc_registrar(buf, scan->bssid)
|
||||
|| wps_is_selected_pin_registrar(buf, scan->bssid)) {
|
||||
if ((wps_get_type() == WPS_TYPE_PBC && wps_is_selected_pbc_registrar(buf)) ||
|
||||
(wps_get_type() == WPS_TYPE_PIN && wps_is_addr_authorized(buf, sm->ownaddr, 1))) {
|
||||
/* Found one AP with selected registrar true */
|
||||
sm->ignore_sel_reg = false;
|
||||
sm->discard_ap_cnt = 0;
|
||||
ap_found = true;
|
||||
}
|
||||
if ((op_mode == WIFI_MODE_STA
|
||||
#ifdef CONFIG_ESP_WIFI_SOFTAP_SUPPORT
|
||||
|| op_mode == WIFI_MODE_APSTA
|
||||
#endif
|
||||
) && wps_get_type() == WPS_TYPE_PIN && sm->ignore_sel_reg) {
|
||||
/* AP is in discard list? */
|
||||
for (count = 0; count < WPS_MAX_DIS_AP_NUM; count++) {
|
||||
if (os_memcmp(sm->dis_ap_list[count].bssid, scan->bssid, ETH_ALEN) == 0) {
|
||||
wpa_printf(MSG_INFO, "discard ap bssid "MACSTR, MAC2STR(scan->bssid));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
sm->wps_pin_war = true;
|
||||
}
|
||||
|
||||
if (ap_found || sm->wps_pin_war) {
|
||||
wpabuf_free(buf);
|
||||
|
||||
if (sm->is_wps_scan == false) {
|
||||
return false;
|
||||
}
|
||||
if (memcmp(sm->config.bssid, scan->bssid, ETH_ALEN) != 0 ) {
|
||||
sm->discover_ssid_cnt++;
|
||||
}
|
||||
|
||||
if (!scan->rsn && !scan->wpa && (scan->capinfo & WIFI_CAPINFO_PRIVACY)) {
|
||||
wpa_printf(MSG_ERROR, "WEP not suppported in WPS");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
esp_wifi_enable_sta_privacy_internal();
|
||||
os_memset(sm->config.ssid, 0, sizeof(sm->config.ssid));
|
||||
strncpy((char *)sm->config.ssid, (char *)&scan->ssid[2], (int)scan->ssid[1]);
|
||||
if (scan->bssid) {
|
||||
memcpy(gWpsSm->bssid, scan->bssid, ETH_ALEN);
|
||||
memcpy(sm->config.bssid, scan->bssid, ETH_ALEN);
|
||||
if (scan->bssid && memcmp(sm->config.bssid, scan->bssid, ETH_ALEN) != 0) {
|
||||
printf("sm BSSid: "MACSTR " scan BSSID " MACSTR "\n", MAC2STR(sm->config.bssid), MAC2STR(scan->bssid));
|
||||
sm->discover_ssid_cnt++;
|
||||
os_memcpy(sm->bssid, scan->bssid, ETH_ALEN);
|
||||
os_memcpy(sm->config.bssid, scan->bssid, ETH_ALEN);
|
||||
sm->config.bssid_set = 1;
|
||||
} else {
|
||||
}
|
||||
wpa_printf(MSG_DEBUG, "wps discover [%s]", (char *)sm->config.ssid);
|
||||
sm->scan_cnt = 0;
|
||||
|
||||
sm->channel = scan->chan;
|
||||
|
||||
return true;
|
||||
@ -983,10 +1007,10 @@ int wps_finish(void)
|
||||
return ESP_FAIL;
|
||||
}
|
||||
|
||||
memset(config, 0x00, sizeof(wifi_sta_config_t));
|
||||
memcpy(config->sta.ssid, sm->ssid[0], sm->ssid_len[0]);
|
||||
memcpy(config->sta.password, sm->key[0], sm->key_len[0]);
|
||||
memcpy(config->sta.bssid, sm->bssid, ETH_ALEN);
|
||||
os_memset(config, 0x00, sizeof(wifi_sta_config_t));
|
||||
os_memcpy(config->sta.ssid, sm->ssid[0], sm->ssid_len[0]);
|
||||
os_memcpy(config->sta.password, sm->key[0], sm->key_len[0]);
|
||||
os_memcpy(config->sta.bssid, sm->bssid, ETH_ALEN);
|
||||
config->sta.bssid_set = 0;
|
||||
esp_wifi_set_config(0, config);
|
||||
|
||||
@ -998,9 +1022,16 @@ int wps_finish(void)
|
||||
|
||||
ret = 0;
|
||||
} else {
|
||||
wpa_printf(MSG_ERROR, "wps failed----->");
|
||||
|
||||
ret = wps_stop_process(WPS_FAIL_REASON_NORMAL);
|
||||
wpa_printf(MSG_ERROR, "wps failed-----> wps_pin_war=%d", sm->wps_pin_war);
|
||||
if (sm->wps_pin_war) {
|
||||
sm->discover_ssid_cnt = 0;
|
||||
esp_wifi_disconnect();
|
||||
os_bzero(sm->ssid, sizeof(sm->ssid));
|
||||
os_bzero(sm->ssid_len, sizeof(sm->ssid_len));
|
||||
wps_add_discard_ap(sm->config.bssid);
|
||||
} else {
|
||||
ret = wps_stop_process(WPS_FAIL_REASON_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -1020,11 +1051,12 @@ void wps_add_discard_ap(u8 *bssid)
|
||||
sm->discard_ap_cnt++;
|
||||
} else {
|
||||
for (cnt = 0; cnt < WPS_MAX_DIS_AP_NUM - 2; cnt++) {
|
||||
memcpy(sm->dis_ap_list[cnt].bssid, sm->dis_ap_list[cnt + 1].bssid, 6);
|
||||
os_memcpy(sm->dis_ap_list[cnt].bssid, sm->dis_ap_list[cnt + 1].bssid, 6);
|
||||
}
|
||||
sm->discard_ap_cnt = WPS_MAX_DIS_AP_NUM;
|
||||
}
|
||||
memcpy(sm->dis_ap_list[cnt].bssid, bssid, 6);
|
||||
os_memcpy(sm->dis_ap_list[cnt].bssid, bssid, 6);
|
||||
wpa_printf(MSG_INFO, "Added BSSID:"MACSTR" to discard list cnt=%d" , MAC2STR(bssid), sm->discard_ap_cnt);
|
||||
}
|
||||
|
||||
int wps_start_msg_timer(void)
|
||||
@ -1089,9 +1121,9 @@ int wps_sm_rx_eapol(u8 *src_addr, u8 *buf, u32 len)
|
||||
os_free(param);
|
||||
return ESP_ERR_NO_MEM;
|
||||
}
|
||||
memcpy(param->buf, buf, len);
|
||||
os_memcpy(param->buf, buf, len);
|
||||
param->len = len;
|
||||
memcpy(param->sa, src_addr, WPS_ADDR_LEN);
|
||||
os_memcpy(param->sa, src_addr, WPS_ADDR_LEN);
|
||||
|
||||
wps_rxq_enqueue(param);
|
||||
return wps_post(SIG_WPS_RX, 0);
|
||||
@ -1241,7 +1273,10 @@ int wps_sm_rx_eapol_internal(u8 *src_addr, u8 *buf, u32 len)
|
||||
break;
|
||||
}
|
||||
out:
|
||||
if (ret != 0 || res == WPS_FAILURE) {
|
||||
if (ret != 0 && sm->wps_pin_war) {
|
||||
sm->wps_pin_war = false;
|
||||
wifi_wps_scan();
|
||||
} else if ((ret != 0 || res == WPS_FAILURE)) {
|
||||
wifi_event_sta_wps_fail_reason_t reason_code = WPS_FAIL_REASON_NORMAL;
|
||||
wpa_printf(MSG_DEBUG, "wpa rx eapol internal: fail ret=%d", ret);
|
||||
wps_set_status(WPS_STATUS_DISABLE);
|
||||
@ -1284,19 +1319,19 @@ int wps_set_factory_info(const esp_wps_config_t *config)
|
||||
}
|
||||
|
||||
if (config->factory_info.manufacturer[0] != 0) {
|
||||
memcpy(s_factory_info->manufacturer, config->factory_info.manufacturer, WPS_MAX_MANUFACTURER_LEN - 1);
|
||||
os_memcpy(s_factory_info->manufacturer, config->factory_info.manufacturer, WPS_MAX_MANUFACTURER_LEN - 1);
|
||||
}
|
||||
|
||||
if (config->factory_info.model_number[0] != 0) {
|
||||
memcpy(s_factory_info->model_number, config->factory_info.model_number, WPS_MAX_MODEL_NUMBER_LEN - 1);
|
||||
os_memcpy(s_factory_info->model_number, config->factory_info.model_number, WPS_MAX_MODEL_NUMBER_LEN - 1);
|
||||
}
|
||||
|
||||
if (config->factory_info.model_name[0] != 0) {
|
||||
memcpy(s_factory_info->model_name, config->factory_info.model_name, WPS_MAX_MODEL_NAME_LEN - 1);
|
||||
os_memcpy(s_factory_info->model_name, config->factory_info.model_name, WPS_MAX_MODEL_NAME_LEN - 1);
|
||||
}
|
||||
|
||||
if (config->factory_info.device_name[0] != 0) {
|
||||
memcpy(s_factory_info->device_name, config->factory_info.device_name, WPS_MAX_DEVICE_NAME_LEN - 1);
|
||||
os_memcpy(s_factory_info->device_name, config->factory_info.device_name, WPS_MAX_DEVICE_NAME_LEN - 1);
|
||||
}
|
||||
|
||||
wpa_printf(MSG_INFO, "manufacturer: %s, model number: %s, model name: %s, device name: %s", s_factory_info->manufacturer,
|
||||
@ -1376,7 +1411,7 @@ int wps_dev_init(void)
|
||||
sm->ownaddr[3], sm->ownaddr[4], sm->ownaddr[5]);
|
||||
|
||||
uuid_gen_mac_addr(sm->ownaddr, sm->uuid);
|
||||
memcpy(dev->mac_addr, sm->ownaddr, ETH_ALEN);
|
||||
os_memcpy(dev->mac_addr, sm->ownaddr, ETH_ALEN);
|
||||
|
||||
return ESP_OK;
|
||||
|
||||
@ -1471,7 +1506,6 @@ void
|
||||
wifi_station_wps_msg_timeout_internal(void)
|
||||
{
|
||||
struct wps_sm *sm = gWpsSm;
|
||||
|
||||
if (!sm) {
|
||||
return;
|
||||
}
|
||||
@ -1479,11 +1513,22 @@ wifi_station_wps_msg_timeout_internal(void)
|
||||
if (sm->wps->state == WPS_FINISHED) {
|
||||
wpa_printf(MSG_DEBUG, "wps msg timeout WPS_FINISHED");
|
||||
wps_finish();
|
||||
return;
|
||||
} else if (sm->wps->state == RECV_M2) {
|
||||
wpa_printf(MSG_DEBUG, "wps msg timeout RECV_M2");
|
||||
wpa_printf(MSG_DEBUG, "wps recev m2/m2d timeout------>");
|
||||
if (!sm->wps_pin_war) {
|
||||
wps_stop_process(WPS_FAIL_REASON_RECV_M2D);
|
||||
}
|
||||
}
|
||||
if (sm->wps_pin_war) {
|
||||
esp_wifi_disconnect();
|
||||
wps_add_discard_ap(sm->config.bssid);
|
||||
wps_stop_process(WPS_FAIL_REASON_RECV_M2D);
|
||||
sm->wps_pin_war = false;
|
||||
os_bzero(sm->ssid, sizeof(sm->ssid));
|
||||
os_bzero(sm->ssid_len, sizeof(sm->ssid_len));
|
||||
sm->discover_ssid_cnt = 0;
|
||||
wifi_wps_scan();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1566,19 +1611,20 @@ wifi_station_wps_init(void)
|
||||
}
|
||||
|
||||
sm = gWpsSm;
|
||||
memset(sm, 0x00, sizeof(struct wps_sm));
|
||||
os_memset(sm, 0x00, sizeof(struct wps_sm));
|
||||
|
||||
esp_wifi_get_macaddr_internal(WIFI_IF_STA, mac);
|
||||
memcpy(sm->ownaddr, mac, ETH_ALEN);
|
||||
os_memcpy(sm->ownaddr, mac, ETH_ALEN);
|
||||
|
||||
sm->discover_ssid_cnt = 0;
|
||||
sm->ignore_sel_reg = false;
|
||||
sm->discard_ap_cnt = 0;
|
||||
memset(&sm->dis_ap_list, 0, WPS_MAX_DIS_AP_NUM * sizeof(struct discard_ap_list_t));
|
||||
memset(&sm->config, 0x00, sizeof(wifi_sta_config_t));
|
||||
os_memset(&sm->dis_ap_list, 0, WPS_MAX_DIS_AP_NUM * sizeof(struct discard_ap_list_t));
|
||||
os_memset(&sm->config, 0x00, sizeof(wifi_sta_config_t));
|
||||
sm->eapol_version = 0x1;
|
||||
sm->identity_len = 29;
|
||||
memcpy(sm->identity, WPS_EAP_EXT_VENDOR_TYPE, sm->identity_len);
|
||||
os_memcpy(sm->identity, WPS_EAP_EXT_VENDOR_TYPE, sm->identity_len);
|
||||
sm->wps_pin_war = false;
|
||||
|
||||
sm->is_wps_scan = false;
|
||||
|
||||
@ -1733,14 +1779,14 @@ wps_ssid_save(u8 *ssid, u8 ssid_len, u8 idx)
|
||||
return ESP_FAIL;
|
||||
}
|
||||
|
||||
memset(gWpsSm->ssid[idx], 0x00, sizeof(gWpsSm->ssid[idx]));
|
||||
memcpy(gWpsSm->ssid[idx], ssid, ssid_len);
|
||||
os_memset(gWpsSm->ssid[idx], 0x00, sizeof(gWpsSm->ssid[idx]));
|
||||
os_memcpy(gWpsSm->ssid[idx], ssid, ssid_len);
|
||||
gWpsSm->ssid_len[idx] = ssid_len;
|
||||
gWpsSm->ap_cred_cnt++;
|
||||
|
||||
tmpssid = (u8 *)os_zalloc(ssid_len + 1);
|
||||
if (tmpssid) {
|
||||
memcpy(tmpssid, ssid, ssid_len);
|
||||
os_memcpy(tmpssid, ssid, ssid_len);
|
||||
wpa_printf(MSG_DEBUG, "WPS: key[%s]", tmpssid);
|
||||
os_free(tmpssid);
|
||||
}
|
||||
@ -1756,13 +1802,13 @@ wps_key_save(char *key, u8 key_len, u8 idx)
|
||||
return ESP_FAIL;
|
||||
}
|
||||
|
||||
memset(gWpsSm->key[idx], 0x00, sizeof(gWpsSm->key[idx]));
|
||||
memcpy(gWpsSm->key[idx], key, key_len);
|
||||
os_memset(gWpsSm->key[idx], 0x00, sizeof(gWpsSm->key[idx]));
|
||||
os_memcpy(gWpsSm->key[idx], key, key_len);
|
||||
gWpsSm->key_len[idx] = key_len;
|
||||
|
||||
tmpkey = (u8 *)os_zalloc(key_len + 1);
|
||||
if (tmpkey) {
|
||||
memcpy(tmpkey, key, key_len);
|
||||
os_memcpy(tmpkey, key, key_len);
|
||||
wpa_printf(MSG_DEBUG, "WPS: key[%s], idx - %d", tmpkey, idx);
|
||||
os_free(tmpkey);
|
||||
}
|
||||
@ -1775,6 +1821,7 @@ wifi_wps_scan_done(void *arg, STATUS status)
|
||||
struct wps_sm *sm = gWpsSm;
|
||||
wifi_config_t wifi_config;
|
||||
|
||||
wpa_printf(MSG_INFO, "WPS: scan done");
|
||||
if (wps_get_type() == WPS_TYPE_DISABLE) {
|
||||
return;
|
||||
}
|
||||
@ -1800,14 +1847,17 @@ wifi_wps_scan_done(void *arg, STATUS status)
|
||||
if (wps_get_status() == WPS_STATUS_PENDING) {
|
||||
esp_wifi_disconnect();
|
||||
|
||||
memcpy(&wifi_config.sta, &sm->config, sizeof(wifi_sta_config_t));
|
||||
os_memcpy(&wifi_config.sta, &sm->config, sizeof(wifi_sta_config_t));
|
||||
esp_wifi_set_config(0, &wifi_config);
|
||||
|
||||
wpa_printf(MSG_DEBUG, "WPS: neg start");
|
||||
esp_wifi_connect();
|
||||
ets_timer_disarm(&sm->wps_msg_timeout_timer);
|
||||
ets_timer_arm(&sm->wps_msg_timeout_timer, 2000, 0);
|
||||
} else if (wps_get_status() == WPS_STATUS_SCANNING) {
|
||||
if (sm->scan_cnt < WPS_IGNORE_SEL_REG_MAX_CNT) {
|
||||
if (wps_get_type() == WPS_TYPE_PIN && sm->scan_cnt > WPS_IGNORE_SEL_REG_MAX_CNT) {
|
||||
sm->ignore_sel_reg = true;
|
||||
sm->wps_pin_war = false;
|
||||
}
|
||||
ets_timer_arm(&sm->wps_scan_timer, 100, 0);
|
||||
} else {
|
||||
@ -1868,6 +1918,8 @@ int wifi_station_wps_start(void)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
sm->discard_ap_cnt = 0;
|
||||
os_memset(&sm->dis_ap_list, 0, WPS_MAX_DIS_AP_NUM * sizeof(struct discard_ap_list_t));
|
||||
esp_wifi_set_wps_start_flag_internal(true);
|
||||
return ESP_OK;
|
||||
}
|
||||
@ -1894,12 +1946,6 @@ int wps_task_deinit(void)
|
||||
wpa_printf(MSG_DEBUG, "wps task deinit: free queue");
|
||||
}
|
||||
|
||||
if (s_wps_task_hdl) {
|
||||
vTaskDelete(s_wps_task_hdl);
|
||||
s_wps_task_hdl = NULL;
|
||||
wpa_printf(MSG_DEBUG, "wps task deinit: free task");
|
||||
}
|
||||
|
||||
if (STAILQ_FIRST(&s_wps_rxq) != NULL){
|
||||
wps_rxq_deinit();
|
||||
}
|
||||
|
@ -67,11 +67,9 @@ struct wpabuf * wps_get_msg(struct wps_data *wps, enum wsc_op_code *op_code)
|
||||
* @msg: WPS IE contents from Beacon or Probe Response frame
|
||||
* Returns: 1 if PBC Registrar is active, 0 if not
|
||||
*/
|
||||
int wps_is_selected_pbc_registrar(const struct wpabuf *msg, u8 *bssid)
|
||||
int wps_is_selected_pbc_registrar(const struct wpabuf *msg)
|
||||
{
|
||||
struct wps_sm *sm = wps_sm_get();
|
||||
struct wps_parse_attr *attr = (struct wps_parse_attr *)os_zalloc(sizeof(struct wps_parse_attr));
|
||||
int i = 0;
|
||||
|
||||
/*
|
||||
* In theory, this could also verify that attr.sel_reg_config_methods
|
||||
@ -80,48 +78,32 @@ int wps_is_selected_pbc_registrar(const struct wpabuf *msg, u8 *bssid)
|
||||
* it is safer to just use Device Password ID here.
|
||||
*/
|
||||
|
||||
if (wps_parse_msg(msg, attr) < 0) {
|
||||
os_free(attr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(!attr->selected_registrar || *attr->selected_registrar == 0) {
|
||||
if (sm->ignore_sel_reg == false) {
|
||||
os_free(attr);
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
for (i = 0; i < WPS_MAX_DIS_AP_NUM; i++) {
|
||||
if (0 == os_memcmp(sm->dis_ap_list[i].bssid, bssid, 6)) {
|
||||
wpa_printf(MSG_DEBUG, "discard ap bssid[%02x:%02x:%02x:%02x:%02x:%02x]\n", \
|
||||
bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]);
|
||||
os_free(attr);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!attr->dev_password_id ||
|
||||
if (wps_parse_msg(msg, attr) < 0 ||
|
||||
!attr->selected_registrar || *attr->selected_registrar == 0 ||
|
||||
!attr->dev_password_id ||
|
||||
WPA_GET_BE16(attr->dev_password_id) != DEV_PW_PUSHBUTTON) {
|
||||
os_free(attr);
|
||||
return 0;
|
||||
os_free(attr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_WPS_STRICT
|
||||
if (!attr->sel_reg_config_methods ||
|
||||
!(WPA_GET_BE16(attr->sel_reg_config_methods) &
|
||||
WPS_CONFIG_PUSHBUTTON)) {
|
||||
os_free(attr);
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_WPS_STRICT */
|
||||
|
||||
os_free(attr);
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_WPS_PIN
|
||||
|
||||
static int is_selected_pin_registrar(struct wps_parse_attr *attr, u8 *bssid)
|
||||
static int is_selected_pin_registrar(struct wps_parse_attr *attr)
|
||||
{
|
||||
struct wps_sm *sm = wps_sm_get();
|
||||
int i = 0;
|
||||
|
||||
if (!sm || !bssid){
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
* In theory, this could also verify that attr.sel_reg_config_methods
|
||||
* includes WPS_CONFIG_LABEL, WPS_CONFIG_DISPLAY, or WPS_CONFIG_KEYPAD,
|
||||
@ -131,27 +113,19 @@ static int is_selected_pin_registrar(struct wps_parse_attr *attr, u8 *bssid)
|
||||
*/
|
||||
|
||||
if (!attr->selected_registrar || *attr->selected_registrar == 0) {
|
||||
if (sm->ignore_sel_reg == false) {
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
for (i = 0; i < WPS_MAX_DIS_AP_NUM; i++) {
|
||||
if (0 == os_memcmp(sm->dis_ap_list[i].bssid, bssid, 6)) {
|
||||
wpa_printf(MSG_DEBUG, "discard ap bssid[%02x:%02x:%02x:%02x:%02x:%02x]\n", \
|
||||
bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
if (attr->dev_password_id != NULL &&
|
||||
WPA_GET_BE16(attr->dev_password_id) == DEV_PW_PUSHBUTTON) {
|
||||
return 0;
|
||||
}
|
||||
#ifdef CONFIG_WPS_STRICT
|
||||
if (!attr->sel_reg_config_methods)
|
||||
if (!attr->sel_reg_config_methods ||
|
||||
!(WPA_GET_BE16(attr->sel_reg_config_methods) &
|
||||
(WPS_CONFIG_LABEL | WPS_CONFIG_DISPLAY | WPS_CONFIG_KEYPAD)))
|
||||
return 0;
|
||||
#endif /* CONFIG_WPS_STRICT */
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -161,7 +135,7 @@ static int is_selected_pin_registrar(struct wps_parse_attr *attr, u8 *bssid)
|
||||
* @msg: WPS IE contents from Beacon or Probe Response frame
|
||||
* Returns: 1 if PIN Registrar is active, 0 if not
|
||||
*/
|
||||
int wps_is_selected_pin_registrar(const struct wpabuf *msg, u8 *bssid)
|
||||
int wps_is_selected_pin_registrar(const struct wpabuf *msg)
|
||||
{
|
||||
struct wps_parse_attr *attr;
|
||||
int ret;
|
||||
@ -175,7 +149,7 @@ int wps_is_selected_pin_registrar(const struct wpabuf *msg, u8 *bssid)
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = is_selected_pin_registrar(attr, bssid);
|
||||
ret = is_selected_pin_registrar(attr);
|
||||
os_free(attr);
|
||||
|
||||
return ret;
|
||||
@ -193,20 +167,15 @@ int wps_is_selected_pin_registrar(const struct wpabuf *msg, u8 *bssid)
|
||||
int wps_is_addr_authorized(const struct wpabuf *msg, const u8 *addr,
|
||||
int ver1_compat)
|
||||
{
|
||||
struct wps_sm *sm = wps_sm_get();
|
||||
struct wps_parse_attr *attr;
|
||||
int ret = 0;
|
||||
unsigned int i;
|
||||
const u8 *pos;
|
||||
const u8 bcast[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
if (!sm){
|
||||
return -10;
|
||||
}
|
||||
|
||||
attr = (struct wps_parse_attr *)os_zalloc(sizeof(struct wps_parse_attr));
|
||||
if (attr == NULL) {
|
||||
ret = -99;
|
||||
ret = 0;
|
||||
goto _out;
|
||||
}
|
||||
|
||||
@ -222,7 +191,7 @@ int wps_is_addr_authorized(const struct wpabuf *msg, const u8 *addr,
|
||||
*/
|
||||
#ifdef CONFIG_WPS_PIN
|
||||
|
||||
ret = is_selected_pin_registrar(attr, sm->config.bssid);
|
||||
ret = is_selected_pin_registrar(attr);
|
||||
goto _out;
|
||||
#endif
|
||||
}
|
||||
|
@ -233,8 +233,8 @@ enum wps_process_res wps_process_msg(struct wps_data *wps,
|
||||
|
||||
struct wpabuf * wps_get_msg(struct wps_data *wps, enum wsc_op_code *op_code);
|
||||
|
||||
int wps_is_selected_pbc_registrar(const struct wpabuf *msg, u8 *bssid);
|
||||
int wps_is_selected_pin_registrar(const struct wpabuf *msg, u8 *bssid);
|
||||
int wps_is_selected_pbc_registrar(const struct wpabuf *msg);
|
||||
int wps_is_selected_pin_registrar(const struct wpabuf *msg);
|
||||
int wps_ap_priority_compar(const struct wpabuf *wps_a,
|
||||
const struct wpabuf *wps_b);
|
||||
int wps_is_addr_authorized(const struct wpabuf *msg, const u8 *addr,
|
||||
@ -1054,6 +1054,7 @@ struct wps_sm {
|
||||
#endif
|
||||
u8 discover_ssid_cnt;
|
||||
bool ignore_sel_reg;
|
||||
bool wps_pin_war;
|
||||
struct discard_ap_list_t dis_ap_list[WPS_MAX_DIS_AP_NUM];
|
||||
u8 discard_ap_cnt;
|
||||
wifi_sta_config_t config;
|
||||
|
Loading…
Reference in New Issue
Block a user