diff --git a/components/esp_wifi/wifi_apps/include/apps_private/wifi_apps_private.h b/components/esp_wifi/wifi_apps/include/apps_private/wifi_apps_private.h index 7c67345757d..95bf9465500 100644 --- a/components/esp_wifi/wifi_apps/include/apps_private/wifi_apps_private.h +++ b/components/esp_wifi/wifi_apps/include/apps_private/wifi_apps_private.h @@ -236,11 +236,11 @@ void esp_nan_app_clear_peer_tks(const uint8_t *peer_nmi, uint8_t service_id); /** * @brief Terminate all active NDPs with a peer (PASN verify prep). * - * @param peer_nmi Peer NMI (6 octets). + * @param publish_id Own publish id * * @return ESP_OK if all ends succeeded or none were active. */ -esp_err_t esp_nan_app_end_peer_datapaths(const uint8_t *peer_nmi); +esp_err_t esp_nan_app_end_peer_datapaths(uint8_t publish_id); #endif /* CONFIG_ESP_WIFI_NAN_PAIRING */ diff --git a/components/esp_wifi/wifi_apps/nan_app/src/nan_app.c b/components/esp_wifi/wifi_apps/nan_app/src/nan_app.c index 885ea6dcc58..f3c82d637f0 100644 --- a/components/esp_wifi/wifi_apps/nan_app/src/nan_app.c +++ b/components/esp_wifi/wifi_apps/nan_app/src/nan_app.c @@ -2598,41 +2598,26 @@ esp_err_t esp_wifi_nan_datapath_end(wifi_nan_datapath_end_req_t *req) } #ifdef CONFIG_ESP_WIFI_NAN_PAIRING -esp_err_t esp_nan_app_end_peer_datapaths(const uint8_t *peer_nmi) +esp_err_t esp_nan_app_end_peer_datapaths(uint8_t publish_id) { - wifi_nan_datapath_end_req_t ndp_end[ESP_WIFI_NAN_DATAPATH_MAX_PEERS]; - int count = 0; - esp_err_t last_err = ESP_OK; - - if (!peer_nmi) { - return ESP_ERR_INVALID_ARG; - } + wifi_nan_datapath_end_req_t ndp_end; + int i; NAN_DATA_LOCK(); - for (int i = 0; i < ESP_WIFI_NAN_DATAPATH_MAX_PEERS; i++) { + for (i = 0; i < ESP_WIFI_NAN_DATAPATH_MAX_PEERS; i++) { struct ndl_info *ndl = &s_nan_ctx.ndl[i]; - if (ndl->ndp_id != 0 && MACADDR_EQUAL(ndl->peer_nmi, peer_nmi)) { - ndp_end[count].ndp_id = ndl->ndp_id; - MACADDR_COPY(ndp_end[count].peer_mac, peer_nmi); - count++; + if (ndl->publisher_id == publish_id) { + ndp_end.ndp_id = ndl->ndp_id; + MACADDR_COPY(ndp_end.peer_mac, ndl->peer_nmi); + break; } } NAN_DATA_UNLOCK(); + if (i == ESP_WIFI_NAN_DATAPATH_MAX_PEERS) + return ESP_FAIL; - if (count == 0) { - return ESP_OK; - } - - for (int i = 0; i < count; i++) { - esp_err_t ret = esp_wifi_nan_datapath_end(&ndp_end[i]); - - if (ret != ESP_OK) { - last_err = ret; - } - } - - return last_err; + return esp_wifi_nan_datapath_end(&ndp_end); } #endif /* CONFIG_ESP_WIFI_NAN_PAIRING */ diff --git a/components/esp_wifi/wifi_apps/nan_app/src/nan_pairing.c b/components/esp_wifi/wifi_apps/nan_app/src/nan_pairing.c index 2937bec29b7..de1c7e36a75 100644 --- a/components/esp_wifi/wifi_apps/nan_app/src/nan_pairing.c +++ b/components/esp_wifi/wifi_apps/nan_app/src/nan_pairing.c @@ -510,7 +510,7 @@ int esp_nan_construct_nira(uint8_t *frm) #define NAN_PASN_KDE_OUI_TYPE_LIFETIME 37 #define NAN_PASN_KEY_LIFETIME_NIK_BIT BIT(3) #define NAN_ATTR_ID_SHARED_KEY_DESC 0x24 -#define NAN_PAIRING_NIK_FUP_TIMEOUT_SEC 2 +#define NAN_PAIRING_NIK_FUP_TIMEOUT_SEC 5 struct nan_pairing_fup_ctx { uint8_t svc_id; @@ -564,11 +564,9 @@ static void nan_pairing_nik_fup_timeout_cb(void *eloop_data, void *user_ctx) evt.reason_code = WIFI_NAN_PAIRING_REASON_NIK_FUP_TIMEOUT; MACADDR_COPY(evt.peer_nmi, own->nik_fup_pending_peer_nmi); nan_app_remove_paired_peer(own->nik_fup_pending_peer_nmi); - struct peer_svc_info *peer = nan_find_peer_svc(own->svc_id, 0, - own->nik_fup_pending_peer_nmi); - esp_nan_complete_pairing(own->svc_id, peer ? peer->svc_id : 0); + esp_nan_set_pairing_status(own->svc_id, 0, own->nik_fup_pending_peer_nmi, false); nan_app_post_event(WIFI_EVENT_NAN_PAIRING_CONFIRM, &evt, sizeof(evt)); - ESP_LOGW(TAG, "Pairing succeeded but NIK caching timed out for peer " MACSTR + ESP_LOGW(TAG, "Failed to complete NIK exchange with peer " MACSTR " (reason=%u)", MAC2STR(own->nik_fup_pending_peer_nmi), evt.reason_code); } @@ -964,7 +962,7 @@ static void nan_pairing_key_installed_cb(const uint8_t *peer_nmi, if (nan_pairing_take_verify_session(peer_nmi) && (role == NAN_ROLE_PAIRING_RESPONDER || role == NAN_ROLE_PAIRING_INITIATOR)) { /* Re-verification: no follow-up ping-pong; notify app directly. */ - esp_nan_complete_pairing(own_svc_id, peer_remote_svc_id); + esp_nan_set_pairing_status(own_svc_id, peer_remote_svc_id, (uint8_t *)peer_nmi, true); nan_pairing_post_confirm(peer_nmi); return; } @@ -975,7 +973,7 @@ static void nan_pairing_key_installed_cb(const uint8_t *peer_nmi, evt.status = WIFI_NAN_PAIRING_STATUS_ACCEPTED; evt.reason_code = 0; MACADDR_COPY(evt.peer_nmi, peer_nmi); - esp_nan_complete_pairing(own_svc_id, peer_remote_svc_id); + esp_nan_set_pairing_status(own_svc_id, peer_remote_svc_id, (uint8_t *)peer_nmi, true); nan_app_post_event(WIFI_EVENT_NAN_PAIRING_CONFIRM, &evt, sizeof(evt)); return; } @@ -1197,7 +1195,7 @@ void nan_app_receive_pairing_followup(uint8_t svc_id, uint8_t peer_svc_id, if (own) { nan_pairing_cancel_svc_pending(own); - esp_nan_complete_pairing(own->svc_id, peer_svc_id); + esp_nan_set_pairing_status(own->svc_id, peer_svc_id, (uint8_t *)peer_mac, true); } evt.status = WIFI_NAN_PAIRING_STATUS_ACCEPTED; evt.reason_code = 0; diff --git a/components/wpa_supplicant/esp_supplicant/include/esp_private/esp_supp_nan.h b/components/wpa_supplicant/esp_supplicant/include/esp_private/esp_supp_nan.h index 0d8a6c07e51..7e43192dc89 100644 --- a/components/wpa_supplicant/esp_supplicant/include/esp_private/esp_supp_nan.h +++ b/components/wpa_supplicant/esp_supplicant/include/esp_private/esp_supp_nan.h @@ -162,12 +162,6 @@ void handle_auth_pasn(uint8_t *buf, size_t len, uint16_t trans_seq, uint16_t sta const struct nan_pasn_key_material *nan_pasn_get_saved_keys(void); void nan_pasn_clear_saved_keys(void); -/** - * Clear stale pairwise keys, saved PASN material, and active NDPs before - * responder-side PASN verification (proactive pairing_start or passive Auth1). - */ -void nan_pasn_responder_verify_prepare(const uint8_t *peer_nmi); - /** Look up cached NPK for pairing verification (ยง7.6.5). Returns 0 on success. * Lookup matches peer_cred.service_hash against active own-service hashes, * or uses a single cached slot when only one NPK is present. */ diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_nan_supplicant.c b/components/wpa_supplicant/esp_supplicant/src/esp_nan_supplicant.c index 69bf45263f5..d7b797e975f 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_nan_supplicant.c +++ b/components/wpa_supplicant/esp_supplicant/src/esp_nan_supplicant.c @@ -499,9 +499,9 @@ static void nan_pasn_clear_peer_tks_for_verify_start(const u8 *peer_nmi) nan_pasn_clear_saved_keys(); } -void nan_pasn_responder_verify_prepare(const u8 *peer_nmi) +static void nan_pasn_responder_verify_prepare(const u8 *peer_nmi, uint8_t publish_id) { - esp_nan_app_end_peer_datapaths(peer_nmi); + esp_nan_app_end_peer_datapaths(publish_id); nan_pasn_clear_peer_tks_for_verify_start(peer_nmi); } @@ -1655,7 +1655,7 @@ void handle_auth_pasn(uint8_t *buf, size_t len, uint16_t trans_seq, uint16_t sta &verify_own_inst_id)) { goto auth1_verify_done; } - nan_pasn_responder_verify_prepare(mgmt->sa); + nan_pasn_responder_verify_prepare(mgmt->sa, verify_own_inst_id); if (!pasn) { wpa_printf(MSG_INFO, "NAN PASN verify: no PASN context for " diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h b/components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h index a0fcca370bd..1ee7ff95827 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h +++ b/components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h @@ -341,7 +341,7 @@ void esp_wifi_ap_set_group_mgmt_cipher_internal(wifi_cipher_type_t cipher); uint8_t esp_wifi_op_class_supported_internal(uint8_t op_class, uint8_t min_chan, uint8_t max_chan, uint8_t inc, uint8_t bw, channel_bitmap_t *non_pref_channels); bool esp_wifi_is_wpa3_compatible_mode_enabled(uint8_t if_index); uint8_t esp_wifi_ap_get_owe_config_internal(void); -esp_err_t esp_nan_complete_pairing(uint8_t svc_id, uint8_t peer_svc_id); +esp_err_t esp_nan_set_pairing_status(uint8_t svc_id, uint8_t peer_svc_id, uint8_t peer_nmi[6], bool pairing_complete); uint8_t *esp_wifi_nan_get_pairing_attrs(uint16_t bootstrap_methods, bool pairing_enabled, bool nik_cache_enabled, uint32_t *npba_len, uint32_t *dcea_len, uint32_t *total_len);