fix(nan): Disable/Enable Pairing setup bit based on NIK stored in NVS

- Only send pairing followup only if nik caching is enabled
This commit is contained in:
Akshat Agrawal
2026-06-30 14:56:00 +08:00
committed by Jack
parent ebf7dc9b31
commit f3c2ff4019
3 changed files with 38 additions and 9 deletions
@@ -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;
}
@@ -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;
@@ -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;
}