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 4c54176d516..76879988a70 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 @@ -462,7 +462,7 @@ static bool nan_services_limit_reached(void) #define NAN_SVC_ID_PENDING 0xFF static struct own_svc_info *nan_claim_own_svc_slot(uint8_t type, const char svc_name[], - const wifi_nan_discovery_security_params_t *security_cfg) + const wifi_nan_discovery_security_params_t *security_cfg, wifi_nan_pairing_cfg_t *pairing) { struct own_svc_info *p_svc = NULL; for (int i = 0; i < ESP_WIFI_NAN_MAX_SVC_SUPPORTED; i++) { @@ -485,6 +485,11 @@ static struct own_svc_info *nan_claim_own_svc_slot(uint8_t type, const char svc_ if (security_cfg) { memcpy(&p_svc->user_cfg, security_cfg, sizeof(*security_cfg)); } +#ifdef CONFIG_ESP_WIFI_NAN_PAIRING + if (pairing) { + memcpy(&p_svc->pairing, pairing, sizeof(*pairing)); + } +#endif #else (void)security_cfg; #endif @@ -1755,9 +1760,14 @@ uint8_t esp_wifi_nan_publish_service(const wifi_nan_publish_cfg_t *publish_cfg) * tripping the task watchdog when num_credentials > 1. */ if (!nan_claim_own_svc_slot(ESP_NAN_PUBLISH, publish_cfg->service_name, #ifdef CONFIG_ESP_WIFI_NAN_SECURITY - cfg->security_cfg + cfg->security_cfg, +#ifdef CONFIG_ESP_WIFI_NAN_PAIRING + cfg->pairing #else NULL +#endif +#else + NULL, NULL #endif )) { ESP_LOGE(TAG, "No free service slot"); @@ -1896,7 +1906,7 @@ uint8_t esp_wifi_nan_subscribe_service(const wifi_nan_subscribe_cfg_t *subscribe /* Pre-claim host slot BEFORE the blob's subscribe call; see comment on * the publish path for the watchdog rationale. */ if (!nan_claim_own_svc_slot(ESP_NAN_SUBSCRIBE, subscribe_cfg->service_name, - subscribe_cfg->security_cfg)) { + subscribe_cfg->security_cfg, subscribe_cfg->pairing)) { ESP_LOGE(TAG, "No free service slot"); goto fail; } diff --git a/components/esp_wifi/wifi_apps/nan_app/src/nan_i.h b/components/esp_wifi/wifi_apps/nan_app/src/nan_i.h index 25a0df128fd..a46d5860ec3 100644 --- a/components/esp_wifi/wifi_apps/nan_app/src/nan_i.h +++ b/components/esp_wifi/wifi_apps/nan_app/src/nan_i.h @@ -222,6 +222,9 @@ struct own_svc_info { * per-service array the blob caches in svc_entry->self_security_params[]. * Valid entries: [0, user_cfg.num_credentials). */ wifi_nan_security_params_t derived_security[ESP_WIFI_NAN_MAX_CREDS_PER_SVC]; +#ifdef CONFIG_ESP_WIFI_NAN_PAIRING + wifi_nan_pairing_cfg_t pairing; +#endif #endif uint8_t num_peer_records; SLIST_HEAD(peer_list_t, peer_svc_info) peer_list; 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 758c876c283..93de2adf3f4 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 @@ -788,6 +788,24 @@ static void nan_pairing_key_installed_cb(const uint8_t *peer_nmi, (void)nik_lifetime_sec; #endif + struct peer_svc_info *peer = nan_find_peer_svc(0, 0, (uint8_t *)peer_nmi); + struct own_svc_info *own = NULL; + + if (peer) { + own = nan_find_own_svc(peer->own_svc_id); + } + + if (own) { + if (!own->pairing.npk_nik_caching) { + wifi_event_nan_pairing_complete_t evt = {0}; + evt.status = WIFI_NAN_PAIRING_STATUS_ACCEPTED; + evt.reason_code = 0; + MACADDR_COPY(evt.peer_nmi, peer_nmi); + nan_app_post_event(WIFI_EVENT_NAN_PAIRING_CONFIRM, &evt, sizeof(evt)); + return; + } + } + if (role == NAN_ROLE_PAIRING_INITIATOR) { struct nan_pairing_fup_ctx *ctx = os_zalloc(sizeof(*ctx)); if (!ctx) { @@ -797,7 +815,7 @@ static void nan_pairing_key_installed_cb(const uint8_t *peer_nmi, } NAN_DATA_LOCK(); - struct peer_svc_info *peer = nan_find_peer_svc(0, 0, (uint8_t *)peer_nmi); + if (peer) { ctx->svc_id = peer->own_svc_id; ctx->peer_svc_id = peer->svc_id; @@ -816,7 +834,7 @@ static void nan_pairing_key_installed_cb(const uint8_t *peer_nmi, MACADDR_COPY(ctx->peer_mac, peer_nmi); ctx->shared_key_attr_len = 0; - struct own_svc_info *own = nan_find_own_svc(ctx->svc_id); + own = nan_find_own_svc(ctx->svc_id); if (own) { nan_pairing_arm_pending(own, peer_nmi); } @@ -832,10 +850,8 @@ static void nan_pairing_key_installed_cb(const uint8_t *peer_nmi, } if (role == NAN_ROLE_PAIRING_RESPONDER) { - struct own_svc_info *own = NULL; - NAN_DATA_LOCK(); - struct peer_svc_info *peer = nan_find_peer_svc(0, 0, (uint8_t *)peer_nmi); + if (peer) { own = nan_find_own_svc(peer->own_svc_id); } @@ -858,7 +874,7 @@ static void nan_app_update_peer_creds(const uint8_t *peer_nik, const uint8_t *np /* Reuse the slot already holding this NIK, if any. */ for (uint8_t i = 0; i < s_nan_ctx.num_peer_creds; i++) { if (s_nan_ctx.peer_creds[i].is_valid && - os_memcmp(s_nan_ctx.peer_creds[i].peer_nik, peer_nik, ESP_WIFI_NAN_NIK_LEN) == 0) { + os_memcmp(s_nan_ctx.peer_creds[i].peer_nik, peer_nik, ESP_WIFI_NAN_NIK_LEN) == 0) { slot = &s_nan_ctx.peer_creds[i]; break; }