mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-01 18:50:34 +03:00
bugfix(nan): Fix hard/soft reset cases in NAN Pairing verification
- Update pairing complete API to record for peer - Terminate NAN Datapaths using publish_id after receiving PASN M1
This commit is contained in:
@@ -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 */
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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 "
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user