From c99c80c1d0b88d57fd2256b1463a3a74c1b1013e Mon Sep 17 00:00:00 2001 From: akshat Date: Wed, 2 Apr 2025 15:03:42 +0530 Subject: [PATCH 1/3] fix(wpa_supplicant): Ensure pbc_overlap event is posted correctly Preserves the pbc_overlap flag to allow proper event posting. This ensures that pbc overlap detection functions as expected. --- .../wpa_supplicant/esp_supplicant/src/esp_wps.c | 15 ++++++++++----- .../wpa_supplicant/esp_supplicant/src/esp_wps_i.h | 3 ++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_wps.c b/components/wpa_supplicant/esp_supplicant/src/esp_wps.c index e6fb8ced74..c6c75aa59b 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_wps.c +++ b/components/wpa_supplicant/esp_supplicant/src/esp_wps.c @@ -352,12 +352,12 @@ is_wps_pbc_overlap(struct wps_sm *sm, const u8 *sel_uuid) return false; } - if (os_memcmp(sel_uuid, sm->uuid, WPS_UUID_LEN) != 0) { + if (os_memcmp(sel_uuid, sm->uuid_r, WPS_UUID_LEN) != 0) { wpa_printf(MSG_DEBUG, "uuid is not same"); wpa_hexdump(MSG_DEBUG, "WPS: UUID of scanned BSS is", sel_uuid, WPS_UUID_LEN); wpa_hexdump(MSG_DEBUG, "WPS: UUID of sm BSS is", - sm->uuid, WPS_UUID_LEN); + sm->uuid_r, WPS_UUID_LEN); return true; } @@ -369,7 +369,10 @@ wps_parse_scan_result(struct wps_scan_ie *scan) { struct wps_sm *sm = gWpsSm; wifi_mode_t op_mode = 0; - sm->wps_pbc_overlap = false; + + if(sm->wps_pbc_overlap) { + return false; + } if (!sm->is_wps_scan || !scan->bssid) { return false; @@ -443,11 +446,11 @@ wps_parse_scan_result(struct wps_scan_ie *scan) scan_uuid = wps_get_uuid_e(buf); if (scan_uuid) { - if (wps_get_type() == WPS_TYPE_PBC && is_wps_pbc_overlap(sm, scan_uuid) == true) { + if (sm->discover_ssid_cnt > 1 && wps_get_type() == WPS_TYPE_PBC && is_wps_pbc_overlap(sm, scan_uuid) == true) { wpa_printf(MSG_INFO, "pbc_overlap flag is true"); sm->wps_pbc_overlap = true; } - os_memcpy(sm->uuid, scan_uuid, WPS_UUID_LEN); + os_memcpy(sm->uuid_r, scan_uuid, WPS_UUID_LEN); } if (ap_supports_sae(scan)) { @@ -1738,6 +1741,8 @@ int wifi_station_wps_start(void) default: break; } + os_memset(sm->uuid_r, 0, sizeof(sm->uuid_r)); + sm->wps_pbc_overlap = false; 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); diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_wps_i.h b/components/wpa_supplicant/esp_supplicant/src/esp_wps_i.h index 887e9968f8..1058da26b7 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_wps_i.h +++ b/components/wpa_supplicant/esp_supplicant/src/esp_wps_i.h @@ -71,7 +71,8 @@ struct wps_sm { struct wps_credential creds[MAX_CRED_COUNT]; u8 ap_cred_cnt; struct wps_device_data *dev; - u8 uuid[16]; + u8 uuid[WPS_UUID_LEN]; + u8 uuid_r[WPS_UUID_LEN]; u8 current_identifier; bool is_wps_scan; u8 channel; From 91da4ea7926f09446d435337c927e6631b167ff1 Mon Sep 17 00:00:00 2001 From: akshat Date: Wed, 2 Apr 2025 15:10:00 +0530 Subject: [PATCH 2/3] fix(wpa_supplicant): Detect PBC overlap even when UUID is null --- .../wpa_supplicant/esp_supplicant/src/esp_wps.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_wps.c b/components/wpa_supplicant/esp_supplicant/src/esp_wps.c index c6c75aa59b..9d7aa04538 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_wps.c +++ b/components/wpa_supplicant/esp_supplicant/src/esp_wps.c @@ -349,7 +349,7 @@ is_wps_pbc_overlap(struct wps_sm *sm, const u8 *sel_uuid) { if (!sel_uuid) { wpa_printf(MSG_DEBUG, "WPS: null uuid field"); - return false; + return true; } if (os_memcmp(sel_uuid, sm->uuid_r, WPS_UUID_LEN) != 0) { @@ -370,7 +370,7 @@ wps_parse_scan_result(struct wps_scan_ie *scan) struct wps_sm *sm = gWpsSm; wifi_mode_t op_mode = 0; - if(sm->wps_pbc_overlap) { + if (sm->wps_pbc_overlap) { return false; } @@ -445,11 +445,13 @@ wps_parse_scan_result(struct wps_scan_ie *scan) os_memcpy(sm->bssid, scan->bssid, ETH_ALEN); scan_uuid = wps_get_uuid_e(buf); + if (sm->discover_ssid_cnt > 1 && wps_get_type() == WPS_TYPE_PBC && is_wps_pbc_overlap(sm, scan_uuid) == true) { + wpa_printf(MSG_INFO, "pbc_overlap flag is true"); + sm->wps_pbc_overlap = true; + wpabuf_free(buf); + return false; + } if (scan_uuid) { - if (sm->discover_ssid_cnt > 1 && wps_get_type() == WPS_TYPE_PBC && is_wps_pbc_overlap(sm, scan_uuid) == true) { - wpa_printf(MSG_INFO, "pbc_overlap flag is true"); - sm->wps_pbc_overlap = true; - } os_memcpy(sm->uuid_r, scan_uuid, WPS_UUID_LEN); } From 3ee449bc5d8f36edadb97419a5b1b316a9832f6b Mon Sep 17 00:00:00 2001 From: akshat Date: Wed, 16 Apr 2025 10:20:09 +0530 Subject: [PATCH 3/3] fix(wpa_supplicant): Disconnect from previous AP while initiating WPS --- components/wpa_supplicant/esp_supplicant/src/esp_wps.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_wps.c b/components/wpa_supplicant/esp_supplicant/src/esp_wps.c index 9d7aa04538..791e92c7ee 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_wps.c +++ b/components/wpa_supplicant/esp_supplicant/src/esp_wps.c @@ -1457,7 +1457,7 @@ static int wifi_station_wps_init(const esp_wps_config_t *config) } sm = gWpsSm; - + esp_wifi_disconnect(); esp_wifi_get_macaddr_internal(WIFI_IF_STA, sm->ownaddr); os_memcpy(gWpaSm.own_addr, sm->ownaddr, ETH_ALEN);