{"id":2198431,"url":"http://patchwork.ozlabs.org/api/1.0/patches/2198431/?format=json","project":{"id":22,"url":"http://patchwork.ozlabs.org/api/1.0/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":"<20260219202514.5781-35-andrei.otcheretianski@intel.com>","date":"2026-02-19T20:24:50","name":"[34/58] NAN: Add API to request/response/terminate an NDP","commit_ref":null,"pull_url":null,"state":"accepted","archived":false,"hash":"992d4815146c9d9fceacc537983f703e9a841bc2","submitter":{"id":62065,"url":"http://patchwork.ozlabs.org/api/1.0/people/62065/?format=json","name":"Andrei Otcheretianski","email":"andrei.otcheretianski@intel.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/hostap/patch/20260219202514.5781-35-andrei.otcheretianski@intel.com/mbox/","series":[{"id":492721,"url":"http://patchwork.ozlabs.org/api/1.0/series/492721/?format=json","date":"2026-02-19T20:24:21","name":"NAN: Add NAN Data Path (NDP) support","version":1,"mbox":"http://patchwork.ozlabs.org/series/492721/mbox/"}],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2198431/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=02B9M8e2;\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=c6tBO8Ha;\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 4fH4hc3G1vz1xpY\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 20 Feb 2026 07:28:32 +1100 (AEDT)","from localhost ([::1] helo=bombadil.infradead.org)\n\tby bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1vtAcw-0000000Byke-3emN;\n\tThu, 19 Feb 2026 20:27:58 +0000","from mgamail.intel.com ([198.175.65.10])\n\tby bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1vtAcY-0000000Bwog-0G17\n\tfor hostap@lists.infradead.org;\n\tThu, 19 Feb 2026 20:27:46 +0000","from orviesa004.jf.intel.com ([10.64.159.144])\n  by orvoesa102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 19 Feb 2026 12:27:07 -0800","from aotchere-mobl1.ger.corp.intel.com (HELO\n aotchere-mobl1.intel.com) ([10.245.246.171])\n  by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 19 Feb 2026 12:27:04 -0800"],"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=6me48q00dXCRpzbcQ2P0VkwoB/r/nWxRCiLUFwHvrjE=; b=02B9M8e2zkM7Dl\n\tBBtllYdbVEuko5laAB5V/gqBe5RwGnBM7YCqRMskaJVG2SQzgtgGtE9dkbyLWd+MFgdo/4xjs+6fD\n\t2Aci8hOzi3sUYhDX4m8HvzWq5/3M9ChnmmcvHxCjY45Und/bE3yZEYKw9IU7SZKj25rHw6IS9UpOG\n\tfkZ8lAppkY5K6VG+zhf/wt0OsnNFBZcAGS1fY4ooAuX/xn/O2chos9lF/fBdW5i6Fl8Yn4o0DaOZu\n\tjHRaxdq/kOIOIgHPRoN7BzJI4IgaNaI8hiGBeaSZK/FSpKh1ESZCgGymvA94M4G8oshJjuIYqPSDK\n\tNPthn3nRgssvGuXJRn5g==;","v=1; a=rsa-sha256; c=relaxed/simple;\n  d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n  t=1771532854; x=1803068854;\n  h=from:to:cc:subject:date:message-id:in-reply-to:\n   references:mime-version:content-transfer-encoding;\n  bh=jeXs0BLpKc9jgtadmn54R2zrT0NbAfDcKn5W1RoQP/s=;\n  b=c6tBO8HaT9JUhbbAiinmM568Q1O3AbHGO5s5/9T/txDp07dlGanKW/xV\n   IoVxYwvzj75ed14eaNrXjgdSUxFer6vrBJhNkFVCosegSihPrQbDs8IA9\n   /+whfQhW6bLI2rsqGgFXarNNr+aSb+lsBSu7Wec6WevJnOExdykbM4yAB\n   DrNbKfgO6WfXWBYScVsV867b1JbMxgyAFGF3iVR6ZTjY3BykwUoi3cGZ5\n   8cUPVoiOArO7aM7Wz3f+PcpWZEenHEDdP7tkm+onDyymZZMtJh+oG5kwM\n   +tiGWJnY52o1FUFbTJYwHZ3yX98uDOoD70xjWGuB+UzDNwkaTkoZ0TJb1\n   A==;"],"X-CSE-ConnectionGUID":["rSixjGv2TTCpKqNX+hLUPQ==","yPWt2mhrSma3PTxoJ7rHfA=="],"X-CSE-MsgGUID":["5lj+W7mGRmmDIijTNYP58Q==","LpqUwiEHTua8UKBkMM8MnQ=="],"X-IronPort-AV":["E=McAfee;i=\"6800,10657,11706\"; a=\"90040083\"","E=Sophos;i=\"6.21,300,1763452800\";\n   d=\"scan'208\";a=\"90040083\"","E=Sophos;i=\"6.21,300,1763452800\";\n   d=\"scan'208\";a=\"219153936\""],"X-ExtLoop1":"1","From":"Andrei Otcheretianski <andrei.otcheretianski@intel.com>","To":"hostap@lists.infradead.org,\n\tvamsin@qti.qualcomm.com,\n\tvganneva@qti.qualcomm.com,\n\tmaheshkkv@google.com","Cc":"Ilan Peer <ilan.peer@intel.com>","Subject":"[PATCH 34/58] NAN: Add API to request/response/terminate an NDP","Date":"Thu, 19 Feb 2026 22:24:50 +0200","Message-ID":"<20260219202514.5781-35-andrei.otcheretianski@intel.com>","X-Mailer":"git-send-email 2.52.0","In-Reply-To":"<20260219202514.5781-1-andrei.otcheretianski@intel.com>","References":"<20260219202514.5781-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-20260219_122734_329629_F48F4EBC ","X-CRM114-Status":"GOOD (  19.43  )","X-Spam-Score":"-4.4 (----)","X-Spam-Report":"Spam detection software,\n running on the system \"bombadil.infradead.org\",\n has NOT identified this incoming email as spam.  The original\n message has been attached to this so you can view it or label\n similar future email.  If you have any questions, see\n the administrator of that system for details.\n Content preview:  From: Ilan Peer <ilan.peer@intel.com> Add APIs to allow\n establishing\n    a NDP with a specific peer. Set timeouts for the NDP setup exchange for\n each\n    peer. If the timeout expires, stop the NDP establishment.\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.10 listed in list.dnswl.org]\n -0.0 SPF_PASS               SPF: sender matches SPF record\n  0.0 SPF_HELO_NONE          SPF: HELO does not publish an SPF Record\n  0.0 RCVD_IN_VALIDITY_SAFE_BLOCKED RBL: ADMINISTRATOR NOTICE: The query to\n                              Validity was blocked.  See\n                             https://knowledge.validity.com/hc/en-us/articles/20961730681243\n                              for more information.\n                             [198.175.65.10 listed in sa-accredit.habeas.com]\n  0.0 RCVD_IN_VALIDITY_CERTIFIED_BLOCKED RBL: ADMINISTRATOR NOTICE: The\n                             query to Validity was blocked.  See\n                             https://knowledge.validity.com/hc/en-us/articles/20961730681243\n                              for more information.\n                          [198.175.65.10 listed in\n sa-trusted.bondedsender.org]\n -0.1 DKIM_VALID_AU          Message has a valid DKIM or DK signature from\n author's\n                             domain\n -0.1 DKIM_VALID_EF          Message has a valid DKIM or DK signature from\n                             envelope-from domain\n -0.1 DKIM_VALID             Message has at least one valid DKIM or DK\n signature\n  0.1 DKIM_SIGNED            Message has a DKIM or DK signature,\n not necessarily valid\n -1.9 BAYES_00               BODY: Bayes spam probability is 0 to 1%\n                             [score: 0.0000]\n  0.0 RCVD_IN_VALIDITY_RPBL_BLOCKED RBL: ADMINISTRATOR NOTICE: The query to\n                              Validity was blocked.  See\n                             https://knowledge.validity.com/hc/en-us/articles/20961730681243\n                              for more information.\n                             [198.175.65.10 listed in\n bl.score.senderscore.com]\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\nAdd APIs to allow establishing a NDP with a specific\npeer.\n\nSet timeouts for the NDP setup exchange for each peer.\nIf the timeout expires, stop the NDP establishment.\n\nSigned-off-by: Ilan Peer <ilan.peer@intel.com>\n---\n src/nan/nan.c   | 170 +++++++++++++++++++++++++++++++++++++++++++++---\n src/nan/nan.h   |   1 +\n src/nan/nan_i.h |  15 +++++\n 3 files changed, 177 insertions(+), 9 deletions(-)","diff":"diff --git a/src/nan/nan.c b/src/nan/nan.c\nindex 6b705b0c92..57e477699a 100644\n--- a/src/nan/nan.c\n+++ b/src/nan/nan.c\n@@ -10,10 +10,18 @@\n #include \"common.h\"\n #include \"nan.h\"\n #include \"nan_i.h\"\n+#include \"eloop.h\"\n \n #define NAN_MAX_PEERS   32\n #define NAN_MAX_NAF_LEN 1024\n \n+#define NAN_NDP_SETUP_TIMEOUT_LONG  30\n+#define NAN_NDP_SETUP_TIMEOUT_SHORT 2\n+\n+static void nan_peer_state_timeout(void *eloop_ctx, void *timeout_ctx);\n+static void nan_ndp_disconnected(struct nan_data *nan, struct nan_peer *peer,\n+\t\t\t\t enum nan_reason reason);\n+\n struct nan_data * nan_init(const struct nan_config *cfg)\n {\n \tstruct nan_data *nan;\n@@ -69,6 +77,17 @@ static void nan_peer_flush_elem_container(struct nan_peer_info *info)\n }\n \n \n+static void nan_ndp_setup_stop(struct nan_data *nan, struct nan_peer *peer)\n+{\n+\teloop_cancel_timeout(nan_peer_state_timeout, nan, peer);\n+\tnan_ndp_setup_reset(nan, peer);\n+\n+\t/* need to also remove the NDL if no active NDPs */\n+\tif (dl_list_empty(&peer->ndps))\n+\t\tnan_ndl_reset(nan, peer);\n+}\n+\n+\n static void nan_del_peer(struct nan_data *nan, struct nan_peer *peer)\n {\n \tif (!peer)\n@@ -94,7 +113,8 @@ static void nan_del_peer(struct nan_data *nan, struct nan_peer *peer)\n \tif (peer->ndp_setup.ndp) {\n \t\twpa_printf(MSG_DEBUG,\n \t\t\t   \"NAN: Peer delete while ndp setup is WIP\");\n-\t\tnan_ndp_setup_reset(nan, peer);\n+\n+\t\tnan_ndp_setup_stop(nan, peer);\n \t}\n \n \tdl_list_del(&peer->list);\n@@ -1095,6 +1115,34 @@ static bool nan_ndp_supported(struct nan_data *nan)\n }\n \n \n+static void nan_peer_state_timeout(void *eloop_ctx, void *timeout_ctx)\n+{\n+\tstruct nan_data *nan = eloop_ctx;\n+\tstruct nan_peer *peer = timeout_ctx;\n+\n+\twpa_printf(MSG_DEBUG,\n+\t\t   \"NAN: timeout expired: \" MACSTR, MAC2STR(peer->nmi_addr));\n+\n+\tif (!peer->ndp_setup.ndp)\n+\t\treturn;\n+\n+\tnan_ndp_disconnected(nan, peer,\n+\t\t\t     NAN_REASON_UNSPECIFIED_REASON);\n+}\n+\n+\n+static void nan_set_peer_timeout(struct nan_data *nan, struct nan_peer *peer,\n+\t\t\t\t unsigned int sec, unsigned int usec)\n+{\n+\twpa_printf(MSG_DEBUG,\n+\t\t   \"NAN: set timeout: \" MACSTR \" %u.%06u sec\",\n+\t\t   MAC2STR(peer->nmi_addr), sec, usec);\n+\n+\teloop_cancel_timeout(nan_peer_state_timeout, nan, peer);\n+\teloop_register_timeout(sec, usec, nan_peer_state_timeout, nan, peer);\n+}\n+\n+\n static void nan_ndp_action_notif(struct nan_data *nan, struct nan_peer *peer)\n {\n \tstruct nan_ndp_action_notif_params notify;\n@@ -1124,6 +1172,7 @@ static void nan_ndp_action_notif(struct nan_data *nan, struct nan_peer *peer)\n \t\t   notify.ndl_status);\n \n \tnan->cfg->ndp_action_notif(nan->cfg->cb_ctx, &notify);\n+\tnan_set_peer_timeout(nan, peer, NAN_NDP_SETUP_TIMEOUT_LONG, 0);\n }\n \n \n@@ -1158,7 +1207,7 @@ static void nan_ndp_connected(struct nan_data *nan, struct nan_peer *peer)\n \tdl_list_add(&peer->ndps, &peer->ndp_setup.ndp->list);\n \tpeer->ndp_setup.ndp = NULL;\n \n-\tnan_ndp_setup_reset(nan, peer);\n+\tnan_ndp_setup_stop(nan, peer);\n }\n \n \n@@ -1189,12 +1238,7 @@ static void nan_ndp_disconnected(struct nan_data *nan, struct nan_peer *peer,\n \tnan->cfg->ndp_disconnected(nan->cfg->cb_ctx, &ndp_id,\n \t\t\t\t   local_ndi, peer_ndi, reason);\n \n-\t/* Reset the NDP setup data */\n-\tnan_ndp_setup_reset(nan, peer);\n-\n-\t/* Need to also remove the NDL if no active peers */\n-\tif (dl_list_empty(&peer->ndps))\n-\t\tnan_ndl_reset(nan, peer);\n+\tnan_ndp_setup_stop(nan, peer);\n }\n \n \n@@ -1225,7 +1269,7 @@ static int nan_action_rx_ndp(struct nan_data *nan, struct nan_peer *peer,\n \n \t\tret = nan_ndl_handle_ndl_attr(nan, peer, msg);\n \t\tif (ret || !peer->ndl) {\n-\t\t\tnan_ndp_setup_reset(nan, peer);\n+\t\t\tnan_ndp_setup_stop(nan, peer);\n \t\t\treturn -1;\n \t\t}\n \n@@ -1296,6 +1340,8 @@ static int nan_action_rx_ndp(struct nan_data *nan, struct nan_peer *peer,\n \t\tnan_ndp_disconnected(nan, peer, NAN_REASON_UNSPECIFIED_REASON);\n \t}\n \n+\tnan_set_peer_timeout(nan, peer, NAN_NDP_SETUP_TIMEOUT_SHORT, 0);\n+\n \treturn 0;\n }\n \n@@ -1469,3 +1515,109 @@ int nan_tx_status(struct nan_data *nan, const u8 *dst, const u8 *data,\n \n \treturn 0;\n }\n+\n+\n+int nan_handle_ndp_setup(struct nan_data *nan, struct nan_ndp_params *params)\n+{\n+\tstruct nan_peer *peer;\n+\tenum nan_subtype naf_oui = NAN_SUBTYPE_INVALID;\n+\tunsigned int timeout;\n+\tint ret;\n+\n+\tif (!nan_ndp_supported(nan))\n+\t\treturn -1;\n+\n+\tpeer = nan_get_peer(nan, params->ndp_id.peer_nmi);\n+\tif (!peer) {\n+\t\twpa_printf(MSG_DEBUG, \"NAN: NDP Peer not found\");\n+\t\treturn -1;\n+\t}\n+\n+\tswitch (params->type) {\n+\tcase NAN_NDP_ACTION_REQ:\n+\t\tparams->ndp_id.id = nan_get_next_ndp_id(nan);\n+\t\tret = nan_ndp_setup_req(nan, peer, params);\n+\t\tif (ret)\n+\t\t\treturn ret;\n+\n+\t\tret = nan_ndl_setup(nan, peer, params);\n+\t\tif (ret) {\n+\t\t\tnan_ndp_setup_stop(nan, peer);\n+\t\t\treturn ret;\n+\t\t}\n+\n+\t\tnaf_oui = NAN_SUBTYPE_DATA_PATH_REQUEST;\n+\t\ttimeout = NAN_NDP_SETUP_TIMEOUT_LONG;\n+\t\tbreak;\n+\tcase NAN_NDP_ACTION_RESP:\n+\t\t/*\n+\t\t * NDL establishment as part of the NDP establishment. It is\n+\t\t * possible that this would use an already existing NDL or start\n+\t\t * a new NDL setup.\n+\t\t */\n+\t\tret = nan_ndp_setup_resp(nan, peer, params);\n+\t\tif (ret) {\n+\t\t\tnan_ndp_setup_stop(nan, peer);\n+\t\t\treturn ret;\n+\t\t}\n+\n+\t\tif (peer->ndp_setup.status != NAN_NDP_STATUS_REJECTED) {\n+\t\t\tret = nan_ndl_setup(nan, peer, params);\n+\t\t\tif (ret) {\n+\t\t\t\tif (peer->ndl && peer->ndl->send_naf_on_error) {\n+\t\t\t\t\tnan_ndp_setup_failure(nan, peer,\n+\t\t\t\t\t\t\t      NAN_REASON_NDL_UNACCEPTABLE,\n+\t\t\t\t\t\t\t      0);\n+\t\t\t\t} else {\n+\t\t\t\t\tnan_ndp_setup_stop(nan, peer);\n+\t\t\t\t\treturn ret;\n+\t\t\t\t}\n+\t\t\t}\n+\t\t} else if (peer->ndl && dl_list_empty(&peer->ndps)) {\n+\t\t\tpeer->ndl->status = NAN_NDL_STATUS_REJECTED;\n+\t\t}\n+\n+\t\tnaf_oui = NAN_SUBTYPE_DATA_PATH_RESPONSE;\n+\t\ttimeout = NAN_NDP_SETUP_TIMEOUT_SHORT;\n+\t\tbreak;\n+\tcase NAN_NDP_ACTION_CONF:\n+\t\tret = nan_ndl_setup(nan, peer, params);\n+\t\tif (ret) {\n+\t\t\tif (peer->ndl && peer->ndl->send_naf_on_error) {\n+\t\t\t\tnan_ndp_setup_failure(nan, peer,\n+\t\t\t\t\t\t      NAN_REASON_NDL_UNACCEPTABLE,\n+\t\t\t\t\t\t      0);\n+\t\t\t} else {\n+\t\t\t\tnan_ndp_setup_stop(nan, peer);\n+\t\t\t\treturn ret;\n+\t\t\t}\n+\t\t}\n+\n+\t\tnaf_oui = NAN_SUBTYPE_DATA_PATH_CONFIRM;\n+\t\ttimeout = NAN_NDP_SETUP_TIMEOUT_SHORT;\n+\t\tbreak;\n+\n+\tcase NAN_NDP_ACTION_TERM:\n+\t\twpa_printf(MSG_DEBUG, \"TODO: Support terminate\");\n+\t\tnaf_oui = NAN_SUBTYPE_DATA_PATH_TERMINATION;\n+\t\treturn -1;\n+\tdefault:\n+\t\twpa_printf(MSG_DEBUG, \"NAN: Unsupported NDP setup type=%u\",\n+\t\t\t   params->type);\n+\t\treturn -1;\n+\t}\n+\n+\tret = nan_action_send(nan, peer, naf_oui);\n+\tif (ret)\n+\t\twpa_printf(MSG_DEBUG,\n+\t\t\t   \"NAN: Failed sending NAF. Resetting: ret=%d\",\n+\t\t\t   ret);\n+\n+\tif (ret) {\n+\t\tnan_ndp_disconnected(nan, peer, peer->ndp_setup.reason);\n+\t\treturn 0;\n+\t}\n+\n+\tnan_set_peer_timeout(nan, peer, timeout, 0);\n+\treturn ret;\n+}\ndiff --git a/src/nan/nan.h b/src/nan/nan.h\nindex 9d89800071..729a4a6fb9 100644\n--- a/src/nan/nan.h\n+++ b/src/nan/nan.h\n@@ -419,4 +419,5 @@ int nan_action_rx(struct nan_data *nan, const struct ieee80211_mgmt *mgmt,\n \t\t  size_t len);\n int nan_tx_status(struct nan_data *nan, const u8 *dst, const u8 *data,\n \t\t  size_t data_len, u8 acked);\n+int nan_handle_ndp_setup(struct nan_data *nan, struct nan_ndp_params *params);\n #endif /* NAN_H */\ndiff --git a/src/nan/nan_i.h b/src/nan/nan_i.h\nindex 48f66e8397..0c15d29d17 100644\n--- a/src/nan/nan_i.h\n+++ b/src/nan/nan_i.h\n@@ -391,6 +391,21 @@ static inline u8 nan_get_next_dialog_token(struct nan_data *nan)\n \tif (++nan->next_dialog_token == 0)\n \t\tnan->next_dialog_token++;\n \treturn nan->next_dialog_token;\n+\n+}\n+\n+\n+/**\n+ * nan_get_next_ndp_id - Allocate next nonzero NDP identifier\n+ *\n+ * Wi-Fi Aware Specification v4.0, Table 82: NDP ID range is 1-255,\n+ * value zero is reserved.\n+ */\n+static inline u8 nan_get_next_ndp_id(struct nan_data *nan)\n+{\n+\tif (++nan->ndp_id_counter == 0)\n+\t\tnan->ndp_id_counter++;\n+\treturn nan->ndp_id_counter;\n }\n \n struct nan_peer * nan_get_peer(struct nan_data *nan, const u8 *addr);\n","prefixes":["34/58"]}