{"id":2229886,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2229886/?format=json","web_url":"http://patchwork.ozlabs.org/project/hostap/patch/20260428200639.40243-80-andrei.otcheretianski@intel.com/","project":{"id":22,"url":"http://patchwork.ozlabs.org/api/1.1/projects/22/?format=json","name":"HostAP Development","link_name":"hostap","list_id":"hostap.lists.infradead.org","list_email":"hostap@lists.infradead.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260428200639.40243-80-andrei.otcheretianski@intel.com>","date":"2026-04-28T20:06:20","name":"[79/97] NAN: Add support for tracking the status of transmit requests","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"33a9f2e5e2cdea692aab2db1a0c390db10a87d3a","submitter":{"id":62065,"url":"http://patchwork.ozlabs.org/api/1.1/people/62065/?format=json","name":"Andrei Otcheretianski","email":"andrei.otcheretianski@intel.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/hostap/patch/20260428200639.40243-80-andrei.otcheretianski@intel.com/mbox/","series":[{"id":501927,"url":"http://patchwork.ozlabs.org/api/1.1/series/501927/?format=json","web_url":"http://patchwork.ozlabs.org/project/hostap/list/?series=501927","date":"2026-04-28T20:05:05","name":"NAN: Group keys support, schedule update and more","version":1,"mbox":"http://patchwork.ozlabs.org/series/501927/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2229886/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2229886/checks/","tags":{},"headers":{"Return-Path":"\n <hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n secure) header.d=lists.infradead.org header.i=@lists.infradead.org\n header.a=rsa-sha256 header.s=bombadil.20210309 header.b=MoTICtWZ;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n secure) header.d=infradead.org header.i=@infradead.org header.a=rsa-sha256\n header.s=casper.20170209 header.b=rmr2+O49;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256\n header.s=Intel header.b=G9hIQjAJ;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=none (no SPF record) smtp.mailfrom=lists.infradead.org\n (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org;\n envelope-from=hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from bombadil.infradead.org (bombadil.infradead.org\n [IPv6:2607:7c80:54:3::133])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g4s9V1Prwz1xrS\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 29 Apr 2026 06:14:54 +1000 (AEST)","from localhost ([::1] helo=bombadil.infradead.org)\n\tby bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1wHop3-00000002LVp-27To;\n\tTue, 28 Apr 2026 20:14:21 +0000","from casper.infradead.org ([2001:8b0:10b:1236::1])\n\tby bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1wHokt-00000002FiJ-2qjL\n\tfor hostap@bombadil.infradead.org;\n\tTue, 28 Apr 2026 20:10:03 +0000","from mgamail.intel.com ([198.175.65.16])\n\tby casper.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1wHokp-00000004NYt-0UBm\n\tfor hostap@lists.infradead.org;\n\tTue, 28 Apr 2026 20:10:01 +0000","from fmviesa001.fm.intel.com ([10.60.135.141])\n  by orvoesa108.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 28 Apr 2026 13:09:17 -0700","from iapp347.iil.intel.com (HELO 87c02287900a.iil.intel.com)\n ([10.167.28.6])\n  by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 28 Apr 2026 13:09:16 -0700"],"DKIM-Signature":["v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;\n\td=lists.infradead.org; s=bombadil.20210309; h=Sender:\n\tContent-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post:\n\tList-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:\n\tMessage-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description:\n\tResent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:\n\tList-Owner; bh=z+PMEpmzvFtNYuKfCwLZsi/ZF7YUWK3HtIhpaGzpr/g=; b=MoTICtWZewpqjx\n\t+xI4kXqTA2FCLsnsXoLczUBxUPReI6RhO92LQIxBPcKjCO40pfLeasaTgtlc4qfaiOM/PBUCjHd3v\n\tPjQyQgO39u3KWOYu5O64Dy2gO3EpISUJcHOLnY1luWUh8yjXJVmdAhuTYbdRs70QhDETy4yiKIYSa\n\t+C044zvJ0GcU4Q2LlqZxPtelgzpPSuGv+bnU81/5a93Yc4NyNJKHD+b9stZ6kixxm3VKvW35zZKxF\n\tNv1Cy/jwU0H/QJgsKu07cme2SD6AAkjWEY/jEsyZmYghFLHV9uiKKEk4tv1oohdTjC8eUb24hHOlf\n\tQ30tFwJF8+OTw1XdCxCw==;","v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;\n\td=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version:\n\tReferences:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:\n\tContent-Type:Content-ID:Content-Description;\n\tbh=v3SJFrWExdxIyxKXxTaM3X8l0aK1vh/IYG7n9Qe2AG8=; b=rmr2+O49lhFcV7at1w3uQhD0kS\n\tY+6BfR8/B9iAX2LYlwStZcqr5q+zYh2bClhqP0i+5lMQBJZrYEUDZWlDLUm1SYnxoTZZyjTDpRatu\n\tXpEA4lAdeBMCydhl1sKb44PW+0YSaE6Ksrjsr44bnXWvd1+W+qjuhOXAvgUsBqd4dyvIyjMSSDJEw\n\tZ5Ofl9t2xx+6jUKsMvhDhwnQIjQbAXju8PTpYWSPGUbdKVpVtdTd6w2CSxGFVYKgDM6jUpJbEtrV5\n\t88YXurQfsPc2jO+tCPHC2b9NxZvJmZLPtWHqZ3AZ71zzaXbnMbsOPEyblDWTiT1KY6G38UbVTswgM\n\tMaKyhRZQ==;","v=1; a=rsa-sha256; c=relaxed/simple;\n  d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n  t=1777406999; x=1808942999;\n  h=from:to:cc:subject:date:message-id:in-reply-to:\n   references:mime-version:content-transfer-encoding;\n  bh=hxJyg0ShKs3WWb2TlskehzJCLrvEhXeBlq8vTyzq07I=;\n  b=G9hIQjAJkSDNUot3RV2A03zRYZ6/iQx3yNoqnTcZHSenQNG4i3rcIZ6s\n   PqeuOdHBlnEy4XUJ8nhITDHx/bXh71QKU7muLqN/HDtGI5jxQNkNfH/j0\n   D2kzNOgcEmOl2WjnLoTluznDULKa4T89iYS1bciZGFCgTjbkeS/54RJkn\n   6oLQZhmBRqTo92tZ72fA2Lf0j6ZQqaAoFCihgxde0xxbqQwJrOoVgZky6\n   LwvHt584Rh7Yt0Lodmo+Iix6V/hRKv/s+pX8QpyF8mhUgDrINdXlqB9/C\n   fU5r0R9+eLeT7/tj+kGbEfzOa5A9EWXdJs/WjtGy0cYNsIUyMobhpjcqa\n   w==;"],"X-CSE-ConnectionGUID":["Oo/dglVjTVi2Imqx1R2Etw==","heDppC1NSiqawRupLpwHqg=="],"X-CSE-MsgGUID":["hadn+6nySGKFsq0EI8bJ9Q==","SgEy+ToaTYGrAXMKzKS6Ow=="],"X-IronPort-AV":["E=McAfee;i=\"6800,10657,11770\"; a=\"78519549\"","E=Sophos;i=\"6.23,204,1770624000\";\n   d=\"scan'208\";a=\"78519549\"","E=Sophos;i=\"6.23,204,1770624000\";\n   d=\"scan'208\";a=\"257610809\""],"X-ExtLoop1":"1","From":"Andrei Otcheretianski <andrei.otcheretianski@intel.com>","To":"hostap@lists.infradead.org","Cc":"vamsin@qti.qualcomm.com,\n\tmaheshkkv@google.com,\n\tIlan Peer <ilan.peer@intel.com>","Subject":"[PATCH 79/97] NAN: Add support for tracking the status of transmit\n requests","Date":"Tue, 28 Apr 2026 23:06:20 +0300","Message-ID":"<20260428200639.40243-80-andrei.otcheretianski@intel.com>","X-Mailer":"git-send-email 2.53.0","In-Reply-To":"<20260428200639.40243-1-andrei.otcheretianski@intel.com>","References":"<20260428200639.40243-1-andrei.otcheretianski@intel.com>","MIME-Version":"1.0","X-CRM114-Version":"20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 ","X-CRM114-CacheID":"sfid-20260428_210959_454006_A9DDBAD6 ","X-CRM114-Status":"GOOD (  21.75  )","X-Spam-Score":"-4.4 (----)","X-Spam-Report":"SpamAssassin version 4.0.1 on casper.infradead.org summary:\n Content analysis details:   (-4.4 points, 5.0 required)\n  pts rule name              description\n ---- ----------------------\n --------------------------------------------------\n -2.3 RCVD_IN_DNSWL_MED      RBL: Sender listed at https://www.dnswl.org/,\n                             medium trust\n                             [198.175.65.16 listed in list.dnswl.org]\n  0.0 SPF_HELO_NONE          SPF: HELO does not publish an SPF Record\n -0.0 SPF_PASS               SPF: sender matches SPF record\n -0.1 DKIM_VALID             Message has at least one valid DKIM or DK\n signature\n -0.1 DKIM_VALID_EF          Message has a valid DKIM or DK signature from\n                             envelope-from domain\n  0.1 DKIM_SIGNED            Message has a DKIM or DK signature,\n not necessarily valid\n -0.1 DKIM_VALID_AU          Message has a valid DKIM or DK signature from\n author's\n                             domain\n -1.9 BAYES_00               BODY: Bayes spam probability is 0 to 1%\n                             [score: 0.0000]\n -0.0 DKIMWL_WL_HIGH         DKIMwl.org - High trust sender","X-BeenThere":"hostap@lists.infradead.org","X-Mailman-Version":"2.1.34","Precedence":"list","List-Id":"<hostap.lists.infradead.org>","List-Unsubscribe":"<http://lists.infradead.org/mailman/options/hostap>,\n <mailto:hostap-request@lists.infradead.org?subject=unsubscribe>","List-Archive":"<http://lists.infradead.org/pipermail/hostap/>","List-Post":"<mailto:hostap@lists.infradead.org>","List-Help":"<mailto:hostap-request@lists.infradead.org?subject=help>","List-Subscribe":"<http://lists.infradead.org/mailman/listinfo/hostap>,\n <mailto:hostap-request@lists.infradead.org?subject=subscribe>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Sender":"\"Hostap\" <hostap-bounces@lists.infradead.org>","Errors-To":"hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org"},"content":"From: Ilan Peer <ilan.peer@intel.com>\n\nExtend the NAN Discovery Engine (DE) to track the status of\ntransmit requests coming from higher layers:\n\n- For transmit requests with valid cookie number, add the\n  cookie and a digest of the transmitted frame to a list.\n- Once a Tx status for a transmitted frame is received, search\n  for the corresponding entry in the list of tracked frames,\n  and when found report to the higher layer whether the frame\n  was acknowledged or not.\n\nSigned-off-by: Ilan Peer <ilan.peer@intel.com>\n---\n src/ap/nan_usd_ap.c             |   2 +-\n src/common/nan_de.c             | 166 ++++++++++++++++++++++++++++++--\n src/common/nan_de.h             |   3 +-\n wpa_supplicant/nan_supplicant.c |   4 +-\n 4 files changed, 162 insertions(+), 13 deletions(-)","diff":"diff --git a/src/ap/nan_usd_ap.c b/src/ap/nan_usd_ap.c\nindex 8620644cb3..63696a8d19 100644\n--- a/src/ap/nan_usd_ap.c\n+++ b/src/ap/nan_usd_ap.c\n@@ -277,5 +277,5 @@ int hostapd_nan_usd_transmit(struct hostapd_data *hapd, int handle,\n \tif (!hapd->nan_de)\n \t\treturn -1;\n \treturn nan_de_transmit(hapd->nan_de, handle, ssi, elems, peer_addr,\n-\t\t\t       req_instance_id, NULL);\n+\t\t\t       req_instance_id, NULL, NULL);\n }\ndiff --git a/src/common/nan_de.c b/src/common/nan_de.c\nindex 696aa97556..f15836bebe 100644\n--- a/src/common/nan_de.c\n+++ b/src/common/nan_de.c\n@@ -18,6 +18,7 @@\n #include \"nan/nan.h\"\n #include \"nan_defs.h\"\n #include \"nan_de.h\"\n+#include \"utils/crc32.h\"\n \n static const u8 nan_network_id[ETH_ALEN] =\n { 0x51, 0x6f, 0x9a, 0x01, 0x00, 0x00 };\n@@ -104,6 +105,19 @@ struct nan_de_service {\n \n #define NAN_DE_RSSI_CLOSE_PROXIMITY (-70) /* dBm */\n \n+struct nan_de_tracked_tx {\n+\tstruct dl_list list;\n+\tu8 dst[ETH_ALEN];\n+\tu32 cookie;\n+\tu32 digest;\n+\tbool with_wait;\n+};\n+\n+enum nan_de_flush_tracked_tx_reason {\n+\tNAN_DE_FLUSH_TRACKED_TX_FLUSH_ALL,\n+\tNAN_DE_FLUSH_TRACKED_TX_WAIT_EXPIRED,\n+};\n+\n struct nan_de {\n \tu8 nmi[ETH_ALEN];\n \tu8 cluster_id[ETH_ALEN];\n@@ -131,6 +145,12 @@ struct nan_de {\n \t/* RSSI threshold for close proximity, or zero if not limited */\n \tint rssi_threshold;\n \n+\t/*\n+\t * list of transmit requests for which the caller requested\n+\t * status indicating if the frame was acknowledged or not.\n+\t */\n+\tstruct dl_list tracked_tx;\n+\n #ifdef CONFIG_TESTING_OPTIONS\n \t/*\n \t * When set, multicast follow up SDFs would be sent as\n@@ -174,6 +194,7 @@ struct nan_de * nan_de_init(const u8 *nmi, bool offload, bool ap,\n \tde->cfg.n_max = NAN_DE_N_MAX;\n \n \tde->rssi_threshold = NAN_DE_RSSI_CLOSE_PROXIMITY;\n+\tdl_list_init(&de->tracked_tx);\n \n \treturn de;\n }\n@@ -209,14 +230,117 @@ static void nan_de_service_deinit(struct nan_de *de, struct nan_de_service *srv,\n }\n \n \n+static void nan_de_flush_tracked_tx(struct nan_de *de,\n+\t\t\t\t    enum nan_de_flush_tracked_tx_reason reason)\n+{\n+\tstruct nan_de_tracked_tx *tx, *tmp;\n+\n+\tdl_list_for_each_safe(tx, tmp, &de->tracked_tx,\n+\t\t\t      struct nan_de_tracked_tx,\n+\t\t\t      list) {\n+\t\tif (reason == NAN_DE_FLUSH_TRACKED_TX_WAIT_EXPIRED &&\n+\t\t    !tx->with_wait)\n+\t\t\tcontinue;\n+\n+\t\tde->cb.transmit_req_status(de->cb.ctx, tx->cookie,\n+\t\t\t\t\t   false);\n+\t\tdl_list_del(&tx->list);\n+\t\tos_free(tx);\n+\t}\n+}\n+\n+\n static void nan_de_clear_pending(struct nan_de *de)\n {\n+\tnan_de_flush_tracked_tx(de,\n+\t\t\t\tNAN_DE_FLUSH_TRACKED_TX_FLUSH_ALL);\n+\n \tde->listen_freq = 0;\n \tde->tx_wait_status_freq = 0;\n \tde->tx_wait_end_freq = 0;\n }\n \n \n+static u32 nan_de_track_tx_digest(const u8 *data, size_t len)\n+{\n+\treturn ieee80211_crc32(data, len);\n+}\n+\n+\n+static struct nan_de_tracked_tx *\n+nan_de_add_tracked_tx(struct nan_de *de, const u8 *dst, bool with_wait,\n+\t\t      u32 cookie, const struct wpabuf *buf)\n+{\n+\tstruct nan_de_tracked_tx *tx;\n+\n+\tif (!de->cb.transmit_req_status) {\n+\t\twpa_printf(MSG_DEBUG,\n+\t\t\t   \"NAN: No tx_status callback, cannot track Tx\");\n+\t\treturn NULL;\n+\t}\n+\n+\tif (!cookie) {\n+\t\twpa_printf(MSG_DEBUG, \"NAN: Invalid cookie for Tx tracking\");\n+\t\treturn NULL;\n+\t}\n+\n+\tdl_list_for_each(tx, &de->tracked_tx, struct nan_de_tracked_tx, list) {\n+\t\tif (ether_addr_equal(tx->dst, dst) && tx->cookie == cookie) {\n+\t\t\twpa_printf(MSG_DEBUG,\n+\t\t\t\t   \"NAN: Already tracking Tx cookie %u to \" MACSTR,\n+\t\t\t\t   tx->cookie, MAC2STR(tx->dst));\n+\t\t\treturn NULL;\n+\t\t}\n+\t}\n+\n+\ttx = os_zalloc(sizeof(*tx));\n+\tif (!tx)\n+\t\treturn NULL;\n+\n+\tos_memcpy(tx->dst, dst, ETH_ALEN);\n+\ttx->cookie = cookie;\n+\ttx->with_wait = with_wait;\n+\ttx->digest = nan_de_track_tx_digest(wpabuf_head(buf),\n+\t\t\t\t\t    wpabuf_len(buf));\n+\n+\tdl_list_add(&de->tracked_tx, &tx->list);\n+\n+\twpa_printf(MSG_DEBUG, \"NAN: Track Tx cookie %u digest 0x%08x\",\n+\t\t   tx->cookie, tx->digest);\n+\n+\treturn tx;\n+}\n+\n+\n+static void nan_de_tx_status_match(struct nan_de *de, const u8 *data,\n+\t\t\t\t   size_t len, u8 acked)\n+{\n+\tstruct nan_de_tracked_tx *tx;\n+\tconst struct ieee80211_mgmt *mgmt = (void *)data;\n+\tconst u8 *pos = (void *)&mgmt->u.action;\n+\n+\tif (len <= offsetof(struct ieee80211_mgmt, u.action))\n+\t\treturn;\n+\n+\tlen = data + len - pos;\n+\n+\tdl_list_for_each(tx, &de->tracked_tx, struct nan_de_tracked_tx, list) {\n+\t\tif (ether_addr_equal(tx->dst, mgmt->da) &&\n+\t\t    tx->digest == nan_de_track_tx_digest(pos, len)) {\n+\t\t\twpa_printf(MSG_DEBUG,\n+\t\t\t\t   \"NAN: Tx status for cookie=%u ack=%u\",\n+\t\t\t\t   tx->cookie, acked);\n+\n+\t\t\tde->cb.transmit_req_status(de->cb.ctx, tx->cookie,\n+\t\t\t\t\t\t   acked);\n+\t\t\tdl_list_del(&tx->list);\n+\t\t\tos_free(tx);\n+\t\t\treturn;\n+\t\t}\n+\t}\n+}\n+\n+\n void nan_de_flush(struct nan_de *de)\n {\n \tunsigned int i;\n@@ -293,16 +417,30 @@ static struct wpabuf * nan_de_alloc_sdf(struct nan_de *de, const u8 *dst,\n static int nan_de_tx(struct nan_de *de, unsigned int freq,\n \t\t     unsigned int wait_time,\n \t\t     const u8 *dst, const u8 *src, const u8 *bssid,\n-\t\t     const struct wpabuf *buf)\n+\t\t     const struct wpabuf *buf,\n+\t\t     u32 *cookie)\n {\n+\tstruct nan_de_tracked_tx *tracked_tx = NULL;\n \tint res;\n \n \tif (!de->cb.tx)\n \t\treturn -1;\n \n+\tif (cookie) {\n+\t\ttracked_tx = nan_de_add_tracked_tx(de, dst, !!wait_time,\n+\t\t\t\t\t\t   *cookie, buf);\n+\t\tif (!tracked_tx)\n+\t\t\treturn -1;\n+\t}\n+\n \tres = de->cb.tx(de->cb.ctx, freq, wait_time, dst, src, bssid, buf);\n-\tif (res < 0)\n+\tif (res < 0) {\n+\t\tif (tracked_tx) {\n+\t\t\tdl_list_del(&tracked_tx->list);\n+\t\t\tos_free(tracked_tx);\n+\t\t}\n \t\treturn res;\n+\t}\n \n \tde->tx_wait_status_freq = freq;\n \tde->tx_wait_end_freq = wait_time ? freq : 0;\n@@ -336,7 +474,8 @@ static void nan_de_tx_sdf(struct nan_de *de, struct nan_de_service *srv,\n \t\t\t  enum nan_service_control_type type,\n \t\t\t  const u8 *dst, const u8 *a3, u8 req_instance_id,\n \t\t\t  const struct wpabuf *ssi,\n-\t\t\t  const struct wpabuf *attrs)\n+\t\t\t  const struct wpabuf *attrs,\n+\t\t\t  u32 *cookie)\n {\n \tstruct wpabuf *buf;\n \tsize_t len = 0, sda_len, sdea_len;\n@@ -511,7 +650,7 @@ static void nan_de_tx_sdf(struct nan_de *de, struct nan_de_service *srv,\n \t}\n \n \tnan_de_tx(de, srv->sync ? 0 : srv->freq, srv->sync ? 0 : wait_time,\n-\t\t  dst, forced_addr, a3, buf);\n+\t\t  dst, forced_addr, a3, buf, cookie);\n \twpabuf_free(buf);\n }\n \n@@ -616,7 +755,7 @@ static void nan_de_tx_multicast(struct nan_de *de, struct nan_de_service *srv,\n \t}\n \n \tnan_de_tx_sdf(de, srv, wait_time, type, network_id, bssid,\n-\t\t      req_instance_id, srv->ssi, NULL);\n+\t\t      req_instance_id, srv->ssi, NULL, NULL);\n \tos_get_reltime(&srv->last_multicast);\n }\n \n@@ -1055,6 +1194,8 @@ void nan_de_tx_status(struct nan_de *de, unsigned int freq, const u8 *dst,\n {\n \tif (freq == de->tx_wait_status_freq)\n \t\tde->tx_wait_status_freq = 0;\n+\n+\tnan_de_tx_status_match(de, data, data_len, ack);\n }\n \n \n@@ -1064,6 +1205,10 @@ void nan_de_tx_wait_ended(struct nan_de *de)\n \t\twpa_printf(MSG_DEBUG,\n \t\t\t   \"NAN: TX wait for response ended (freq=%u)\",\n \t\t\t   de->tx_wait_end_freq);\n+\n+\tnan_de_flush_tracked_tx(de,\n+\t\t\t\tNAN_DE_FLUSH_TRACKED_TX_WAIT_EXPIRED);\n+\n \tde->tx_wait_end_freq = 0;\n \tnan_de_run_timer(de);\n }\n@@ -1522,7 +1667,7 @@ static bool nan_de_rx_publish(struct nan_de *de, struct nan_de_service *srv,\n \t\t * Service Specific Info field if it received a matching\n \t\t * unsolicited Publish message. */\n \t\tnan_de_transmit(de, srv->id, NULL, NULL, peer_addr,\n-\t\t\t\tinstance_id, NULL);\n+\t\t\t\tinstance_id, NULL, NULL);\n \t}\n \n send_event:\n@@ -1626,7 +1771,8 @@ static bool nan_de_rx_subscribe(struct nan_de *de, struct nan_de_service *srv,\n \n \tnan_de_tx_sdf(de, srv, 100, NAN_SRV_CTRL_PUBLISH,\n \t\t      srv->publish.solicited_multicast ?\n-\t\t      network_id : peer_addr, a3, instance_id, srv->ssi, NULL);\n+\t\t      network_id : peer_addr, a3, instance_id, srv->ssi, NULL,\n+\t\t      NULL);\n \n \tif (!srv->is_p2p && !srv->sync)\n \t\tnan_de_pause_state(srv, peer_addr, instance_id);\n@@ -2452,7 +2598,8 @@ void nan_de_cancel_subscribe(struct nan_de *de, int subscribe_id)\n int nan_de_transmit(struct nan_de *de, int handle,\n \t\t    const struct wpabuf *ssi, const struct wpabuf *elems,\n \t\t    const u8 *peer_addr, u8 req_instance_id,\n-\t\t    const struct wpabuf *nan_attrs)\n+\t\t    const struct wpabuf *nan_attrs,\n+\t\t    u32 *cookie)\n {\n \tstruct nan_de_service *srv;\n \tconst u8 *a3;\n@@ -2483,7 +2630,8 @@ int nan_de_transmit(struct nan_de *de, int handle,\n \telse\n \t\ta3 = network_id;\n \tnan_de_tx_sdf(de, srv, 100, NAN_SRV_CTRL_FOLLOW_UP,\n-\t\t      peer_addr, a3, req_instance_id, ssi, nan_attrs);\n+\t\t      peer_addr, a3, req_instance_id, ssi, nan_attrs,\n+\t\t      cookie);\n \n \tsrv->listen_stopped = false;\n \treturn 0;\ndiff --git a/src/common/nan_de.h b/src/common/nan_de.h\nindex 184f725507..bf11659efb 100644\n--- a/src/common/nan_de.h\n+++ b/src/common/nan_de.h\n@@ -81,6 +81,7 @@ struct nan_callbacks {\n \t\t\t\t     unsigned int freq);\n \tvoid (*add_extra_attrs)(void *ctx, struct wpabuf *buf);\n \tbool (*is_peer_paired)(void *ctx, const u8 *addr);\n+\tvoid (*transmit_req_status)(void *ctx, u32 cookie, bool ack);\n };\n \n bool nan_de_is_nan_network_id(const u8 *addr);\n@@ -266,7 +267,7 @@ void nan_de_cancel_subscribe(struct nan_de *de, int subscribe_id);\n int nan_de_transmit(struct nan_de *de, int handle,\n \t\t    const struct wpabuf *ssi, const struct wpabuf *elems,\n \t\t    const u8 *peer_addr, u8 req_instance_id,\n-\t\t    const struct wpabuf *nan_attrs);\n+\t\t    const struct wpabuf *nan_attrs, u32 *cookie);\n \n void nan_de_dw_trigger(struct nan_de *de, int freq);\n void nan_de_set_cluster_id(struct nan_de *de, const u8 *cluster_id);\ndiff --git a/wpa_supplicant/nan_supplicant.c b/wpa_supplicant/nan_supplicant.c\nindex a8595d0d23..a4cc5597fd 100644\n--- a/wpa_supplicant/nan_supplicant.c\n+++ b/wpa_supplicant/nan_supplicant.c\n@@ -996,7 +996,7 @@ static int wpas_nan_transmit_followup_cb(void *ctx, const u8 *peer_nmi,\n \t\treturn -1;\n \n \treturn nan_de_transmit(wpa_s->nan_de, handle, NULL, NULL,\n-\t\t\t       peer_nmi, req_instance_id, attrs);\n+\t\t\t       peer_nmi, req_instance_id, attrs, NULL);\n }\n \n \n@@ -4392,7 +4392,7 @@ int wpas_nan_transmit(struct wpa_supplicant *wpa_s, int handle,\n \tif (!wpa_s->nan_de)\n \t\treturn -1;\n \treturn nan_de_transmit(wpa_s->nan_de, handle, ssi, elems, peer_addr,\n-\t\t\t       req_instance_id, NULL);\n+\t\t\t       req_instance_id, NULL, NULL);\n }\n \n \n","prefixes":["79/97"]}