From fa57212b82e34a95c6b3302ee9ec2047388ab342 Mon Sep 17 00:00:00 2001 From: Li Cao Date: Fri, 9 Oct 2020 23:36:39 +0800 Subject: [PATCH] [cli] add cli command to control child supervision (#5620) --- src/cli/README.md | 43 +++++++++++++++ src/cli/cli.cpp | 55 +++++++++++++++++++ src/cli/cli.hpp | 6 ++ tests/scripts/expect/_multinode.exp | 4 +- .../scripts/expect/cli-child-supervision.exp | 47 ++++++++++++++++ 5 files changed, 153 insertions(+), 2 deletions(-) create mode 100755 tests/scripts/expect/cli-child-supervision.exp diff --git a/src/cli/README.md b/src/cli/README.md index 33b525ffe..5a2893bac 100644 --- a/src/cli/README.md +++ b/src/cli/README.md @@ -28,6 +28,7 @@ Done - [child](#child-list) - [childip](#childip) - [childmax](#childmax) +- [childsupervision](#childsupervision-interval) - [childtimeout](#childtimeout) - [coap](README_COAP.md) - [coaps](README_COAPS.md) @@ -476,6 +477,48 @@ Set the Thread maximum number of allowed children. Done ``` +### childsupervision interval + +Get the Child Supervision Interval value. + +Child supervision feature provides a mechanism for parent to ensure that a message is sent to each sleepy child within the supervision interval. If there is no transmission to the child within the supervision interval, OpenThread enqueues and sends a supervision message (a data message with empty payload) to the child. This command can only be used with FTD devices. + +```bash +> childsupervision interval +30 +Done +``` + +### childsupervision interval \ + +Set the Child Supervision Interval value. This command can only be used with FTD devices. + +```bash +> childsupervision interval 30 +Done +``` + +### childsupervision checktimeout + +Get the Child Supervision Check Timeout value. + +If the device is a sleepy child and it does not hear from its parent within the specified check timeout, it initiates the re-attach process (MLE Child Update Request/Response exchange with its parent). + +```bash +> childsupervision checktimeout +30 +Done +``` + +### childsupervision checktimeout \ + +Set the Child Supervision Check Timeout value. + +```bash +> childsupervision checktimeout 30 +Done +``` + ### childtimeout Get the Thread Child Timeout value. diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp index 44561fc5b..6ce76df3b 100644 --- a/src/cli/cli.cpp +++ b/src/cli/cli.cpp @@ -56,6 +56,9 @@ #if OPENTHREAD_CONFIG_TMF_NETDATA_SERVICE_ENABLE #include #endif +#if OPENTHREAD_CONFIG_CHILD_SUPERVISION_ENABLE +#include +#endif #if OPENTHREAD_CONFIG_PLATFORM_NETIF_ENABLE #include #endif @@ -942,6 +945,58 @@ exit: } #endif // OPENTHREAD_FTD +#if OPENTHREAD_CONFIG_CHILD_SUPERVISION_ENABLE +otError Interpreter::ProcessChildSupervision(uint8_t aArgsLength, char *aArgs[]) +{ + otError error = OT_ERROR_NONE; + uint16_t value; + + VerifyOrExit(aArgsLength > 0, error = OT_ERROR_INVALID_ARGS); + + if (strcmp(aArgs[0], "checktimeout") == 0) + { + if (aArgsLength == 1) + { + OutputLine("%u", otChildSupervisionGetCheckTimeout(mInstance)); + } + else if (aArgsLength == 2) + { + SuccessOrExit(error = ParseAsUint16(aArgs[1], value)); + otChildSupervisionSetCheckTimeout(mInstance, value); + } + else + { + ExitNow(error = OT_ERROR_INVALID_ARGS); + } + } +#if OPENTHREAD_FTD + else if (strcmp(aArgs[0], "interval") == 0) + { + if (aArgsLength == 1) + { + OutputLine("%u", otChildSupervisionGetInterval(mInstance)); + } + else if (aArgsLength == 2) + { + SuccessOrExit(error = ParseAsUint16(aArgs[1], value)); + otChildSupervisionSetInterval(mInstance, value); + } + else + { + ExitNow(error = OT_ERROR_INVALID_ARGS); + } + } +#endif + else + { + ExitNow(error = OT_ERROR_INVALID_ARGS); + } + +exit: + return error; +} +#endif // OPENTHREAD_CONFIG_CHILD_SUPERVISION_ENABLE + otError Interpreter::ProcessChildTimeout(uint8_t aArgsLength, char *aArgs[]) { otError error = OT_ERROR_NONE; diff --git a/src/cli/cli.hpp b/src/cli/cli.hpp index 5b060df07..060af4ff1 100644 --- a/src/cli/cli.hpp +++ b/src/cli/cli.hpp @@ -286,6 +286,9 @@ private: otError ProcessChild(uint8_t aArgsLength, char *aArgs[]); otError ProcessChildIp(uint8_t aArgsLength, char *aArgs[]); otError ProcessChildMax(uint8_t aArgsLength, char *aArgs[]); +#endif +#if OPENTHREAD_CONFIG_CHILD_SUPERVISION_ENABLE + otError ProcessChildSupervision(uint8_t aArgsLength, char *aArgs[]); #endif otError ProcessChildTimeout(uint8_t aArgsLength, char *aArgs[]); #if OPENTHREAD_CONFIG_COAP_API_ENABLE @@ -541,6 +544,9 @@ private: {"child", &Interpreter::ProcessChild}, {"childip", &Interpreter::ProcessChildIp}, {"childmax", &Interpreter::ProcessChildMax}, +#endif +#if OPENTHREAD_CONFIG_CHILD_SUPERVISION_ENABLE + {"childsupervision", &Interpreter::ProcessChildSupervision}, #endif {"childtimeout", &Interpreter::ProcessChildTimeout}, #if OPENTHREAD_CONFIG_COAP_API_ENABLE diff --git a/tests/scripts/expect/_multinode.exp b/tests/scripts/expect/_multinode.exp index 7a6f2cbf9..371cdb9fd 100644 --- a/tests/scripts/expect/_multinode.exp +++ b/tests/scripts/expect/_multinode.exp @@ -29,7 +29,7 @@ source "tests/scripts/expect/_common.exp" -proc setup_nodes {} { +proc setup_nodes {{childmode {r}}} { # Sets up a Thread network with 2 nodes, spawn_1 as the leader and spawn_2 # as a child. @@ -62,7 +62,7 @@ proc setup_nodes {} { expect "Done" set spawn_id $spawn_2 - send "mode r\n" + send "mode $childmode\n" expect "Done" send "ifconfig up\n" expect "Done" diff --git a/tests/scripts/expect/cli-child-supervision.exp b/tests/scripts/expect/cli-child-supervision.exp new file mode 100755 index 000000000..84f426b37 --- /dev/null +++ b/tests/scripts/expect/cli-child-supervision.exp @@ -0,0 +1,47 @@ +#!/usr/bin/expect -f +# +# Copyright (c) 2020, The OpenThread Authors. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. Neither the name of the copyright holder nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +source "tests/scripts/expect/_common.exp" +source "tests/scripts/expect/_multinode.exp" + +setup_nodes "-" + +set spawn_id $spawn_1 +send "childsupervision interval 30\n" +expect "Done" +send "childsupervision interval\n" +expect "Done" + +set spawn_id $spawn_2 +send "childsupervision checktimeout 30\n" +expect "Done" +send "childsupervision checktimeout\n" +expect "Done" + +dispose_nodes