From patchwork Mon Jul 15 06:12:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chin-Ran Lo X-Patchwork-Id: 1960437 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=F/VF2e3b; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.a=rsa-sha256 header.s=selector2 header.b=MYiojD2A; 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 4WMsMC0qxvz1xqc for ; Mon, 15 Jul 2024 16:13:07 +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=lTg7kddpX+a4IMLPTDQgplL/b+yDoc47blg0kXAVRDQ=; b=F/VF2e3bGn+Tvd QYVEQV+DICqpvJj+Rm06UQUm/DRxfZQ85tfwG/2DUySZgVtElK5Pe3k8skQVRVRrRRwzAqlsHCL4k J572FZy29bLyVIRfJXnOhSwC8WF7QCg1vpyNA44WJi885gxhNacU4WIXc7HcuNmtwzWd1iyIHCZZA BDmY/2siJ3L2kpO0hOJLVzrPniLO4P1cvszl43pmo6raj4Y+sQqqxBr8j3BppXwFrYtoGQdUKPHkC gHa3dAoegdoNnAc3cknghSGVxBCfMUUpbHJn/vTTRRWhHBPZONBQFrUUZ95v88qX8zZUYhA63yAOY qr3Ka3zTJQC+4t5X4Lng==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sTEwk-00000005zok-0FSm; Mon, 15 Jul 2024 06:12:26 +0000 Received: from [2a01:111:f403:c200::1] (helo=DB3PR0202CU003.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sTEwf-00000005zo5-11O1 for hostap@lists.infradead.org; Mon, 15 Jul 2024 06:12:23 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=FXV6i4nbuh/OhQBFCZwXbQEh+F6isw1aFtSnWed/alRgzSje1YJjXDDMy5nvmQlZy8JuyiYKk2rBrWJn7BOqmu90OXqwJO8NRdRnAWJXDmlVWo90B+5WoKHHvSYjogwtgDAyt4uz7lcga33gcirdpLwLeJkIOMoD/ofk2bKjbpSw3Bplfosqm4vwJZDPqiWC0VeudfqUqnMTDlfNtytygez4/WHcfTIv0Gcl50M1hOYISAGVvKBuSFYupZ45W4NogtYzF+J41K9Z6pTdfRxPIFMR29ornWF0mfvGwuJrfCi1uYlEaBEResHyOLGnejwtDIHpYrgOlasHjP8E9YWTLw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=cB6/6zhl52ggsLUh2zIKYtgmLRf5CoQHhbSnj+yqUOM=; b=K3kLVDXuILC07syHUHnHkiD3ZPXtjWZErOGANUnC+LisjVDHgKIM99/nJURDM/0uiQeDDGzMDGpcbUqJQ3WBhOxhf2Go0dMD9mpaFDGqKwboj4Qjl0GM/KAr3pacx+O7oML5RZGouDZwbJV2TBfPGI1uYHxI0YrnYtHCHl8EzOWbB05qQodHw31Iank9D0IRYWF+ggFV2Rc55sQZM20kJnZ7e/f0MlUtWRDkmx2Nb2WBsZoHEtRJE1FwAIcQ7F/Oa5dmvpEN9FiS74DcD4H9U/8kWkbyWfIH2NJ+ZHnjj0bitixwFnH4yVBiMPBz7MF/a6of1WW29WNPPyO6BpcxXA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=cB6/6zhl52ggsLUh2zIKYtgmLRf5CoQHhbSnj+yqUOM=; b=MYiojD2Am4+VFdcf4l3i29TPaStZI7cSGQbdfw2Do0aczauzTGxPVNN4eVMlTXXA+z8r/HhkmJQXIMen5grjH9K/+rip+QN7MHJyBRVxJeAhERLzeHJxFET8C6baofTY0Q6joalmmApsXycmUONkBgIukFS6XKORHaziQRwqwZY= Received: from DU0PR04MB9396.eurprd04.prod.outlook.com (2603:10a6:10:35b::9) by AM8PR04MB7730.eurprd04.prod.outlook.com (2603:10a6:20b:242::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7762.28; Mon, 15 Jul 2024 06:12:08 +0000 Received: from DU0PR04MB9396.eurprd04.prod.outlook.com ([fe80::34a2:5975:cf64:a72c]) by DU0PR04MB9396.eurprd04.prod.outlook.com ([fe80::34a2:5975:cf64:a72c%7]) with mapi id 15.20.7762.025; Mon, 15 Jul 2024 06:12:07 +0000 From: Chin-Ran Lo To: "hostap@lists.infradead.org" CC: Chin-Ran Lo , Pete Hsieh Subject: [PATCH v2] Add the similar USD APIs to dbus control interface that other apps can use the functions Thread-Topic: [PATCH v2] Add the similar USD APIs to dbus control interface that other apps can use the functions Thread-Index: AdrWfdCh0aDFTjqPSvO8UcMndgy7+g== Date: Mon, 15 Jul 2024 06:12:07 +0000 Message-ID: Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: DU0PR04MB9396:EE_|AM8PR04MB7730:EE_ x-ms-office365-filtering-correlation-id: ac876fcc-bc83-42d3-b298-08dca4950e5c x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|1800799024|366016|376014|38070700018; x-microsoft-antispam-message-info: 44j7CnpWbnj7ERZjjvGfgzJTxxKNlAQSvVKZrXN1tjKwJnGU9ROIzVOIy0tays3myGKVwdjwhz57zPxAt0C2Vy6ob9gHUsLs9TSnbkyAeBosyBcjd8s3kExjcpBY2BJAMDXXmr6uZYYQGo2/KZ307TrP1dI/Y2u9Hhd+bb7TvmIY01mBVXyiVX9QeoG0xRVrWQja/2JQimu+EUKImyuXmiRpMCAYxPuqGjKXMo/MPWg6ru9p8TqepmPyQWdeMYqNW3VuuokmSG5Fr6GcNbs6oTqVWheWK+yf3Jn6BVwuyGkQaYZ2SE3tEr5BRhgF5vgxK+JZgDPj+ksndr4soHpmV9m2YU1RaE/dO/H7zl74a2LW7P17ayOoBUpzYYgVMNuq7NrL2IobC1U59lmOgcVYG41HGyJJV6eOgYXxXtjbrDNTNW4Cr25Ska6Vxydxtp3FoQr/+JAMotOXGmcts4wDrXRokVWkq7s7QET9g9iAUW5Ez+cS67eJSrwzJxKljYvd5cRaBw1xvUHwJnh9hI1FxNlzE1gReHnmT/1SxOVfHu3e5TKBkbqxR1fsQXeMTcM3k9NhM1Zd/0lRruXaVIMLsJuRGq8yqcCgb50PWCw+X6dIlPIrTmbirdEmHroEdCzFOZ2Khl2Nm4A0vp/uLrKIIsEUoAhXkHwHpXSEgTfEIpEoR4h4AQohPaJqJeI0+u+vlCikDp+1TTjOrAPdORSHk5nZX0DPK1xYlfR41GlqgLy3/HHiJ3IDVGtroZU7Vt/P1iYtMYY/AH3un9fq2ipo+bqG89VmzHAEdxds2JQbN4bGtGmfCZY2+RThhCZ9e6RcgdM9YfXIf7jIMQ/vCdh1CJMj2HGr2z587S9DrGLD/quDfms82Pg1CC0D7+SH0NiDGCa/IBxe/v4wFwZ1AIv0eixA8MZ+wxXgn4L1f7qLSP89NmksBCSIEkkAYBmIM7a14/raAuqYH3edrgLtpXSeawTMr6EdPQMqsz3bP8EIUWUGihmN/Iy/mnh1zUaDCbxMjP+OLLx4BQ1Hv8jagd/16EQutZUEuITD6+QMu7ZsqqOc4RM/sFwB2Zmbmaum7x5xKIZyfmURY3CC5wpJNQw+uXz86EtlzNH91hFfiCMLMZyXTrgOh98QLbeRIF0TfjrugJ5e49r38mJ6HIFlZsuKmeuw3pHTKemqtU4sNvIObrHJbMkzOl80nlOgLyClEgHUAQhQG2icsPtFuqtUBUyAcP25jbjbGWEveUhXr87+kHU030xhgWfK8MhfGQKBLhcl77uWltokpBKMK1ISYDsl1DrD6Cle5ALM5CWQkqdu5Uxxb1kkaslS3VHGf9pyQWgZES7+RUJqJ2cjwgW4gEH4H5lDeP90VyXkcnWm2eOn3Hh6NKJI1730Yk87vzXSJ+mimD3fXhcPnsSBWdqNK5gRDQ== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DU0PR04MB9396.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(38070700018);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: da4+vAIvfpwy40FzTV1xCkWu6QA36On5DeEtnVPVA5vjToSyCNYXJ7o8YcXevX54PQOk0/42Kg8sK0YUhQeqagZ4CvfzSor7pRHk7hL7maNF2g+CEpqqa9ECWb0oEgxXGZQQgWPGDZB+MSHEXXvKj+ilPTIzI23/mmjwgpyz9p4nRZsWa1W9rcWI3D8p6deUBn+V2bljL9r1NQtg3wXoVvoG1uwU8dqqmKrKvIXi4wnZ4tk1v+n7ICDeFA6tiBmjJ+uZoqSTwFiKeO7LyaW5iQ2haWXwl3RrHPZRY3NB4GQZMK5UJDFv5e2pdYfKxxqKcUby7jfhibA0dm21rvo2hoQ4UMPqEoM1gp41pSZWvQRqecDuhMC3mAzAUHqy3H21Z7HhLqKcf9dKhnY09fOHYxTROOp97G6e0KNinDJxPdw3NFYtHCDASEVbmFzHrgsfQA/clGoedRwoXsqpx51nEQQHeW2R1ue5o7ejGNpBEfqRZ9s9f6DxYdwTVybXuOv8nxyYJBbNGeALOm+rJ4G5BmF9HQ1zv9po5aifYBhcddUF3W27rgvrCgTeyzKjL9Li2as6MwlbHdIObM997ZFP+No9oXmCmXnwPG9l75405t8ikrv8Wu1h0nra898TlKHT1FEOMgbM5A/rKT+4xzrmTMjEBCWjbvjx6UvGaUAYmuxf3cZPYW8JToeIF+8KXDduRpwJRAFFdxMepgkSVi2aLQ0NmiLG2MWYkdStg1hGBhU0B4Q/CbUnw4wsFfNTn3LmitfKVJO7BqnQKQ21gpy9YFHRtOyXjr0U/20tsg1UqSlNDu1Yg5hPexpZY5L0MPNUzgE6sNABDyA7VtKJ5zOFvuFpqyRfjVtgn5JK3VVyK3+lSRnq8YRF4InO+K4TnJQXAcuGcAUly/OvP0JaqpdW5MLZXCUXKRzMs8RZ4+L1V2ASVkPwW2o3JlaMiEknGp3N325+YVHVztZ3S/cGkaVT21+Rz32BQt8GDnKYx3HLtpaqvuebYTMinlb1JTIs9Tb5QCFRSawut38X8Nlmla6yGoB7SEtlOqRkUgSEmLoJH8hD1RB23U2j9knnzOxuC75HibsXjPe1yDXNPKUGKCOMvrVAVnWLWzUT5uW+vljPnKC99Um151/b72GX1oQDicvhiugK3sHJN6ofxHcZqNgxTiscPtsOjgP1AV04CvVZJZEO04+ThPBgukvHwpDvlaKH89VTwHv39EnxHpvvk/3OanHLLF2bzkA7YiDqTju2Tua/HzFi1nNK4T3+TRbJc9IfZUzpYuAlWeErjmSUdqu1TqWVG+fud5sCOvsqyTEvnb5JeWhYh6lxuRblR49YSGwkoJzBNFxu+VWFXisH5LcFiGZ7YtTt0wct+etB6afx52EO9qCO7cLvUEP4aukqJ5IX4R/XynuouXTcTX1LnXpRyexDwwpGyRBYMdCevyuzpt2BV2Vj0bIpIH8FMDdB7yfgypI6Zl5dTB3NcMJ+jBZ1qn9nzeP54Vre80xki1cFyNpUh1vT5jZEnHfc86kokw6uZojAkDIlMv8dp42iFod12Xce9cjjdWy4b42hVORoTBVKMh73/3tcqc3bxGbmMDTz MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DU0PR04MB9396.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: ac876fcc-bc83-42d3-b298-08dca4950e5c X-MS-Exchange-CrossTenant-originalarrivaltime: 15 Jul 2024 06:12:07.7724 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: ymXfqh8Uiy4+ceTU07clhh5hOgISsW5DXKKleH/zzat+9rbl2KlnDSReooSbmQOMMsLkBKZtWqN2FlXcP3g9BQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM8PR04MB7730 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240714_231221_499828_76C72301 X-CRM114-Status: GOOD ( 17.68 ) X-Spam-Score: -1.4 (-) 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 7449675abaefa5e7958ed51296c99f6d4441e0f0 Mon Sep 17 00:00:00 2001 From: "Lo,Chin-Ran" Date: Mon, 15 Jul 2024 14:01:11 +0800 Subject: [PATCH v2] Add the similar USD APIs to d [...] Content analysis details: (-1.4 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 0.0 T_SPF_PERMERROR SPF: test of record failed (permerror) -0.0 SPF_HELO_PASS SPF: HELO matches SPF record -0.1 ARC_VALID Message has a valid ARC signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.0 ARC_SIGNED Message has a ARC signature -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.8 RDNS_NONE Delivered to internal network by a host with no rDNS 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 7449675abaefa5e7958ed51296c99f6d4441e0f0 Mon Sep 17 00:00:00 2001 From: "Lo,Chin-Ran" Date: Mon, 15 Jul 2024 14:01:11 +0800 Subject: [PATCH v2] Add the similar USD APIs to dbus control interface that other apps can use the functions Signed-off-by: Lo,Chin-Ran --- Changelog since v1: - Not replacing tab with spaces - Add the NANCancelPublish and NANSubscribe dbus method that app can stop after jobs are done wpa_supplicant/dbus/dbus_new.c | 146 +++++++++ wpa_supplicant/dbus/dbus_new.h | 19 ++ wpa_supplicant/dbus/dbus_new_handlers.c | 381 ++++++++++++++++++++++++ wpa_supplicant/dbus/dbus_new_handlers.h | 13 +- wpa_supplicant/dbus/dbus_new_helpers.h | 13 + wpa_supplicant/nan_usd.c | 6 +- wpa_supplicant/notify.c | 11 + wpa_supplicant/notify.h | 4 + 8 files changed, 591 insertions(+), 2 deletions(-) diff --git a/wpa_supplicant/dbus/dbus_new.c b/wpa_supplicant/dbus/dbus_new.c index 00b38edf5..97539666b 100644 --- a/wpa_supplicant/dbus/dbus_new.c +++ b/wpa_supplicant/dbus/dbus_new.c @@ -220,6 +220,98 @@ void wpas_dbus_signal_scan_done(struct wpa_supplicant *wpa_s, int success) dbus_message_unref(msg); } +/** + * wpas_dbus_signal_discovery_result - send discovery result signal + * @wpa_s: %wpa_supplicant network interface data + * @success: indicates if scanning succeed or failed + * + * Notify listeners about finishing a scan + */ +void wpas_dbus_signal_discovery_result(struct wpa_supplicant *wpa_s, int success, int subscribe_id, int peer_publish_id, const u8 *peer_addr) +{ + struct wpas_dbus_priv *iface; + DBusMessage *msg; + DBusMessageIter iter, dict_iter; + dbus_bool_t succ; + struct wpa_dbus_discov_info disc_info; + + iface = wpa_s->global->dbus; + + /* Do nothing if the control interface is not turned on */ + if (iface == NULL || !wpa_s->dbus_new_path) + return; + + msg = dbus_message_new_signal(wpa_s->dbus_new_path, + WPAS_DBUS_NEW_IFACE_INTERFACE, + "DiscoveryResult"); + if (msg == NULL) + return; + + dbus_message_iter_init_append(msg, &iter); + succ = success ? TRUE : FALSE; + disc_info.subscribe_id = subscribe_id; + disc_info.peer_publish_id = peer_publish_id; + memcpy(disc_info.peer_addr, peer_addr, ETH_ALEN); + + if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &succ) || + !wpa_dbus_dict_open_write(&iter, &dict_iter) || + !wpa_dbus_dict_append_byte_array(&dict_iter, "discov_info", + (const char *) &disc_info, + sizeof(disc_info)) || + !wpa_dbus_dict_close_write(&iter, &dict_iter)) + wpa_printf(MSG_ERROR, "dbus: Failed to construct signal"); + else + dbus_connection_send(iface->con, msg, NULL); + dbus_message_unref(msg); +} + +/** + * wpas_dbus_signal_nan_receive - send receive nan-usd packet signal + * @wpa_s: %wpa_supplicant network interface data + * @success: indicates if scanning succeed or failed + * + * Notify listeners about finishing a scan + */ +void wpas_dbus_signal_nan_receive(struct wpa_supplicant *wpa_s, int id, int peer_id, const u8 *peer_addr, size_t ssi_len, const u8 *ssi) +{ + struct wpas_dbus_priv *iface; + DBusMessage *msg; + DBusMessageIter iter, dict_iter; + struct wpa_dbus_nanrx_info nanrx_info; + + iface = wpa_s->global->dbus; + + /* Do nothing if the control interface is not turned on */ + if (iface == NULL || !wpa_s->dbus_new_path) + return; + + msg = dbus_message_new_signal(wpa_s->dbus_new_path, + WPAS_DBUS_NEW_IFACE_INTERFACE, + "NanReceive"); + if (msg == NULL) + return; + + dbus_message_iter_init_append(msg, &iter); + nanrx_info.id = id; + nanrx_info.peer_id = peer_id; + memcpy(nanrx_info.peer_addr, peer_addr, ETH_ALEN); + nanrx_info.ssi_len = ssi_len; + + if (!wpa_dbus_dict_open_write(&iter, &dict_iter) || + !wpa_dbus_dict_append_byte_array(&dict_iter, "nanrx_info", + (const char *) &nanrx_info, + sizeof(nanrx_info)) || + !wpa_dbus_dict_append_byte_array(&dict_iter, "ssi", + (const char *) ssi, + ssi_len) || + !wpa_dbus_dict_close_write(&iter, &dict_iter)) + wpa_printf(MSG_ERROR, "dbus: Failed to construct signal"); + else + dbus_connection_send(iface->con, msg, NULL); + dbus_message_unref(msg); +} + + /** * wpas_dbus_signal_bss - Send a BSS related event signal @@ -3605,6 +3697,44 @@ static const struct wpa_dbus_method_desc wpas_dbus_interface_methods[] = { } }, #endif /* CONFIG_AUTOSCAN */ +#ifdef CONFIG_NAN_USD + { "NANPublish", WPAS_DBUS_NEW_IFACE_INTERFACE, + (WPADBusMethodHandler) wpas_dbus_handler_nan_publish, + { + { "nan_args", "s", ARG_IN }, + { "publish_id", "i", ARG_OUT }, + END_ARGS + } + }, + { "NANCancelPublish", WPAS_DBUS_NEW_IFACE_INTERFACE, + (WPADBusMethodHandler) wpas_dbus_handler_nan_cancel_publish, + { + { "nan_args", "s", ARG_IN }, + END_ARGS + } + }, + { "NANSubscribe", WPAS_DBUS_NEW_IFACE_INTERFACE, + (WPADBusMethodHandler) wpas_dbus_handler_nan_subscribe, + { + { "nan_args", "s", ARG_IN }, + END_ARGS + } + }, + { "NANCancelSubscribe", WPAS_DBUS_NEW_IFACE_INTERFACE, + (WPADBusMethodHandler) wpas_dbus_handler_nan_cancel_subscribe, + { + { "nan_args", "s", ARG_IN }, + END_ARGS + } + }, + { "NANTransmit", WPAS_DBUS_NEW_IFACE_INTERFACE, + (WPADBusMethodHandler) wpas_dbus_handler_nan_transmit, + { + { "nan_args", "s", ARG_IN }, + END_ARGS + } + }, +#endif /* CONFIG_NAN_USD */ #ifdef CONFIG_TDLS { "TDLSDiscover", WPAS_DBUS_NEW_IFACE_INTERFACE, (WPADBusMethodHandler) wpas_dbus_handler_tdls_discover, @@ -3983,6 +4113,22 @@ static const struct wpa_dbus_signal_desc wpas_dbus_interface_signals[] = { END_ARGS } }, +#ifdef CONFIG_NAN_USD + { "DiscoveryResult", WPAS_DBUS_NEW_IFACE_INTERFACE, + { + { "success", "b", ARG_OUT }, + { "discov_info", "a{sv}", ARG_OUT }, + END_ARGS + } + }, + { "NANReceive", WPAS_DBUS_NEW_IFACE_INTERFACE, + { + { "nanrx_info", "a{sv}", ARG_OUT }, + { "ssi", "a{sv}", ARG_OUT }, + END_ARGS + } + }, +#endif /* CONFIG_NAN_USD */ { "BSSAdded", WPAS_DBUS_NEW_IFACE_INTERFACE, { { "path", "o", ARG_OUT }, diff --git a/wpa_supplicant/dbus/dbus_new.h b/wpa_supplicant/dbus/dbus_new.h index b653f10f9..d58ede9c1 100644 --- a/wpa_supplicant/dbus/dbus_new.h +++ b/wpa_supplicant/dbus/dbus_new.h @@ -21,6 +21,9 @@ struct wpa_bss; struct wps_event_m2d; struct wps_event_fail; struct wps_credential; +#ifdef CONFIG_NAN_USD +struct wpa_dbus_discov_info; +#endif /* CONFIG_NAN_USD */ enum wpas_dbus_prop { WPAS_DBUS_PROP_AP_SCAN, @@ -168,6 +171,10 @@ void wpas_dbus_signal_network_request(struct wpa_supplicant *wpa_s, enum wpa_ctrl_req_type rtype, const char *default_text); void wpas_dbus_signal_scan_done(struct wpa_supplicant *wpa_s, int success); +#ifdef CONFIG_NAN_USD +void wpas_dbus_signal_discovery_result(struct wpa_supplicant *wpa_s, int success, int subscribe_id, int peer_publish_id, const u8 *peer_addr); +void wpas_dbus_signal_nan_receive(struct wpa_supplicant *wpa_s, int id, int peer_id, const u8 *peer_addr, size_t ssi_len, const u8 *ssi); +#endif /* CONFIG_NAN_USD */ void wpas_dbus_signal_wps_cred(struct wpa_supplicant *wpa_s, const struct wps_credential *cred); void wpas_dbus_signal_wps_event_m2d(struct wpa_supplicant *wpa_s, @@ -328,6 +335,18 @@ static inline void wpas_dbus_signal_scan_done(struct wpa_supplicant *wpa_s, { } +#ifdef CONFIG_NAN_USD +static inline void wpas_dbus_signal_discovery_result(struct wpa_supplicant *wpa_s, + int success, int subscribe_id, int peer_publish_id, const u8 *peer_addr) +{ +} + +static inline void wpas_dbus_signal_nan_receive(struct wpa_supplicant *wpa_s, + int id, int peer_id, const u8 *peer_addr, size_t ssi_len, const u8 *ssi) +{ +} +#endif /* CONFIG_NAN_USD */ + static inline void wpas_dbus_signal_wps_cred(struct wpa_supplicant *wpa_s, const struct wps_credential *cred) { diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c b/wpa_supplicant/dbus/dbus_new_handlers.c index 6ad49a136..2831ad6ff 100644 --- a/wpa_supplicant/dbus/dbus_new_handlers.c +++ b/wpa_supplicant/dbus/dbus_new_handlers.c @@ -12,6 +12,9 @@ #include "common.h" #include "common/ieee802_11_defs.h" +#ifdef CONFIG_NAN_USD +#include "common/nan_de.h" +#endif /* CONFIG_NAN_USD */ #include "eap_peer/eap_methods.h" #include "eapol_supp/eapol_supp_sm.h" #include "rsn_supp/wpa.h" @@ -27,6 +30,9 @@ #include "../autoscan.h" #include "../ap.h" #include "../interworking.h" +#ifdef CONFIG_NAN_USD +#include "../nan_usd.h" +#endif /* CONFIG_NAN_USD */ #include "dbus_new_helpers.h" #include "dbus_new.h" #include "dbus_new_handlers.h" @@ -2705,6 +2711,381 @@ DBusMessage * wpas_dbus_handler_eap_logon(DBusMessage *message, return NULL; } +#ifdef CONFIG_NAN_USD +/* + * wpas_dbus_handler_nan_publish - Send out nan-publish packets + * @message: Pointer to incoming dbus message + * @wpa_s: wpa_supplicant structure for a network interface + * Returns: NULL indicating success or DBus error message on failure + * + * Handler function for "NANPublish" method call of network interface. + */ +DBusMessage * wpas_dbus_handler_nan_publish(DBusMessage *message, + struct wpa_supplicant *wpa_s) +{ + const char *cmd; + char cmdbuf[128]; + + char *token, *context = NULL; + int publish_id; + struct nan_publish_params params; + const char *service_name = NULL; + struct wpabuf *ssi = NULL; + enum nan_service_protocol_type srv_proto_type = 3; + int *freq_list = NULL; + + wpa_printf(MSG_INFO, "DBUS NAN_PUBLISH:"); + if (!dbus_message_get_args(message, NULL, + DBUS_TYPE_STRING, &cmd, + DBUS_TYPE_INVALID)) { + wpa_printf(MSG_DEBUG, " DBUS NAN_PUBLISH, failed to get args "); + return NULL; + } + wpa_printf(MSG_DEBUG, "DBUS NAN_PUBLISH: args: [%s]", cmd); + + os_memset(¶ms, 0, sizeof(params)); + /* USD shall use both solicited and unsolicited transmissions */ + params.unsolicited = true; + params.solicited = true; + /* USD shall require FSD without GAS */ + params.fsd = true; + params.freq = NAN_USD_DEFAULT_FREQ; + strcpy(cmdbuf, cmd); + + while ((token = str_token(cmdbuf, " ", &context))) { + if (os_strncmp(token, "service_name=", 13) == 0) { + service_name = token + 13; + wpa_printf(MSG_DEBUG, "DBUS NAN_PUBLISH, service_name=[%s]", service_name); + continue; + } + + if (os_strncmp(token, "ttl=", 4) == 0) { + params.ttl = atoi(token + 4); + wpa_printf(MSG_DEBUG, "DBUS NAN_PUBLISH, ttl=[%d]", params.ttl); + continue; + } + + if (os_strncmp(token, "freq=", 5) == 0) { + params.freq = atoi(token + 5); + wpa_printf(MSG_DEBUG, "DBUS NAN_PUBLISH, freq=[%d]", params.ttl); + continue; + } + + if (os_strncmp(token, "freq_list=", 10) == 0) { + char *pos = token + 10; + if (os_strcmp(pos, "all") == 0) { + os_free(freq_list); + freq_list = wpas_nan_usd_all_freqs(wpa_s); + params.freq_list = freq_list; + continue; + } + + while (pos && pos[0]) { + int_array_add_unique(&freq_list, atoi(pos)); + pos = os_strchr(pos, ','); + if (pos) + pos++; + } + + params.freq_list = freq_list; + continue; + } + + if (os_strncmp(token, "srv_proto_type=", 15) == 0) { + srv_proto_type = atoi(token + 15); + wpa_printf(MSG_DEBUG, " DBUS NAN_PUBLISH, srv_proto_type=[%d]", srv_proto_type); + continue; + } + + if (os_strncmp(token, "ssi=", 4) == 0) { + if (ssi) + goto fail; + ssi = wpabuf_parse_bin(token + 4); + if (!ssi) + goto fail; + continue; + } + + if (os_strcmp(token, "solicited=0") == 0) { + params.solicited = false; + continue; + } + + if (os_strcmp(token, "unsolicited=0") == 0) { + params.unsolicited = false; + continue; + } + + if (os_strcmp(token, "fsd=0") == 0) { + params.fsd = false; + continue; + } + + wpa_printf(MSG_DEBUG, "CTRL: Invalid NAN_PUBLISH parameter: %s", + token); + goto fail; + } + publish_id = wpas_nan_usd_publish(wpa_s, service_name, srv_proto_type, + ssi, ¶ms); + if (publish_id > 0) { + DBusMessage *reply; + reply = dbus_message_new_method_return(message); + dbus_message_append_args(reply, DBUS_TYPE_INT32, + &publish_id, DBUS_TYPE_INVALID); + return reply; + } +fail: + wpabuf_free(ssi); + os_free(freq_list); + return NULL; +} + +/* + * wpas_dbus_handler_nan_cancel_publish - Cancel the publish + * @message: Pointer to incoming dbus message + * @wpa_s: wpa_supplicant structure for a network interface + * Returns: NULL indicating success or DBus error message on failure + * + * Handler function for "NANCancelPublish" method call of network interface. + */ +DBusMessage * wpas_dbus_handler_nan_cancel_publish(DBusMessage *message, + struct wpa_supplicant *wpa_s) +{ + const char *cmd; + char cmdbuf[128]; + char *token, *context = NULL; + int publish_id = -1; + + wpa_printf(MSG_INFO, "DBUS NAN_CANCEL_PUBLISH:"); + if (!dbus_message_get_args(message, NULL, + DBUS_TYPE_STRING, &cmd, + DBUS_TYPE_INVALID)) { + wpa_printf(MSG_DEBUG, " DBUS NAN_CANCEL_PUBLISH, failed to get args "); + return NULL; + } + wpa_printf(MSG_DEBUG, "DBUS NAN_CANCEL_PUBLISH: args: [%s]", cmd); + strcpy(cmdbuf, cmd); + while ((token = str_token(cmdbuf, " ", &context))) { + if (os_strncmp(token, "publish_id=", 11) == 0) { + publish_id = atoi(token + 11); + wpa_printf(MSG_DEBUG, "DBUS NAN_CANCEL_PUBLISH, publish_id=[%d]", publish_id); + break; + } + wpa_printf(MSG_DEBUG, "CTRL: Invalid NAN_CANCEL_PUBLISH parameter: %s", + token); + goto fail; + } + + if ((!wpa_s->nan_de) || (publish_id == -1)) + return NULL; + nan_de_cancel_publish(wpa_s->nan_de, publish_id); +fail: + return NULL; +} + +/* + * wpas_dbus_handler_nan_subscribe - Send out nan-subscribe packets + * @message: Pointer to incoming dbus message + * @wpa_s: wpa_supplicant structure for a network interface + * Returns: NULL indicating success or DBus error message on failure + * + * Handler function for "NANSubscribe" method call of network interface. + */ +DBusMessage * wpas_dbus_handler_nan_subscribe(DBusMessage *message, + struct wpa_supplicant *wpa_s) +{ + const char *cmd; + char cmdbuf[128]; + char *token, *context = NULL; + struct nan_subscribe_params params; + const char *service_name = NULL; + struct wpabuf *ssi = NULL; + enum nan_service_protocol_type srv_proto_type = 3; + + wpa_printf(MSG_INFO, "DBUS NAN_SUBSCRIBE: "); + if (!dbus_message_get_args(message, NULL, + DBUS_TYPE_STRING, &cmd, + DBUS_TYPE_INVALID)) { + wpa_printf(MSG_DEBUG, "DBUS NAN_SUBSCRIBE, failed to get args "); + return NULL; + } + wpa_printf(MSG_DEBUG, "DBUS NAN_SUBSCRIBE, args: [%s]", cmd); + os_memset(¶ms, 0, sizeof(params)); + params.freq = NAN_USD_DEFAULT_FREQ; + + strcpy(cmdbuf, cmd); + while ((token = str_token(cmdbuf, " ", &context))) { + if (os_strncmp(token, "service_name=", 13) == 0) { + service_name = token + 13; + continue; + } + + if (os_strcmp(token, "active=1") == 0) { + params.active = true; + continue; + } + + if (os_strncmp(token, "ttl=", 4) == 0) { + params.ttl = atoi(token + 4); + continue; + } + + if (os_strncmp(token, "freq=", 5) == 0) { + params.freq = atoi(token + 5); + continue; + } + + if (os_strncmp(token, "srv_proto_type=", 15) == 0) { + srv_proto_type = atoi(token + 15); + continue; + } + + if (os_strncmp(token, "ssi=", 4) == 0) { + if (ssi) + goto fail; + ssi = wpabuf_parse_bin(token + 4); + if (!ssi) + goto fail; + continue; + } + wpa_printf(MSG_INFO, + "DBUS: Invalid NAN_SUBSCRIBE parameter: %s", + token); + goto fail; + } + + wpas_nan_usd_subscribe(wpa_s, service_name, + srv_proto_type, ssi, + ¶ms); +fail: + wpabuf_free(ssi); + return NULL; +} + +/* + * wpas_dbus_handler_nan_cancel_publish - Cancel the subscription + * @message: Pointer to incoming dbus message + * @wpa_s: wpa_supplicant structure for a network interface + * Returns: NULL indicating success or DBus error message on failure + * + * Handler function for "NANCancelSubscribe" method call of network interface. + */ +DBusMessage * wpas_dbus_handler_nan_cancel_subscribe(DBusMessage *message, + struct wpa_supplicant *wpa_s) +{ + const char *cmd; + char cmdbuf[128]; + char *token, *context = NULL; + int subscribe_id = -1; + + wpa_printf(MSG_INFO, "DBUS NAN_CANCEL_SUBSCRIBE:"); + if (!dbus_message_get_args(message, NULL, + DBUS_TYPE_STRING, &cmd, + DBUS_TYPE_INVALID)) { + wpa_printf(MSG_DEBUG, " DBUS NAN_CANCEL_SUBSCRIBE, failed to get args "); + return NULL; + } + wpa_printf(MSG_DEBUG, "DBUS NAN_CANCEL_SUBSCRIBE: args: [%s]", cmd); + strcpy(cmdbuf, cmd); + while ((token = str_token(cmdbuf, " ", &context))) { + if (os_strncmp(token, "subscribe_id=", 13) == 0) { + subscribe_id = atoi(token + 13); + wpa_printf(MSG_DEBUG, "DBUS NAN_CANCEL_SUBSCRIBE, publish_id=[%d]", subscribe_id); + break; + } + wpa_printf(MSG_DEBUG, "DBUS: Invalid NAN_CANCEL_SUBSCRIBE parameter: %s", + token); + goto fail; + } + + if ((!wpa_s->nan_de)||(subscribe_id == -1)) + return NULL; + nan_de_cancel_subscribe(wpa_s->nan_de, subscribe_id); +fail: + return NULL; +} + + +/* + * wpas_dbus_handler_nan_transmit - Send out nan-followup packets + * @message: Pointer to incoming dbus message + * @wpa_s: wpa_supplicant structure for a network interface + * Returns: NULL indicating success or DBus error message on failure + * + * Handler function for "NANTransmit" method call of network interface. + */ +#define TX_CMD_DAT_BUFLEN 2048 +DBusMessage * wpas_dbus_handler_nan_transmit(DBusMessage *message, + struct wpa_supplicant *wpa_s) +{ + const char *cmd; + char cmdbuf[TX_CMD_DAT_BUFLEN]; + char *token, *context = NULL; + int handle = 0; + int req_instance_id = 0; + struct wpabuf *ssi = NULL; + u8 peer_addr[ETH_ALEN]; + int ret = -1; + + wpa_printf(MSG_INFO, "DBUS NAN_TRANSMIT:"); + os_memset(cmdbuf, 0, TX_CMD_DAT_BUFLEN); + if (!dbus_message_get_args(message, NULL, + DBUS_TYPE_STRING, &cmd, + DBUS_TYPE_INVALID)) { + wpa_printf(MSG_DEBUG, "DBUS NAN_TRANSMIT, failed to get args "); + return NULL; + } + wpa_printf(MSG_DEBUG, "DBUS NAN_TRANSMIT, args: [%s]", cmd); + os_memset(peer_addr, 0, ETH_ALEN); + strcpy(cmdbuf, cmd); + while ((token = str_token(cmdbuf, " ", &context))) { + if (sscanf(token, "handle=%i", &handle) == 1) + continue; + + if (sscanf(token, "req_instance_id=%i", &req_instance_id) == 1) + continue; + + if (os_strncmp(token, "address=", 8) == 0) { + if (hwaddr_aton(token + 8, peer_addr) < 0) + return NULL; + continue; + } + + if (os_strncmp(token, "ssi=", 4) == 0) { + if (ssi) + goto fail; + ssi = wpabuf_parse_bin(token + 4); + if (!ssi) + goto fail; + continue; + } + + wpa_printf(MSG_INFO, + "CTRL: Invalid NAN_TRANSMIT parameter: %s", + token); + goto fail; + } + + if (handle <= 0) { + wpa_printf(MSG_INFO, + "CTRL: Invalid or missing NAN_TRANSMIT handle"); + goto fail; + } + + if (is_zero_ether_addr(peer_addr)) { + wpa_printf(MSG_INFO, + "CTRL: Invalid or missing NAN_TRANSMIT address"); + goto fail; + } + + ret = wpas_nan_usd_transmit(wpa_s, handle, ssi, NULL, peer_addr, + req_instance_id); +fail: + wpa_printf(MSG_INFO, "DBUS NAN_TRANSMIT Done, %d", ret); + wpabuf_free(ssi); + return NULL; +} +#endif /* CONFIG_NAN_USD */ #ifdef CONFIG_TDLS diff --git a/wpa_supplicant/dbus/dbus_new_handlers.h b/wpa_supplicant/dbus/dbus_new_handlers.h index 97fa337bd..0af93df81 100644 --- a/wpa_supplicant/dbus/dbus_new_handlers.h +++ b/wpa_supplicant/dbus/dbus_new_handlers.h @@ -248,7 +248,18 @@ DECLARE_ACCESSOR(wpas_dbus_getter_mesh_peers); DECLARE_ACCESSOR(wpas_dbus_getter_mesh_group); DECLARE_ACCESSOR(wpas_dbus_getter_signal_change); - +#ifdef CONFIG_NAN_USD +DBusMessage * wpas_dbus_handler_nan_publish(DBusMessage *message, + struct wpa_supplicant *wpa_s); +DBusMessage * wpas_dbus_handler_nan_cancel_publish(DBusMessage *message, + struct wpa_supplicant *wpa_s); +DBusMessage * wpas_dbus_handler_nan_subscribe(DBusMessage *message, + struct wpa_supplicant *wpa_s); +DBusMessage * wpas_dbus_handler_nan_cancel_subscribe(DBusMessage *message, + struct wpa_supplicant *wpa_s); +DBusMessage * wpas_dbus_handler_nan_transmit(DBusMessage *message, + struct wpa_supplicant *wpa_s); +#endif /* CONFIG_NAN_USD */ DBusMessage * wpas_dbus_handler_tdls_discover(DBusMessage *message, struct wpa_supplicant *wpa_s); DBusMessage * wpas_dbus_handler_tdls_setup(DBusMessage *message, diff --git a/wpa_supplicant/dbus/dbus_new_helpers.h b/wpa_supplicant/dbus/dbus_new_helpers.h index c8d44a00b..87ef31000 100644 --- a/wpa_supplicant/dbus/dbus_new_helpers.h +++ b/wpa_supplicant/dbus/dbus_new_helpers.h @@ -98,7 +98,20 @@ struct wpa_dbus_property_desc { /* other data */ const char *data; }; +#ifdef CONFIG_NAN_USD +struct wpa_dbus_discov_info { + u32 subscribe_id; + u32 peer_publish_id; + u8 peer_addr[ETH_ALEN]; +}; +struct wpa_dbus_nanrx_info { + u32 id; + u32 peer_id; + u8 peer_addr[ETH_ALEN]; + u32 ssi_len; +}; +#endif /* CONFIG_NAN_USD */ #define WPAS_DBUS_OBJECT_PATH_MAX 150 #define WPAS_DBUS_INTERFACE_MAX 150 diff --git a/wpa_supplicant/nan_usd.c b/wpa_supplicant/nan_usd.c index 657b302c1..04a564580 100644 --- a/wpa_supplicant/nan_usd.c +++ b/wpa_supplicant/nan_usd.c @@ -14,7 +14,7 @@ #include "offchannel.h" #include "driver_i.h" #include "nan_usd.h" - +#include "notify.h" static const char * tx_status_result_txt(enum offchannel_send_action_result result) @@ -254,6 +254,8 @@ wpas_nan_de_discovery_result(void *ctx, int subscribe_id, subscribe_id, peer_publish_id, MAC2STR(peer_addr), fsd, fsd_gas, srv_proto_type, ssi_hex); os_free(ssi_hex); + + wpas_notify_discovery_result(wpa_s, 1, subscribe_id, peer_publish_id, peer_addr); } @@ -331,6 +333,8 @@ static void wpas_nan_de_receive(void *ctx, int id, int peer_instance_id, wpa_msg(wpa_s, MSG_INFO, NAN_RECEIVE "id=%d peer_instance_id=%d address=" MACSTR " ssi=%s", id, peer_instance_id, MAC2STR(peer_addr), ssi_hex); + + wpas_notify_nan_receive(wpa_s, id, peer_instance_id, peer_addr, ssi_len, ssi); os_free(ssi_hex); } diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c index 745234dda..61281a066 100644 --- a/wpa_supplicant/notify.c +++ b/wpa_supplicant/notify.c @@ -281,6 +281,17 @@ void wpas_notify_scan_done(struct wpa_supplicant *wpa_s, int success) wpas_dbus_signal_scan_done(wpa_s, success); } +#ifdef CONFIG_NAN_USD +void wpas_notify_discovery_result(struct wpa_supplicant *wpa_s, int success, int subscribe_id, int peer_publish_id, const u8 *peer_addr) +{ + wpas_dbus_signal_discovery_result(wpa_s, success, subscribe_id, peer_publish_id, peer_addr); +} + +void wpas_notify_nan_receive(struct wpa_supplicant *wpa_s, int id, int peer_id, const u8 *peer_addr, size_t ssi_len, const u8 *ssi) +{ + wpas_dbus_signal_nan_receive(wpa_s, id, peer_id, peer_addr, ssi_len, ssi); +} +#endif /* CONFIG_NAN_USD */ void wpas_notify_scan_results(struct wpa_supplicant *wpa_s) { diff --git a/wpa_supplicant/notify.h b/wpa_supplicant/notify.h index 2a0cf097a..105bf9dcd 100644 --- a/wpa_supplicant/notify.h +++ b/wpa_supplicant/notify.h @@ -47,6 +47,10 @@ void wpas_notify_network_request(struct wpa_supplicant *wpa_s, const char *default_txt); void wpas_notify_scanning(struct wpa_supplicant *wpa_s); void wpas_notify_scan_done(struct wpa_supplicant *wpa_s, int success); +#ifdef CONFIG_NAN_USD +void wpas_notify_discovery_result(struct wpa_supplicant *wpa_s, int success, int subscribe_id, int peer_publish_id, const u8 *peer_addr); +void wpas_notify_nan_receive(struct wpa_supplicant *wpa_s, int id, int peer_id, const u8 *peer_addr, size_t ssi_len, const u8 *ssi); +#endif /* CONFIG_NAN_USD */ void wpas_notify_scan_results(struct wpa_supplicant *wpa_s); void wpas_notify_wps_credential(struct wpa_supplicant *wpa_s, const struct wps_credential *cred);