mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-01 02:30:52 +03:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user