From patchwork Wed May 13 06:58:59 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrei Otcheretianski X-Patchwork-Id: 2237511 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=sFkVyCtF; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=PZm3RIGS; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=patchwork.ozlabs.org) Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4gFks73Ym3z1yLV for ; Wed, 13 May 2026 17:01:31 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-ID:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=XZ913Y5BnYbeVTAAhz00Xhd/lnnDOAGXHmdlXUJp+Vo=; b=sFkVyCtF/NSh+y 7D4TAV/l7QUWqrSrMBE6IcGXaqHpWx9Pv7INXTIgJZerhd3O27OOAM8J0ewKaUUrLnLr/xf9YoH1S uZTxiELopQtZX5pYG8kBDYkU/o6LyMFW7Yyr0F0meeZLSf+wd6i/b5vjir9E9YJnNaZdUGcAOQXuv 0j9R7yegDuZ5uVB3pAupfu1CuqoisPn/+nHbMyH9Jsv0omGRPs3Pwkn+7Q+XvdwlgZx9N5ByIKODd VyhlznrrT75NJiu1S/gWeP7yqLJmw1aCC7kF/96fZXSfu+Tm+Tbto90eIWI1HBoWfXHzp9F2FEAfv Seg5nl9QsemIAWUIIdRA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wN3Z6-00000001UXv-0hx3; Wed, 13 May 2026 06:59:32 +0000 Received: from mgamail.intel.com ([198.175.65.10]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wN3Z0-00000001UWf-2RtK for hostap@lists.infradead.org; Wed, 13 May 2026 06:59:28 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1778655567; x=1810191567; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=RPHFXzi3JUMMS9uPYk2KgDnIh+ypAP6jIYmgjaNTjWw=; b=PZm3RIGSPIKBlmbWFsc8qvvGCyGsX/K0aVVri5K5j2sMkjr5wNGCNegk vyRavrF5z2vQc1G/DOfDTSkk8H8hMOlvspE9nIq55UeVNY8tC1dyALD05 5ii6Mu6C7LNuiGPnh/NJrdUUku5o87DCT2JmQNI+xzsE80AUlHtLro+Nz CajVG4AuWt8B3CRLqqbgbzQxl+DbiCo09h+llZB0/JU59nnF+bzrJaebS kT/+iPQlzRAtfqvEBJY2hbwkoJSG798/vQ1h49/Aiv0jK85+grKzEJkIb 6QRCteoPk8u8XQmae16Gl/CiJwFc8z0m9cMLy+KrHjpgSOvKmRIJRg6OC A==; X-CSE-ConnectionGUID: v3VHPCpaQ3OwlxX/6d5G1g== X-CSE-MsgGUID: //NpfYJlS9Wvc0o5fgnfog== X-IronPort-AV: E=McAfee;i="6800,10657,11784"; a="97001255" X-IronPort-AV: E=Sophos;i="6.23,232,1770624000"; d="scan'208";a="97001255" Received: from fmviesa010.fm.intel.com ([10.60.135.150]) by orvoesa102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 May 2026 23:59:26 -0700 X-CSE-ConnectionGUID: /u6PGbMTRWWhIgySJXsyjw== X-CSE-MsgGUID: nMG9sRQxQ4iMmVDT00Wmhw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,232,1770624000"; d="scan'208";a="233721868" Received: from iapp347.iil.intel.com (HELO 87c02287900a.iil.intel.com) ([10.167.28.6]) by fmviesa010-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 May 2026 23:59:23 -0700 From: Andrei Otcheretianski To: hostap@lists.infradead.org Cc: maheshkkv@google.com, vamsin@qti.qualcomm.com, Ilan Peer Subject: [PATCH 1/3] NAN: Add support for tracking the status of transmit requests Date: Wed, 13 May 2026 09:58:59 +0300 Message-ID: <20260513065909.12048-1-andrei.otcheretianski@intel.com> X-Mailer: git-send-email 2.53.0 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260512_235926_697696_23B2CB20 X-CRM114-Status: GOOD ( 22.65 ) X-Spam-Score: -4.8 (----) X-Spam-Report: Spam detection software, running on the system "bombadil.infradead.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: From: Ilan Peer Extend the NAN Discovery Engine (DE) to track the status of transmit requests coming from higher layers: - For transmit requests with valid cookie number, add the cookie and a digest of the transmitted frame to a list. - Once a Tx status for a transmitted frame is received, search for the corresponding e [...] Content analysis details: (-4.8 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -2.3 RCVD_IN_DNSWL_MED RBL: Sender listed at https://www.dnswl.org/, medium trust [198.175.65.10 listed in list.dnswl.org] 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.0 SPF_PASS SPF: sender matches SPF record 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -0.4 DKIMWL_WL_HIGH DKIMwl.org - High trust sender -0.0 DMARC_PASS DMARC pass policy X-BeenThere: hostap@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Hostap" Errors-To: hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Ilan Peer Extend the NAN Discovery Engine (DE) to track the status of transmit requests coming from higher layers: - For transmit requests with valid cookie number, add the cookie and a digest of the transmitted frame to a list. - Once a Tx status for a transmitted frame is received, search for the corresponding entry in the list of tracked frames, and when found report to the higher layer whether the frame was acknowledged or not. Signed-off-by: Ilan Peer --- src/ap/nan_usd_ap.c | 2 +- src/common/nan_de.c | 192 ++++++++++++++++++++++++++++++-- src/common/nan_de.h | 3 +- wpa_supplicant/nan_supplicant.c | 4 +- 4 files changed, 188 insertions(+), 13 deletions(-) diff --git a/src/ap/nan_usd_ap.c b/src/ap/nan_usd_ap.c index 8620644cb3..63696a8d19 100644 --- a/src/ap/nan_usd_ap.c +++ b/src/ap/nan_usd_ap.c @@ -277,5 +277,5 @@ int hostapd_nan_usd_transmit(struct hostapd_data *hapd, int handle, if (!hapd->nan_de) return -1; return nan_de_transmit(hapd->nan_de, handle, ssi, elems, peer_addr, - req_instance_id, NULL); + req_instance_id, NULL, NULL); } diff --git a/src/common/nan_de.c b/src/common/nan_de.c index c5b1022772..f1d23ac340 100644 --- a/src/common/nan_de.c +++ b/src/common/nan_de.c @@ -105,6 +105,19 @@ struct nan_de_service { #define NAN_DE_RSSI_CLOSE_PROXIMITY (-70) /* dBm */ +struct nan_de_tracked_tx { + struct dl_list list; + u8 dst[ETH_ALEN]; + u32 cookie; + u8 digest[SHA256_MAC_LEN]; + bool with_wait; +}; + +enum nan_de_flush_tracked_tx_reason { + NAN_DE_FLUSH_TRACKED_TX_FLUSH_ALL, + NAN_DE_FLUSH_TRACKED_TX_WAIT_EXPIRED, +}; + struct nan_de { u8 nmi[ETH_ALEN]; u8 cluster_id[ETH_ALEN]; @@ -132,6 +145,12 @@ struct nan_de { /* RSSI threshold for close proximity, or zero if not limited */ int rssi_threshold; + /* + * list of transmit requests for which the caller requested + * status indicating if the frame was acknowledged or not. + */ + struct dl_list tracked_tx; + #ifdef CONFIG_TESTING_OPTIONS /* * When set, multicast follow-up SDFs will be sent as Protected Dual of @@ -175,6 +194,7 @@ struct nan_de * nan_de_init(const u8 *nmi, bool offload, bool ap, de->cfg.n_max = NAN_DE_N_MAX; de->rssi_threshold = NAN_DE_RSSI_CLOSE_PROXIMITY; + dl_list_init(&de->tracked_tx); return de; } @@ -210,14 +230,144 @@ static void nan_de_service_deinit(struct nan_de *de, struct nan_de_service *srv, } +static void nan_de_flush_tracked_tx(struct nan_de *de, + enum nan_de_flush_tracked_tx_reason reason) +{ + struct nan_de_tracked_tx *tx, *tmp; + + dl_list_for_each_safe(tx, tmp, &de->tracked_tx, + struct nan_de_tracked_tx, + list) { + if (reason == NAN_DE_FLUSH_TRACKED_TX_WAIT_EXPIRED && + !tx->with_wait) + continue; + + de->cb.transmit_req_status(de->cb.ctx, tx->cookie, + false); + dl_list_del(&tx->list); + os_free(tx); + } +} + + static void nan_de_clear_pending(struct nan_de *de) { + nan_de_flush_tracked_tx(de, + NAN_DE_FLUSH_TRACKED_TX_FLUSH_ALL); + de->listen_freq = 0; de->tx_wait_status_freq = 0; de->tx_wait_end_freq = 0; } +static int nan_de_track_tx_digest(const u8 *data, size_t len, u8 *digest) +{ + return sha256_vector(1, &data, &len, digest); +} + + +static struct nan_de_tracked_tx * +nan_de_add_tracked_tx(struct nan_de *de, const u8 *dst, bool with_wait, + u32 cookie, const struct wpabuf *buf) +{ + struct nan_de_tracked_tx *tx; + u8 digest[SHA256_MAC_LEN]; + + if (!de->cb.transmit_req_status) { + wpa_printf(MSG_DEBUG, + "NAN: No tx_status callback, cannot track Tx"); + return NULL; + } + + if (!cookie) { + wpa_printf(MSG_DEBUG, "NAN: Invalid cookie for Tx tracking"); + return NULL; + } + + if (nan_de_track_tx_digest(wpabuf_head(buf), + wpabuf_len(buf), digest)) { + wpa_printf(MSG_DEBUG, "NAN: Failed to compute Tx digest"); + return NULL; + } + + dl_list_for_each(tx, &de->tracked_tx, struct nan_de_tracked_tx, list) { + if (!ether_addr_equal(tx->dst, dst)) + continue; + + if (tx->cookie == cookie) { + wpa_printf(MSG_DEBUG, + "NAN: Already tracking Tx cookie %u to " + MACSTR, cookie, MAC2STR(dst)); + return NULL; + } + + if (os_memcmp(tx->digest, digest, SHA256_MAC_LEN) == 0) { + wpa_printf(MSG_DEBUG, + "NAN: Already tracking identical payload to " + MACSTR " (cookie %u)", + MAC2STR(dst), tx->cookie); + return NULL; + } + } + + tx = os_zalloc(sizeof(*tx)); + if (!tx) + return NULL; + + os_memcpy(tx->dst, dst, ETH_ALEN); + tx->cookie = cookie; + tx->with_wait = with_wait; + os_memcpy(tx->digest, digest, SHA256_MAC_LEN); + + dl_list_add(&de->tracked_tx, &tx->list); + + wpa_printf(MSG_DEBUG, "NAN: Track Tx cookie %u", tx->cookie); + wpa_hexdump(MSG_DEBUG, "NAN: Track Tx digest", + tx->digest, SHA256_MAC_LEN); + + return tx; +} + + +static void nan_de_tx_status_match(struct nan_de *de, const u8 *data, + size_t len, u8 acked) +{ + struct nan_de_tracked_tx *tx; + const struct ieee80211_mgmt *mgmt = (void *)data; + const u8 *pos = (void *)&mgmt->u.action; + + if (len <= offsetof(struct ieee80211_mgmt, u.action)) + return; + + len = data + len - pos; + + { + u8 digest[SHA256_MAC_LEN]; + + if (nan_de_track_tx_digest(pos, len, digest)) + return; + + dl_list_for_each(tx, &de->tracked_tx, + struct nan_de_tracked_tx, list) { + if (!ether_addr_equal(tx->dst, mgmt->da) || + os_memcmp(tx->digest, digest, SHA256_MAC_LEN)) + continue; + + wpa_printf(MSG_DEBUG, + "NAN: Tx status for cookie=%u ack=%u", + tx->cookie, acked); + + de->cb.transmit_req_status(de->cb.ctx, tx->cookie, + acked); + dl_list_del(&tx->list); + os_free(tx); + return; + } + } +} + + void nan_de_flush(struct nan_de *de) { unsigned int i; @@ -294,16 +444,30 @@ static struct wpabuf * nan_de_alloc_sdf(struct nan_de *de, const u8 *dst, static int nan_de_tx(struct nan_de *de, unsigned int freq, unsigned int wait_time, const u8 *dst, const u8 *src, const u8 *bssid, - const struct wpabuf *buf) + const struct wpabuf *buf, + u32 *cookie) { + struct nan_de_tracked_tx *tracked_tx = NULL; int res; if (!de->cb.tx) return -1; + if (cookie) { + tracked_tx = nan_de_add_tracked_tx(de, dst, !!wait_time, + *cookie, buf); + if (!tracked_tx) + return -1; + } + res = de->cb.tx(de->cb.ctx, freq, wait_time, dst, src, bssid, buf); - if (res < 0) + if (res < 0) { + if (tracked_tx) { + dl_list_del(&tracked_tx->list); + os_free(tracked_tx); + } return res; + } de->tx_wait_status_freq = freq; de->tx_wait_end_freq = wait_time ? freq : 0; @@ -337,7 +501,8 @@ static void nan_de_tx_sdf(struct nan_de *de, struct nan_de_service *srv, enum nan_service_control_type type, const u8 *dst, const u8 *a3, u8 req_instance_id, const struct wpabuf *ssi, - const struct wpabuf *attrs) + const struct wpabuf *attrs, + u32 *cookie) { struct wpabuf *buf; size_t len = 0, sda_len, sdea_len; @@ -514,7 +679,7 @@ static void nan_de_tx_sdf(struct nan_de *de, struct nan_de_service *srv, } nan_de_tx(de, srv->sync ? 0 : srv->freq, srv->sync ? 0 : wait_time, - dst, forced_addr, a3, buf); + dst, forced_addr, a3, buf, cookie); wpabuf_free(buf); } @@ -619,7 +784,7 @@ static void nan_de_tx_multicast(struct nan_de *de, struct nan_de_service *srv, } nan_de_tx_sdf(de, srv, wait_time, type, network_id, bssid, - req_instance_id, srv->ssi, NULL); + req_instance_id, srv->ssi, NULL, NULL); os_get_reltime(&srv->last_multicast); } @@ -1058,6 +1223,8 @@ void nan_de_tx_status(struct nan_de *de, unsigned int freq, const u8 *dst, { if (freq == de->tx_wait_status_freq) de->tx_wait_status_freq = 0; + + nan_de_tx_status_match(de, data, data_len, ack); } @@ -1067,6 +1234,10 @@ void nan_de_tx_wait_ended(struct nan_de *de) wpa_printf(MSG_DEBUG, "NAN: TX wait for response ended (freq=%u)", de->tx_wait_end_freq); + + nan_de_flush_tracked_tx(de, + NAN_DE_FLUSH_TRACKED_TX_WAIT_EXPIRED); + de->tx_wait_end_freq = 0; nan_de_run_timer(de); } @@ -1525,7 +1696,7 @@ static bool nan_de_rx_publish(struct nan_de *de, struct nan_de_service *srv, * Service Specific Info field if it received a matching * unsolicited Publish message. */ nan_de_transmit(de, srv->id, NULL, NULL, peer_addr, - instance_id, NULL); + instance_id, NULL, NULL); } send_event: @@ -1630,7 +1801,8 @@ static bool nan_de_rx_subscribe(struct nan_de *de, struct nan_de_service *srv, nan_de_tx_sdf(de, srv, 100, NAN_SRV_CTRL_PUBLISH, srv->publish.solicited_multicast ? - network_id : peer_addr, a3, instance_id, srv->ssi, NULL); + network_id : peer_addr, a3, instance_id, srv->ssi, NULL, + NULL); if (!srv->is_p2p && !srv->sync) nan_de_pause_state(srv, peer_addr, instance_id); @@ -2457,7 +2629,8 @@ void nan_de_cancel_subscribe(struct nan_de *de, int subscribe_id) int nan_de_transmit(struct nan_de *de, int handle, const struct wpabuf *ssi, const struct wpabuf *elems, const u8 *peer_addr, u8 req_instance_id, - const struct wpabuf *nan_attrs) + const struct wpabuf *nan_attrs, + u32 *cookie) { struct nan_de_service *srv; const u8 *a3; @@ -2488,7 +2661,8 @@ int nan_de_transmit(struct nan_de *de, int handle, else a3 = network_id; nan_de_tx_sdf(de, srv, 100, NAN_SRV_CTRL_FOLLOW_UP, - peer_addr, a3, req_instance_id, ssi, nan_attrs); + peer_addr, a3, req_instance_id, ssi, nan_attrs, + cookie); srv->listen_stopped = false; return 0; diff --git a/src/common/nan_de.h b/src/common/nan_de.h index e3d872f38e..cbfd173d58 100644 --- a/src/common/nan_de.h +++ b/src/common/nan_de.h @@ -82,6 +82,7 @@ struct nan_callbacks { unsigned int freq); void (*add_extra_attrs)(void *ctx, struct wpabuf *buf); bool (*is_peer_paired)(void *ctx, const u8 *addr); + void (*transmit_req_status)(void *ctx, u32 cookie, bool ack); }; bool nan_de_is_nan_network_id(const u8 *addr); @@ -270,7 +271,7 @@ void nan_de_cancel_subscribe(struct nan_de *de, int subscribe_id); int nan_de_transmit(struct nan_de *de, int handle, const struct wpabuf *ssi, const struct wpabuf *elems, const u8 *peer_addr, u8 req_instance_id, - const struct wpabuf *nan_attrs); + const struct wpabuf *nan_attrs, u32 *cookie); void nan_de_dw_trigger(struct nan_de *de, int freq); void nan_de_set_cluster_id(struct nan_de *de, const u8 *cluster_id); diff --git a/wpa_supplicant/nan_supplicant.c b/wpa_supplicant/nan_supplicant.c index c08c095f9e..fe20919ad4 100644 --- a/wpa_supplicant/nan_supplicant.c +++ b/wpa_supplicant/nan_supplicant.c @@ -1021,7 +1021,7 @@ static int wpas_nan_transmit_followup_cb(void *ctx, const u8 *peer_nmi, return -1; return nan_de_transmit(wpa_s->nan_de, handle, NULL, NULL, - peer_nmi, req_instance_id, attrs); + peer_nmi, req_instance_id, attrs, NULL); } @@ -4729,7 +4729,7 @@ int wpas_nan_transmit(struct wpa_supplicant *wpa_s, int handle, if (!wpa_s->nan_de) return -1; return nan_de_transmit(wpa_s->nan_de, handle, ssi, elems, peer_addr, - req_instance_id, NULL); + req_instance_id, NULL, NULL); } From patchwork Wed May 13 06:59:04 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrei Otcheretianski X-Patchwork-Id: 2237507 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=T8xFwQC9; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=Tt4vs4f0; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=patchwork.ozlabs.org) Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4gFks53hpvz1yLT for ; Wed, 13 May 2026 17:01:29 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-ID:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=Q+BRbqT3P74nx7C+kUFfTDo2dR3SrsJ9HX0R+Bx818w=; b=T8xFwQC9QGvSIs muSubWziOQDENfocuDjAGcZgcKpBe/5UQhCaSY5YHrH3XXQVTsRJMaAYOwINqis5ir5VNHBIvKoB9 GBY41hvq4EHbPEswOSo5jVlCgYFz/AScU6dC/5azAAYu3+40Pq9Jp5LJNvBZSNFX4Kkqv7nxE9PRf m8D5KJRUBvREIFYIcBoOOAzRrhrOz1CnEEV34hVKqr9zhg5Ttz8MjYnCVrAQDA7EuIif4kTHP9uNn 1tlbyegaRXMPdvuDx2Wm0iyI5WtkeA1GBsHqKnBwnF1ki80UjQNU2Y4hZiqBS5eJscXqQfTGHOEVb I6kGYoYU9FkjRuAsLjMg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wN3Z9-00000001UbA-0a0L; Wed, 13 May 2026 06:59:35 +0000 Received: from mgamail.intel.com ([198.175.65.10]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wN3Z7-00000001UZY-0aZr for hostap@lists.infradead.org; Wed, 13 May 2026 06:59:34 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1778655574; x=1810191574; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=JzveeoUfk9o4QNRO9prZYoAiQPMukA/846shtIJIMxI=; b=Tt4vs4f0bJOcj6Ei+AGUs6Ikl6zOHmcqmHnSMG6N17pgPCK5Uz+65FD2 6P0IWBVwNB7ib1N7GD/Dgq3N7umg/2G0VgY5yPnjM/HpV5rPEFryZbqmK gDvzWxRiLrHwwLlOHr6N37rS72s7Pz2XykjL+PIhlYnaoEcup77mzSnxs KJhYVjbyBb6+m9ogqXgzsOHOwBG0yjB1lFHAWf7DVMfuq+W1EZ5Ud92GU dfWQdo4OJRbXEINZ99lMt4ECPZmPrbcGhiyKybH9S/nfUv0bpVNxUwvfX v//I2+87rApO8DLIDwdnPEMObR7OeoumZLoYVK8rxy6eaCR0gxGtqezMb A==; X-CSE-ConnectionGUID: yqdgOib2SoiGI/mVovIX5w== X-CSE-MsgGUID: /LflZKhKRGq0prRkXFxvXQ== X-IronPort-AV: E=McAfee;i="6800,10657,11784"; a="97001312" X-IronPort-AV: E=Sophos;i="6.23,232,1770624000"; d="scan'208";a="97001312" Received: from fmviesa010.fm.intel.com ([10.60.135.150]) by orvoesa102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 May 2026 23:59:33 -0700 X-CSE-ConnectionGUID: otncQmr1T+qhMw1Vju43Pg== X-CSE-MsgGUID: DbzB9mgtRZ2DwtYOlZJHnw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,232,1770624000"; d="scan'208";a="233721918" Received: from iapp347.iil.intel.com (HELO 87c02287900a.iil.intel.com) ([10.167.28.6]) by fmviesa010-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 May 2026 23:59:31 -0700 From: Andrei Otcheretianski To: hostap@lists.infradead.org Cc: maheshkkv@google.com, vamsin@qti.qualcomm.com, Ilan Peer Subject: [PATCH 2/3] wpa_supplicant: Support tracking NAN transmit requests Date: Wed, 13 May 2026 09:59:04 +0300 Message-ID: <20260513065909.12048-6-andrei.otcheretianski@intel.com> X-Mailer: git-send-email 2.53.0 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260512_235933_244709_F44EC6AC X-CRM114-Status: GOOD ( 16.00 ) X-Spam-Score: -4.8 (----) X-Spam-Report: Spam detection software, running on the system "bombadil.infradead.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: From: Ilan Peer Extended the NAN transmit API to also include a cookie, so that when the NAN DE finishes transmitting the frame it would notify the higher layers whether the frame was acknowledged or not. Content analysis details: (-4.8 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -2.3 RCVD_IN_DNSWL_MED RBL: Sender listed at https://www.dnswl.org/, medium trust [198.175.65.10 listed in list.dnswl.org] 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.0 SPF_PASS SPF: sender matches SPF record 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -0.4 DKIMWL_WL_HIGH DKIMwl.org - High trust sender -0.0 DMARC_PASS DMARC pass policy X-BeenThere: hostap@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Hostap" Errors-To: hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Ilan Peer Extended the NAN transmit API to also include a cookie, so that when the NAN DE finishes transmitting the frame it would notify the higher layers whether the frame was acknowledged or not. Signed-off-by: Ilan Peer --- src/common/wpa_ctrl.h | 1 + wpa_supplicant/ctrl_iface.c | 17 ++++++++++++++++- wpa_supplicant/dbus/dbus_new_handlers.c | 2 +- wpa_supplicant/nan_supplicant.c | 19 +++++++++++++++++-- wpa_supplicant/nan_supplicant.h | 3 ++- wpa_supplicant/notify.c | 8 ++++++++ wpa_supplicant/notify.h | 2 ++ 7 files changed, 47 insertions(+), 5 deletions(-) diff --git a/src/common/wpa_ctrl.h b/src/common/wpa_ctrl.h index b16790fe67..1472553d9c 100644 --- a/src/common/wpa_ctrl.h +++ b/src/common/wpa_ctrl.h @@ -246,6 +246,7 @@ extern "C" { #define NAN_PUBLISH_TERMINATED "NAN-PUBLISH-TERMINATED " #define NAN_SUBSCRIBE_TERMINATED "NAN-SUBSCRIBE-TERMINATED " #define NAN_RECEIVE "NAN-RECEIVE " +#define NAN_TRANSMIT_STATUS "NAN-TRANSMIT-STATUS " #define NAN_CLUSTER_JOIN "NAN-CLUSTER-JOIN " #define NAN_NDP_REQUEST "NAN-NDP-REQUEST " #define NAN_NDP_COUNTER_REQUEST "NAN-NDP-COUNTER-REQUEST " diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c index 14b4cd9d2e..fbdf72aa03 100644 --- a/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c @@ -13266,6 +13266,8 @@ static int wpas_ctrl_nan_transmit(struct wpa_supplicant *wpa_s, char *cmd) struct wpabuf *ssi = NULL; u8 peer_addr[ETH_ALEN]; int ret = -1; + u32 cookie = 0; + u32 *cookie_ptr = NULL; os_memset(peer_addr, 0, ETH_ALEN); @@ -13291,6 +13293,19 @@ static int wpas_ctrl_nan_transmit(struct wpa_supplicant *wpa_s, char *cmd) continue; } + if (os_strncmp(token, "cookie=", 7) == 0) { + cookie = strtoul(token + 7, NULL, 0); + if (!cookie) { + wpa_printf(MSG_INFO, + "CTRL: Invalid cookie value: %s", + token + 7); + goto fail; + } + + cookie_ptr = &cookie; + continue; + } + wpa_printf(MSG_INFO, "CTRL: Invalid NAN_TRANSMIT parameter: %s", token); @@ -13310,7 +13325,7 @@ static int wpas_ctrl_nan_transmit(struct wpa_supplicant *wpa_s, char *cmd) } ret = wpas_nan_transmit(wpa_s, handle, ssi, NULL, peer_addr, - req_instance_id); + req_instance_id, cookie_ptr); fail: wpabuf_free(ssi); return ret; diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c b/wpa_supplicant/dbus/dbus_new_handlers.c index cb4a8a6d38..a9f5679443 100644 --- a/wpa_supplicant/dbus/dbus_new_handlers.c +++ b/wpa_supplicant/dbus/dbus_new_handlers.c @@ -7035,7 +7035,7 @@ DBusMessage * wpas_dbus_handler_nan_transmit(DBusMessage *message, goto fail; if (wpas_nan_transmit(wpa_s, handle, ssi, NULL, peer_addr, - req_instance_id) < 0) + req_instance_id, NULL) < 0) reply = wpas_dbus_error_unknown_error( message, "failed to transmit follow-up"); out: diff --git a/wpa_supplicant/nan_supplicant.c b/wpa_supplicant/nan_supplicant.c index fe20919ad4..5d80489411 100644 --- a/wpa_supplicant/nan_supplicant.c +++ b/wpa_supplicant/nan_supplicant.c @@ -4337,6 +4337,14 @@ static void wpas_nan_de_receive(void *ctx, int id, int peer_instance_id, } +static void wpas_nan_de_transmit_req_status(void *ctx, u32 cookie, bool ack) +{ + struct wpa_supplicant *wpa_s = ctx; + + wpas_notify_nan_transmit_req_status(wpa_s, cookie, ack); +} + + #ifdef CONFIG_P2P static void wpas_nan_process_p2p_usd_elems(void *ctx, const u8 *buf, u16 buf_len, const u8 *peer_addr, @@ -4388,6 +4396,7 @@ int wpas_nan_de_init(struct wpa_supplicant *wpa_s) cb.offload_cancel_publish = wpas_nan_usd_offload_cancel_publish; cb.offload_cancel_subscribe = wpas_nan_usd_offload_cancel_subscribe; cb.receive = wpas_nan_de_receive; + cb.transmit_req_status = wpas_nan_de_transmit_req_status; #ifdef CONFIG_P2P cb.process_p2p_usd_elems = wpas_nan_process_p2p_usd_elems; #endif /* CONFIG_P2P */ @@ -4724,12 +4733,13 @@ int wpas_nan_usd_subscribe_stop_listen(struct wpa_supplicant *wpa_s, int wpas_nan_transmit(struct wpa_supplicant *wpa_s, int handle, const struct wpabuf *ssi, const struct wpabuf *elems, - const u8 *peer_addr, u8 req_instance_id) + const u8 *peer_addr, u8 req_instance_id, + u32 *cookie) { if (!wpa_s->nan_de) return -1; return nan_de_transmit(wpa_s->nan_de, handle, ssi, elems, peer_addr, - req_instance_id, NULL, NULL); + req_instance_id, NULL, cookie); } @@ -4864,6 +4874,11 @@ int wpas_nan_tx_status(struct wpa_supplicant *wpa_s, (const struct ieee80211_mgmt *) data; wpa_s = wpas_nan_get_mgmt_iface(wpa_s); + + if (wpa_s->nan_de) + nan_de_tx_status(wpa_s->nan_de, 0, mgmt->da, data, data_len, + acked); + if (!wpas_nan_ndp_allowed(wpa_s)) return -1; diff --git a/wpa_supplicant/nan_supplicant.h b/wpa_supplicant/nan_supplicant.h index 9d7347f365..b8676a86c1 100644 --- a/wpa_supplicant/nan_supplicant.h +++ b/wpa_supplicant/nan_supplicant.h @@ -150,7 +150,8 @@ void wpas_nan_cancel_subscribe(struct wpa_supplicant *wpa_s, int subscribe_id); int wpas_nan_transmit(struct wpa_supplicant *wpa_s, int handle, const struct wpabuf *ssi, const struct wpabuf *elems, - const u8 *peer_addr, u8 req_instance_id); + const u8 *peer_addr, u8 req_instance_id, + u32 *cookie); int wpas_nan_tx_status(struct wpa_supplicant *wpa_s, const u8 *data, size_t data_len, int acked); diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c index d0b317ee1f..171508d12f 100644 --- a/wpa_supplicant/notify.c +++ b/wpa_supplicant/notify.c @@ -1268,6 +1268,14 @@ void wpas_notify_nan_subscribe_terminated(struct wpa_supplicant *wpa_s, } +void wpas_notify_nan_transmit_req_status(struct wpa_supplicant *wpa_s, + u32 cookie, bool acked) +{ + wpa_msg_global(wpa_s, MSG_INFO, NAN_TRANSMIT_STATUS + "cookie=%u acked=%u", cookie, acked); +} + + void wpas_notify_nan_bootstrap_request(struct wpa_supplicant *wpa_s, const u8 *peer_nmi, u16 pbm, int handle, u8 requestor_instance_id) diff --git a/wpa_supplicant/notify.h b/wpa_supplicant/notify.h index f779a613a4..f8ce563cd7 100644 --- a/wpa_supplicant/notify.h +++ b/wpa_supplicant/notify.h @@ -201,6 +201,8 @@ void wpas_notify_nan_publish_terminated(struct wpa_supplicant *wpa_s, void wpas_notify_nan_subscribe_terminated(struct wpa_supplicant *wpa_s, int subscribe_id, enum nan_de_reason reason); +void wpas_notify_nan_transmit_req_status(struct wpa_supplicant *wpa_s, + u32 cookie, bool acked); void wpas_notify_nan_nik_received(struct wpa_supplicant *wpa_s, const u8 *nik, size_t nik_len, int cipher_ver, int akmp, From patchwork Wed May 13 06:59:06 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrei Otcheretianski X-Patchwork-Id: 2237508 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=GpLk/Idd; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=K5z38lN/; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=patchwork.ozlabs.org) Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4gFks53hXBz1yJ5 for ; Wed, 13 May 2026 17:01:29 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-ID:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=VIQT3CQE9098UWWh7pvoq8pL6fDEUKHzCMRgNMPBDrU=; b=GpLk/IddUZ8gNH d5Oq4FGj8ePI7y14sK0ihRXrF4u796rVOLY3RVMYEkjAtT3/BErNgI63xZvx4E3Dc6wop3OItnn6H 2r/m0g4ootvMfflwhxAyKfZyHFeFDOL1lxuOou2asvIujJpn1vCk6jL+ez6SWaTZucLTg7D71Co47 ymof5yn+eh+gOJ2DttUlUInZBOUEFPqgk5iWwBZWaRn15CwyikLKmbU2LaM0IUzY6sVu2JtKml1R4 VbeNjS3uzD0uR0qn12qwJLm0pmYfwxdQ28lReTPIzID/WPtGHthW7GVCDYIDlxv5QANK6Zah6tmmu iZX1BJ5h2xtwFRT14rtw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wN3ZC-00000001UdL-3BZd; Wed, 13 May 2026 06:59:38 +0000 Received: from mgamail.intel.com ([198.175.65.10]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wN3ZA-00000001UZY-0FMT for hostap@lists.infradead.org; Wed, 13 May 2026 06:59:37 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1778655577; x=1810191577; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=Mq8lRwmj3+8Bd6y8NjO1m6eEuE1GvKazarKI++libEo=; b=K5z38lN/N6l5T1Ap1RSOM582Ch9GsecmJrJ9QsHODNSLzSJ6rqyjEsGI kwty9GfxfW5qBurg8CaiozG8AHoAPF1M7Q08V9O5FKKqI0i1tq4gNFl8/ bU6CsY/xCzxUGsRTqwmCbVIEhOnNvxUFQTEA7v+VSzofuhIb6jWwB3OTF zxzfwyinjTe2ThflcrQEM1oLftuCLnnVbFUs/VfWgNuJL5lmUQTom9Kd4 SgLrnBBAzrDKL0e63bDhI8MW45Qsub4SX1B/x07QRg/tFVkHgz7Gpv+5+ +49sh2zU/1eRXmYWnbuIZSZfX0qF45dTokpCGjjrLqdIgkiiNT5Am8A7X A==; X-CSE-ConnectionGUID: bL9ePVpGSm+iaNH7emM+pA== X-CSE-MsgGUID: eVmpUegTT7yEEgyxzaaE4w== X-IronPort-AV: E=McAfee;i="6800,10657,11784"; a="97001322" X-IronPort-AV: E=Sophos;i="6.23,232,1770624000"; d="scan'208";a="97001322" Received: from fmviesa010.fm.intel.com ([10.60.135.150]) by orvoesa102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 May 2026 23:59:36 -0700 X-CSE-ConnectionGUID: wCFjqiizQpaiEqclwE9ojQ== X-CSE-MsgGUID: vCo1T8r6SHOTxaaCMDDplw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,232,1770624000"; d="scan'208";a="233721931" Received: from iapp347.iil.intel.com (HELO 87c02287900a.iil.intel.com) ([10.167.28.6]) by fmviesa010-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 May 2026 23:59:34 -0700 From: Andrei Otcheretianski To: hostap@lists.infradead.org Cc: maheshkkv@google.com, vamsin@qti.qualcomm.com, Ilan Peer Subject: [PATCH 3/3] tests: Add NAN test to cover followup status tracking Date: Wed, 13 May 2026 09:59:06 +0300 Message-ID: <20260513065909.12048-8-andrei.otcheretianski@intel.com> X-Mailer: git-send-email 2.53.0 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260512_235936_138120_04F4A05F X-CRM114-Status: GOOD ( 10.62 ) X-Spam-Score: -4.8 (----) X-Spam-Report: Spam detection software, running on the system "bombadil.infradead.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: From: Ilan Peer Add a test to verify that when a NAN transmit is requested with a cookie, the corresponding event is sent by the wpa_supplicant with valid acknowledgment status Signed-off-by: Ilan Peer --- tests/hwsim/test_nan.py | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) Content analysis details: (-4.8 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -2.3 RCVD_IN_DNSWL_MED RBL: Sender listed at https://www.dnswl.org/, medium trust [198.175.65.10 listed in list.dnswl.org] 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.0 SPF_PASS SPF: sender matches SPF record 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -0.4 DKIMWL_WL_HIGH DKIMwl.org - High trust sender -0.0 DMARC_PASS DMARC pass policy X-BeenThere: hostap@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Hostap" Errors-To: hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Ilan Peer Add a test to verify that when a NAN transmit is requested with a cookie, the corresponding event is sent by the wpa_supplicant with valid acknowledgment status Signed-off-by: Ilan Peer --- tests/hwsim/test_nan.py | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/tests/hwsim/test_nan.py b/tests/hwsim/test_nan.py index 1c16ba47c0..691da50032 100644 --- a/tests/hwsim/test_nan.py +++ b/tests/hwsim/test_nan.py @@ -279,11 +279,15 @@ class NanDevice: if "OK" not in self.wpas.request("NAN_UPDATE_CONFIG"): raise Exception(f"{self.ifname}: failed to update NAN configuration") - def transmit(self, handle, req_instance_id, address, ssi=None): + def transmit(self, handle, req_instance_id, address, ssi=None, cookie=None): logger.info(f"Transmitting followup on {self.ifname}") cmd = f"NAN_TRANSMIT handle={handle} req_instance_id={req_instance_id} address={address}" if ssi is not None: cmd += f" ssi={ssi}" + + if cookie is not None: + cmd += f" cookie={cookie}" + if "OK" not in self.wpas.request(cmd): raise Exception(f"{self.ifname}: failed to transmit NAN followup") @@ -449,6 +453,35 @@ def test_nan_sync_followup(dev, apdev, params): if ev is None or f"id={pid}" not in ev or f"peer_instance_id={sid}" not in ev or "ssi=11223344" not in ev: raise Exception("NAN-RECEIVE followup event not seen or invalid format") +def test_nan_sync_followup_tracking(dev, apdev, params): + """NAN synchronized active subscribe and solicited publish with followup tracking""" + with hwsim_nan_radios(count=2) as [wpas1, wpas2], \ + NanDevice(wpas1, "nan0") as pub, NanDevice(wpas2, "nan1") as sub: + pid, sid, paddr, _ = nan_sync_discovery(pub, sub, "test_service", + pssi="aabbccdd", sssi="ddbbccaa", + unsolicited=0, timeout=2) + + # Check followup to the publisher. Acknowledgment is expected. + cookie = 127 + sub.transmit(handle=sid, req_instance_id=pid, address=paddr, ssi="11223344", cookie=cookie) + ev = pub.wpas.wait_event(["NAN-RECEIVE"], timeout=2) + if ev is None or f"id={pid}" not in ev or f"peer_instance_id={sid}" not in ev or "ssi=11223344" not in ev: + raise Exception("NAN-RECEIVE followup event not seen or invalid format") + + ev = sub.wpas.wait_event(["NAN-TRANSMIT-STATUS"], timeout=2) + if ev is None or f"cookie={cookie}" not in ev or "acked=1" not in ev: + raise Exception("NAN-TX-STATUS event not seen or invalid data") + + # Check followup to an invalid address. Acknowledgment is not expected. + cookie = 243 + suffix = int(paddr[-2:], 16) ^ 0xFF + addr = paddr[:-2] + f"{suffix:02x}" + + sub.transmit(handle=sid, req_instance_id=pid, address=addr, cookie=cookie) + ev = sub.wpas.wait_event(["NAN-TRANSMIT-STATUS"], timeout=2) + if ev is None or f"cookie={cookie}" not in ev or "acked=0" not in ev: + raise Exception("NAN-TX-STATUS event not seen or invalid data") + def test_nan_sync_active_subscribe_two_publishers(dev, apdev, params): """NAN synchronized active subscribe and 2 publishers""" with hwsim_nan_radios(count=3) as [wpas1, wpas2, wpas3], \