From patchwork Fri Jul 1 14:34:28 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miquel Raynal X-Patchwork-Id: 12903459 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 08036C43334 for ; Fri, 1 Jul 2022 14:38:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233488AbiGAOiN (ORCPT ); Fri, 1 Jul 2022 10:38:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56476 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232249AbiGAOh5 (ORCPT ); Fri, 1 Jul 2022 10:37:57 -0400 Received: from relay12.mail.gandi.net (relay12.mail.gandi.net [217.70.178.232]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 379053BF92 for ; Fri, 1 Jul 2022 07:34:38 -0700 (PDT) Received: (Authenticated sender: miquel.raynal@bootlin.com) by mail.gandi.net (Postfix) with ESMTPSA id D1F2D200006; Fri, 1 Jul 2022 14:34:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1656686076; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=SC+efU5PqAwVLFuiqQsRReY/dRs97fikxOlstcwAtdM=; b=O4mj72JtqKPBVh1LuESHZX/trUxAu9Rr1HsTh4aYYh0LMOXPhLYRoF8RyPl7NHjML/rg4D 7gon1xOHUktLzDQCi9PbSOcpf0lB3wAav1O1Y3lEWyQywHpmHUjFAl0TdZgZXM0cBNSNaK jO+TNY8HKAmrKfTFeZYk0mTeLQec+gzu+LWrY8asRZMR/sFBzpcptkuvEWnkqmuNlzdfJU Yxqe1OkvClkVDQTikM5s5Hn7mH7nGvvAQcwzdKhWeL6eNmQDw0lxPVwDr4Nqeu6osgBxR8 3mXc6KERk2/zjM+iv3MLdoJRY4NyfsFWBm6AUvJgFYV5PD82wznLSM2rGXVcxg== From: Miquel Raynal To: Alexander Aring , Stefan Schmidt , linux-wpan@vger.kernel.org Cc: David Girault , Romuald Despres , Frederic Blain , Nicolas Schodet , Thomas Petazzoni , Romuald Despres , Miquel Raynal Subject: [PATCH wpan-tools 1/7] iwpan: Fix the channels printing Date: Fri, 1 Jul 2022 16:34:28 +0200 Message-Id: <20220701143434.1267864-2-miquel.raynal@bootlin.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220701143434.1267864-1-miquel.raynal@bootlin.com> References: <20220701143434.1267864-1-miquel.raynal@bootlin.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-wpan@vger.kernel.org From: Romuald Despres The presence of a channel capability is checked against the tb_msg netlink attributes array which is the root one, while here we are looking for channel capabilities, themselves being nested and parsed into tb_caps. Use tb_caps instead of tb_msg here otherwise we are accessing a random index in the upper attributes list. Signed-off-by: Romuald Despres Signed-off-by: Miquel Raynal --- src/info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/info.c b/src/info.c index f85690c..8ed5e4f 100644 --- a/src/info.c +++ b/src/info.c @@ -342,7 +342,7 @@ static int print_phy_handler(struct nl_msg *msg, void *arg) printf("\b \n"); } - if (tb_msg[NL802154_CAP_ATTR_CHANNELS]) { + if (tb_caps[NL802154_CAP_ATTR_CHANNELS]) { int counter = 0; int rem_pages; struct nlattr *nl_pages; From patchwork Fri Jul 1 14:34:29 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miquel Raynal X-Patchwork-Id: 12903460 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3D705CCA47B for ; Fri, 1 Jul 2022 14:38:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232222AbiGAOiO (ORCPT ); Fri, 1 Jul 2022 10:38:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56478 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232278AbiGAOh5 (ORCPT ); Fri, 1 Jul 2022 10:37:57 -0400 Received: from relay12.mail.gandi.net (relay12.mail.gandi.net [IPv6:2001:4b98:dc4:8::232]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BB2053D491 for ; Fri, 1 Jul 2022 07:34:39 -0700 (PDT) Received: (Authenticated sender: miquel.raynal@bootlin.com) by mail.gandi.net (Postfix) with ESMTPSA id 113FD20000F; Fri, 1 Jul 2022 14:34:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1656686078; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=i3NuLMYQGegEDlsYXHWQTxM+kmTZB4g8rjBeozny6tE=; b=i2ka9kXXuZ37KT6UoKKQurjW0uS0UFroLMKHA1U6dnyyx4m0nYr6Bmx3RNdTlzL+BElNcv kREe6eNed4RWFg3CymrsEwt+CVVrd15ILhCokodR1fgepSQvYveoow1D7Ui95mjmtDFTJ0 erSckKVgTzXkoKvPcrwePdSvmNua4SdXbpEk651N7K9aBBbdmLgQDjXuABb8CiFGCZ3amk 9QnjTu8/IFL7gnXhEacac3OaBaVWGzMZwXlABCTf6V8TDG9C69P/xSJKk4RpkMZMtMsn05 j5yzz6CJnkacgB2qeVzuwtljoOz9wpKUpnzlRsnbcxQh+GB50232VYtSS4jENQ== From: Miquel Raynal To: Alexander Aring , Stefan Schmidt , linux-wpan@vger.kernel.org Cc: David Girault , Romuald Despres , Frederic Blain , Nicolas Schodet , Thomas Petazzoni , Miquel Raynal Subject: [PATCH wpan-tools 2/7] iwpan: Export iwpan_debug Date: Fri, 1 Jul 2022 16:34:29 +0200 Message-Id: <20220701143434.1267864-3-miquel.raynal@bootlin.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220701143434.1267864-1-miquel.raynal@bootlin.com> References: <20220701143434.1267864-1-miquel.raynal@bootlin.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-wpan@vger.kernel.org From: David Girault This debug flag will be used later on in different files. Signed-off-by: David Girault Signed-off-by: Miquel Raynal --- src/iwpan.c | 2 +- src/iwpan.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/iwpan.c b/src/iwpan.c index fb7bef1..3cf5fe2 100644 --- a/src/iwpan.c +++ b/src/iwpan.c @@ -21,7 +21,7 @@ /* TODO libnl 1.x compatibility code */ -static int iwpan_debug = 0; +int iwpan_debug = 0; static int nl802154_init(struct nl802154_state *state) { diff --git a/src/iwpan.h b/src/iwpan.h index 48c4f03..860dd37 100644 --- a/src/iwpan.h +++ b/src/iwpan.h @@ -120,4 +120,6 @@ DECLARE_SECTION(get); const char *iftype_name(enum nl802154_iftype iftype); +extern int iwpan_debug; + #endif /* __IWPAN_H */ From patchwork Fri Jul 1 14:34:30 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miquel Raynal X-Patchwork-Id: 12903461 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EB582C43334 for ; Fri, 1 Jul 2022 14:38:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232278AbiGAOiV (ORCPT ); Fri, 1 Jul 2022 10:38:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56490 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232314AbiGAOh5 (ORCPT ); Fri, 1 Jul 2022 10:37:57 -0400 Received: from relay12.mail.gandi.net (relay12.mail.gandi.net [217.70.178.232]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0EA463D4B9 for ; Fri, 1 Jul 2022 07:34:40 -0700 (PDT) Received: (Authenticated sender: miquel.raynal@bootlin.com) by mail.gandi.net (Postfix) with ESMTPSA id 5F54C200015; Fri, 1 Jul 2022 14:34:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1656686079; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=7DYGlaVj+dX75xjeCSEzO2H48Gb9JrtGwznnKQcBMSY=; b=HpX6Fe58kbw4o9L9dDcvFrM9w5xP4PIDjVWYLOuRGoIr5zNcDJTYlvV+5/LuOrzwdatM+2 R51NHIz1fwYJK8amHH/hPcl0b9QQyqIGJ7oxKgEndrxGVg7jHBmACRW9asXLF0ugInZ6gP zGkz2mJQNBPdpWQBajsp/1QbGUgd93cA5Nlc1qxzr2PcDvS3BpZp5HkF7DNcSvQ+qN4c8H aAAD6MAeG6+zf7S4ShWeBUpgEt7kj6DkwSZ2CC47EZKvMyyP+EAACsrSs1XRhDt4Q1DVUf j1/wPZx0Z3yau2D1UAFOEUoWDU4HqLPub7+00YiRLERFI4bH5SmAlZ89svmcSA== From: Miquel Raynal To: Alexander Aring , Stefan Schmidt , linux-wpan@vger.kernel.org Cc: David Girault , Romuald Despres , Frederic Blain , Nicolas Schodet , Thomas Petazzoni , Miquel Raynal Subject: [PATCH wpan-tools 3/7] iwpan: Fix a comment Date: Fri, 1 Jul 2022 16:34:30 +0200 Message-Id: <20220701143434.1267864-4-miquel.raynal@bootlin.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220701143434.1267864-1-miquel.raynal@bootlin.com> References: <20220701143434.1267864-1-miquel.raynal@bootlin.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-wpan@vger.kernel.org There are a couple of words missing, add them to clarify the comment. Signed-off-by: Miquel Raynal --- src/iwpan.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iwpan.h b/src/iwpan.h index 860dd37..9d265c6 100644 --- a/src/iwpan.h +++ b/src/iwpan.h @@ -43,7 +43,7 @@ struct cmd { const enum command_identify_by idby; /* The handler should return a negative error code, * zero on success, 1 if the arguments were wrong - * and the usage message should and 2 otherwise. + * and the usage message should be displayed, 2 otherwise. */ int (*handler)(struct nl802154_state *state, struct nl_cb *cb, From patchwork Fri Jul 1 14:34:31 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miquel Raynal X-Patchwork-Id: 12903462 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5E822C433EF for ; Fri, 1 Jul 2022 14:38:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232563AbiGAOiV (ORCPT ); Fri, 1 Jul 2022 10:38:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56474 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232331AbiGAOh5 (ORCPT ); Fri, 1 Jul 2022 10:37:57 -0400 Received: from relay12.mail.gandi.net (relay12.mail.gandi.net [217.70.178.232]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4D51A3DA5C for ; Fri, 1 Jul 2022 07:34:42 -0700 (PDT) Received: (Authenticated sender: miquel.raynal@bootlin.com) by mail.gandi.net (Postfix) with ESMTPSA id EBB79200004; Fri, 1 Jul 2022 14:34:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1656686081; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lEaI1Ym2paejQwXNvmzOV2cHFz6vGMqUYVMWC/hHsjg=; b=Rmm4Th8fJBD5DEIalvVMekYfZTJ48t2Aj7cI8N7iqs/if+io2y30/8G5zaSaZPf5Mjejn3 tCkapO55Y2kuuz5XvuFToA65kX0D3knSH3bRtx2ibmySCh/Qayx5uadLqfg52d8gHaWYWa Xuhi+c9izLB9AEC7o8nKQaMjReTV72mYT+aAUXaN8mKQyb+SlEHEZpTkdgGKay+hnKK0Er iqXjShNyeTsgSYqnUdX/oMYP/0yVeNXGsI4XEKaYdRJHdbSVLTDAXi3/xKa0CsKdfpFcjb iFLPHlXEaBCcJQzT8CM4IfBwJRN7Vh9YnPJerbMinW6sagtVJBDDEJxt1NPTtQ== From: Miquel Raynal To: Alexander Aring , Stefan Schmidt , linux-wpan@vger.kernel.org Cc: David Girault , Romuald Despres , Frederic Blain , Nicolas Schodet , Thomas Petazzoni , Miquel Raynal Subject: [PATCH wpan-tools 4/7] iwpan: Remove duplicated SECTION Date: Fri, 1 Jul 2022 16:34:31 +0200 Message-Id: <20220701143434.1267864-5-miquel.raynal@bootlin.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220701143434.1267864-1-miquel.raynal@bootlin.com> References: <20220701143434.1267864-1-miquel.raynal@bootlin.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-wpan@vger.kernel.org From: David Girault This section has been duplicated, drop one. Signed-off-by: David Girault Signed-off-by: Miquel Raynal --- src/iwpan.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/iwpan.h b/src/iwpan.h index 9d265c6..406940a 100644 --- a/src/iwpan.h +++ b/src/iwpan.h @@ -90,12 +90,6 @@ struct cmd { .handler = (_handler), \ .help = (_help), \ } -#define SECTION(_name) \ - struct cmd __section ## _ ## _name \ - __attribute__((used)) __attribute__((section("__cmd"))) = { \ - .name = (#_name), \ - .hidden = 1, \ - } #define SECTION(_name) \ struct cmd __section ## _ ## _name \ From patchwork Fri Jul 1 14:34:32 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miquel Raynal X-Patchwork-Id: 12903463 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AC4CCCCA479 for ; Fri, 1 Jul 2022 14:38:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233170AbiGAOiW (ORCPT ); Fri, 1 Jul 2022 10:38:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56024 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232336AbiGAOh5 (ORCPT ); Fri, 1 Jul 2022 10:37:57 -0400 Received: from relay12.mail.gandi.net (relay12.mail.gandi.net [217.70.178.232]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 529AE3DA5F for ; Fri, 1 Jul 2022 07:34:43 -0700 (PDT) Received: (Authenticated sender: miquel.raynal@bootlin.com) by mail.gandi.net (Postfix) with ESMTPSA id 368D6200002; Fri, 1 Jul 2022 14:34:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1656686082; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=dd4fIq1C5Slakhrfguk5LkXAVZkjq9iPJkmRSdO29xE=; b=GmPpq1UC/SqaOkR41MepPdUUKhVAFfydZOujA3EmW8R12HnsvfOJHxUCdIetxygx5ya+2H aPm7X/cZMj3kZmAcBDLROSj01PJ47YnewSoTfm1v0HY2TdXYAZJF7UvmWQzR/t1i00hjt5 0lnHWgTf7k0RLMCXUTy+MDLWbCJWqdHFaUJQ2C7CWWKlV68+1dkFxtVabupDVDhLT5Eu2G ZNddhwiO68BmKTEKPa3rwVyFpPkq/mqQdY6BdnIeW0UxHdz0kdP0OsSzJhpWgHZhQEaBj8 ZQLSnRgMhLK1NGw8mYEFCSmDE4YcKj2q2vqsBnzxpT9MNZOkYUGN6xiEc7C8SQ== From: Miquel Raynal To: Alexander Aring , Stefan Schmidt , linux-wpan@vger.kernel.org Cc: David Girault , Romuald Despres , Frederic Blain , Nicolas Schodet , Thomas Petazzoni , Miquel Raynal Subject: [PATCH wpan-tools 5/7] iwpan: Synchronize nl802154 header with the Linux kernel Date: Fri, 1 Jul 2022 16:34:32 +0200 Message-Id: <20220701143434.1267864-6-miquel.raynal@bootlin.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220701143434.1267864-1-miquel.raynal@bootlin.com> References: <20220701143434.1267864-1-miquel.raynal@bootlin.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-wpan@vger.kernel.org The content of this file as evolved, reflect the changes accepted in the mainline Linux kernel here. Signed-off-by: Miquel Raynal --- src/nl802154.h | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/src/nl802154.h b/src/nl802154.h index ddcee12..a9c06f3 100644 --- a/src/nl802154.h +++ b/src/nl802154.h @@ -56,6 +56,13 @@ enum nl802154_commands { NL802154_CMD_SET_WPAN_PHY_NETNS, + NL802154_CMD_NEW_COORDINATOR, + NL802154_CMD_TRIGGER_SCAN, + NL802154_CMD_ABORT_SCAN, + NL802154_CMD_SCAN_DONE, + NL802154_CMD_SEND_BEACONS, + NL802154_CMD_STOP_BEACONS, + /* add new commands above here */ #ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL @@ -131,6 +138,13 @@ enum nl802154_attrs { NL802154_ATTR_PID, NL802154_ATTR_NETNS_FD, + NL802154_ATTR_COORDINATOR, + NL802154_ATTR_SCAN_TYPE, + NL802154_ATTR_SCAN_FLAGS, + NL802154_ATTR_SCAN_CHANNELS, + NL802154_ATTR_SCAN_DURATION, + NL802154_ATTR_BEACON_INTERVAL, + /* add attributes here, update the policy in nl802154.c */ #ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL @@ -217,6 +231,85 @@ enum nl802154_wpan_phy_capability_attr { NL802154_CAP_ATTR_MAX = __NL802154_CAP_ATTR_AFTER_LAST - 1 }; +/** + * enum nl802154_scan_types - Scan types + * + * @__NL802154_SCAN_INVALID: scan type number 0 is reserved + * @NL802154_SCAN_ED: An ED scan allows a device to obtain a measure of the peak + * energy in each requested channel + * @NL802154_SCAN_ACTIVE: Locate any coordinator transmitting Beacon frames using + * a Beacon Request command + * @NL802154_SCAN_PASSIVE: Locate any coordinator transmitting Beacon frames + * @NL802154_SCAN_ORPHAN: Relocate coordinator following a loss of synchronisation + * @NL802154_SCAN_ENHANCED_ACTIVE: Same as Active using Enhanced Beacon Request + * command instead of Beacon Request command + * @NL802154_SCAN_RIT_PASSIVE: Passive scan for RIT Data Request command frames + * instead of Beacon frames + * @NL802154_SCAN_ATTR_MAX: Maximum SCAN attribute number + */ +enum nl802154_scan_types { + __NL802154_SCAN_INVALID, + NL802154_SCAN_ED, + NL802154_SCAN_ACTIVE, + NL802154_SCAN_PASSIVE, + NL802154_SCAN_ORPHAN, + NL802154_SCAN_ENHANCED_ACTIVE, + NL802154_SCAN_RIT_PASSIVE, + + /* keep last */ + NL802154_SCAN_ATTR_MAX, +}; + +/** + * enum nl802154_scan_flags - Scan request control flags + * + * @NL802154_SCAN_FLAG_RANDOM_ADDR: use a random MAC address for this scan (ie. + * a different one for every scan iteration). When the flag is set, full + * randomisation is assumed. + */ +enum nl802154_scan_flags { + NL802154_SCAN_FLAG_RANDOM_ADDR = 1 << 0, +}; + +/** + * enum nl802154_coord - Netlink attributes for a coordinator + * + * @__NL802154_COORD_INVALID: invalid + * @NL802154_COORD_PANID: PANID of the coordinator (2 bytes) + * @NL802154_COORD_ADDR: Coordinator address, (8 bytes or 2 bytes) + * @NL802154_COORD_CHANNEL: channel number, related to @NL802154_COORD_PAGE (u8) + * @NL802154_COORD_PAGE: channel page, related to @NL802154_COORD_CHANNEL (u8) + * @NL802154_COORD_PREAMBLE_CODE: Preamble code used when the beacon was received, + * this is PHY dependent and optional (u8) + * @NL802154_COORD_MEAN_PRF: Mean PRF used when the beacon was received, + * this is PHY dependent and optional (u8) + * @NL802154_COORD_SUPERFRAME_SPEC: superframe specification of the PAN (u16) + * @NL802154_COORD_LINK_QUALITY: signal quality of beacon in unspecified units, + * scaled to 0..255 (u8) + * @NL802154_COORD_GTS_PERMIT: set to true if GTS is permitted on this PAN + * @NL802154_COORD_PAYLOAD_DATA: binary data containing the raw data from the + * frame payload, (only if beacon or probe response had data) + * @NL802154_COORD_PAD: attribute used for padding for 64-bit alignment + * @NL802154_COORD_MAX: highest coordinator attribute + */ +enum nl802154_coord { + __NL802154_COORD_INVALID, + NL802154_COORD_PANID, + NL802154_COORD_ADDR, + NL802154_COORD_CHANNEL, + NL802154_COORD_PAGE, + NL802154_COORD_PREAMBLE_CODE, + NL802154_COORD_MEAN_PRF, + NL802154_COORD_SUPERFRAME_SPEC, + NL802154_COORD_LINK_QUALITY, + NL802154_COORD_GTS_PERMIT, + NL802154_COORD_PAYLOAD_DATA, + NL802154_COORD_PAD, + + /* keep last */ + NL802154_COORD_MAX, +}; + /** * enum nl802154_cca_modes - cca modes * From patchwork Fri Jul 1 14:34:33 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miquel Raynal X-Patchwork-Id: 12903464 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id F05C2C43334 for ; Fri, 1 Jul 2022 14:38:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232336AbiGAOiW (ORCPT ); Fri, 1 Jul 2022 10:38:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56492 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232399AbiGAOh5 (ORCPT ); Fri, 1 Jul 2022 10:37:57 -0400 Received: from relay12.mail.gandi.net (relay12.mail.gandi.net [217.70.178.232]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6437A3EA90 for ; Fri, 1 Jul 2022 07:34:44 -0700 (PDT) Received: (Authenticated sender: miquel.raynal@bootlin.com) by mail.gandi.net (Postfix) with ESMTPSA id 3ED66200016; Fri, 1 Jul 2022 14:34:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1656686083; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=D9NUH5yjbyQsyMLIKzsycBkRITi01Pv43GRQn0t2uNw=; b=C01144IHGgky3kiF8yvC0TO5Ce7yyXavgMrZPkSPAhIk1BlRXEOmrekormF+GIOwR5XbhT yZtlAWX4zBe5I+yvyK+82kiwtCmOw2KO7A7xNJumxvYiV+pOsd2lWOX8G95vk/BC0e8WQm TJ1w5owA+6+u8BJJmX37qSYtrGF9dAkyZcMJasKFa0QA9Q1kO8ABbgq4XWTFly75PO0acE krza6cXBraG0IvSSH1oGw5nn8aMnADxlyMGAVPusWwluiUs4BJnylIbsjWBrGudwG1QOBi 7KWjY+Rpx+iqS/3F4fbcP1OW859v2H2vJi474wXPFsKn3TzPNUhIhP+ZzLMGAw== From: Miquel Raynal To: Alexander Aring , Stefan Schmidt , linux-wpan@vger.kernel.org Cc: David Girault , Romuald Despres , Frederic Blain , Nicolas Schodet , Thomas Petazzoni , Miquel Raynal Subject: [PATCH wpan-tools 6/7] iwpan: Add full scan support Date: Fri, 1 Jul 2022 16:34:33 +0200 Message-Id: <20220701143434.1267864-7-miquel.raynal@bootlin.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220701143434.1267864-1-miquel.raynal@bootlin.com> References: <20220701143434.1267864-1-miquel.raynal@bootlin.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-wpan@vger.kernel.org From: David Girault Bring support for different scanning operations, such as starting or aborting a scan operation with a given configuration, and dumping the discovered coordinators. It also brings support for additional PAN management features, such as a beacon request to ask the mac to send or stop sending beacons out of a particular interface. Signed-off-by: David Girault Signed-off-by: Miquel Raynal --- src/Makefile.am | 1 + src/mac.c | 1 + src/scan.c | 421 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 423 insertions(+) create mode 100644 src/scan.c diff --git a/src/Makefile.am b/src/Makefile.am index 2d54576..18b3569 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -9,6 +9,7 @@ iwpan_SOURCES = \ interface.c \ phy.c \ mac.c \ + scan.c \ nl_extras.h \ nl802154.h diff --git a/src/mac.c b/src/mac.c index 286802c..19bb328 100644 --- a/src/mac.c +++ b/src/mac.c @@ -234,3 +234,4 @@ nla_put_failure: COMMAND(set, ackreq_default, "<1|0>", NL802154_CMD_SET_ACKREQ_DEFAULT, 0, CIB_NETDEV, handle_ackreq_default, NULL); + diff --git a/src/scan.c b/src/scan.c new file mode 100644 index 0000000..de6caf4 --- /dev/null +++ b/src/scan.c @@ -0,0 +1,421 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "nl802154.h" +#include "nl_extras.h" +#include "iwpan.h" + +static char scantypebuf[100]; + +static const char *scantype_name(enum nl802154_scan_types scantype) +{ + switch (scantype) { + case NL802154_SCAN_ED: + return "ed"; + case NL802154_SCAN_ACTIVE: + return "active"; + case NL802154_SCAN_PASSIVE: + return "passive"; + case NL802154_SCAN_ENHANCED_ACTIVE: + return "enhanced"; + case NL802154_SCAN_RIT_PASSIVE: + return "rit"; + default: + sprintf(scantypebuf, "Invalid scantype (%d)", scantype); + return scantypebuf; + } +} + +/* for help */ +#define SCAN_TYPES "Valid scanning types are: ed, active, passive, enhanced, rit." + +/* return 0 if ok, internal error otherwise */ +static int get_scan_type(int *argc, char ***argv, enum nl802154_scan_types *type) +{ + char *tpstr; + + if (*argc < 2) + return 1; + + if (strcmp((*argv)[0], "type")) + return 1; + + tpstr = (*argv)[1]; + *argc -= 2; + *argv += 2; + + if (strcmp(tpstr, "ed") == 0) { + *type = NL802154_SCAN_ED; + return 0; + } else if (strcmp(tpstr, "active") == 0) { + *type = NL802154_SCAN_ACTIVE; + return 0; + } else if (strcmp(tpstr, "passive") == 0) { + *type = NL802154_SCAN_PASSIVE; + return 0; + } else if (strcmp(tpstr, "enhanced") == 0) { + *type = NL802154_SCAN_ENHANCED_ACTIVE; + return 0; + } else if (strcmp(tpstr, "rit") == 0) { + *type = NL802154_SCAN_RIT_PASSIVE; + return 0; + } + + fprintf(stderr, "invalid interface type %s\n", tpstr); + return 2; +} + +static int get_option_value(int *argc, char ***argv, const char *marker, unsigned long *result, bool *valid) +{ + unsigned long value; + char *tpstr, *end; + + *valid = false; + + if (*argc < 2) + return 0; + + if (strcmp((*argv)[0], marker)) + return 0; + + tpstr = (*argv)[1]; + *argc -= 2; + *argv += 2; + + value = strtoul(tpstr, &end, 0); + if (*end != '\0') + return 1; + + *result = value; + *valid = true; + + return 0; +} + +static int scan_trigger_handler(struct nl802154_state *state, + struct nl_cb *cb, + struct nl_msg *msg, + int argc, char **argv, + enum id_input id) +{ + enum nl802154_scan_types type; + unsigned long page, channels, duration; + int tpset; + bool valid_page, valid_channels, valid_duration; + + if (argc < 2) + return 1; + + tpset = get_scan_type(&argc, &argv, &type); + if (tpset) + return tpset; + + tpset = get_option_value(&argc, &argv, "page", &page, &valid_page); + if (tpset) + return tpset; + if (valid_page && page > UINT8_MAX) + return 1; + + tpset = get_option_value(&argc, &argv, "channels", &channels, &valid_channels); + if (tpset) + return tpset; + if (valid_channels && channels > UINT32_MAX) + return 1; + + tpset = get_option_value(&argc, &argv, "duration", &duration, &valid_duration); + if (tpset) + return tpset; + if (valid_duration && duration > UINT8_MAX) + return 1; + + if (argc) + return 1; + + /* Mandatory argument */ + NLA_PUT_U8(msg, NL802154_ATTR_SCAN_TYPE, type); + /* Optional arguments */ + if (valid_duration) + NLA_PUT_U8(msg, NL802154_ATTR_SCAN_DURATION, duration); + if (valid_page) + NLA_PUT_U8(msg, NL802154_ATTR_PAGE, page); + if (valid_channels) + NLA_PUT_U32(msg, NL802154_ATTR_SCAN_CHANNELS, channels); + + /* TODO: support IES parameters for active scans */ + + return 0; + +nla_put_failure: + return -ENOBUFS; +} + +static int scan_abort_handler(struct nl802154_state *state, + struct nl_cb *cb, + struct nl_msg *msg, + int argc, char **argv, + enum id_input id) +{ + return 0; +} + + +static int parse_new_coordinator(struct nlattr *nestedcoord, + struct nlattr *ifattr) +{ + struct nlattr *pan[NL802154_COORD_MAX + 1]; + static struct nla_policy pan_policy[NL802154_COORD_MAX + 1] = { + [NL802154_COORD_PANID] = { .type = NLA_U16, }, + [NL802154_COORD_ADDR] = { .minlen = 2, .maxlen = 8, }, /* 2 or 8 */ + [NL802154_COORD_CHANNEL] = { .type = NLA_U8, }, + [NL802154_COORD_PAGE] = { .type = NLA_U8, }, + [NL802154_COORD_PREAMBLE_CODE] = { .type = NLA_U8, }, + [NL802154_COORD_MEAN_PRF] = { .type = NLA_U8, }, + [NL802154_COORD_SUPERFRAME_SPEC] = { .type = NLA_U16, }, + [NL802154_COORD_LINK_QUALITY] = { .type = NLA_U8, }, + [NL802154_COORD_GTS_PERMIT] = { .type = NLA_FLAG, }, + }; + char dev[20]; + int ret; + + ret = nla_parse_nested(pan, NL802154_COORD_MAX, nestedcoord, pan_policy); + if (ret < 0) { + fprintf(stderr, "failed to parse nested attributes! (ret = %d)\n", + ret); + return NL_SKIP; + } + if (!pan[NL802154_COORD_PANID]) + return NL_SKIP; + + printf("PAN 0x%04x", le16toh(nla_get_u16(pan[NL802154_COORD_PANID]))); + if (ifattr) { + if_indextoname(nla_get_u32(ifattr), dev); + printf(" (on %s)", dev); + } + printf("\n"); + if (pan[NL802154_COORD_ADDR]) { + struct nlattr *coord = pan[NL802154_COORD_ADDR]; + if (nla_len(coord) == 2) { + uint16_t addr = nla_get_u16(coord); + printf("\tcoordinator 0x%04x\n", le16toh(addr)); + } else { + uint64_t addr = nla_get_u64(coord); + printf("\tcoordinator 0x%016" PRIx64 "\n", le64toh(addr)); + } + } + if (pan[NL802154_COORD_PAGE]) { + printf("\tpage %u\n", nla_get_u8(pan[NL802154_COORD_PAGE])); + } + if (pan[NL802154_COORD_CHANNEL]) { + printf("\tchannel %u\n", nla_get_u8(pan[NL802154_COORD_CHANNEL])); + } + if (pan[NL802154_COORD_SUPERFRAME_SPEC]) { + printf("\tsuperframe spec. 0x%x\n", nla_get_u16( + pan[NL802154_COORD_SUPERFRAME_SPEC])); + } + if (pan[NL802154_COORD_LINK_QUALITY]) { + printf("\tLQI %x\n", nla_get_u8( + pan[NL802154_COORD_LINK_QUALITY])); + } + if (pan[NL802154_COORD_GTS_PERMIT]) { + printf("\tGTS permitted\n"); + } + + /* TODO: Beacon IES display/decoding */ + + return NL_OK; +} + +static int print_new_coordinator_handler(struct nl_msg *msg, void *arg) +{ + struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); + struct nlattr *tb[NL802154_ATTR_MAX + 1]; + struct nlattr *nestedcoord; + + nla_parse(tb, NL802154_ATTR_MAX, genlmsg_attrdata(gnlh, 0), + genlmsg_attrlen(gnlh, 0), NULL); + + nestedcoord = tb[NL802154_ATTR_COORDINATOR]; + if (!nestedcoord) { + fprintf(stderr, "coordinator info missing!\n"); + return NL_SKIP; + } + + return parse_new_coordinator(nestedcoord, tb[NL802154_ATTR_IFINDEX]); +} + +struct scan_done +{ + volatile int done; + int devidx; +}; + +static int wait_scan_done_handler(struct nl_msg *msg, void *arg) +{ + struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); + struct scan_done *sd = (struct scan_done *)arg; + + if (gnlh->cmd == NL802154_CMD_NEW_COORDINATOR) + return print_new_coordinator_handler(msg, arg); + + if (gnlh->cmd != NL802154_CMD_SCAN_DONE) + return 0; + + if (sd->devidx != -1) { + struct nlattr *tb[NL802154_ATTR_MAX + 1]; + nla_parse(tb, NL802154_ATTR_MAX, genlmsg_attrdata(gnlh, 0), + genlmsg_attrlen(gnlh, 0), NULL); + if (!tb[NL802154_ATTR_IFINDEX] || + nla_get_u32(tb[NL802154_ATTR_IFINDEX]) != sd->devidx) + return 0; + } + + sd->done = 1; + return 0; +} + +static int no_seq_check(struct nl_msg *msg, void *arg) +{ + return NL_OK; +} + +static int scan_done_handler(struct nl802154_state *state, + struct nl_cb *cb, + struct nl_msg *msg, + int argc, char **argv, + enum id_input id) +{ + struct nl_cb *s_cb; + struct scan_done sd; + int ret, group; + + /* Configure socket to receive messages in Scan multicast group */ + group = genl_ctrl_resolve_grp(state->nl_sock, "nl802154", "scan"); + if (group < 0) + return group; + ret = nl_socket_add_membership(state->nl_sock, group); + if (ret) + return ret; + /* Init netlink callbacks as if we run a command */ + cb = nl_cb_alloc(iwpan_debug ? NL_CB_DEBUG : NL_CB_DEFAULT); + if (!cb) { + fprintf(stderr, "failed to allocate netlink callbacks\n"); + return 2; + } + nl_socket_set_cb(state->nl_sock, cb); + /* no sequence checking for multicast messages */ + nl_socket_disable_seq_check(state->nl_sock); + /* install scan done message handler */ + nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, wait_scan_done_handler, &sd); + /* set net device filter */ + sd.devidx = if_nametoindex(*argv); + if (sd.devidx == 0) + sd.devidx = -1; + sd.done = 0; + /* loop waiting */ + while (sd.done == 0) + nl_recvmsgs(state->nl_sock, cb); + /* restore seq & leave multicast group */ + ret = nl_socket_drop_membership(state->nl_sock, group); + nl_cb_put(cb); + return ret; +} + +static int scan_combined_handler(struct nl802154_state *state, + struct nl_cb *cb, + struct nl_msg *msg, + int argc, char **argv, + enum id_input id) +{ + char **trig_argv; + static char *show_argv[] = { + NULL, + "scan", + "done", + }; + int trig_argc, err; + int i; + + /* dev wpan0 scan trigger ... */ + trig_argc = 3 + (argc - 2); + trig_argv = calloc(trig_argc, sizeof(*trig_argv)); + if (!trig_argv) + return -ENOMEM; + trig_argv[0] = argv[0]; + trig_argv[1] = "scan"; + trig_argv[2] = "trigger"; + for (i = 0; i < argc - 2; i++) + trig_argv[i + 3] = argv[i + 2]; + err = handle_cmd(state, id, trig_argc, trig_argv); + free(trig_argv); + if (err) + return err; + + /* dev wpanX scan show */ + show_argv[0] = argv[0]; + return handle_cmd(state, id, 3, show_argv); +} +TOPLEVEL(scan, "type [page ] [channels ] [duration ]", + 0, 0, CIB_NETDEV, scan_combined_handler, + "Scan on this virtual interface with the given configuration.\n" + SCAN_TYPES); +COMMAND(scan, abort, NULL, NL802154_CMD_ABORT_SCAN, 0, CIB_NETDEV, scan_abort_handler, + "Abort ongoing scanning on this virtual interface"); +COMMAND(scan, done, NULL, 0, 0, CIB_NETDEV, scan_done_handler, + "Wait the scan operation to finish on this virtual interface, showing discoveries"); +COMMAND(scan, trigger, + "type [page ] [channels ] [duration ]", + NL802154_CMD_TRIGGER_SCAN, 0, CIB_NETDEV, scan_trigger_handler, + "Launch scanning on this virtual interface with the given configuration.\n" + SCAN_TYPES); + +SECTION(beacons); + +static int send_beacons_handler(struct nl802154_state *state, struct nl_cb *cb, + struct nl_msg *msg, int argc, char **argv, + enum id_input id) +{ + unsigned long interval; + bool valid_interval; + int tpset; + + tpset = get_option_value(&argc, &argv, "interval", &interval, &valid_interval); + if (tpset) + return tpset; + if (valid_interval && interval > UINT8_MAX) + return 1; + + if (argc) + return 1; + + /* Optional arguments */ + if (valid_interval) + NLA_PUT_U8(msg, NL802154_ATTR_BEACON_INTERVAL, interval); + + return 0; + +nla_put_failure: + return -ENOBUFS; +} + +static int stop_beacons_handler(struct nl802154_state *state, struct nl_cb *cb, + struct nl_msg *msg, int argc, char **argv, + enum id_input id) +{ + return 0; +} + +COMMAND(beacons, stop, NULL, + NL802154_CMD_STOP_BEACONS, 0, CIB_NETDEV, stop_beacons_handler, + "Stop sending beacons on this interface."); +COMMAND(beacons, send, "[interval ]", + NL802154_CMD_SEND_BEACONS, 0, CIB_NETDEV, send_beacons_handler, + "Send beacons on this virtual interface at a regular pace."); From patchwork Fri Jul 1 14:34:34 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miquel Raynal X-Patchwork-Id: 12903465 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A0AA7C433EF for ; Fri, 1 Jul 2022 14:38:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231639AbiGAOiX (ORCPT ); Fri, 1 Jul 2022 10:38:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56330 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232419AbiGAOh6 (ORCPT ); Fri, 1 Jul 2022 10:37:58 -0400 Received: from relay12.mail.gandi.net (relay12.mail.gandi.net [217.70.178.232]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9038B3DA50 for ; Fri, 1 Jul 2022 07:34:45 -0700 (PDT) Received: (Authenticated sender: miquel.raynal@bootlin.com) by mail.gandi.net (Postfix) with ESMTPSA id 63C4520000B; Fri, 1 Jul 2022 14:34:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1656686084; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bb5v/Hsp0+jefA3mGLCm/+wQVouPCXtqwXFQo/gwD5E=; b=YN6Fo8+55nro/OVQuzRm7DtpAXW5GVQ6exWuMzFyQrFmS9xy90cbGIJwn874yQebl7Ssmg pNJwDYpWIkxxxum2Rj02bsoF1JFfyzf+D/aNQMcd9OzZFvRxcsR8cR5BfEklOmfDN3iElR UyOhCl3h6y23mVRRSTutg0qfxO4ReTxk766yagauYE5G1grsAoTTyH5VvLHqGqnUszKqK2 GYK8PxE1s7qY6iFPXDU+/922tuAJ4j86ylGiTn+IToOIszEU2agF6ZFC1zqH6CL57EnTaN zcnSHx+1ZCi8qNZwELQi6I1egRhvQZI2/AIEoWweLI/JtIFv1HtDTHfIiYkv/g== From: Miquel Raynal To: Alexander Aring , Stefan Schmidt , linux-wpan@vger.kernel.org Cc: David Girault , Romuald Despres , Frederic Blain , Nicolas Schodet , Thomas Petazzoni , Miquel Raynal Subject: [PATCH wpan-tools 7/7] iwpan: Add events support Date: Fri, 1 Jul 2022 16:34:34 +0200 Message-Id: <20220701143434.1267864-8-miquel.raynal@bootlin.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220701143434.1267864-1-miquel.raynal@bootlin.com> References: <20220701143434.1267864-1-miquel.raynal@bootlin.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-wpan@vger.kernel.org From: David Girault Add the possibility to listen to the scan multicast netlink family in order to print all the events happening in the 802.15.4 stack, like the discovery of a new coordinator or an end of scan. Signed-off-by: David Girault Signed-off-by: Miquel Raynal --- src/Makefile.am | 1 + src/event.c | 222 ++++++++++++++++++++++++++++++++++++++++++++++++ src/iwpan.h | 3 + src/scan.c | 5 +- 4 files changed, 228 insertions(+), 3 deletions(-) create mode 100644 src/event.c diff --git a/src/Makefile.am b/src/Makefile.am index 18b3569..7933daf 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -10,6 +10,7 @@ iwpan_SOURCES = \ phy.c \ mac.c \ scan.c \ + event.c \ nl_extras.h \ nl802154.h diff --git a/src/event.c b/src/event.c new file mode 100644 index 0000000..2eab144 --- /dev/null +++ b/src/event.c @@ -0,0 +1,222 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "nl802154.h" +#include "nl_extras.h" +#include "iwpan.h" + +struct print_event_args { + struct timeval ts; /* internal */ + bool have_ts; /* must be set false */ + bool frame, time, reltime; +}; + +static void parse_scan_terminated(struct nlattr **tb) +{ + struct nlattr *a; + if ((a = tb[NL802154_ATTR_SCAN_TYPE])) { + enum nl802154_scan_types st = + (enum nl802154_scan_types)nla_get_u8(a); + const char *stn = scantype_name(st); + printf(" type %s,", stn); + } + if ((a = tb[NL802154_ATTR_SCAN_FLAGS])) { + printf(" flags 0x%x,", nla_get_u32(a)); + } + if ((a = tb[NL802154_ATTR_PAGE])) { + printf(" page %u,", nla_get_u8(a)); + } + if ((a = tb[NL802154_ATTR_SCAN_CHANNELS])) { + printf(" channels mask 0x%x,", nla_get_u32(a)); + } + /* TODO: show requested IEs */ + if ((a = tb[NL802154_ATTR_COORDINATOR])) { + parse_scan_result_pan(a, tb[NL802154_ATTR_IFINDEX]); + } +} + +static int print_event(struct nl_msg *msg, void *arg) +{ + struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); + struct nlattr *tb[NL802154_ATTR_MAX + 1], *nst; + struct print_event_args *args = arg; + char ifname[100]; + + uint8_t reg_type; + uint32_t wpan_phy_idx = 0; + int rem_nst; + uint16_t status; + + if (args->time || args->reltime) { + unsigned long long usecs, previous; + + previous = 1000000ULL * args->ts.tv_sec + args->ts.tv_usec; + gettimeofday(&args->ts, NULL); + usecs = 1000000ULL * args->ts.tv_sec + args->ts.tv_usec; + if (args->reltime) { + if (!args->have_ts) { + usecs = 0; + args->have_ts = true; + } else + usecs -= previous; + } + printf("%llu.%06llu: ", usecs/1000000, usecs % 1000000); + } + + nla_parse(tb, NL802154_ATTR_MAX, genlmsg_attrdata(gnlh, 0), + genlmsg_attrlen(gnlh, 0), NULL); + + if (tb[NL802154_ATTR_IFINDEX] && tb[NL802154_ATTR_WPAN_PHY]) { + if_indextoname(nla_get_u32(tb[NL802154_ATTR_IFINDEX]), ifname); + printf("%s (phy #%d): ", ifname, nla_get_u32(tb[NL802154_ATTR_WPAN_PHY])); + } else if (tb[NL802154_ATTR_WPAN_DEV] && tb[NL802154_ATTR_WPAN_PHY]) { + printf("wdev 0x%llx (phy #%d): ", + (unsigned long long)nla_get_u64(tb[NL802154_ATTR_WPAN_DEV]), + nla_get_u32(tb[NL802154_ATTR_WPAN_PHY])); + } else if (tb[NL802154_ATTR_IFINDEX]) { + if_indextoname(nla_get_u32(tb[NL802154_ATTR_IFINDEX]), ifname); + printf("%s: ", ifname); + } else if (tb[NL802154_ATTR_WPAN_DEV]) { + printf("wdev 0x%llx: ", (unsigned long long)nla_get_u64(tb[NL802154_ATTR_WPAN_DEV])); + } else if (tb[NL802154_ATTR_WPAN_PHY]) { + printf("phy #%d: ", nla_get_u32(tb[NL802154_ATTR_WPAN_PHY])); + } + + switch (gnlh->cmd) { + case NL802154_CMD_NEW_WPAN_PHY: + printf("renamed to %s\n", nla_get_string(tb[NL802154_ATTR_WPAN_PHY_NAME])); + break; + case NL802154_CMD_DEL_WPAN_PHY: + printf("delete wpan_phy\n"); + break; + case NL802154_CMD_TRIGGER_SCAN: + printf("scan started\n"); + break; + case NL802154_CMD_SCAN_DONE: + printf("scan finished\n"); + break; + case NL802154_CMD_NEW_COORDINATOR: + printf("new coordinator\n"); + break; + default: + printf("unknown event %d\n", gnlh->cmd); + break; + } + fflush(stdout); + return NL_SKIP; +} + +static int __prepare_listen_events(struct nl802154_state *state) +{ + int mcid, ret; + + /* Configuration multicast group */ + mcid = genl_ctrl_resolve_grp(state->nl_sock, NL802154_GENL_NAME, + "config"); + if (mcid < 0) + return mcid; + ret = nl_socket_add_membership(state->nl_sock, mcid); + if (ret) + return ret; + + /* Scan multicast group */ + mcid = genl_ctrl_resolve_grp(state->nl_sock, NL802154_GENL_NAME, + "scan"); + if (mcid >= 0) { + ret = nl_socket_add_membership(state->nl_sock, mcid); + if (ret) + return ret; + } + + /* MLME multicast group */ + mcid = genl_ctrl_resolve_grp(state->nl_sock, NL802154_GENL_NAME, + "mlme"); + if (mcid >= 0) { + ret = nl_socket_add_membership(state->nl_sock, mcid); + if (ret) + return ret; + } + + return 0; +} + +static int __do_listen_events(struct nl802154_state *state, + struct print_event_args *args) +{ + struct nl_cb *cb = nl_cb_alloc(iwpan_debug ? NL_CB_DEBUG : NL_CB_DEFAULT); + if (!cb) { + fprintf(stderr, "failed to allocate netlink callbacks\n"); + return -ENOMEM; + } + nl_socket_set_cb(state->nl_sock, cb); + /* No sequence checking for multicast messages */ + nl_socket_disable_seq_check(state->nl_sock); + /* Install print_event message handler */ + nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, print_event, args); + + /* Loop waiting until interrupted by signal */ + while (1) { + int ret = nl_recvmsgs(state->nl_sock, cb); + if (ret) { + fprintf(stderr, "nl_recvmsgs return error %d\n", ret); + break; + } + } + /* Free allocated nl_cb structure */ + nl_cb_put(cb); + return 0; +} + +static int print_events(struct nl802154_state *state, + struct nl_cb *cb, + struct nl_msg *msg, + int argc, char **argv, + enum id_input id) +{ + struct print_event_args args; + int ret; + + memset(&args, 0, sizeof(args)); + + argc--; + argv++; + + while (argc > 0) { + if (strcmp(argv[0], "-f") == 0) + args.frame = true; + else if (strcmp(argv[0], "-t") == 0) + args.time = true; + else if (strcmp(argv[0], "-r") == 0) + args.reltime = true; + else + return 1; + argc--; + argv++; + } + if (args.time && args.reltime) + return 1; + if (argc) + return 1; + + /* Prepare reception of all multicast messages */ + ret = __prepare_listen_events(state); + if (ret) + return ret; + + /* Read message loop */ + return __do_listen_events(state, &args); +} +TOPLEVEL(event, "[-t|-r] [-f]", 0, 0, CIB_NONE, print_events, + "Monitor events from the kernel.\n" + "-t - print timestamp\n" + "-r - print relative timestamp\n" + "-f - print full frame for auth/assoc etc."); diff --git a/src/iwpan.h b/src/iwpan.h index 406940a..a71b991 100644 --- a/src/iwpan.h +++ b/src/iwpan.h @@ -114,6 +114,9 @@ DECLARE_SECTION(get); const char *iftype_name(enum nl802154_iftype iftype); +const char *scantype_name(enum nl802154_scan_types scantype); +int parse_scan_result_pan(struct nlattr *nestedpan, struct nlattr *ifattr); + extern int iwpan_debug; #endif /* __IWPAN_H */ diff --git a/src/scan.c b/src/scan.c index de6caf4..bc06069 100644 --- a/src/scan.c +++ b/src/scan.c @@ -16,7 +16,7 @@ static char scantypebuf[100]; -static const char *scantype_name(enum nl802154_scan_types scantype) +const char *scantype_name(enum nl802154_scan_types scantype) { switch (scantype) { case NL802154_SCAN_ED: @@ -168,8 +168,7 @@ static int scan_abort_handler(struct nl802154_state *state, } -static int parse_new_coordinator(struct nlattr *nestedcoord, - struct nlattr *ifattr) +int parse_new_coordinator(struct nlattr *nestedcoord, struct nlattr *ifattr) { struct nlattr *pan[NL802154_COORD_MAX + 1]; static struct nla_policy pan_policy[NL802154_COORD_MAX + 1] = {