From patchwork Wed Dec 22 15:58:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miquel Raynal X-Patchwork-Id: 12691720 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 14FD6C43219 for ; Wed, 22 Dec 2021 15:58:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343948AbhLVP6z (ORCPT ); Wed, 22 Dec 2021 10:58:55 -0500 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:51831 "EHLO relay4-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343803AbhLVP6V (ORCPT ); Wed, 22 Dec 2021 10:58:21 -0500 Received: (Authenticated sender: miquel.raynal@bootlin.com) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id D1A7BE0012; Wed, 22 Dec 2021 15:58:18 +0000 (UTC) From: Miquel Raynal To: Alexander Aring , Stefan Schmidt , linux-wpan@vger.kernel.org Cc: David Girault , Romuald Despres , Frederic Blain , Thomas Petazzoni , netdev@vger.kernel.org, Romuald Despres , Miquel Raynal Subject: [wpan-tools 1/7] iwpan: Fix the channels printing Date: Wed, 22 Dec 2021 16:58:10 +0100 Message-Id: <20211222155816.256405-2-miquel.raynal@bootlin.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20211222155816.256405-1-miquel.raynal@bootlin.com> References: <20211222155816.256405-1-miquel.raynal@bootlin.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@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 Wed Dec 22 15:58:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miquel Raynal X-Patchwork-Id: 12691722 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 642E0C4332F for ; Wed, 22 Dec 2021 15:58:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343857AbhLVP6z (ORCPT ); Wed, 22 Dec 2021 10:58:55 -0500 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:43303 "EHLO relay4-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344041AbhLVP6W (ORCPT ); Wed, 22 Dec 2021 10:58:22 -0500 Received: (Authenticated sender: miquel.raynal@bootlin.com) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id 0C501E000A; Wed, 22 Dec 2021 15:58:19 +0000 (UTC) From: Miquel Raynal To: Alexander Aring , Stefan Schmidt , linux-wpan@vger.kernel.org Cc: David Girault , Romuald Despres , Frederic Blain , Thomas Petazzoni , netdev@vger.kernel.org, Miquel Raynal Subject: [wpan-tools 2/7] iwpan: Export iwpan_debug Date: Wed, 22 Dec 2021 16:58:11 +0100 Message-Id: <20211222155816.256405-3-miquel.raynal@bootlin.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20211222155816.256405-1-miquel.raynal@bootlin.com> References: <20211222155816.256405-1-miquel.raynal@bootlin.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@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 Wed Dec 22 15:58:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miquel Raynal X-Patchwork-Id: 12691721 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 45552C433FE for ; Wed, 22 Dec 2021 15:58:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343864AbhLVP64 (ORCPT ); Wed, 22 Dec 2021 10:58:56 -0500 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:38423 "EHLO relay4-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343914AbhLVP6X (ORCPT ); Wed, 22 Dec 2021 10:58:23 -0500 Received: (Authenticated sender: miquel.raynal@bootlin.com) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id 1E2CAE0003; Wed, 22 Dec 2021 15:58:21 +0000 (UTC) From: Miquel Raynal To: Alexander Aring , Stefan Schmidt , linux-wpan@vger.kernel.org Cc: David Girault , Romuald Despres , Frederic Blain , Thomas Petazzoni , netdev@vger.kernel.org, Miquel Raynal Subject: [wpan-tools 3/7] iwpan: Fix a comment Date: Wed, 22 Dec 2021 16:58:12 +0100 Message-Id: <20211222155816.256405-4-miquel.raynal@bootlin.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20211222155816.256405-1-miquel.raynal@bootlin.com> References: <20211222155816.256405-1-miquel.raynal@bootlin.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@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 Wed Dec 22 15:58:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miquel Raynal X-Patchwork-Id: 12691724 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 7ED0FC433FE for ; Wed, 22 Dec 2021 15:59:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344060AbhLVP65 (ORCPT ); Wed, 22 Dec 2021 10:58:57 -0500 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:44097 "EHLO relay4-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344045AbhLVP6Y (ORCPT ); Wed, 22 Dec 2021 10:58:24 -0500 Received: (Authenticated sender: miquel.raynal@bootlin.com) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id 32B5EE0016; Wed, 22 Dec 2021 15:58:22 +0000 (UTC) From: Miquel Raynal To: Alexander Aring , Stefan Schmidt , linux-wpan@vger.kernel.org Cc: David Girault , Romuald Despres , Frederic Blain , Thomas Petazzoni , netdev@vger.kernel.org, Miquel Raynal Subject: [wpan-tools 4/7] iwpan: Remove duplicated SECTION Date: Wed, 22 Dec 2021 16:58:13 +0100 Message-Id: <20211222155816.256405-5-miquel.raynal@bootlin.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20211222155816.256405-1-miquel.raynal@bootlin.com> References: <20211222155816.256405-1-miquel.raynal@bootlin.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@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 Wed Dec 22 15:58:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miquel Raynal X-Patchwork-Id: 12691723 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 A456AC43217 for ; Wed, 22 Dec 2021 15:58:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343911AbhLVP65 (ORCPT ); Wed, 22 Dec 2021 10:58:57 -0500 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:47863 "EHLO relay4-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344055AbhLVP6Z (ORCPT ); Wed, 22 Dec 2021 10:58:25 -0500 Received: (Authenticated sender: miquel.raynal@bootlin.com) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id 51C41E0018; Wed, 22 Dec 2021 15:58:23 +0000 (UTC) From: Miquel Raynal To: Alexander Aring , Stefan Schmidt , linux-wpan@vger.kernel.org Cc: David Girault , Romuald Despres , Frederic Blain , Thomas Petazzoni , netdev@vger.kernel.org, Miquel Raynal Subject: [wpan-tools 5/7] iwpan: Synchronize nl802154 header with the Linux kernel Date: Wed, 22 Dec 2021 16:58:14 +0100 Message-Id: <20211222155816.256405-6-miquel.raynal@bootlin.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20211222155816.256405-1-miquel.raynal@bootlin.com> References: <20211222155816.256405-1-miquel.raynal@bootlin.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@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 | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/src/nl802154.h b/src/nl802154.h index ddcee12..73295bc 100644 --- a/src/nl802154.h +++ b/src/nl802154.h @@ -56,6 +56,14 @@ enum nl802154_commands { NL802154_CMD_SET_WPAN_PHY_NETNS, + NL802154_CMD_TRIGGER_SCAN, + NL802154_CMD_ABORT_SCAN, + NL802154_CMD_SCAN_DONE, + NL802154_CMD_DUMP_PANS, + NL802154_CMD_FLUSH_PANS, + NL802154_CMD_SEND_BEACONS, + NL802154_CMD_STOP_BEACONS, + /* add new commands above here */ #ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL @@ -131,6 +139,13 @@ enum nl802154_attrs { NL802154_ATTR_PID, NL802154_ATTR_NETNS_FD, + NL802154_ATTR_SCAN_TYPE, + NL802154_ATTR_SCAN_FLAGS, + NL802154_ATTR_SCAN_CHANNELS, + NL802154_ATTR_SCAN_DURATION, + NL802154_ATTR_PAN, + NL802154_ATTR_BEACON_INTERVAL, + /* add attributes here, update the policy in nl802154.c */ #ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL @@ -217,6 +232,86 @@ 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_pan - Netlink attributes for a PAN + * + * @__NL802154_PAN_INVALID: invalid + * @NL802154_PAN_PANID: PANID of the PAN (2 bytes) + * @NL802154_PAN_COORD_ADDR: Coordinator address, (8 bytes or 2 bytes) + * @NL802154_PAN_CHANNEL: channel number, related to @NL802154_PAN_PAGE (u8) + * @NL802154_PAN_PAGE: channel page, related to @NL802154_PAN_CHANNEL (u8) + * @NL802154_PAN_PREAMBLE_CODE: Preamble code while the beacon was received, + * this is PHY dependent and optional (4 bytes) + * @NL802154_PAN_SUPERFRAME_SPEC: superframe specification of the PAN (u16) + * @NL802154_PAN_LINK_QUALITY: signal quality of beacon in unspecified units, + * scaled to 0..255 (u8) + * @NL802154_PAN_GTS_PERMIT: set to true if GTS is permitted on this PAN + * @NL802154_PAN_PAYLOAD_DATA: binary data containing the raw data from the + * frame payload, (only if beacon or probe response had data) + * @NL802154_PAN_STATUS: status, if this PAN is "used" + * @NL802154_PAN_SEEN_MS_AGO: age of this PAN entry in ms + * @NL802154_PAN_PAD: attribute used for padding for 64-bit alignment + * @NL802154_PAN_MAX: highest PAN attribute + */ +enum nl802154_pan { + __NL802154_PAN_INVALID, + NL802154_PAN_PANID, + NL802154_PAN_COORD_ADDR, + NL802154_PAN_CHANNEL, + NL802154_PAN_PAGE, + NL802154_PAN_PREAMBLE_CODE, + NL802154_PAN_SUPERFRAME_SPEC, + NL802154_PAN_LINK_QUALITY, + NL802154_PAN_GTS_PERMIT, + NL802154_PAN_PAYLOAD_DATA, + NL802154_PAN_STATUS, + NL802154_PAN_SEEN_MS_AGO, + NL802154_PAN_PAD, + + /* keep last */ + NL802154_PAN_MAX, +}; + /** * enum nl802154_cca_modes - cca modes * From patchwork Wed Dec 22 15:58:15 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miquel Raynal X-Patchwork-Id: 12691727 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 9C4E1C4332F for ; Wed, 22 Dec 2021 15:59:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237469AbhLVP7B (ORCPT ); Wed, 22 Dec 2021 10:59:01 -0500 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:39883 "EHLO relay4-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344065AbhLVP62 (ORCPT ); Wed, 22 Dec 2021 10:58:28 -0500 Received: (Authenticated sender: miquel.raynal@bootlin.com) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id 22DF6E001A; Wed, 22 Dec 2021 15:58:24 +0000 (UTC) From: Miquel Raynal To: Alexander Aring , Stefan Schmidt , linux-wpan@vger.kernel.org Cc: David Girault , Romuald Despres , Frederic Blain , Thomas Petazzoni , netdev@vger.kernel.org, Miquel Raynal Subject: [wpan-tools 6/7] iwpan: Add full scan support Date: Wed, 22 Dec 2021 16:58:15 +0100 Message-Id: <20211222155816.256405-7-miquel.raynal@bootlin.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20211222155816.256405-1-miquel.raynal@bootlin.com> References: <20211222155816.256405-1-miquel.raynal@bootlin.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: David Girault Bring support for different scanning operations, such as starting or aborting a scan operation with a given configuration, dumping the list of discovered PANs, and flushing the list. It also brings support for a couple of semi-debug features, such as a manual beacon request to ask sending or stopping beacons out of a particular interface. This is particularly useful when trying to validate the scanning support without proper hardware. Signed-off-by: David Girault Signed-off-by: Miquel Raynal --- DEST/usr/local/bin/iwpan | Bin 0 -> 178448 bytes DEST/usr/local/bin/wpan-hwsim | Bin 0 -> 45056 bytes DEST/usr/local/bin/wpan-ping | Bin 0 -> 47840 bytes src/Makefile.am | 1 + src/scan.c | 471 ++++++++++++++++++++++++++++++++++ 5 files changed, 472 insertions(+) create mode 100755 DEST/usr/local/bin/iwpan create mode 100755 DEST/usr/local/bin/wpan-hwsim create mode 100755 DEST/usr/local/bin/wpan-ping create mode 100644 src/scan.c diff --git a/DEST/usr/local/bin/iwpan b/DEST/usr/local/bin/iwpan new file mode 100755 index 0000000000000000000000000000000000000000..7d88e09c06b14551274b268d26c60f8eded90849 GIT binary patch literal 178448 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
`|yXJzT(QdYTwc_-?EC8WmP0f7`BR~zKSaR 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 Pzvgzyzb=9y0@VHw0_(6h literal 0 HcmV?d00001 diff --git a/DEST/usr/local/bin/wpan-ping b/DEST/usr/local/bin/wpan-ping new file mode 100755 index 0000000000000000000000000000000000000000..8b14ce20a717c7f56ea1d55063211758f85e2e5b GIT binary patch literal 47840 zcmeHwdwf*I+5en9Ih)-alFbdmRTc<=Ah~ff1cGd`3mZs6Bng5F%aUwJG&hq?0IPt2 zmPk>kRv9!-fgRGy(G0NV!gDs^7}q>X3n17?6&>9zxVg~ z{Qls;*_r2==XvItXP&v7$;>%BeAUZrio)cjvL%e5odpJFsYuxP0}(;6l$A0azj~+9ve;+bTX70Qb>G>uEBI8MTShk#HUe`n|^S) z`L7v%*JZ#mwDR%%iUoa4SSku6Ln|NI=D=cu??82QI3xG_{tqIhhz$S;vy zy2&wc$&l)euA=s~O$+7~wKo^Ew{`YyE!bMRpkTqg!rrdJIlSE2pdr@fwT)x9{%M7az09cpPv9fDuMj|1oZDFz*j(jH}2T$A|T@F z-<3el;|b`43GjC&kaI}_{I?R|uStM^K0&@?6VP9gfWAHf{hJBsf0h8hD1n^*1oYP> zz}F^_^P2?t?e$ z(BCicM`G}-v%RBtbD*`khXtw{Y68unp3vsD-f*a=p{BCEt25LP+|(WdRWQ)q7Y_7> zd)hiTb8vGg9Ox@qzyg8I9bKJB3HF2o0VD-_yPB>*Vz9lvtI6OD_Vkhr%BeXR4qAv> zdO|YApyyh|)nRi8vYWy^?SY<9Z&!PNh!KWlLNgu@G<9`$hMEk35`tlnhdNC{f=vZN zoy~#XZJnf|RJo(8xvgbeplOo@*NdWT>T78U^#pp`t|DavP3>L0Ji!1r!h(6sC^8Fe zZ40yRP)|=6%o%6{cHzQ6Z*NnuvxPy)UIzPxyV_ZkQPxduoz1MbwJ+S+<)YN9y*V`Tnb+eW&J#Aq!PB`4w z5$bAb4sN4-n_7EVOE;=7+ye2P&EYPn*t9hmXld&Vwo}Oh0SvZHq9!|nZBVIGFd(6` zy@2dpFqaR$#l_6PS-~bsTELc9S5;I7<`iCF#^w~x=U!^#<1V^fG5!)PaWZbe5eijM zkO1P8m!u^geW;blkI9_p&|c}n72v1Ti}nx z;GZit=m%r)zZLk`V(_mEJQMRfDgPaTcgNsA5cs7r_)i3WV+`I_V(7Co2A?AE-7)Q7 z!h@>}KAHo`xgKFoTJTv03I9E1!H==vU$o$7Tkx-0@X`d7Ec-Q@4i{PIWj{suITpO^ z*9b3)#8b!C8AQnl(AAlj+k&@x&rAzmOg%YIu?0_g$g9+Xx6Xf;TJV&&y!;lttYb>6 zv*6)~=C#&>PcgBKZM5KNPAIQd3x1SDBJ8%{Q!V(d7JQlozte(uS@3%;_;d^YfCZmn z!5^~Vt@E8D7Cg<><@HSqezZg)yw8HqvEYwd@MA6bK?{DI1%J|lA8)~*vfw9J@Gn~M z^4XJ;U$fvRS?Gr>`136I(-!<>3;q)e-fh7%(H_ZnrdaR}3x28vpKifVv*5>C@VOSe z+k&5N!Oyhd^DOvc3!a`4%fd#+Of)`z| zCG}kNoCVHV;G6}{S>T)n&RO7`1T)n&RO7JS-`*hFAo1c?H5>c z^Ita@ww*oY-~FiL5tHTY{68Y;?DW_1>zce2F@jquefYJrxTe2MFfFwWpW^T{1k)1R z@F0huAeffchVSF>!vxdP;_wj;A0wES*oF^q_E8XhrdlQEsG3ybNEhzX(?@Z zBZt3CFfE}C*KzoZ1k=*l@KO%nKrk(t4Ht8G7s0etHtgo`RRq%#*>F0CdkChbv0=vH z%L#T7eEKsWrf(uRo#59vd6lGboKhtCj9OIgE=!+$22mav9T|C7r9M}pl1zsBL038p2h z;Zq!bhG1H%8Xn~E69m%|)$n~Bewbidni@XB;bR2TlGN}44&P5OEkzCQ@z2dSCe>qz%7FV)m66S?E51M9_JMe~PrB=Kw*QbpOB!bVIH^pP|7YV{T|e zKSRsND*LWUA9@OONWX3tlq7_I|NKp)=Py7o;2Vpiy7@f%UpZDiG&lrd8C7{q>V=aZLlJgAqLd6)5Bw1sR}XwVq@v`zhZNU!520_| zXLwgRypy>;|9xO8_Ik_9{MWtW+H)(Qs@*4)s@-QD;T2T_zkmBSRPVD`WIdJ#a#_7A zQ(=+qWOlNv50T-=P!rIT`tD=Y!9mx7vqLMO7b>c(MM`xqR} zzrSzdG3wI>P7GZI`T=k5M5?A=BaO`Cy6y^SMK*C=_gz@l_2ZgS*N+>^N(NDZ*FqDo z>$nfKR{jpwh=-2;{p{JFw^25qA%HEZyUYlF58 z9)89(8}V5u{Y|I*0}Z*|XIz&(bjGz#3yC!UAwP85>fc|T+wD0@h2!da2R`QZ80z~Q z_p80BRG1Uq++t9$l2<4?6VASaB5uM}4>aeN4*TJLUI=vfP~SHu!!B^3{a5F19Qr8) z?MCSp|2}W-#_D~|xvl>5y}5PO=QroB^#bSErdM72=+X)oYIsPgR+@8*s~0urx?MM& zAF5odp7akO4tLl-;}|Lr)=B*}IvH7iccGKvDh&MuM&gpmFl1xc@orFl zQ01ES=m#)R9h&tAu1nCY?h#p(dI$b)^e+47-vB{FKB!F^cl-DMG>D6t`xelJ7 zoT^dYs$Tes>kH((aB}#9ZQ(Cn`)81Du;EhlY5kOg>v$s@c+rENn6*4K=^~M<0CK=lXHTR`R&#C*+CLZ1($#QNt~shaPnd z&4tM82DjE36;(HsC9^1b9Hbx{@_Y=R-gymL&%lYk1`nLh28oYS-YwpRuetW5P%pN> zyb8^GC>O-TOOP!PV+ipGxAfptN0_5)W2s)H)Cn0K_P;NDk_*7~?>kAgV) z5bno6@S}Bs|8Y3bL*zs{+yu+aD2LIC%z|`kq2ip&x@i zmZKAZJzhldVJI8r%k%TNI$wp=PNRPU)i#)jJ12bhk)iK^7-`QUt;N;(C#2twbfM-m zr0P-XSV0Td#P74XtI?hIf{*&|OFu;GKr=_#*wAqU7+OF=k+=kK$>8uI@&&Z;ZqP8e z?GPmL{$lu-=*(OX)Rfg>SRZhp_0h!3^?=V)J@8f?!lm?cA^j|&pYl2{s27(EBJeF5 zIt=lcP8aizZ%;DGLdVDZIv50<-@fvHOy^~8gzTX~kPoYzs<8|O^<(6MxxPi{C#l*e z?LyIq4cUV5E=0;4xCeWTuR8u48yE(d;j; zK%Y941d9w00|8>gNgTsjM*0#;f1Q;0BYGMzj3vZxfS^|M_Fs{3A5rd0?LuLAzbZSa zU&D|?<4E+a)GuO~OLpz~A@6HaD~Oopm6G@m@Q$Isa2vqUAMzjgM`MXc`?@4heO?gU-Q<1`O6h)#Y0{_6&} z9VZw24mjTa5v=wWJaFj02)d`G&^37vn6N##Z187xFYe*g%MRn^s=?BN#Pr4>E&&AdI%a`Nv$+M09N_H@=n4+@mJ;mqm85xseoV>kqm4mNe{gs}Eh-7wWt!F%rD1wnUjs0VV~5;wEAwW}xW4i#=LbQfuQjgJF1TD2y`*SGbM6o}i&C zLMQf~5)1Z8hI-myYlDMGJ%&%ZH=_}B!V>N+J=n5Il?aaqLA~Kf*nk=;bYBc>ksYXt zg)IsTjSQz3&)Hh`?|)cbRqb-}=9zV#T6dKf-Z;H@-qw6-RkQ)ty=hxG)C;{hossx& zX{o%mU7ZC~$GrWC#?=l!L9Cc5YKHXGJk~n?997o z&!+r8yx$bEpFsE!?xQhzZI6Ky>9WW|cO&B130lDm%C5p}L|jX6T1v5Re*o{ftDTJpH?ghRM6T?#o>7pqaUCLFfnX)xq znJ_BZaX?8{-mk&8rx(%W(Ul^HYSaNK5~M&676vdexKW-kr1}ZO~@>VoI7DQax$u z6={y;`c9Bhx%WWUm&jScbCaziZS0L|MVfm*cxHY<^Q0ADZ}+5??oO^vJFVEhnUYot zlqYQ_NI(h}$nxmwawY8(#h13zW~)NP16uV}4Y3BGd}(`eAHaPG_YqqoQjr~9RF-T2 z8=?1lLU0|bNCzM3;3FNpq=TPySe~}@@^}jH{nM90&Q{2gvPs;z>zoD7S>T)n{~f(W77+PG z>uhvc&jb)G*f3cjC~^|$v`CQi0GfZ$CC?6=5(Srdhsa3keNq?>OK$v<`C~PXmj_5r ziiIu?zbF*P>IR3U-SL#qVOpJ|3sV{n%W@gm|9^f5YvSv&z-{1{iExbwTSV9|!s|tN zs|fEA;R7OkOoY#i@J$hZBtrWX#;-9V%oE`P5iS$q8WFaLuwR7Ni||$v-Xp>XMEIBp zpBLeqBK$~%_NgL&5$1_-fe4q0aE%CCMA$FF>qU602=5W$10sA(ghnnnmm|(GEU&CA zbIy~YctRg#YM zw?oI2(SJZ%%1Ur1Cs8KZW9_#9&_9n3MbW`Df5E=SUDMmZrLf<==297(?!tMTLb1#Fz2@~-1B0OyDBvy{_9`A(>k z^1kbRnAhg~335p}ll?r^x$`z?net)QWKcU;(t0kDelxyK60d@-CZ_z;VS~2LKcFZn zXAOy2v>hRZDTc@_H_2C&w0e@6bv=GlY|7|Mp}8aLFO;SlX=7Q^_jwldn~@Bund^up zlkDT5-;9Zb9EG2x85~K!86|}LZ=zhxk@TCfjF97C%%qDrl72HTCFGlAofeLy-wb+t zMdrQa51->m`pvkGN2#JS4)ACi>GTyIokr1nc(jzFKj6_CivE;G$;25ac$93D@eGgV zQ1o{^I-8>Ohbx=IL(va-bPYv6V(;Cj-3?EMl`Jgwkkq|dsH%Wd;^~RqF&;7 zfL!!6%&E^!UIZHEyqACl&V0lj&Zkf_`UM$wptw0l#xP)X+T~sB`Xx)_Mg8);h zV6f3S5ti1MWj_a?)!9Kjey(-5vk%tRt2hvL9-vHD=yxHztBZ}gunz;s+yPdb<9&)=3Z-n0e;~?fb0C}3 zW&yhZ%r;)lqq|_&)Em+!A$jz*sJ_&FJZ^sp>}g}OLZGzUNXWSCtrTC4;-!tx-b3*( zf+=l6_HA4m`NrrUqlm8DH0~##L)@J{$MJJeIp3kqVxEh%V9qiWH~j)$c84=eDW#4_ zk&-?JOT{dGAx}Z$y#_d&gFMh)3aXUzGO5KoXzx=}%47%iFHZ7-lqs$!5C_>3g0^JR zpPF;hQ=Zq(huOv!!d@varttU~w4{`m^hJb!8P1mSvc3{=mbM5igylAJu{07vDWYxg zzJ_`j4y(-Zd8DVOJnQHO&iMoC<6d$86F4Zb50#KHnh%KfsX%3n9ZQa8@27@0fscfa z^`J@5ob4DU_H8I!W`XlY#F_JIw64rT=Pm$A&bRTKS;PUm^K$5$S7q^wlOGSH1_>S$(JX~|Rq=A4eU zlI7xn;`|4OqO5cWNuY708q}FIe5T}r-xzmBFR}Lnt=B+4(`n15q91|vZ7iiFLbTHU z4I-jmjp>;vnWBFQR}1n4A|@_7J4>Uz5krPLpW2&P{MyrS<%#x@;0TfmSG zOC{-k0iOGsyBf$NuPsKY5Ir2*!6T!ChHCOb?8|zj8ktSk@`ByL8ryvQTo?` zPu0`Go2I)V-lf~1UAq1yU@~+XT{HDc#Iy9vV1#V_M`%T(^%;;eMxTb(kfXl?{8)W4 zav7)Bf_}Vy2&I{z(`MR z-;G2~4+C%4Z^v)4z6;_U`n`xd^*^HkDS9;|zz*OVr9Tfjsrr0s;`$*_x^xnsu8#&j zL;p20%+!C+i}5@PoUISTe53XEQPeT|7^LRtKLlp1J`Qy}PX8Ky$Lp&gd4j$cIZo6! zK+YunFod3`KLPoZ^?J~_^;|lc<~%$29kbnbORGV&@&O zqY~ozcrlr`Ers%#B*^BN1343pql%SR6phRh`=p_K^=+&LOx#7*6{lnfHz14KI^hw-EQ zUg2eZ9PtNn)7}yGHj3c>3*1%tRN;e$dhp1ODK%~kbk3gAWOIijCO})g; z*e2A?M%>eG5%hNhnX5E9)$|f#r)$b)H)B6E<;j?Q4~CL%%OP)?z71s49usu;1ISex zl;T|FBBe|SsmO&mTndvhQ%I^U`;;l9QP9N|a=9r)#!Mj-ZKFrSB8Dc{BoLCvw_`(# z<8EwF06B_l>m_Av*WmXerak=h{NV8Yi(CEmiJXrz$e^{T_L!!oR#+%ivho6 z;GOCxbGRT9uFQvQo1>NG{naAjyA}!4gu*XC^7B%{I8&DfrG#v`giSkN5RwX{JhEpq zreo9k^`>cvODV9~E}$-D0g`T1k&JsLrQ}xt^DZEInw>QPVkBo0+ew^*w(4{+&PK}Y zBxHhnCMD#T0`mnxdvTxd1z^hq8rST7xkluVZW!a+0(cj|A-E^Xuck0J^rwK${-H?! zI}!g<0QM=E{TakgmFr0o^JETWmUnqFywg9I(zsx57MmlF&DMo3nGlq>dA318Y`G{5 zcWSID@Qdn$Thq&?Jzymy&v%cIJq=6+iW~c!rgL^Uu#B0l>T%nb$z*AuI+?`SW4LFR z3G(xx(CkV9kajHZv?%l}K#z0vL|d85y-u!lkk_GlXMZTj7f{i%g`^4qNvL4*0did- z0Znc#wYzn&waW6Q3+h@>Pl=+Q$EL|*T!KUhfEZje-bd%NO0X&H6i`aB%{dBXoti!Y zt9mHg+qkEy0B+IXT)1ZvS^gwo-U37q`Gqq9^h_s-j5Qkp`wKKE%0~kARQU@KX+bx+ z5qI8=g0uy?{8A{ooonSNW7EDXQhT_jjW#2Nw^(YIY+9bEeWTN8wC#vkWGT{Tc#+pE zL6d~B4~1G_v*n|xQ`aDg9(QRg`Aka5ZvrL-{rG3VD2d;v=bxzRk)|V4&c{_JdS%Nk>&prn5mcsjKy7)f~8~i;Hm9JIXv>(_M%)K zIlaB8ghzJn$X|lUS3rCacm7HM<1iYh;?7?S;5&%iO+W~MhJol~0(vL~z}>j>cK~pW zLPogrzX0G~MD8Krb^s3ax1SJj4**)sparD-9{`}|(=br(v64iGh?)*wh*avq-!f92>PDdg z(NGU=bDWP{g|SK5>@h;w119A~yf0Xtbnqk=Jo99IP^NP@F>3Ub%=8^0>X%5}Xrx-Y zn$^^=qDQ9QRq?XCe_Fg_yOi~sl;slM@d9LhEuJivw^)$;2_%CCiBsKKEX`aalHW!0 zt1@|mnamG&4!w$*9PMba3(1t9@rvf2qCN!#R&@;av2oy7Rhrz*= zZz<}f_{-qbeIPpvNBk%5{M!J`g3YJm&i^`q0YpBJyXXf1sGBP~&LanQadk zlgJ}eo<>tfT&2k6RznHut{Q9(KW4PTRmso4XC%@jFYgv1@CD#skeYYLxQVigO_RRr zGs>Wp&@<~-bnGqrlMUM5uZ&uRycL@9lmsbuzcPy+DCf{CGXX51mOrQ6=lj6C4;Eu@~8E!3V%YMUoi>-wjpN)bT&r? zev3a=fwKv1@-eU(+Srr=UO>vlrd+^t;eu5|@cf%FPf?PT3=Oj8-(mn$IZ#AuCMks+ zD5ETslu`obVrwQ-G$r`}GM>NAffP+i=fFP*u#1#W4IrDREW=DmNfs$S1DM298ZjkS z93tgu%!dGQ9;yhZ)q+lAO!ArzaX6hIUKmu zNXg^C?@H&!dlc2KN%)=h%!sDA=My5TI-|YQ4rx-I~v9o!%*|T*dvvvy3YJW`$kwG_``uQTEiI;y8lQK;Kd$@C>&v7fdlapg?y&`_-d~|X&^>X*c<+~BOS;ER zNcSE^K6Fpoo$7rUhNXLgFU|WhWYc}#AJZ!5q2T4XQ@@JBEJ3;Ho{R!K55?$qKdFqW ztOqCEsha?-2bS*CWdQz)veT_ju%&tFrNwmTyZ~8gkcB(vP`Wn_GU?7anC_bgg=XQN z!YVI<&UB|Ht56WtMt9C#>E1gagYKM`QQqIdKnPh2y>`*TpxJ+U;yOCC%2xY?=R;~=Jc-1%d@kD|@d zJ?YX^Z!vImPwLC`E{8gFPr4?PDH+Q2v@Bgsn~>I+lcA)e;oDsJn*=@2s=0_PK^hu- z9)H5s1O{cck6~(BnZ8J0$Z3;_3D5OeikhbD23~;-ESpEjNilQEILZNcuIGz>qo-wW}D?`al zUOM)+ig8qiiJFl!*UOgkV|w(N1QC?A6?dKxYsF30mBt(r;*Ls0o>L|%C0VPLqZJxu zwpL%KU91z~RE?EniCm@)>{3wIB|zuifKN%-#vZHyEB?$+s63fUY%@%8jX4ovGbwvK zZp@3woE1%|8@ZmJ0*VYY!`TqZj4TUGN}-{kE!3eAp(x)XE*eS|7s5phi;xA~yf7tJ z(_u~r(6k!nOI9Od(9w}Uj?76h&yV4289fQzjB zQqjdiGeJ`xO%vq~_=|bO>qJFeXw6aJmRhqFIGibtcyvXq*BOPWEW{(#;&Gj6(hfMC z5QTz{cr!*c3LVMk&^@Y*|K&&dG%b}WxPZp36!rD?6t#6Wwf8lLits6zz=C<=yD*zO z`-(QT;SKv%k|uR4YZ7+(*^}j^Z|{55#J8zYYGSGBo;Pl0Ed22oPjf>;X?&<0?`oC z)`<{ZsNh;wRqZoaA~6VW>jDzFQ?xT&(1#!5gKpx322EW(p(q57@EI`Cx3}XPK&=cT ziacW1id|*kjRFlN15_-7wH3$v+Hvd?5C%(mv=tCM&MXm?o`1l?pdxc322Z6=PZ+UC zE)au>uR%#4moQ=|JI=l#PWFY_5QEgdPMn@>Hn5nfx3!0HNYYrp#AAfhCMVYF9g3pa zvNXk>q1o*H2-CH3{c8~~&&t+H>`1&sE13;=iG7#dHf^+~0awgyNy;v51_f(1`#L0l zU&|t5`$26ELhTZ**sqOU0Yo+DQ0+z9L?o#8K5a6>Nq1<<>XUB3>Qx8KloY#?WP=Xs zfgL9`b+iU}aS}19@8W^ej@GG7h4S*x#Oli`DW3&Rr`l6B=a;mp^_uev{<}@fP&3zR zPPLN?bD@@LSHg(Y2sLX)kJi$;!dtWq9vXT&)XNWmOr79>ZrNJ0JRm>h$NeRP~XoNeMd`fccrK?6#u-DT=0pQrU2TuooXlQZ+?=X**gXAmu?s^5i(TBLOLX@(;SWvrLA*h z{S?+)MN$u9udZ5zM}52ch7H~WLe>5tGTkLIC5+8}3sSPREI*>HoXBQx*Cz0!el1Nw zG+j$por|@!+rfV#OG~rEJyqyIwUz`wB^AivMlDwJTD6}6$rrgd*u#i^U%2Bsv#u3w zhF!f{@iX0uJr*2ZyZzoZtUX)BQH zVd$(>`?VATc5`2vu~N&f;t-Owg)6ktyY5A9IY!0U9S@SoUA7sSpn5CUMWlc-)Ns8ze81rfqY_o;c1BkYbTnv=Q` z>3nm9eI1)0L?g8yv#aM9s+TxUKB%dxe=YfLhNhP9f(|yf=GXX z_Yyia;GY^OIAJd`+N{|eqiqG*w$g0gu`N;_=iy#O*)2+{4qX%G-GYkVpS&0b>2hSk zpcliQ+4dE7TiIx81bMP)zW~i_fb#6>;T?{a7IH2yy}-hT8uvaAJuWuOvTJ3pmeazU z-9bfpkh@%t`tEjW+v@n&?Z?*I)z6rMZW8X#k#F(V32%cDP8dDPz3@Escc>>-ee!DC zRJ2}``Xf-JsvnyDIHc}V74?TZ?f|-)d;(Xt9b=!G?s#2GQ9EcT`5t`IXm(F%D!B(0 z+;Ld+8UazgmvC*9?2bO(;xSn6){@k|!Ut_O3}^f!N&&olp^4R28!x{Icp4g32WmWP z0~J2JMxt{;pryTQOIv447fm_%C#d9?rfRDLl@)=i+BKf)DlZH0H!#quT%c+dKGM{5 zMIel~QFOLo^1;73MbZM@cxMDB0AT>HK#0k=YFWd&I-faR3AAFp1u6zD{KbCjDiG-G4$~*FEK{&ZsVZx{fqGvU|dlD*e97l>%P1#b@T+c;fqy8S9bOEcNO(**;Ih{fHYlE z)Ew&WEuwc56ok9F+DAs|l?BW=@K+g{ZD* z2-K|d`h==p-!e~Qbps3&4A5e~nTJ7-`l#@ED)D|17$+*tv#i0lI#BJYZ;0@4x2yDf zYHNMfF<5fOWvF#uV70Gdb(OE4H5uOtvwUUEl+WeVS9)p#%c?!g>tO_Zk1c>LfdTFm zfk58^9>dq%_&YT?KyOf?>LZdsTldx&1?n5?>QH??Z=iBjO^v743$buN{w1;iK1tTg z>ivxkfz{rNSI2UaBBE6F^aMa(J%bK&=R`fVP>bme_J>4^AiwbXDjJu^Nb^*#Tn%@T zc1ObuhPm~5AtNOK)_4sJeJah(fBHIm+ctONEgw{|9id=vUr#8|L$9{M{JopCZsFE3 ztte}}veFYkv8#P+P%EbGN?B81PY-`eifAZVVw8*$>Gf3yF2-9r0(Jg%;N79)D5)+@luv; zR3g};WC41rC_R^>#hQ9j+43)8;X3yPIPCSnTk?VzZ|_G>+S0ZP>(7Fly7AN#pI@z}{b%Bw;>U1XyAhE;WDOSU#L?&wmM_%`+ql|8?|6dh7`%+3$5K0?P)NM<${1WLE9)XUaVa%bwKNk5n8O7BwqtZo zrfE@mc(+fmJ>Ha}*4I#5A6VvPJf}J|WnTmJi1b&ONP9Lqc2hj>RL}w}Bgv-Tt-Kzf zhx|mR97!?aKx|9_s0+jUtt`IBTQN;~VA|NOUKS-#i}5BRNp@}{hoVRqOFgUj9;T^3 zH(?!SM~3iZqdb%iB1$^O^*uU?OsM6h6T;O8Y7KK z)JI-^!@G0I>MxPdq2$v>pSR1HYb+K=CL=T!@TE^qx);aT$NLaWb%}D!r56OEB z@*GSfjgOm}${C&;XV?fDLyToU!bzhhB-E8xHlp9HL3Z82=K0Y&dn#xqM>7oIiFR34 zZB@NLLc}GSr80Gr<)z^dHHT>fy^#&w3jZi;(^8kn~uAVTe8g%S$N+`zVFHjWu;fe@%}V@F9A)9de}#r9Q-L z6jW^b)GSS?$Lg2z%UgKb##++nqS8iZ`Lxpo3>_5J?SIBk+%afn*EEyli|=M z1n^!!)@F9ahUi`}@uk@jh2@iXxMnZC*bOR}%^M%FbK1s~o47_AqdT$`rv++IU zC?R+pTD~05QldMuDps|O4`BiBv0$f9C$}|kmETwnkez|Xz}|~Lmf){Td@dEOBh8!S zGnqM^?0Fo%T!YE)uL8VJA57-=<5V? zvt<;g;m~k(Zw<9AqnqG^EPwXkc}1&Ig)z$OTT6c(<9}a7sN%0Q;*x*Q_}f$ip|D07 zmFJ)oRxhLSWLOfzwxPokx_Y|gt(Va^1j-I#ON8X?NDeakZ4Vu|20U4FnjaTN#In0|)#jc4h3I3F5prongnK6Z}k=jY80BWRm zYes4}!d%F~CS5Sg^vXIJjbyn#Ry`P+UsAj0O-K0O(+<0L%`=7aThK~QMgb6H;Afp4ObvDT8eiPLwqtBbD4Kgb03jL0(E{jvi z5^OO&XoI0q@ddOC^e^ZldaBG@{K0sg3M{6*i*wjS@uvULv&V zk7y;MWit#?mEo9;)JvWb<46h25XQl|MH&5)Kyf;^(7Z&194Udtkz&cHEEcDe1xpnp zEHaT%SyoOLT`r>?Mvhd#rPXg1>cfZc+b(S^E1o0c=^!mH>z)(J+Lu+qkrF5oE*`I5lH-=&&PL%q zj5`j;<}dNFk|kc&unZwRp(P}bw1%bNN6kJ*7FH5V*i!hT+v61e==T3qMeJ_F6|b6N z3;&b7yM@D$5B$nRtg76xNm+)^*#|p}*bSz04>s>rQS#`3%lf*G)pe?5(dL^m2 zFIZgzl4Vs?m>6oUmV<7S6!i1Kw0)-u1CsYzGuMEON;9K!j%>GI&8Cic&d21K z&+}z0 zp~yyNXJhk5lwVQg^M!n!hsyfP{sXckm~_WTI`f?e@<}b;gO#w1Q#{{I5Fy!jfr!(m zaOr|u%9jr`M^KwZv?qcx$gRIpY($e0){Y#|f6|;Rk6cS5q4F@nE;^cr3+vZ1T3%$J zXsxtyghhLr)IV)c=9ay3d0(Xw1}Ax5^K zSbjPB%Xx_8mop1FU6XU3SpM{w&Rll1a(l_O~b-B-e79Q7;zQnw@z7Sd4fcxDYQEt{V3*+i%(^zrpBXBGhc&gO;wqTeOF}BQERG-H+07P-UD8r z$_7_iDWx17gN@Sxs%#u0S+glbw%v&CIPr;Dj!cy3GgK6J~1O8TDs=q zCj4tL_+@TuqtsFnnPi_L9;+jqux-fLG%9=N|=qtp9(=@gv(2z4TdOBmMSb^hdTh{lIyk&x9S0n4>lq z%;=-l^5sVc#`rBwfUin`zXW)oB&Us4~|EF zECK%U1bF(~L^|}@8q=;{Pe4DD@OXDaY=8K-1oRmwZ#+GpOMuT!fG~<=~507y> zq_Lf%pA?HR>@egIeXQSpN9ZZ1Q1Zh$_a(^pp#=D+6X4%Yfd41~o?cfTx4shK^Ah0a zB*1$T;A;}#HzdGc2|W2ptUc+a{PFa^DFObgz`HH=Eu#+rKUD&j@aY6{UI(7q(O^tF z`Zxi7)R7`=45JPIO`BqmDmC?ld&7M#EqGZ1_TGm!(`SxxmZyU@4tL_64uL>(S738{ z*CuS^$M()1>~rheify?a-R&WKCbqCRJ_Syht--V6lfdGi32(W?NyAFF9t16>Ya1xHr5(cpIFyQkG34S_Yx4e2) zg$KLQaa0H!7#lnl)jpDn_dqlSntJ=Vs$vT+?N6oc=}VVaS5;I7=HMe$^Z7=|C`6#D zp$2DLq_rAqD#=z2bYeyv>WU(#BN9;v+5yYAWk>b_$D{`Xmh%jeO?{E$O@WZHk+`)F zhsd^cMzLFV`9|T5P0&#&bE`5=u=IBF6L2k21lCQRQ3=L(&ZAJgOi>tNWL`BmUC|b; zr*UjAhJlJ@Y3}?78}WnKlVZl<3hoick&}dSIE@qxALB(tCF30AJd5e54FIGr!>}TqFp3gt91o2` z1p;UZ0i)3xCbk{`Annbg8N3C>Z9joP(^i~RYr`>D>}QXXZyaQcLKz2!qEURCd=!cm z_HOII{$YgJG|j_S8RMs4x>;doR~X-}@9Zn2^RLYX*ynGcJQY>gdc2wOG;H&2WrfY# zIw8*paR`N{$Wy^qAb_-!6(U-=xeFkDqMa2|e+i;4UO|PSR?$OJ zhh#zqtI<^&95PN^loteWy>Onf35s=vDH~wu&_N;mjTO>yNOZ`+g*Nq}cJamU&FJO@ z$WH*tq)nT8Lj5uY@8Ai^IBX}QIM^+tLXu@9`=3SW$r)2;Ji8c|T(^-S-Yy<>5v}!_ z1|S)?Z0WcE5BR^lA$|_dL+LW>G)K4m&{+T7s*h*o>*@7k@I0G zwiXdu>XH0%T}g)Yr2)F^xT)-tA5Vb%q6Jq>y-a?&{v^Z8rC@`c%Mei>(AG5i#-}8c z>r^sq5yVn|NhiZAkWSwWm9SjTlA&B4iq&6;Wmh3WMU?z<-Ajh_IXSvy{;}oXgEZo= zAR=6HeN2X@$vC)(pKKP(e7=F2KC_}F#6k%-sKab&;>x(ixLdLaRvH3rav^3npP0V%31B(r& zSb7P|@HvpVEc|l4^3Z?C{|E4riZXw>u6ac8yJPfsgVuVz3xG^4`Q`fOV7Z_Y6(g%b z>Mi}?5Xh|g%XQMh3l096LW~R~zYIT);WyV)ml_5B<2}S6Rf$0^7_%GenOqKj%*N%xNTDoMIE%*&=-Lk!6N E4^R&)TL1t6 literal 0 HcmV?d00001 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/scan.c b/src/scan.c new file mode 100644 index 0000000..ec91c7c --- /dev/null +++ b/src/scan.c @@ -0,0 +1,471 @@ +#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, 10); + 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_scan_result_pan(struct nlattr *nestedpan, struct nlattr *ifattr) +{ + struct nlattr *pan[NL802154_PAN_MAX + 1]; + static struct nla_policy pan_policy[NL802154_PAN_MAX + 1] = { + [NL802154_PAN_PANID] = { .type = NLA_U16, }, + [NL802154_PAN_COORD_ADDR] = { .minlen = 2, .maxlen = 8, }, /* 2 or 8 */ + [NL802154_PAN_CHANNEL] = { .type = NLA_U8, }, + [NL802154_PAN_PAGE] = { .type = NLA_U8, }, + [NL802154_PAN_SUPERFRAME_SPEC] = { .type = NLA_U16, }, + [NL802154_PAN_LINK_QUALITY] = { .type = NLA_U8, }, + [NL802154_PAN_GTS_PERMIT] = { .type = NLA_FLAG, }, + [NL802154_PAN_STATUS] = { .type = NLA_U32, }, + [NL802154_PAN_SEEN_MS_AGO] = { .type = NLA_U32, }, + }; + char dev[20]; + int ret; + + ret = nla_parse_nested(pan, NL802154_PAN_MAX, nestedpan, pan_policy); + if (ret < 0) { + fprintf(stderr, "failed to parse nested attributes! (ret = %d)\n", + ret); + return NL_SKIP; + } + if (!pan[NL802154_PAN_PANID]) + return NL_SKIP; + + printf("PAN 0x%04x", le16toh(nla_get_u16(pan[NL802154_PAN_PANID]))); + if (ifattr) { + if_indextoname(nla_get_u32(ifattr), dev); + printf(" (on %s)", dev); + } + printf("\n"); + if (pan[NL802154_PAN_COORD_ADDR]) { + struct nlattr *coord = pan[NL802154_PAN_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_PAN_PAGE]) { + printf("\tpage %u\n", nla_get_u8(pan[NL802154_PAN_PAGE])); + } + if (pan[NL802154_PAN_CHANNEL]) { + printf("\tchannel %u\n", nla_get_u8(pan[NL802154_PAN_CHANNEL])); + } + if (pan[NL802154_PAN_SUPERFRAME_SPEC]) { + printf("\tsuperframe spec. 0x%x\n", nla_get_u16( + pan[NL802154_PAN_SUPERFRAME_SPEC])); + } + if (pan[NL802154_PAN_LINK_QUALITY]) { + printf("\tLQI %x\n", nla_get_u8( + pan[NL802154_PAN_LINK_QUALITY])); + } + if (pan[NL802154_PAN_GTS_PERMIT]) { + printf("\tGTS permitted\n"); + } + if (pan[NL802154_PAN_STATUS]) { + printf("\tstatus 0x%x\n", nla_get_u32( + pan[NL802154_PAN_STATUS])); + } + if (pan[NL802154_PAN_SEEN_MS_AGO]) { + printf("\tseen %ums ago\n", nla_get_u32( + pan[NL802154_PAN_SEEN_MS_AGO])); + } + + /* TODO: Beacon IES display/decoding */ + + return NL_OK; +} + +static int print_scan_dump_handler(struct nl_msg *msg, void *arg) +{ + struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); + struct nlattr *tb[NL802154_ATTR_MAX + 1]; + struct nlattr *nestedpan; + + nla_parse(tb, NL802154_ATTR_MAX, genlmsg_attrdata(gnlh, 0), + genlmsg_attrlen(gnlh, 0), NULL); + nestedpan = tb[NL802154_ATTR_PAN]; + if (!nestedpan) { + fprintf(stderr, "pan info missing!\n"); + return NL_SKIP; + } + return parse_scan_result_pan(nestedpan, 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_SCAN_DONE) + return 0; + else 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 *done_argv[] = { + NULL, + "scan", + "done", + }; + static char *dump_argv[] = { + NULL, + "pans", + "dump", + }; + 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 wpan0 scan done */ + done_argv[0] = argv[0]; + err = handle_cmd(state, id, 3, done_argv); + if (err) + return err; + + /* dev wpan0 scan dump */ + dump_argv[0] = argv[0]; + return handle_cmd(state, id, 3, dump_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 scan terminated on this virtual interface"); +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(pans); + +static unsigned int scan_dump_offset; + +static int pans_dump_handler(struct nl802154_state *state, + struct nl_cb *cb, + struct nl_msg *msg, + int argc, char **argv, + enum id_input id) +{ + int ret; + scan_dump_offset = 0; + /* Configure socket to receive messages in scan multicast group */ + ret = genl_ctrl_resolve_grp(state->nl_sock, "nl802154", "scan"); + if (ret < 0) + return ret; + ret = nl_socket_add_membership(state->nl_sock, ret); + if (ret) + return ret; + /* Set custom callback to decode received message on scan group */ + nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, print_scan_dump_handler, &scan_dump_offset); + return 0; +} + +static int pans_flush_handler(struct nl802154_state *state, + struct nl_cb *cb, + struct nl_msg *msg, + int argc, char **argv, + enum id_input id) +{ + return 0; +} + +COMMAND(pans, flush, NULL, NL802154_CMD_FLUSH_PANS, 0, CIB_NETDEV, + pans_flush_handler, + "Flush list of known PANs on this virtual interface"); +COMMAND(pans, dump, NULL, NL802154_CMD_DUMP_PANS, NLM_F_DUMP, CIB_NETDEV, + pans_dump_handler, + "Dump list of known PANs on this virtual interface"); + +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 Wed Dec 22 15:58:16 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miquel Raynal X-Patchwork-Id: 12691725 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 AA613C433FE for ; Wed, 22 Dec 2021 15:59:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344041AbhLVP7C (ORCPT ); Wed, 22 Dec 2021 10:59:02 -0500 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:40329 "EHLO relay4-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344070AbhLVP62 (ORCPT ); Wed, 22 Dec 2021 10:58:28 -0500 Received: (Authenticated sender: miquel.raynal@bootlin.com) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id 79011E000D; Wed, 22 Dec 2021 15:58:26 +0000 (UTC) From: Miquel Raynal To: Alexander Aring , Stefan Schmidt , linux-wpan@vger.kernel.org Cc: David Girault , Romuald Despres , Frederic Blain , Thomas Petazzoni , netdev@vger.kernel.org, Miquel Raynal Subject: [wpan-tools 7/7] iwpan: Add events support Date: Wed, 22 Dec 2021 16:58:16 +0100 Message-Id: <20211222155816.256405-8-miquel.raynal@bootlin.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20211222155816.256405-1-miquel.raynal@bootlin.com> References: <20211222155816.256405-1-miquel.raynal@bootlin.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@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. Signed-off-by: David Girault Signed-off-by: Miquel Raynal --- src/Makefile.am | 1 + src/event.c | 221 ++++++++++++++++++++++++++++++++++++++++++++++++ src/iwpan.h | 3 + src/scan.c | 4 +- 4 files changed, 227 insertions(+), 2 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..0c5450b --- /dev/null +++ b/src/event.c @@ -0,0 +1,221 @@ +#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_PAN])) { + 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:"); + parse_scan_terminated(tb); + printf("\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 ec91c7c..a557e09 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,7 +168,7 @@ static int scan_abort_handler(struct nl802154_state *state, } -static int parse_scan_result_pan(struct nlattr *nestedpan, struct nlattr *ifattr) +int parse_scan_result_pan(struct nlattr *nestedpan, struct nlattr *ifattr) { struct nlattr *pan[NL802154_PAN_MAX + 1]; static struct nla_policy pan_policy[NL802154_PAN_MAX + 1] = {