get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.0/patches/2198404/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2198404,
    "url": "http://patchwork.ozlabs.org/api/1.0/patches/2198404/?format=api",
    "project": {
        "id": 22,
        "url": "http://patchwork.ozlabs.org/api/1.0/projects/22/?format=api",
        "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-8-andrei.otcheretianski@intel.com>",
    "date": "2026-02-19T20:24:23",
    "name": "[07/58] NAN: Add support for parsing NAN action frames",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "9a07e871536b88f68c545927416684b62ae75087",
    "submitter": {
        "id": 62065,
        "url": "http://patchwork.ozlabs.org/api/1.0/people/62065/?format=api",
        "name": "Andrei Otcheretianski",
        "email": "andrei.otcheretianski@intel.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/hostap/patch/20260219202514.5781-8-andrei.otcheretianski@intel.com/mbox/",
    "series": [
        {
            "id": 492721,
            "url": "http://patchwork.ozlabs.org/api/1.0/series/492721/?format=api",
            "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/2198404/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=fA1qdvmF;\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=dCxeCgAE;\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 4fH4f214Z8z1xpY\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 20 Feb 2026 07:26:18 +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 1vtAaw-0000000Bvw4-3BON;\n\tThu, 19 Feb 2026 20:25:54 +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 1vtAau-0000000BvpR-1ItO\n\tfor hostap@lists.infradead.org;\n\tThu, 19 Feb 2026 20:25:53 +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:25:52 -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:25:49 -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=JOOWgRlbH+K8kl2CYsyxOH3Dsa+QhEttKs0tn+0E5aQ=; b=fA1qdvmFfMzZSK\n\tT1x525EoHA2K1ScmxG+xVWucIKDGkvDn/83h2ESBOHXwT2V9qhBWNGegJxGwqr8k3f+0BP6G1jYXm\n\t9fs6qp+iwqZigKgh70FOHjnr5/QnmTmqERAHJu+UVSekwQvFGPXl9M3jn5LbhsLh3RddCue4t2U0d\n\tJ1/I3YgCKguX67DZF6h7RloPHzZxFq5w8dSpnk6TH3kgUvdMx12ZmfepsuN1fGlVx0Rqn/MEFnRSs\n\tgkcphrwJEhEkwLdyb9n13ZpoK5jKGaFJnwc4OG68rVtr+LyJbIpEB1iNUiGjSHwczPy8EMGSehJ4X\n\tsFx/eX9/VtXbzRPDxLNw==;",
            "v=1; a=rsa-sha256; c=relaxed/simple;\n  d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n  t=1771532753; x=1803068753;\n  h=from:to:cc:subject:date:message-id:in-reply-to:\n   references:mime-version:content-transfer-encoding;\n  bh=k9lBwonYaRwCYJtkAW0zY57Fe1UtCKQ1HplqHfQi9N8=;\n  b=dCxeCgAE3F7TvcPJW3wnoLPN/xp7aXdpqEYJMRZfVzEcdttAl1FpmLY4\n   JhcW+7zs8rSlcxnVDlX1is/cQyxOYjXtzfrIrJM3etov2yiRYoWgs/2Nb\n   lrlszXeeTtcbglebPs5P6DQXqvqpAj2CXTNgvqKDRpNJzHDssihTcgXac\n   l75s9vJ1J4IdmAF8d/l707WbarTqgL7KC+wylQfCFjpdTNF/n2TfQpHrQ\n   UdpnPKL3BOfqDsPCzPSxrzl2DhV9lRO0/wORID8+p+vZ9lHRQ3R9+ORir\n   BuBNX9Dmxo/A/mxqLk3+FYvJKaTOosCUkHozJW05FucETGFSVlRhwpylV\n   Q==;"
        ],
        "X-CSE-ConnectionGUID": [
            "wt1znMZKS3CUv8Ds9C5+7Q==",
            "AESLgLH7TGiM9VXWMUCwKQ=="
        ],
        "X-CSE-MsgGUID": [
            "VXvyQpGHSaKgggKf/zekKw==",
            "FwsvwIu+SH6BYGhL+pVjpw=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6800,10657,11706\"; a=\"90039937\"",
            "E=Sophos;i=\"6.21,300,1763452800\";\n   d=\"scan'208\";a=\"90039937\"",
            "E=Sophos;i=\"6.21,300,1763452800\";\n   d=\"scan'208\";a=\"219153714\""
        ],
        "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 07/58] NAN: Add support for parsing NAN action frames",
        "Date": "Thu, 19 Feb 2026 22:24:23 +0200",
        "Message-ID": "<20260219202514.5781-8-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_122552_424621_A18B2FC1 ",
        "X-CRM114-Status": "GOOD (  24.92  )",
        "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 support for\n parsing\n    a NAN Action Frame (NAF) and storing the relevant parsed attributes.\n Signed-off-by:\n    Ilan Peer <ilan.peer@intel.com> --- src/common/ieee802_11_defs.h | 11 ++\n   src/nan/Makefile | 2 +- src/nan/nan_i.h | 51 ++++++ src/nan/nan_util.c |\n 319\n    +++++++++++++++++++++++++++++++++++ [...]\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 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.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 SPF_PASS               SPF: sender matches SPF record\n  0.0 SPF_HELO_NONE          SPF: HELO does not publish an SPF Record\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 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 support for parsing a NAN Action Frame (NAF) and\nstoring the relevant parsed attributes.\n\nSigned-off-by: Ilan Peer <ilan.peer@intel.com>\n---\n src/common/ieee802_11_defs.h |  11 ++\n src/nan/Makefile             |   2 +-\n src/nan/nan_i.h              |  51 ++++++\n src/nan/nan_util.c           | 319 +++++++++++++++++++++++++++++++++++\n wpa_supplicant/Makefile      |   1 +\n 5 files changed, 383 insertions(+), 1 deletion(-)\n create mode 100644 src/nan/nan_util.c",
    "diff": "diff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h\nindex 88407503a4..dcce7995bf 100644\n--- a/src/common/ieee802_11_defs.h\n+++ b/src/common/ieee802_11_defs.h\n@@ -1210,12 +1210,23 @@ struct ieee80211_mgmt {\n \t\t\t\t\t * Basic Multi-Link element (optional) */\n \t\t\t\t\tu8 variable[];\n \t\t\t\t} STRUCT_PACKED link_reconf_resp;\n+\t\t\t\tstruct {\n+\t\t\t\t\tu8 action_code;\n+\t\t\t\t\tu8 oui[3];\n+\t\t\t\t\tu8 oui_type;\n+\t\t\t\t\tu8 subtype;\n+\t\t\t\t\tu8 variable[0];\n+\t\t\t\t} STRUCT_PACKED naf;\n \t\t\t} u;\n \t\t} STRUCT_PACKED action;\n \t} u;\n } STRUCT_PACKED;\n \n \n+#define IEEE80211_MIN_ACTION_LEN(type)\t\\\n+\t(offsetof(struct ieee80211_mgmt, u.action.u.type) + \\\n+\t sizeof(((struct ieee80211_mgmt *)0)->u.action.u.type))\n+\n #define IEEE80211_MAX_MMPDU_SIZE 2304\n \n /* Rx MCS bitmask is in the first 77 bits of supported_mcs_set */\ndiff --git a/src/nan/Makefile b/src/nan/Makefile\nindex bd8a66a5b3..2c58f9cb6c 100644\n--- a/src/nan/Makefile\n+++ b/src/nan/Makefile\n@@ -1,3 +1,3 @@\n-LIB_OBJS= nan.o\n+LIB_OBJS= nan.o nan_util.o\n \n include ../lib.rules\ndiff --git a/src/nan/nan_i.h b/src/nan/nan_i.h\nindex 0efb51a300..5cf2bf80eb 100644\n--- a/src/nan/nan_i.h\n+++ b/src/nan/nan_i.h\n@@ -9,6 +9,9 @@\n #ifndef NAN_I_H\n #define NAN_I_H\n \n+#include \"common/ieee802_11_defs.h\"\n+#include \"common/nan_defs.h\"\n+#include \"nan.h\"\n #include \"list.h\"\n \n struct nan_config;\n@@ -38,5 +41,53 @@ struct nan_data {\n \tstruct dl_list peer_list;\n };\n \n+struct nan_attrs_entry {\n+\tstruct dl_list list;\n+\tconst u8 *ptr;\n+\tu16 len;\n+};\n+\n+struct nan_attrs {\n+\tstruct dl_list serv_desc_ext;\n+\tstruct dl_list avail;\n+\tstruct dl_list ndc;\n+\tstruct dl_list dev_capa;\n+\tstruct dl_list element_container;\n+\n+\tconst u8 *ndp;\n+\tconst u8 *ndl;\n+\tconst u8 *ndl_qos;\n+\tconst u8 *cipher_suite_info;\n+\tconst u8 *sec_ctxt_info;\n+\tconst u8 *shared_key_desc;\n+\n+\tu16 ndp_len;\n+\tu16 ndl_len;\n+\tu16 ndl_qos_len;\n+\tu16 cipher_suite_info_len;\n+\tu16 sec_ctxt_info_len;\n+\tu16 shared_key_desc_len;\n+};\n+\n+struct nan_msg {\n+\tu8 oui_type;\n+\tu8 oui_subtype;\n+\tstruct nan_attrs attrs;\n+\n+\t/* the full frame is required for the NDP security flows, that compute\n+\t * the NDP authentication token over the entire frame body.\n+\t */\n+\tconst struct ieee80211_mgmt *mgmt;\n+\tsize_t len;\n+};\n+\n struct nan_peer * nan_get_peer(struct nan_data *nan, const u8 *addr);\n+bool nan_is_naf(struct nan_data *nan, const struct ieee80211_mgmt *mgmt,\n+\t\tsize_t len);\n+int nan_parse_attrs(struct nan_data *nan, const u8 *data, size_t len,\n+\t\t    struct nan_attrs *attrs);\n+int nan_parse_naf(struct nan_data *nan, const struct ieee80211_mgmt *mgmt,\n+\t\t  size_t len, struct nan_msg *msg);\n+void nan_attrs_clear(struct nan_data *nan, struct nan_attrs *attrs);\n+\n #endif /* NAN_I_H */\ndiff --git a/src/nan/nan_util.c b/src/nan/nan_util.c\nnew file mode 100644\nindex 0000000000..7e8d27f9c7\n--- /dev/null\n+++ b/src/nan/nan_util.c\n@@ -0,0 +1,319 @@\n+/*\n+ * Wi-Fi Aware - NAN module utils\n+ * Copyright (C) 2025 Intel Corporation\n+ *\n+ * This software may be distributed under the terms of the BSD license.\n+ * See README for more details.\n+ */\n+\n+#include \"includes.h\"\n+#include \"common.h\"\n+#include \"nan_i.h\"\n+\n+\n+static void nan_attrs_clear_list(struct nan_data *nan,\n+\t\t\t\t struct dl_list *list)\n+{\n+\tstruct nan_attrs_entry *entry, *pentry;\n+\n+\tdl_list_for_each_safe(entry, pentry, list,\n+\t\t\t      struct nan_attrs_entry,\n+\t\t\t      list) {\n+\t\tdl_list_del(&entry->list);\n+\t\tos_free(entry);\n+\t}\n+}\n+\n+\n+/*\n+ * nan_attrs_clear - Free data from nan parsing\n+ *\n+ * @nan: NAN module context from nan_init()\n+ * @attrs: Parsed nan_attrs\n+ */\n+void nan_attrs_clear(struct nan_data *nan, struct nan_attrs *attrs)\n+{\n+\tnan_attrs_clear_list(nan, &attrs->serv_desc_ext);\n+\tnan_attrs_clear_list(nan, &attrs->avail);\n+\tnan_attrs_clear_list(nan, &attrs->ndc);\n+\tnan_attrs_clear_list(nan, &attrs->dev_capa);\n+\tnan_attrs_clear_list(nan, &attrs->element_container);\n+\n+\tos_memset(attrs, 0, sizeof(*attrs));\n+}\n+\n+\n+/*\n+ * nan_parse_attrs - Parse NAN attributes\n+ *\n+ * @nan: NAN module context from nan_init()\n+ * @data: Buffer holding the attributes\n+ * @len: Length of &data\n+ * @attrs: On return would hold the parsed attributes\n+ * Returns: 0 on success; positive or negative indicate an error\n+ *\n+ * Note: In case of success, the caller must free temporary memory allocations\n+ * by calling nan_attrs_clear() when the parsed data is not needed anymore.\n+ */\n+int nan_parse_attrs(struct nan_data *nan, const u8 *data, size_t len,\n+\t\t    struct nan_attrs *attrs)\n+{\n+\tstruct nan_attrs_entry *entry;\n+\tconst u8 *pos = data;\n+\tconst u8 *end = pos + len;\n+\n+\tos_memset(attrs, 0, sizeof(*attrs));\n+\n+\tdl_list_init(&attrs->serv_desc_ext);\n+\tdl_list_init(&attrs->avail);\n+\tdl_list_init(&attrs->ndc);\n+\tdl_list_init(&attrs->dev_capa);\n+\tdl_list_init(&attrs->element_container);\n+\n+\twhile (pos + 3 < end) {\n+\t\tu8 id = *pos++;\n+\t\tu16 attr_len = WPA_GET_LE16(pos);\n+\n+\t\tpos += 2;\n+\t\tif ((pos + attr_len) > end)\n+\t\t\tgoto fail;\n+\n+\t\tswitch (id) {\n+\t\tcase NAN_ATTR_SDEA:\n+\t\t\tentry = os_malloc(sizeof(*entry));\n+\t\t\tif (!entry)\n+\t\t\t\tgoto fail;\n+\n+\t\t\tentry->ptr = pos;\n+\t\t\tentry->len = attr_len;\n+\t\t\tdl_list_add_tail(&attrs->serv_desc_ext, &entry->list);\n+\t\t\tbreak;\n+\t\tcase NAN_ATTR_DEVICE_CAPABILITY:\n+\t\t\t/* Validate Device Capability attribute length */\n+\t\t\tif (attr_len != sizeof(struct nan_device_capa))\n+\t\t\t\tbreak;\n+\n+\t\t\tentry = os_malloc(sizeof(*entry));\n+\t\t\tif (!entry)\n+\t\t\t\tgoto fail;\n+\n+\t\t\tentry->ptr = pos;\n+\t\t\tentry->len = attr_len;\n+\t\t\tdl_list_add_tail(&attrs->dev_capa, &entry->list);\n+\t\t\tbreak;\n+\t\tcase NAN_ATTR_NDP:\n+\t\t\t/* Validate minimal NDP attribute length */\n+\t\t\tif (attr_len < sizeof(struct ieee80211_ndp))\n+\t\t\t\tbreak;\n+\n+\t\t\tattrs->ndp = pos;\n+\t\t\tattrs->ndp_len = attr_len;\n+\t\t\tbreak;\n+\t\tcase NAN_ATTR_NAN_AVAILABILITY:\n+\t\t\t/* Validate minimal Availability attribute length */\n+\t\t\tif (attr_len < sizeof(struct nan_avail))\n+\t\t\t\tbreak;\n+\n+\t\t\tentry = os_malloc(sizeof(*entry));\n+\t\t\tif (!entry)\n+\t\t\t\tgoto fail;\n+\n+\t\t\tentry->ptr = pos;\n+\t\t\tentry->len = attr_len;\n+\t\t\tdl_list_add_tail(&attrs->avail, &entry->list);\n+\t\t\tbreak;\n+\t\tcase NAN_ATTR_NDC:\n+\t\t\t/* Validate minimal NDC attribute length */\n+\t\t\tif (attr_len < sizeof(struct ieee80211_ndc))\n+\t\t\t\tbreak;\n+\n+\t\t\tentry = os_malloc(sizeof(*entry));\n+\t\t\tif (!entry)\n+\t\t\t\tgoto fail;\n+\n+\t\t\tentry->ptr = pos;\n+\t\t\tentry->len = attr_len;\n+\t\t\tdl_list_add_tail(&attrs->ndc, &entry->list);\n+\t\t\tbreak;\n+\t\tcase NAN_ATTR_NDL:\n+\t\t\t/* Validate minimal NDL attribute length */\n+\t\t\tif (attr_len < sizeof(struct ieee80211_ndl))\n+\t\t\t\tbreak;\n+\n+\t\t\tattrs->ndl = pos;\n+\t\t\tattrs->ndl_len = attr_len;\n+\t\t\tbreak;\n+\t\tcase NAN_ATTR_NDL_QOS:\n+\t\t\t/* Validate QoS attribute length */\n+\t\t\tif (attr_len != sizeof(struct ieee80211_nan_qos))\n+\t\t\t\tbreak;\n+\n+\t\t\tattrs->ndl_qos = pos;\n+\t\t\tattrs->ndl_qos_len = attr_len;\n+\t\t\tbreak;\n+\t\tcase NAN_ATTR_ELEM_CONTAINER:\n+\t\t\t/*\n+\t\t\t * Validate minimal Element Container attribute length\n+\t\t\t */\n+\t\t\tif (attr_len < 1)\n+\t\t\t\tbreak;\n+\n+\t\t\tentry = os_malloc(sizeof(*entry));\n+\t\t\tif (!entry)\n+\t\t\t\tgoto fail;\n+\n+\t\t\tentry->ptr = pos;\n+\t\t\tentry->len = attr_len;\n+\t\t\tdl_list_add_tail(&attrs->element_container,\n+\t\t\t\t\t &entry->list);\n+\t\t\tbreak;\n+\t\tcase NAN_ATTR_CSIA:\n+\t\t\tif (attr_len < sizeof(struct nan_cipher_suite_info) +\n+\t\t\t\t       sizeof(struct nan_cipher_suite))\n+\t\t\t\tbreak;\n+\n+\t\t\tattrs->cipher_suite_info = pos;\n+\t\t\tattrs->cipher_suite_info_len = attr_len;\n+\t\t\tbreak;\n+\t\tcase NAN_ATTR_SCIA:\n+\t\t\tif (attr_len < sizeof(struct nan_sec_ctxt))\n+\t\t\t\tbreak;\n+\n+\t\t\tattrs->sec_ctxt_info = pos;\n+\t\t\tattrs->sec_ctxt_info_len = attr_len;\n+\t\t\tbreak;\n+\t\tcase NAN_ATTR_SHARED_KEY_DESCR:\n+\t\t\tif (attr_len < sizeof(struct nan_shared_key) +\n+\t\t\t\t       sizeof(struct wpa_eapol_key))\n+\t\t\t\tbreak;\n+\n+\t\t\tattrs->shared_key_desc = pos;\n+\t\t\tattrs->shared_key_desc_len = attr_len;\n+\t\t\tbreak;\n+\t\tcase NAN_ATTR_MASTER_INDICATION:\n+\t\tcase NAN_ATTR_CLUSTER:\n+\t\tcase NAN_ATTR_NAN_ATTR_SERVICE_ID_LIST:\n+\t\tcase NAN_ATTR_SDA:\n+\t\tcase NAN_ATTR_CONN_CAPA:\n+\t\tcase NAN_ATTR_WLAN_INFRA:\n+\t\tcase NAN_ATTR_P2P_OPER:\n+\t\tcase NAN_ATTR_IBSS:\n+\t\tcase NAN_ATTR_MESH:\n+\t\tcase NAN_ATTR_FURTHER_NAN_SD:\n+\t\tcase NAN_ATTR_FURTHER_AVAIL_MAP:\n+\t\tcase NAN_ATTR_COUNTRY_CODE:\n+\t\tcase NAN_ATTR_RANGING:\n+\t\tcase NAN_ATTR_CLUSTER_DISCOVERY:\n+\t\tcase NAN_ATTR_UNALIGNED_SCHEDULE:\n+\t\tcase NAN_ATTR_RANGING_INFO:\n+\t\tcase NAN_ATTR_RANGING_SETUP:\n+\t\tcase NAN_ATTR_FTM_RANGING_REPORT:\n+\t\tcase NAN_ATTR_EXT_WLAN_INFRA:\n+\t\tcase NAN_ATTR_EXT_P2P_OPER:\n+\t\tcase NAN_ATTR_EXT_IBSS:\n+\t\tcase NAN_ATTR_EXT_MESH:\n+\t\tcase NAN_ATTR_PUBLIC_AVAILABILITY:\n+\t\tcase NAN_ATTR_SUBSC_SERVICE_ID_LIST:\n+\t\tcase NAN_ATTR_NDP_EXT:\n+\t\tcase NAN_ATTR_DCEA:\n+\t\tcase NAN_ATTR_NIRA:\n+\t\tcase NAN_ATTR_BPBA:\n+\t\tcase NAN_ATTR_S3:\n+\t\tcase NAN_ATTR_TPEA:\n+\t\tcase NAN_ATTR_VENDOR_SPECIFIC:\n+\t\t\twpa_printf(MSG_DEBUG, \"NAN: ignore attr=%u\", id);\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\twpa_printf(MSG_DEBUG, \"NAN: unknown attr=%u\", id);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tpos += attr_len;\n+\t}\n+\n+\t/* Parsing is considered success only if all attributes were consumed */\n+\tif (pos == end)\n+\t\treturn 0;\n+\n+fail:\n+\tnan_attrs_clear(nan, attrs);\n+\treturn -1;\n+}\n+\n+\n+/*\n+ * nan_is_naf - Check if a given frame is a NAN action frame\n+ *\n+ * @nan: NAN module context from nan_init()\n+ * @mgmt: NAN action frame\n+ * @len: Length of the management frame in octets\n+ * Returns: true if NAF; otherwise false\n+ */\n+bool nan_is_naf(struct nan_data *nan, const struct ieee80211_mgmt *mgmt,\n+\t\tsize_t len)\n+{\n+\tu8 subtype;\n+\n+\t/*\n+\t * 802.11 header + category + NAN action frame minimal + subtype (1)\n+\t */\n+\tif (len < IEEE80211_MIN_ACTION_LEN(naf)) {\n+\t\twpa_printf(MSG_DEBUG, \"Too short NAN frame\");\n+\t\treturn false;\n+\t}\n+\n+\tif (mgmt->u.action.u.naf.action_code != WLAN_PA_VENDOR_SPECIFIC ||\n+\t    mgmt->u.action.u.naf.oui[0] != ((OUI_WFA >> 16) & 0xff) ||\n+\t    mgmt->u.action.u.naf.oui[1] != ((OUI_WFA >> 8)  & 0xff) ||\n+\t    mgmt->u.action.u.naf.oui[2] != (OUI_WFA & 0xff) ||\n+\t    mgmt->u.action.u.naf.oui_type != NAN_TYPE_NAF)\n+\t\treturn false;\n+\n+\tsubtype = mgmt->u.action.u.naf.subtype;\n+\n+\tif (mgmt->u.action.category != WLAN_ACTION_PUBLIC &&\n+\t    !(subtype >= NAN_SUBTYPE_DATA_PATH_REQUEST &&\n+\t      subtype <= NAN_SUBTYPE_DATA_PATH_TERMINATION &&\n+\t      mgmt->u.action.category == WLAN_ACTION_PROTECTED_DUAL)) {\n+\t\twpa_printf(MSG_DEBUG, \"NAN: Invalid action category for NAF\");\n+\t\treturn false;\n+\t}\n+\n+\treturn true;\n+}\n+\n+\n+/*\n+ * nan_parse_naf - Parse a NAN Action frame content\n+ *\n+ * @nan: NAN module context from nan_init()\n+ * @mgmt: NAN action frame.\n+ * @len: Length of the management frame in octets\n+ * @msg: Buffer for returning parsed attributes\n+ * Returns: 0 on success; positive or negative indicate an error\n+ *\n+ * Note: in case of success, the caller must free temporary memory allocations\n+ * by calling nan_attrs_clear() when the parsed data is not needed anymore. In\n+ * addition, as the &mgmt is referenced from the returned structure, the caller\n+ * must ensure that the frame buffer remains valid an unmodified as long as the\n+ * &msg object is used.\n+ */\n+int nan_parse_naf(struct nan_data *nan, const struct ieee80211_mgmt *mgmt,\n+\t\t  size_t len, struct nan_msg *msg)\n+{\n+\tif (!nan_is_naf(nan, mgmt, len))\n+\t\treturn -1;\n+\n+\twpa_printf(MSG_DEBUG, \"NAN: Parse NAF\");\n+\n+\tmsg->oui_type = mgmt->u.action.u.naf.oui_type;\n+\tmsg->oui_subtype = mgmt->u.action.u.naf.subtype;\n+\n+\tmsg->mgmt = mgmt;\n+\tmsg->len = len;\n+\n+\treturn nan_parse_attrs(nan,\n+\t\t\t       mgmt->u.action.u.naf.variable,\n+\t\t\t       len - IEEE80211_MIN_ACTION_LEN(naf),\n+\t\t\t       &msg->attrs);\n+}\ndiff --git a/wpa_supplicant/Makefile b/wpa_supplicant/Makefile\nindex af6c9bd342..b247b6b827 100644\n--- a/wpa_supplicant/Makefile\n+++ b/wpa_supplicant/Makefile\n@@ -332,6 +332,7 @@ ifdef NEED_NAN\n OBJS += nan_supplicant.o\n OBJS += ../src/nan/nan.o\n OBJS += ../src/common/nan_de.o\n+OBJS += ../src/nan/nan_util.o\n endif\n \n ifdef CONFIG_PR\n",
    "prefixes": [
        "07/58"
    ]
}