Skip to content

Commit 9c84243

Browse files
author
Jiang Jiang Jian
committed
Merge branch 'bugfix/wps_pbc_overlap_uuid' into 'master'
fix(wpa_supplicant): Ensure pbc_overlap event is posted correctly Closes WIFIBUG-1115 and WIFIBUG-1055 See merge request espressif/esp-idf!38206
2 parents 27ec17a + 3ee449b commit 9c84243

File tree

2 files changed

+19
-11
lines changed

2 files changed

+19
-11
lines changed

components/wpa_supplicant/esp_supplicant/src/esp_wps.c

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -349,15 +349,15 @@ is_wps_pbc_overlap(struct wps_sm *sm, const u8 *sel_uuid)
349349
{
350350
if (!sel_uuid) {
351351
wpa_printf(MSG_DEBUG, "WPS: null uuid field");
352-
return false;
352+
return true;
353353
}
354354

355-
if (os_memcmp(sel_uuid, sm->uuid, WPS_UUID_LEN) != 0) {
355+
if (os_memcmp(sel_uuid, sm->uuid_r, WPS_UUID_LEN) != 0) {
356356
wpa_printf(MSG_DEBUG, "uuid is not same");
357357
wpa_hexdump(MSG_DEBUG, "WPS: UUID of scanned BSS is",
358358
sel_uuid, WPS_UUID_LEN);
359359
wpa_hexdump(MSG_DEBUG, "WPS: UUID of sm BSS is",
360-
sm->uuid, WPS_UUID_LEN);
360+
sm->uuid_r, WPS_UUID_LEN);
361361
return true;
362362
}
363363

@@ -369,7 +369,10 @@ wps_parse_scan_result(struct wps_scan_ie *scan)
369369
{
370370
struct wps_sm *sm = gWpsSm;
371371
wifi_mode_t op_mode = 0;
372-
sm->wps_pbc_overlap = false;
372+
373+
if (sm->wps_pbc_overlap) {
374+
return false;
375+
}
373376

374377
if (!sm->is_wps_scan || !scan->bssid) {
375378
return false;
@@ -442,12 +445,14 @@ wps_parse_scan_result(struct wps_scan_ie *scan)
442445
os_memcpy(sm->bssid, scan->bssid, ETH_ALEN);
443446

444447
scan_uuid = wps_get_uuid_e(buf);
448+
if (sm->discover_ssid_cnt > 1 && wps_get_type() == WPS_TYPE_PBC && is_wps_pbc_overlap(sm, scan_uuid) == true) {
449+
wpa_printf(MSG_INFO, "pbc_overlap flag is true");
450+
sm->wps_pbc_overlap = true;
451+
wpabuf_free(buf);
452+
return false;
453+
}
445454
if (scan_uuid) {
446-
if (wps_get_type() == WPS_TYPE_PBC && is_wps_pbc_overlap(sm, scan_uuid) == true) {
447-
wpa_printf(MSG_INFO, "pbc_overlap flag is true");
448-
sm->wps_pbc_overlap = true;
449-
}
450-
os_memcpy(sm->uuid, scan_uuid, WPS_UUID_LEN);
455+
os_memcpy(sm->uuid_r, scan_uuid, WPS_UUID_LEN);
451456
}
452457

453458
if (ap_supports_sae(scan)) {
@@ -1452,7 +1457,7 @@ static int wifi_station_wps_init(const esp_wps_config_t *config)
14521457
}
14531458

14541459
sm = gWpsSm;
1455-
1460+
esp_wifi_disconnect();
14561461
esp_wifi_get_macaddr_internal(WIFI_IF_STA, sm->ownaddr);
14571462
os_memcpy(gWpaSm.own_addr, sm->ownaddr, ETH_ALEN);
14581463

@@ -1738,6 +1743,8 @@ int wifi_station_wps_start(void)
17381743
default:
17391744
break;
17401745
}
1746+
os_memset(sm->uuid_r, 0, sizeof(sm->uuid_r));
1747+
sm->wps_pbc_overlap = false;
17411748
sm->discard_ap_cnt = 0;
17421749
os_memset(&sm->dis_ap_list, 0, WPS_MAX_DIS_AP_NUM * sizeof(struct discard_ap_list_t));
17431750
esp_wifi_set_wps_start_flag_internal(true);

components/wpa_supplicant/esp_supplicant/src/esp_wps_i.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ struct wps_sm {
7171
struct wps_credential creds[MAX_CRED_COUNT];
7272
u8 ap_cred_cnt;
7373
struct wps_device_data *dev;
74-
u8 uuid[16];
74+
u8 uuid[WPS_UUID_LEN];
75+
u8 uuid_r[WPS_UUID_LEN];
7576
u8 current_identifier;
7677
bool is_wps_scan;
7778
u8 channel;

0 commit comments

Comments
 (0)