xref: /aosp_15_r20/external/openthread/src/cli/cli.cpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker  *  Copyright (c) 2016, The OpenThread Authors.
3*cfb92d14SAndroid Build Coastguard Worker  *  All rights reserved.
4*cfb92d14SAndroid Build Coastguard Worker  *
5*cfb92d14SAndroid Build Coastguard Worker  *  Redistribution and use in source and binary forms, with or without
6*cfb92d14SAndroid Build Coastguard Worker  *  modification, are permitted provided that the following conditions are met:
7*cfb92d14SAndroid Build Coastguard Worker  *  1. Redistributions of source code must retain the above copyright
8*cfb92d14SAndroid Build Coastguard Worker  *     notice, this list of conditions and the following disclaimer.
9*cfb92d14SAndroid Build Coastguard Worker  *  2. Redistributions in binary form must reproduce the above copyright
10*cfb92d14SAndroid Build Coastguard Worker  *     notice, this list of conditions and the following disclaimer in the
11*cfb92d14SAndroid Build Coastguard Worker  *     documentation and/or other materials provided with the distribution.
12*cfb92d14SAndroid Build Coastguard Worker  *  3. Neither the name of the copyright holder nor the
13*cfb92d14SAndroid Build Coastguard Worker  *     names of its contributors may be used to endorse or promote products
14*cfb92d14SAndroid Build Coastguard Worker  *     derived from this software without specific prior written permission.
15*cfb92d14SAndroid Build Coastguard Worker  *
16*cfb92d14SAndroid Build Coastguard Worker  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*cfb92d14SAndroid Build Coastguard Worker  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*cfb92d14SAndroid Build Coastguard Worker  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*cfb92d14SAndroid Build Coastguard Worker  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20*cfb92d14SAndroid Build Coastguard Worker  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*cfb92d14SAndroid Build Coastguard Worker  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*cfb92d14SAndroid Build Coastguard Worker  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*cfb92d14SAndroid Build Coastguard Worker  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*cfb92d14SAndroid Build Coastguard Worker  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*cfb92d14SAndroid Build Coastguard Worker  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*cfb92d14SAndroid Build Coastguard Worker  *  POSSIBILITY OF SUCH DAMAGE.
27*cfb92d14SAndroid Build Coastguard Worker  */
28*cfb92d14SAndroid Build Coastguard Worker 
29*cfb92d14SAndroid Build Coastguard Worker /**
30*cfb92d14SAndroid Build Coastguard Worker  * @file
31*cfb92d14SAndroid Build Coastguard Worker  *   This file implements the CLI interpreter.
32*cfb92d14SAndroid Build Coastguard Worker  */
33*cfb92d14SAndroid Build Coastguard Worker 
34*cfb92d14SAndroid Build Coastguard Worker #include "cli.hpp"
35*cfb92d14SAndroid Build Coastguard Worker 
36*cfb92d14SAndroid Build Coastguard Worker #include <stdio.h>
37*cfb92d14SAndroid Build Coastguard Worker #include <stdlib.h>
38*cfb92d14SAndroid Build Coastguard Worker #include <string.h>
39*cfb92d14SAndroid Build Coastguard Worker 
40*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/debug_uart.h>
41*cfb92d14SAndroid Build Coastguard Worker 
42*cfb92d14SAndroid Build Coastguard Worker #include <openthread/backbone_router.h>
43*cfb92d14SAndroid Build Coastguard Worker #include <openthread/backbone_router_ftd.h>
44*cfb92d14SAndroid Build Coastguard Worker #include <openthread/border_router.h>
45*cfb92d14SAndroid Build Coastguard Worker #include <openthread/channel_manager.h>
46*cfb92d14SAndroid Build Coastguard Worker #include <openthread/channel_monitor.h>
47*cfb92d14SAndroid Build Coastguard Worker #include <openthread/child_supervision.h>
48*cfb92d14SAndroid Build Coastguard Worker #include <openthread/dataset_ftd.h>
49*cfb92d14SAndroid Build Coastguard Worker #include <openthread/diag.h>
50*cfb92d14SAndroid Build Coastguard Worker #include <openthread/dns.h>
51*cfb92d14SAndroid Build Coastguard Worker #include <openthread/icmp6.h>
52*cfb92d14SAndroid Build Coastguard Worker #include <openthread/nat64.h>
53*cfb92d14SAndroid Build Coastguard Worker #include <openthread/ncp.h>
54*cfb92d14SAndroid Build Coastguard Worker #include <openthread/network_time.h>
55*cfb92d14SAndroid Build Coastguard Worker #include <openthread/radio_stats.h>
56*cfb92d14SAndroid Build Coastguard Worker #include <openthread/server.h>
57*cfb92d14SAndroid Build Coastguard Worker #include <openthread/thread.h>
58*cfb92d14SAndroid Build Coastguard Worker #include <openthread/thread_ftd.h>
59*cfb92d14SAndroid Build Coastguard Worker #include <openthread/trel.h>
60*cfb92d14SAndroid Build Coastguard Worker #include <openthread/verhoeff_checksum.h>
61*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/misc.h>
62*cfb92d14SAndroid Build Coastguard Worker 
63*cfb92d14SAndroid Build Coastguard Worker #include "common/new.hpp"
64*cfb92d14SAndroid Build Coastguard Worker #include "common/num_utils.hpp"
65*cfb92d14SAndroid Build Coastguard Worker #include "common/numeric_limits.hpp"
66*cfb92d14SAndroid Build Coastguard Worker #include "common/string.hpp"
67*cfb92d14SAndroid Build Coastguard Worker #include "mac/channel_mask.hpp"
68*cfb92d14SAndroid Build Coastguard Worker 
69*cfb92d14SAndroid Build Coastguard Worker namespace ot {
70*cfb92d14SAndroid Build Coastguard Worker namespace Cli {
71*cfb92d14SAndroid Build Coastguard Worker 
72*cfb92d14SAndroid Build Coastguard Worker Interpreter *Interpreter::sInterpreter = nullptr;
73*cfb92d14SAndroid Build Coastguard Worker static OT_DEFINE_ALIGNED_VAR(sInterpreterRaw, sizeof(Interpreter), uint64_t);
74*cfb92d14SAndroid Build Coastguard Worker 
Interpreter(Instance * aInstance,otCliOutputCallback aCallback,void * aContext)75*cfb92d14SAndroid Build Coastguard Worker Interpreter::Interpreter(Instance *aInstance, otCliOutputCallback aCallback, void *aContext)
76*cfb92d14SAndroid Build Coastguard Worker     : OutputImplementer(aCallback, aContext)
77*cfb92d14SAndroid Build Coastguard Worker     , Utils(aInstance, *this)
78*cfb92d14SAndroid Build Coastguard Worker     , mCommandIsPending(false)
79*cfb92d14SAndroid Build Coastguard Worker     , mInternalDebugCommand(false)
80*cfb92d14SAndroid Build Coastguard Worker     , mTimer(*aInstance, HandleTimer, this)
81*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD || OPENTHREAD_MTD
82*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_SNTP_CLIENT_ENABLE
83*cfb92d14SAndroid Build Coastguard Worker     , mSntpQueryingInProgress(false)
84*cfb92d14SAndroid Build Coastguard Worker #endif
85*cfb92d14SAndroid Build Coastguard Worker     , mDataset(aInstance, *this)
86*cfb92d14SAndroid Build Coastguard Worker     , mNetworkData(aInstance, *this)
87*cfb92d14SAndroid Build Coastguard Worker     , mUdp(aInstance, *this)
88*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MAC_FILTER_ENABLE
89*cfb92d14SAndroid Build Coastguard Worker     , mMacFilter(aInstance, *this)
90*cfb92d14SAndroid Build Coastguard Worker #endif
91*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CLI_DNS_ENABLE
92*cfb92d14SAndroid Build Coastguard Worker     , mDns(aInstance, *this)
93*cfb92d14SAndroid Build Coastguard Worker #endif
94*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MULTICAST_DNS_ENABLE && OPENTHREAD_CONFIG_MULTICAST_DNS_PUBLIC_API_ENABLE
95*cfb92d14SAndroid Build Coastguard Worker     , mMdns(aInstance, *this)
96*cfb92d14SAndroid Build Coastguard Worker #endif
97*cfb92d14SAndroid Build Coastguard Worker #if (OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2)
98*cfb92d14SAndroid Build Coastguard Worker     , mBbr(aInstance, *this)
99*cfb92d14SAndroid Build Coastguard Worker #endif
100*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE
101*cfb92d14SAndroid Build Coastguard Worker     , mBr(aInstance, *this)
102*cfb92d14SAndroid Build Coastguard Worker #endif
103*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_TCP_ENABLE && OPENTHREAD_CONFIG_CLI_TCP_ENABLE
104*cfb92d14SAndroid Build Coastguard Worker     , mTcp(aInstance, *this)
105*cfb92d14SAndroid Build Coastguard Worker #endif
106*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_API_ENABLE
107*cfb92d14SAndroid Build Coastguard Worker     , mCoap(aInstance, *this)
108*cfb92d14SAndroid Build Coastguard Worker #endif
109*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_SECURE_API_ENABLE
110*cfb92d14SAndroid Build Coastguard Worker     , mCoapSecure(aInstance, *this)
111*cfb92d14SAndroid Build Coastguard Worker #endif
112*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE && OPENTHREAD_FTD
113*cfb92d14SAndroid Build Coastguard Worker     , mCommissioner(aInstance, *this)
114*cfb92d14SAndroid Build Coastguard Worker #endif
115*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_JOINER_ENABLE
116*cfb92d14SAndroid Build Coastguard Worker     , mJoiner(aInstance, *this)
117*cfb92d14SAndroid Build Coastguard Worker #endif
118*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_SRP_CLIENT_ENABLE
119*cfb92d14SAndroid Build Coastguard Worker     , mSrpClient(aInstance, *this)
120*cfb92d14SAndroid Build Coastguard Worker #endif
121*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_SRP_SERVER_ENABLE
122*cfb92d14SAndroid Build Coastguard Worker     , mSrpServer(aInstance, *this)
123*cfb92d14SAndroid Build Coastguard Worker #endif
124*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_HISTORY_TRACKER_ENABLE
125*cfb92d14SAndroid Build Coastguard Worker     , mHistory(aInstance, *this)
126*cfb92d14SAndroid Build Coastguard Worker #endif
127*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE
128*cfb92d14SAndroid Build Coastguard Worker     , mLinkMetrics(aInstance, *this)
129*cfb92d14SAndroid Build Coastguard Worker #endif
130*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BLE_TCAT_ENABLE && OPENTHREAD_CONFIG_CLI_BLE_SECURE_ENABLE
131*cfb92d14SAndroid Build Coastguard Worker     , mTcat(aInstance, *this)
132*cfb92d14SAndroid Build Coastguard Worker #endif
133*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PING_SENDER_ENABLE
134*cfb92d14SAndroid Build Coastguard Worker     , mPing(aInstance, *this)
135*cfb92d14SAndroid Build Coastguard Worker #endif
136*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_TMF_ANYCAST_LOCATOR_ENABLE
137*cfb92d14SAndroid Build Coastguard Worker     , mLocateInProgress(false)
138*cfb92d14SAndroid Build Coastguard Worker #endif
139*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_FTD || OPENTHREAD_MTD
140*cfb92d14SAndroid Build Coastguard Worker {
141*cfb92d14SAndroid Build Coastguard Worker #if (OPENTHREAD_FTD || OPENTHREAD_MTD) && OPENTHREAD_CONFIG_CLI_REGISTER_IP6_RECV_CALLBACK
142*cfb92d14SAndroid Build Coastguard Worker     otIp6SetReceiveCallback(GetInstancePtr(), &Interpreter::HandleIp6Receive, this);
143*cfb92d14SAndroid Build Coastguard Worker #endif
144*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DIAG_ENABLE
145*cfb92d14SAndroid Build Coastguard Worker     otDiagSetOutputCallback(GetInstancePtr(), &Interpreter::HandleDiagOutput, this);
146*cfb92d14SAndroid Build Coastguard Worker #endif
147*cfb92d14SAndroid Build Coastguard Worker 
148*cfb92d14SAndroid Build Coastguard Worker     ClearAllBytes(mUserCommands);
149*cfb92d14SAndroid Build Coastguard Worker 
150*cfb92d14SAndroid Build Coastguard Worker     OutputPrompt();
151*cfb92d14SAndroid Build Coastguard Worker }
152*cfb92d14SAndroid Build Coastguard Worker 
OutputResult(otError aError)153*cfb92d14SAndroid Build Coastguard Worker void Interpreter::OutputResult(otError aError)
154*cfb92d14SAndroid Build Coastguard Worker {
155*cfb92d14SAndroid Build Coastguard Worker     if (mInternalDebugCommand)
156*cfb92d14SAndroid Build Coastguard Worker     {
157*cfb92d14SAndroid Build Coastguard Worker         if (aError != OT_ERROR_NONE)
158*cfb92d14SAndroid Build Coastguard Worker         {
159*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Error %u: %s", aError, otThreadErrorToString(aError));
160*cfb92d14SAndroid Build Coastguard Worker         }
161*cfb92d14SAndroid Build Coastguard Worker 
162*cfb92d14SAndroid Build Coastguard Worker         ExitNow();
163*cfb92d14SAndroid Build Coastguard Worker     }
164*cfb92d14SAndroid Build Coastguard Worker 
165*cfb92d14SAndroid Build Coastguard Worker     OT_ASSERT(mCommandIsPending);
166*cfb92d14SAndroid Build Coastguard Worker 
167*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(aError != OT_ERROR_PENDING);
168*cfb92d14SAndroid Build Coastguard Worker 
169*cfb92d14SAndroid Build Coastguard Worker     if (aError == OT_ERROR_NONE)
170*cfb92d14SAndroid Build Coastguard Worker     {
171*cfb92d14SAndroid Build Coastguard Worker         OutputLine("Done");
172*cfb92d14SAndroid Build Coastguard Worker     }
173*cfb92d14SAndroid Build Coastguard Worker     else
174*cfb92d14SAndroid Build Coastguard Worker     {
175*cfb92d14SAndroid Build Coastguard Worker         OutputLine("Error %u: %s", aError, otThreadErrorToString(aError));
176*cfb92d14SAndroid Build Coastguard Worker     }
177*cfb92d14SAndroid Build Coastguard Worker 
178*cfb92d14SAndroid Build Coastguard Worker     mCommandIsPending = false;
179*cfb92d14SAndroid Build Coastguard Worker     mTimer.Stop();
180*cfb92d14SAndroid Build Coastguard Worker     OutputPrompt();
181*cfb92d14SAndroid Build Coastguard Worker 
182*cfb92d14SAndroid Build Coastguard Worker exit:
183*cfb92d14SAndroid Build Coastguard Worker     return;
184*cfb92d14SAndroid Build Coastguard Worker }
185*cfb92d14SAndroid Build Coastguard Worker 
186*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DIAG_ENABLE
Process(Arg aArgs[])187*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("diag")>(Arg aArgs[])
188*cfb92d14SAndroid Build Coastguard Worker {
189*cfb92d14SAndroid Build Coastguard Worker     char *args[kMaxArgs];
190*cfb92d14SAndroid Build Coastguard Worker 
191*cfb92d14SAndroid Build Coastguard Worker     // all diagnostics related features are processed within diagnostics module
192*cfb92d14SAndroid Build Coastguard Worker     Arg::CopyArgsToStringArray(aArgs, args);
193*cfb92d14SAndroid Build Coastguard Worker 
194*cfb92d14SAndroid Build Coastguard Worker     return otDiagProcessCmd(GetInstancePtr(), Arg::GetArgsLength(aArgs), args);
195*cfb92d14SAndroid Build Coastguard Worker }
196*cfb92d14SAndroid Build Coastguard Worker 
HandleDiagOutput(const char * aFormat,va_list aArguments,void * aContext)197*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleDiagOutput(const char *aFormat, va_list aArguments, void *aContext)
198*cfb92d14SAndroid Build Coastguard Worker {
199*cfb92d14SAndroid Build Coastguard Worker     static_cast<Interpreter *>(aContext)->HandleDiagOutput(aFormat, aArguments);
200*cfb92d14SAndroid Build Coastguard Worker }
201*cfb92d14SAndroid Build Coastguard Worker 
HandleDiagOutput(const char * aFormat,va_list aArguments)202*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleDiagOutput(const char *aFormat, va_list aArguments) { OutputFormatV(aFormat, aArguments); }
203*cfb92d14SAndroid Build Coastguard Worker #endif
204*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])205*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("version")>(Arg aArgs[])
206*cfb92d14SAndroid Build Coastguard Worker {
207*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
208*cfb92d14SAndroid Build Coastguard Worker 
209*cfb92d14SAndroid Build Coastguard Worker     /**
210*cfb92d14SAndroid Build Coastguard Worker      * @cli version
211*cfb92d14SAndroid Build Coastguard Worker      * @code
212*cfb92d14SAndroid Build Coastguard Worker      * version
213*cfb92d14SAndroid Build Coastguard Worker      * OPENTHREAD/gf4f2f04; Jul 1 2016 17:00:09
214*cfb92d14SAndroid Build Coastguard Worker      * Done
215*cfb92d14SAndroid Build Coastguard Worker      * @endcode
216*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
217*cfb92d14SAndroid Build Coastguard Worker      * #otGetVersionString
218*cfb92d14SAndroid Build Coastguard Worker      */
219*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
220*cfb92d14SAndroid Build Coastguard Worker     {
221*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%s", otGetVersionString());
222*cfb92d14SAndroid Build Coastguard Worker     }
223*cfb92d14SAndroid Build Coastguard Worker 
224*cfb92d14SAndroid Build Coastguard Worker     /**
225*cfb92d14SAndroid Build Coastguard Worker      * @cli version api
226*cfb92d14SAndroid Build Coastguard Worker      * @code
227*cfb92d14SAndroid Build Coastguard Worker      * version api
228*cfb92d14SAndroid Build Coastguard Worker      * 28
229*cfb92d14SAndroid Build Coastguard Worker      * Done
230*cfb92d14SAndroid Build Coastguard Worker      * @endcode
231*cfb92d14SAndroid Build Coastguard Worker      * @par
232*cfb92d14SAndroid Build Coastguard Worker      * Prints the API version number.
233*cfb92d14SAndroid Build Coastguard Worker      */
234*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "api")
235*cfb92d14SAndroid Build Coastguard Worker     {
236*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%u", OPENTHREAD_API_VERSION);
237*cfb92d14SAndroid Build Coastguard Worker     }
238*cfb92d14SAndroid Build Coastguard Worker     else
239*cfb92d14SAndroid Build Coastguard Worker     {
240*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_COMMAND;
241*cfb92d14SAndroid Build Coastguard Worker     }
242*cfb92d14SAndroid Build Coastguard Worker 
243*cfb92d14SAndroid Build Coastguard Worker     return error;
244*cfb92d14SAndroid Build Coastguard Worker }
245*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])246*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("reset")>(Arg aArgs[])
247*cfb92d14SAndroid Build Coastguard Worker {
248*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
249*cfb92d14SAndroid Build Coastguard Worker 
250*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
251*cfb92d14SAndroid Build Coastguard Worker     {
252*cfb92d14SAndroid Build Coastguard Worker         otInstanceReset(GetInstancePtr());
253*cfb92d14SAndroid Build Coastguard Worker     }
254*cfb92d14SAndroid Build Coastguard Worker 
255*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_BOOTLOADER_MODE_ENABLE
256*cfb92d14SAndroid Build Coastguard Worker     /**
257*cfb92d14SAndroid Build Coastguard Worker      * @cli reset bootloader
258*cfb92d14SAndroid Build Coastguard Worker      * @code
259*cfb92d14SAndroid Build Coastguard Worker      * reset bootloader
260*cfb92d14SAndroid Build Coastguard Worker      * @endcode
261*cfb92d14SAndroid Build Coastguard Worker      * @cparam reset bootloader
262*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
263*cfb92d14SAndroid Build Coastguard Worker      * #otInstanceResetToBootloader
264*cfb92d14SAndroid Build Coastguard Worker      */
265*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "bootloader")
266*cfb92d14SAndroid Build Coastguard Worker     {
267*cfb92d14SAndroid Build Coastguard Worker         error = otInstanceResetToBootloader(GetInstancePtr());
268*cfb92d14SAndroid Build Coastguard Worker     }
269*cfb92d14SAndroid Build Coastguard Worker #endif
270*cfb92d14SAndroid Build Coastguard Worker     else
271*cfb92d14SAndroid Build Coastguard Worker     {
272*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_COMMAND;
273*cfb92d14SAndroid Build Coastguard Worker     }
274*cfb92d14SAndroid Build Coastguard Worker 
275*cfb92d14SAndroid Build Coastguard Worker     return error;
276*cfb92d14SAndroid Build Coastguard Worker }
277*cfb92d14SAndroid Build Coastguard Worker 
ProcessLine(char * aBuf)278*cfb92d14SAndroid Build Coastguard Worker void Interpreter::ProcessLine(char *aBuf)
279*cfb92d14SAndroid Build Coastguard Worker {
280*cfb92d14SAndroid Build Coastguard Worker     Arg     args[kMaxArgs + 1];
281*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
282*cfb92d14SAndroid Build Coastguard Worker 
283*cfb92d14SAndroid Build Coastguard Worker     OT_ASSERT(aBuf != nullptr);
284*cfb92d14SAndroid Build Coastguard Worker 
285*cfb92d14SAndroid Build Coastguard Worker     if (!mInternalDebugCommand)
286*cfb92d14SAndroid Build Coastguard Worker     {
287*cfb92d14SAndroid Build Coastguard Worker         // Ignore the command if another command is pending.
288*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(!mCommandIsPending, args[0].Clear());
289*cfb92d14SAndroid Build Coastguard Worker         mCommandIsPending = true;
290*cfb92d14SAndroid Build Coastguard Worker 
291*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(StringLength(aBuf, kMaxLineLength) <= kMaxLineLength - 1, error = OT_ERROR_PARSE);
292*cfb92d14SAndroid Build Coastguard Worker     }
293*cfb92d14SAndroid Build Coastguard Worker 
294*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = ot::Utils::CmdLineParser::ParseCmd(aBuf, args, kMaxArgs));
295*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(!args[0].IsEmpty(), mCommandIsPending = false);
296*cfb92d14SAndroid Build Coastguard Worker 
297*cfb92d14SAndroid Build Coastguard Worker     if (!mInternalDebugCommand)
298*cfb92d14SAndroid Build Coastguard Worker     {
299*cfb92d14SAndroid Build Coastguard Worker         LogInput(args);
300*cfb92d14SAndroid Build Coastguard Worker 
301*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DIAG_ENABLE
302*cfb92d14SAndroid Build Coastguard Worker         if (otDiagIsEnabled(GetInstancePtr()) && (args[0] != "diag") && (args[0] != "factoryreset"))
303*cfb92d14SAndroid Build Coastguard Worker         {
304*cfb92d14SAndroid Build Coastguard Worker             OutputLine("under diagnostics mode, execute 'diag stop' before running any other commands.");
305*cfb92d14SAndroid Build Coastguard Worker             ExitNow(error = OT_ERROR_INVALID_STATE);
306*cfb92d14SAndroid Build Coastguard Worker         }
307*cfb92d14SAndroid Build Coastguard Worker #endif
308*cfb92d14SAndroid Build Coastguard Worker     }
309*cfb92d14SAndroid Build Coastguard Worker 
310*cfb92d14SAndroid Build Coastguard Worker     error = ProcessCommand(args);
311*cfb92d14SAndroid Build Coastguard Worker 
312*cfb92d14SAndroid Build Coastguard Worker exit:
313*cfb92d14SAndroid Build Coastguard Worker     if ((error != OT_ERROR_NONE) || !args[0].IsEmpty())
314*cfb92d14SAndroid Build Coastguard Worker     {
315*cfb92d14SAndroid Build Coastguard Worker         OutputResult(error);
316*cfb92d14SAndroid Build Coastguard Worker     }
317*cfb92d14SAndroid Build Coastguard Worker     else if (!mCommandIsPending)
318*cfb92d14SAndroid Build Coastguard Worker     {
319*cfb92d14SAndroid Build Coastguard Worker         OutputPrompt();
320*cfb92d14SAndroid Build Coastguard Worker     }
321*cfb92d14SAndroid Build Coastguard Worker }
322*cfb92d14SAndroid Build Coastguard Worker 
ProcessUserCommands(Arg aArgs[])323*cfb92d14SAndroid Build Coastguard Worker otError Interpreter::ProcessUserCommands(Arg aArgs[])
324*cfb92d14SAndroid Build Coastguard Worker {
325*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_INVALID_COMMAND;
326*cfb92d14SAndroid Build Coastguard Worker 
327*cfb92d14SAndroid Build Coastguard Worker     for (const UserCommandsEntry &entry : mUserCommands)
328*cfb92d14SAndroid Build Coastguard Worker     {
329*cfb92d14SAndroid Build Coastguard Worker         for (uint8_t i = 0; i < entry.mLength; i++)
330*cfb92d14SAndroid Build Coastguard Worker         {
331*cfb92d14SAndroid Build Coastguard Worker             if (aArgs[0] == entry.mCommands[i].mName)
332*cfb92d14SAndroid Build Coastguard Worker             {
333*cfb92d14SAndroid Build Coastguard Worker                 char *args[kMaxArgs];
334*cfb92d14SAndroid Build Coastguard Worker 
335*cfb92d14SAndroid Build Coastguard Worker                 Arg::CopyArgsToStringArray(aArgs, args);
336*cfb92d14SAndroid Build Coastguard Worker                 error = entry.mCommands[i].mCommand(entry.mContext, Arg::GetArgsLength(aArgs) - 1, args + 1);
337*cfb92d14SAndroid Build Coastguard Worker                 break;
338*cfb92d14SAndroid Build Coastguard Worker             }
339*cfb92d14SAndroid Build Coastguard Worker         }
340*cfb92d14SAndroid Build Coastguard Worker     }
341*cfb92d14SAndroid Build Coastguard Worker 
342*cfb92d14SAndroid Build Coastguard Worker     return error;
343*cfb92d14SAndroid Build Coastguard Worker }
344*cfb92d14SAndroid Build Coastguard Worker 
SetUserCommands(const otCliCommand * aCommands,uint8_t aLength,void * aContext)345*cfb92d14SAndroid Build Coastguard Worker otError Interpreter::SetUserCommands(const otCliCommand *aCommands, uint8_t aLength, void *aContext)
346*cfb92d14SAndroid Build Coastguard Worker {
347*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_FAILED;
348*cfb92d14SAndroid Build Coastguard Worker 
349*cfb92d14SAndroid Build Coastguard Worker     for (UserCommandsEntry &entry : mUserCommands)
350*cfb92d14SAndroid Build Coastguard Worker     {
351*cfb92d14SAndroid Build Coastguard Worker         if (entry.mCommands == nullptr)
352*cfb92d14SAndroid Build Coastguard Worker         {
353*cfb92d14SAndroid Build Coastguard Worker             entry.mCommands = aCommands;
354*cfb92d14SAndroid Build Coastguard Worker             entry.mLength   = aLength;
355*cfb92d14SAndroid Build Coastguard Worker             entry.mContext  = aContext;
356*cfb92d14SAndroid Build Coastguard Worker 
357*cfb92d14SAndroid Build Coastguard Worker             error = OT_ERROR_NONE;
358*cfb92d14SAndroid Build Coastguard Worker             break;
359*cfb92d14SAndroid Build Coastguard Worker         }
360*cfb92d14SAndroid Build Coastguard Worker     }
361*cfb92d14SAndroid Build Coastguard Worker 
362*cfb92d14SAndroid Build Coastguard Worker     return error;
363*cfb92d14SAndroid Build Coastguard Worker }
364*cfb92d14SAndroid Build Coastguard Worker 
365*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD || OPENTHREAD_MTD
366*cfb92d14SAndroid Build Coastguard Worker 
367*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_HISTORY_TRACKER_ENABLE
Process(Arg aArgs[])368*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("history")>(Arg aArgs[]) { return mHistory.Process(aArgs); }
369*cfb92d14SAndroid Build Coastguard Worker #endif
370*cfb92d14SAndroid Build Coastguard Worker 
371*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_AGENT_ENABLE
Process(Arg aArgs[])372*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("ba")>(Arg aArgs[])
373*cfb92d14SAndroid Build Coastguard Worker {
374*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
375*cfb92d14SAndroid Build Coastguard Worker 
376*cfb92d14SAndroid Build Coastguard Worker     /**
377*cfb92d14SAndroid Build Coastguard Worker      * @cli ba port
378*cfb92d14SAndroid Build Coastguard Worker      * @code
379*cfb92d14SAndroid Build Coastguard Worker      * ba port
380*cfb92d14SAndroid Build Coastguard Worker      * 49153
381*cfb92d14SAndroid Build Coastguard Worker      * Done
382*cfb92d14SAndroid Build Coastguard Worker      * @endcode
383*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
384*cfb92d14SAndroid Build Coastguard Worker      * #otBorderAgentGetUdpPort
385*cfb92d14SAndroid Build Coastguard Worker      */
386*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "port")
387*cfb92d14SAndroid Build Coastguard Worker     {
388*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%hu", otBorderAgentGetUdpPort(GetInstancePtr()));
389*cfb92d14SAndroid Build Coastguard Worker     }
390*cfb92d14SAndroid Build Coastguard Worker     /**
391*cfb92d14SAndroid Build Coastguard Worker      * @cli ba state
392*cfb92d14SAndroid Build Coastguard Worker      * @code
393*cfb92d14SAndroid Build Coastguard Worker      * ba state
394*cfb92d14SAndroid Build Coastguard Worker      * Started
395*cfb92d14SAndroid Build Coastguard Worker      * Done
396*cfb92d14SAndroid Build Coastguard Worker      * @endcode
397*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
398*cfb92d14SAndroid Build Coastguard Worker      * #otBorderAgentGetState
399*cfb92d14SAndroid Build Coastguard Worker      */
400*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "state")
401*cfb92d14SAndroid Build Coastguard Worker     {
402*cfb92d14SAndroid Build Coastguard Worker         static const char *const kStateStrings[] = {
403*cfb92d14SAndroid Build Coastguard Worker             "Stopped", // (0) OT_BORDER_AGENT_STATE_STOPPED
404*cfb92d14SAndroid Build Coastguard Worker             "Started", // (1) OT_BORDER_AGENT_STATE_STARTED
405*cfb92d14SAndroid Build Coastguard Worker             "Active",  // (2) OT_BORDER_AGENT_STATE_ACTIVE
406*cfb92d14SAndroid Build Coastguard Worker         };
407*cfb92d14SAndroid Build Coastguard Worker 
408*cfb92d14SAndroid Build Coastguard Worker         static_assert(0 == OT_BORDER_AGENT_STATE_STOPPED, "OT_BORDER_AGENT_STATE_STOPPED value is incorrect");
409*cfb92d14SAndroid Build Coastguard Worker         static_assert(1 == OT_BORDER_AGENT_STATE_STARTED, "OT_BORDER_AGENT_STATE_STARTED value is incorrect");
410*cfb92d14SAndroid Build Coastguard Worker         static_assert(2 == OT_BORDER_AGENT_STATE_ACTIVE, "OT_BORDER_AGENT_STATE_ACTIVE value is incorrect");
411*cfb92d14SAndroid Build Coastguard Worker 
412*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%s", Stringify(otBorderAgentGetState(GetInstancePtr()), kStateStrings));
413*cfb92d14SAndroid Build Coastguard Worker     }
414*cfb92d14SAndroid Build Coastguard Worker     /**
415*cfb92d14SAndroid Build Coastguard Worker      * @cli ba disconnect
416*cfb92d14SAndroid Build Coastguard Worker      * @code
417*cfb92d14SAndroid Build Coastguard Worker      * ba disconnect
418*cfb92d14SAndroid Build Coastguard Worker      * Done
419*cfb92d14SAndroid Build Coastguard Worker      * @endcode
420*cfb92d14SAndroid Build Coastguard Worker      * @par
421*cfb92d14SAndroid Build Coastguard Worker      * Disconnects the Border Agent from any active secure sessions
422*cfb92d14SAndroid Build Coastguard Worker      * @sa otBorderAgentDisconnect
423*cfb92d14SAndroid Build Coastguard Worker      */
424*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "disconnect")
425*cfb92d14SAndroid Build Coastguard Worker     {
426*cfb92d14SAndroid Build Coastguard Worker         otBorderAgentDisconnect(GetInstancePtr());
427*cfb92d14SAndroid Build Coastguard Worker     }
428*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_AGENT_ID_ENABLE
429*cfb92d14SAndroid Build Coastguard Worker     /**
430*cfb92d14SAndroid Build Coastguard Worker      * @cli ba id (get,set)
431*cfb92d14SAndroid Build Coastguard Worker      * @code
432*cfb92d14SAndroid Build Coastguard Worker      * ba id
433*cfb92d14SAndroid Build Coastguard Worker      * cb6da1e0c0448aaec39fa90f3d58f45c
434*cfb92d14SAndroid Build Coastguard Worker      * Done
435*cfb92d14SAndroid Build Coastguard Worker      * @endcode
436*cfb92d14SAndroid Build Coastguard Worker      * @code
437*cfb92d14SAndroid Build Coastguard Worker      * ba id 00112233445566778899aabbccddeeff
438*cfb92d14SAndroid Build Coastguard Worker      * Done
439*cfb92d14SAndroid Build Coastguard Worker      * @endcode
440*cfb92d14SAndroid Build Coastguard Worker      * @cparam ba id [@ca{border-agent-id}]
441*cfb92d14SAndroid Build Coastguard Worker      * Use the optional `border-agent-id` argument to set the Border Agent ID.
442*cfb92d14SAndroid Build Coastguard Worker      * @par
443*cfb92d14SAndroid Build Coastguard Worker      * Gets or sets the 16 bytes Border Router ID which can uniquely identifies the device among multiple BRs.
444*cfb92d14SAndroid Build Coastguard Worker      * @sa otBorderAgentGetId
445*cfb92d14SAndroid Build Coastguard Worker      * @sa otBorderAgentSetId
446*cfb92d14SAndroid Build Coastguard Worker      */
447*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "id")
448*cfb92d14SAndroid Build Coastguard Worker     {
449*cfb92d14SAndroid Build Coastguard Worker         otBorderAgentId id;
450*cfb92d14SAndroid Build Coastguard Worker 
451*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1].IsEmpty())
452*cfb92d14SAndroid Build Coastguard Worker         {
453*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = otBorderAgentGetId(GetInstancePtr(), &id));
454*cfb92d14SAndroid Build Coastguard Worker             OutputBytesLine(id.mId);
455*cfb92d14SAndroid Build Coastguard Worker         }
456*cfb92d14SAndroid Build Coastguard Worker         else
457*cfb92d14SAndroid Build Coastguard Worker         {
458*cfb92d14SAndroid Build Coastguard Worker             uint16_t idLength = sizeof(id);
459*cfb92d14SAndroid Build Coastguard Worker 
460*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = aArgs[1].ParseAsHexString(idLength, id.mId));
461*cfb92d14SAndroid Build Coastguard Worker             VerifyOrExit(idLength == sizeof(id), error = OT_ERROR_INVALID_ARGS);
462*cfb92d14SAndroid Build Coastguard Worker             error = otBorderAgentSetId(GetInstancePtr(), &id);
463*cfb92d14SAndroid Build Coastguard Worker         }
464*cfb92d14SAndroid Build Coastguard Worker     }
465*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_BORDER_AGENT_ID_ENABLE
466*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_AGENT_EPHEMERAL_KEY_ENABLE
467*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "ephemeralkey")
468*cfb92d14SAndroid Build Coastguard Worker     {
469*cfb92d14SAndroid Build Coastguard Worker         /**
470*cfb92d14SAndroid Build Coastguard Worker          * @cli ba ephemeralkey
471*cfb92d14SAndroid Build Coastguard Worker          * @code
472*cfb92d14SAndroid Build Coastguard Worker          * ba ephemeralkey
473*cfb92d14SAndroid Build Coastguard Worker          * active
474*cfb92d14SAndroid Build Coastguard Worker          * Done
475*cfb92d14SAndroid Build Coastguard Worker          * @endcode
476*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
477*cfb92d14SAndroid Build Coastguard Worker          * #otBorderAgentIsEphemeralKeyActive
478*cfb92d14SAndroid Build Coastguard Worker          */
479*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1].IsEmpty())
480*cfb92d14SAndroid Build Coastguard Worker         {
481*cfb92d14SAndroid Build Coastguard Worker             OutputLine("%sactive", otBorderAgentIsEphemeralKeyActive(GetInstancePtr()) ? "" : "in");
482*cfb92d14SAndroid Build Coastguard Worker         }
483*cfb92d14SAndroid Build Coastguard Worker         /**
484*cfb92d14SAndroid Build Coastguard Worker          * @cli ba ephemeralkey set <keystring> [timeout-in-msec] [port]
485*cfb92d14SAndroid Build Coastguard Worker          * @code
486*cfb92d14SAndroid Build Coastguard Worker          * ba ephemeralkey set Z10X20g3J15w1000P60m16 5000 1234
487*cfb92d14SAndroid Build Coastguard Worker          * Done
488*cfb92d14SAndroid Build Coastguard Worker          * @endcode
489*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
490*cfb92d14SAndroid Build Coastguard Worker          * #otBorderAgentSetEphemeralKey
491*cfb92d14SAndroid Build Coastguard Worker          */
492*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "set")
493*cfb92d14SAndroid Build Coastguard Worker         {
494*cfb92d14SAndroid Build Coastguard Worker             uint32_t timeout = 0;
495*cfb92d14SAndroid Build Coastguard Worker             uint16_t port    = 0;
496*cfb92d14SAndroid Build Coastguard Worker 
497*cfb92d14SAndroid Build Coastguard Worker             VerifyOrExit(!aArgs[2].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
498*cfb92d14SAndroid Build Coastguard Worker 
499*cfb92d14SAndroid Build Coastguard Worker             if (!aArgs[3].IsEmpty())
500*cfb92d14SAndroid Build Coastguard Worker             {
501*cfb92d14SAndroid Build Coastguard Worker                 SuccessOrExit(error = aArgs[3].ParseAsUint32(timeout));
502*cfb92d14SAndroid Build Coastguard Worker             }
503*cfb92d14SAndroid Build Coastguard Worker 
504*cfb92d14SAndroid Build Coastguard Worker             if (!aArgs[4].IsEmpty())
505*cfb92d14SAndroid Build Coastguard Worker             {
506*cfb92d14SAndroid Build Coastguard Worker                 SuccessOrExit(error = aArgs[4].ParseAsUint16(port));
507*cfb92d14SAndroid Build Coastguard Worker             }
508*cfb92d14SAndroid Build Coastguard Worker 
509*cfb92d14SAndroid Build Coastguard Worker             error = otBorderAgentSetEphemeralKey(GetInstancePtr(), aArgs[2].GetCString(), timeout, port);
510*cfb92d14SAndroid Build Coastguard Worker         }
511*cfb92d14SAndroid Build Coastguard Worker         /**
512*cfb92d14SAndroid Build Coastguard Worker          * @cli ba ephemeralkey clear
513*cfb92d14SAndroid Build Coastguard Worker          * @code
514*cfb92d14SAndroid Build Coastguard Worker          * ba ephemeralkey clear
515*cfb92d14SAndroid Build Coastguard Worker          * Done
516*cfb92d14SAndroid Build Coastguard Worker          * @endcode
517*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
518*cfb92d14SAndroid Build Coastguard Worker          * #otBorderAgentClearEphemeralKey
519*cfb92d14SAndroid Build Coastguard Worker          */
520*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "clear")
521*cfb92d14SAndroid Build Coastguard Worker         {
522*cfb92d14SAndroid Build Coastguard Worker             otBorderAgentClearEphemeralKey(GetInstancePtr());
523*cfb92d14SAndroid Build Coastguard Worker         }
524*cfb92d14SAndroid Build Coastguard Worker         /**
525*cfb92d14SAndroid Build Coastguard Worker          * @cli ba ephemeralkey callback (enable, disable)
526*cfb92d14SAndroid Build Coastguard Worker          * @code
527*cfb92d14SAndroid Build Coastguard Worker          * ba ephemeralkey callback enable
528*cfb92d14SAndroid Build Coastguard Worker          * Done
529*cfb92d14SAndroid Build Coastguard Worker          * ba ephemeralkey set W10X1 5000 49155
530*cfb92d14SAndroid Build Coastguard Worker          * Done
531*cfb92d14SAndroid Build Coastguard Worker          * BorderAgent callback: Ephemeral key active, port:49155
532*cfb92d14SAndroid Build Coastguard Worker          * BorderAgent callback: Ephemeral key inactive
533*cfb92d14SAndroid Build Coastguard Worker          * @endcode
534*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
535*cfb92d14SAndroid Build Coastguard Worker          * #otBorderAgentSetEphemeralKeyCallback
536*cfb92d14SAndroid Build Coastguard Worker          */
537*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "callback")
538*cfb92d14SAndroid Build Coastguard Worker         {
539*cfb92d14SAndroid Build Coastguard Worker             bool enable;
540*cfb92d14SAndroid Build Coastguard Worker 
541*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = ParseEnableOrDisable(aArgs[2], enable));
542*cfb92d14SAndroid Build Coastguard Worker 
543*cfb92d14SAndroid Build Coastguard Worker             if (enable)
544*cfb92d14SAndroid Build Coastguard Worker             {
545*cfb92d14SAndroid Build Coastguard Worker                 otBorderAgentSetEphemeralKeyCallback(GetInstancePtr(), HandleBorderAgentEphemeralKeyStateChange, this);
546*cfb92d14SAndroid Build Coastguard Worker             }
547*cfb92d14SAndroid Build Coastguard Worker             else
548*cfb92d14SAndroid Build Coastguard Worker             {
549*cfb92d14SAndroid Build Coastguard Worker                 otBorderAgentSetEphemeralKeyCallback(GetInstancePtr(), nullptr, nullptr);
550*cfb92d14SAndroid Build Coastguard Worker             }
551*cfb92d14SAndroid Build Coastguard Worker         }
552*cfb92d14SAndroid Build Coastguard Worker         else
553*cfb92d14SAndroid Build Coastguard Worker         {
554*cfb92d14SAndroid Build Coastguard Worker             error = OT_ERROR_INVALID_ARGS;
555*cfb92d14SAndroid Build Coastguard Worker         }
556*cfb92d14SAndroid Build Coastguard Worker     }
557*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_BORDER_AGENT_EPHEMERAL_KEY_ENABLE
558*cfb92d14SAndroid Build Coastguard Worker     /**
559*cfb92d14SAndroid Build Coastguard Worker      * @cli ba counters
560*cfb92d14SAndroid Build Coastguard Worker      * @code
561*cfb92d14SAndroid Build Coastguard Worker      * ba counters
562*cfb92d14SAndroid Build Coastguard Worker      * epskcActivation: 0
563*cfb92d14SAndroid Build Coastguard Worker      * epskcApiDeactivation: 0
564*cfb92d14SAndroid Build Coastguard Worker      * epskcTimeoutDeactivation: 0
565*cfb92d14SAndroid Build Coastguard Worker      * epskcMaxAttemptDeactivation: 0
566*cfb92d14SAndroid Build Coastguard Worker      * epskcDisconnectDeactivation: 0
567*cfb92d14SAndroid Build Coastguard Worker      * epskcInvalidBaStateError: 0
568*cfb92d14SAndroid Build Coastguard Worker      * epskcInvalidArgsError: 0
569*cfb92d14SAndroid Build Coastguard Worker      * epskcStartSecureSessionError: 0
570*cfb92d14SAndroid Build Coastguard Worker      * epskcSecureSessionSuccess: 0
571*cfb92d14SAndroid Build Coastguard Worker      * epskcSecureSessionFailure: 0
572*cfb92d14SAndroid Build Coastguard Worker      * epskcCommissionerPetition: 0
573*cfb92d14SAndroid Build Coastguard Worker      * pskcSecureSessionSuccess: 0
574*cfb92d14SAndroid Build Coastguard Worker      * pskcSecureSessionFailure: 0
575*cfb92d14SAndroid Build Coastguard Worker      * pskcCommissionerPetition: 0
576*cfb92d14SAndroid Build Coastguard Worker      * mgmtActiveGet: 0
577*cfb92d14SAndroid Build Coastguard Worker      * mgmtPendingGet: 0
578*cfb92d14SAndroid Build Coastguard Worker      * Done
579*cfb92d14SAndroid Build Coastguard Worker      * @endcode
580*cfb92d14SAndroid Build Coastguard Worker      * @par
581*cfb92d14SAndroid Build Coastguard Worker      * Gets the border agent counters.
582*cfb92d14SAndroid Build Coastguard Worker      * @sa otBorderAgentGetCounters
583*cfb92d14SAndroid Build Coastguard Worker      */
584*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "counters")
585*cfb92d14SAndroid Build Coastguard Worker     {
586*cfb92d14SAndroid Build Coastguard Worker         OutputBorderAgentCounters(*otBorderAgentGetCounters(GetInstancePtr()));
587*cfb92d14SAndroid Build Coastguard Worker     }
588*cfb92d14SAndroid Build Coastguard Worker     else
589*cfb92d14SAndroid Build Coastguard Worker     {
590*cfb92d14SAndroid Build Coastguard Worker         ExitNow(error = OT_ERROR_INVALID_COMMAND);
591*cfb92d14SAndroid Build Coastguard Worker     }
592*cfb92d14SAndroid Build Coastguard Worker 
593*cfb92d14SAndroid Build Coastguard Worker exit:
594*cfb92d14SAndroid Build Coastguard Worker     return error;
595*cfb92d14SAndroid Build Coastguard Worker }
596*cfb92d14SAndroid Build Coastguard Worker 
OutputBorderAgentCounters(const otBorderAgentCounters & aCounters)597*cfb92d14SAndroid Build Coastguard Worker void Interpreter::OutputBorderAgentCounters(const otBorderAgentCounters &aCounters)
598*cfb92d14SAndroid Build Coastguard Worker {
599*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_AGENT_EPHEMERAL_KEY_ENABLE
600*cfb92d14SAndroid Build Coastguard Worker     OutputLine("epskcActivation: %lu ", ToUlong(aCounters.mEpskcActivations));
601*cfb92d14SAndroid Build Coastguard Worker     OutputLine("epskcApiDeactivation: %lu ", ToUlong(aCounters.mEpskcDeactivationClears));
602*cfb92d14SAndroid Build Coastguard Worker     OutputLine("epskcTimeoutDeactivation: %lu ", ToUlong(aCounters.mEpskcDeactivationTimeouts));
603*cfb92d14SAndroid Build Coastguard Worker     OutputLine("epskcMaxAttemptDeactivation: %lu ", ToUlong(aCounters.mEpskcDeactivationMaxAttempts));
604*cfb92d14SAndroid Build Coastguard Worker     OutputLine("epskcDisconnectDeactivation: %lu ", ToUlong(aCounters.mEpskcDeactivationDisconnects));
605*cfb92d14SAndroid Build Coastguard Worker     OutputLine("epskcInvalidBaStateError: %lu ", ToUlong(aCounters.mEpskcInvalidBaStateErrors));
606*cfb92d14SAndroid Build Coastguard Worker     OutputLine("epskcInvalidArgsError: %lu ", ToUlong(aCounters.mEpskcInvalidArgsErrors));
607*cfb92d14SAndroid Build Coastguard Worker     OutputLine("epskcStartSecureSessionError: %lu ", ToUlong(aCounters.mEpskcStartSecureSessionErrors));
608*cfb92d14SAndroid Build Coastguard Worker     OutputLine("epskcSecureSessionSuccess: %lu ", ToUlong(aCounters.mEpskcSecureSessionSuccesses));
609*cfb92d14SAndroid Build Coastguard Worker     OutputLine("epskcSecureSessionFailure: %lu ", ToUlong(aCounters.mEpskcSecureSessionFailures));
610*cfb92d14SAndroid Build Coastguard Worker     OutputLine("epskcCommissionerPetition: %lu ", ToUlong(aCounters.mEpskcCommissionerPetitions));
611*cfb92d14SAndroid Build Coastguard Worker #endif
612*cfb92d14SAndroid Build Coastguard Worker     OutputLine("pskcSecureSessionSuccess: %lu ", ToUlong(aCounters.mPskcSecureSessionSuccesses));
613*cfb92d14SAndroid Build Coastguard Worker     OutputLine("pskcSecureSessionFailure: %lu ", ToUlong(aCounters.mPskcSecureSessionFailures));
614*cfb92d14SAndroid Build Coastguard Worker     OutputLine("pskcCommissionerPetition: %lu ", ToUlong(aCounters.mPskcCommissionerPetitions));
615*cfb92d14SAndroid Build Coastguard Worker     OutputLine("mgmtActiveGet: %lu ", ToUlong(aCounters.mMgmtActiveGets));
616*cfb92d14SAndroid Build Coastguard Worker     OutputLine("mgmtPendingGet: %lu", ToUlong(aCounters.mMgmtPendingGets));
617*cfb92d14SAndroid Build Coastguard Worker }
618*cfb92d14SAndroid Build Coastguard Worker 
619*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_AGENT_EPHEMERAL_KEY_ENABLE
HandleBorderAgentEphemeralKeyStateChange(void * aContext)620*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleBorderAgentEphemeralKeyStateChange(void *aContext)
621*cfb92d14SAndroid Build Coastguard Worker {
622*cfb92d14SAndroid Build Coastguard Worker     reinterpret_cast<Interpreter *>(aContext)->HandleBorderAgentEphemeralKeyStateChange();
623*cfb92d14SAndroid Build Coastguard Worker }
624*cfb92d14SAndroid Build Coastguard Worker 
HandleBorderAgentEphemeralKeyStateChange(void)625*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleBorderAgentEphemeralKeyStateChange(void)
626*cfb92d14SAndroid Build Coastguard Worker {
627*cfb92d14SAndroid Build Coastguard Worker     bool active = otBorderAgentIsEphemeralKeyActive(GetInstancePtr());
628*cfb92d14SAndroid Build Coastguard Worker 
629*cfb92d14SAndroid Build Coastguard Worker     OutputFormat("BorderAgent callback: Ephemeral key %sactive", active ? "" : "in");
630*cfb92d14SAndroid Build Coastguard Worker 
631*cfb92d14SAndroid Build Coastguard Worker     if (active)
632*cfb92d14SAndroid Build Coastguard Worker     {
633*cfb92d14SAndroid Build Coastguard Worker         OutputFormat(", port:%u", otBorderAgentGetUdpPort(GetInstancePtr()));
634*cfb92d14SAndroid Build Coastguard Worker     }
635*cfb92d14SAndroid Build Coastguard Worker 
636*cfb92d14SAndroid Build Coastguard Worker     OutputNewLine();
637*cfb92d14SAndroid Build Coastguard Worker }
638*cfb92d14SAndroid Build Coastguard Worker #endif
639*cfb92d14SAndroid Build Coastguard Worker 
640*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_BORDER_AGENT_ENABLE
641*cfb92d14SAndroid Build Coastguard Worker 
642*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE
Process(Arg aArgs[])643*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("br")>(Arg aArgs[]) { return mBr.Process(aArgs); }
644*cfb92d14SAndroid Build Coastguard Worker #endif
645*cfb92d14SAndroid Build Coastguard Worker 
646*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_NAT64_TRANSLATOR_ENABLE || OPENTHREAD_CONFIG_NAT64_BORDER_ROUTING_ENABLE
Process(Arg aArgs[])647*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("nat64")>(Arg aArgs[])
648*cfb92d14SAndroid Build Coastguard Worker {
649*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
650*cfb92d14SAndroid Build Coastguard Worker 
651*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
652*cfb92d14SAndroid Build Coastguard Worker     {
653*cfb92d14SAndroid Build Coastguard Worker         ExitNow(error = OT_ERROR_INVALID_COMMAND);
654*cfb92d14SAndroid Build Coastguard Worker     }
655*cfb92d14SAndroid Build Coastguard Worker 
656*cfb92d14SAndroid Build Coastguard Worker     /**
657*cfb92d14SAndroid Build Coastguard Worker      * @cli nat64 (enable,disable)
658*cfb92d14SAndroid Build Coastguard Worker      * @code
659*cfb92d14SAndroid Build Coastguard Worker      * nat64 enable
660*cfb92d14SAndroid Build Coastguard Worker      * Done
661*cfb92d14SAndroid Build Coastguard Worker      * @endcode
662*cfb92d14SAndroid Build Coastguard Worker      * @code
663*cfb92d14SAndroid Build Coastguard Worker      * nat64 disable
664*cfb92d14SAndroid Build Coastguard Worker      * Done
665*cfb92d14SAndroid Build Coastguard Worker      * @endcode
666*cfb92d14SAndroid Build Coastguard Worker      * @cparam nat64 @ca{enable|disable}
667*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
668*cfb92d14SAndroid Build Coastguard Worker      * #otNat64SetEnabled
669*cfb92d14SAndroid Build Coastguard Worker      *
670*cfb92d14SAndroid Build Coastguard Worker      */
671*cfb92d14SAndroid Build Coastguard Worker     if (ProcessEnableDisable(aArgs, otNat64SetEnabled) == OT_ERROR_NONE)
672*cfb92d14SAndroid Build Coastguard Worker     {
673*cfb92d14SAndroid Build Coastguard Worker     }
674*cfb92d14SAndroid Build Coastguard Worker     /**
675*cfb92d14SAndroid Build Coastguard Worker      * @cli nat64 state
676*cfb92d14SAndroid Build Coastguard Worker      * @code
677*cfb92d14SAndroid Build Coastguard Worker      * nat64 state
678*cfb92d14SAndroid Build Coastguard Worker      * PrefixManager: Active
679*cfb92d14SAndroid Build Coastguard Worker      * Translator: Active
680*cfb92d14SAndroid Build Coastguard Worker      * Done
681*cfb92d14SAndroid Build Coastguard Worker      * @endcode
682*cfb92d14SAndroid Build Coastguard Worker      * @par
683*cfb92d14SAndroid Build Coastguard Worker      * Gets the state of NAT64 functions.
684*cfb92d14SAndroid Build Coastguard Worker      * @par
685*cfb92d14SAndroid Build Coastguard Worker      * `PrefixManager` state is available when `OPENTHREAD_CONFIG_NAT64_BORDER_ROUTING_ENABLE` is enabled.
686*cfb92d14SAndroid Build Coastguard Worker      * `Translator` state is available when `OPENTHREAD_CONFIG_NAT64_TRANSLATOR_ENABLE` is enabled.
687*cfb92d14SAndroid Build Coastguard Worker      * @par
688*cfb92d14SAndroid Build Coastguard Worker      * When `OPENTHREAD_CONFIG_NAT64_BORDER_ROUTING_ENABLE` is enabled, `PrefixManager` returns one of the following
689*cfb92d14SAndroid Build Coastguard Worker      * states:
690*cfb92d14SAndroid Build Coastguard Worker      * - `Disabled`: NAT64 prefix manager is disabled.
691*cfb92d14SAndroid Build Coastguard Worker      * - `NotRunning`: NAT64 prefix manager is enabled, but is not running. This could mean that the routing manager is
692*cfb92d14SAndroid Build Coastguard Worker      *   disabled.
693*cfb92d14SAndroid Build Coastguard Worker      * - `Idle`: NAT64 prefix manager is enabled and is running, but is not publishing a NAT64 prefix. This can happen
694*cfb92d14SAndroid Build Coastguard Worker      *   when there is another border router publishing a NAT64 prefix with a higher priority.
695*cfb92d14SAndroid Build Coastguard Worker      * - `Active`: NAT64 prefix manager is enabled, running, and publishing a NAT64 prefix.
696*cfb92d14SAndroid Build Coastguard Worker      * @par
697*cfb92d14SAndroid Build Coastguard Worker      * When `OPENTHREAD_CONFIG_NAT64_TRANSLATOR_ENABLE` is enabled, `Translator` returns one of the following states:
698*cfb92d14SAndroid Build Coastguard Worker      * - `Disabled`: NAT64 translator is disabled.
699*cfb92d14SAndroid Build Coastguard Worker      * - `NotRunning`: NAT64 translator is enabled, but is not translating packets. This could mean that the Translator
700*cfb92d14SAndroid Build Coastguard Worker      *   is not configured with a NAT64 prefix or a CIDR for NAT64.
701*cfb92d14SAndroid Build Coastguard Worker      * - `Active`: NAT64 translator is enabled and is translating packets.
702*cfb92d14SAndroid Build Coastguard Worker      * @sa otNat64GetPrefixManagerState
703*cfb92d14SAndroid Build Coastguard Worker      * @sa otNat64GetTranslatorState
704*cfb92d14SAndroid Build Coastguard Worker      *
705*cfb92d14SAndroid Build Coastguard Worker      */
706*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "state")
707*cfb92d14SAndroid Build Coastguard Worker     {
708*cfb92d14SAndroid Build Coastguard Worker         static const char *const kNat64State[] = {"Disabled", "NotRunning", "Idle", "Active"};
709*cfb92d14SAndroid Build Coastguard Worker 
710*cfb92d14SAndroid Build Coastguard Worker         static_assert(0 == OT_NAT64_STATE_DISABLED, "OT_NAT64_STATE_DISABLED value is incorrect");
711*cfb92d14SAndroid Build Coastguard Worker         static_assert(1 == OT_NAT64_STATE_NOT_RUNNING, "OT_NAT64_STATE_NOT_RUNNING value is incorrect");
712*cfb92d14SAndroid Build Coastguard Worker         static_assert(2 == OT_NAT64_STATE_IDLE, "OT_NAT64_STATE_IDLE value is incorrect");
713*cfb92d14SAndroid Build Coastguard Worker         static_assert(3 == OT_NAT64_STATE_ACTIVE, "OT_NAT64_STATE_ACTIVE value is incorrect");
714*cfb92d14SAndroid Build Coastguard Worker 
715*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_NAT64_BORDER_ROUTING_ENABLE
716*cfb92d14SAndroid Build Coastguard Worker         OutputLine("PrefixManager: %s", kNat64State[otNat64GetPrefixManagerState(GetInstancePtr())]);
717*cfb92d14SAndroid Build Coastguard Worker #endif
718*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_NAT64_TRANSLATOR_ENABLE
719*cfb92d14SAndroid Build Coastguard Worker         OutputLine("Translator: %s", kNat64State[otNat64GetTranslatorState(GetInstancePtr())]);
720*cfb92d14SAndroid Build Coastguard Worker #endif
721*cfb92d14SAndroid Build Coastguard Worker     }
722*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_NAT64_TRANSLATOR_ENABLE
723*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "cidr")
724*cfb92d14SAndroid Build Coastguard Worker     {
725*cfb92d14SAndroid Build Coastguard Worker         otIp4Cidr cidr;
726*cfb92d14SAndroid Build Coastguard Worker 
727*cfb92d14SAndroid Build Coastguard Worker         /**
728*cfb92d14SAndroid Build Coastguard Worker          * @cli nat64 cidr
729*cfb92d14SAndroid Build Coastguard Worker          * @code
730*cfb92d14SAndroid Build Coastguard Worker          * nat64 cidr
731*cfb92d14SAndroid Build Coastguard Worker          * 192.168.255.0/24
732*cfb92d14SAndroid Build Coastguard Worker          * Done
733*cfb92d14SAndroid Build Coastguard Worker          * @endcode
734*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
735*cfb92d14SAndroid Build Coastguard Worker          * #otNat64GetCidr
736*cfb92d14SAndroid Build Coastguard Worker          *
737*cfb92d14SAndroid Build Coastguard Worker          */
738*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1].IsEmpty())
739*cfb92d14SAndroid Build Coastguard Worker         {
740*cfb92d14SAndroid Build Coastguard Worker             char cidrString[OT_IP4_CIDR_STRING_SIZE];
741*cfb92d14SAndroid Build Coastguard Worker 
742*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = otNat64GetCidr(GetInstancePtr(), &cidr));
743*cfb92d14SAndroid Build Coastguard Worker             otIp4CidrToString(&cidr, cidrString, sizeof(cidrString));
744*cfb92d14SAndroid Build Coastguard Worker             OutputLine("%s", cidrString);
745*cfb92d14SAndroid Build Coastguard Worker         }
746*cfb92d14SAndroid Build Coastguard Worker         /**
747*cfb92d14SAndroid Build Coastguard Worker          * @cli nat64 cidr <cidr>
748*cfb92d14SAndroid Build Coastguard Worker          * @code
749*cfb92d14SAndroid Build Coastguard Worker          * nat64 cidr 192.168.255.0/24
750*cfb92d14SAndroid Build Coastguard Worker          * Done
751*cfb92d14SAndroid Build Coastguard Worker          * @endcode
752*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
753*cfb92d14SAndroid Build Coastguard Worker          * #otPlatNat64SetIp4Cidr
754*cfb92d14SAndroid Build Coastguard Worker          *
755*cfb92d14SAndroid Build Coastguard Worker          */
756*cfb92d14SAndroid Build Coastguard Worker         else
757*cfb92d14SAndroid Build Coastguard Worker         {
758*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = otIp4CidrFromString(aArgs[1].GetCString(), &cidr));
759*cfb92d14SAndroid Build Coastguard Worker             error = otNat64SetIp4Cidr(GetInstancePtr(), &cidr);
760*cfb92d14SAndroid Build Coastguard Worker         }
761*cfb92d14SAndroid Build Coastguard Worker     }
762*cfb92d14SAndroid Build Coastguard Worker     /**
763*cfb92d14SAndroid Build Coastguard Worker      * @cli nat64 mappings
764*cfb92d14SAndroid Build Coastguard Worker      * @code
765*cfb92d14SAndroid Build Coastguard Worker      * nat64 mappings
766*cfb92d14SAndroid Build Coastguard Worker      * |          | Address                   |        | 4 to 6       | 6 to 4       |
767*cfb92d14SAndroid Build Coastguard Worker      * +----------+---------------------------+--------+--------------+--------------+
768*cfb92d14SAndroid Build Coastguard Worker      * | ID       | IPv6       | IPv4         | Expiry | Pkts | Bytes | Pkts | Bytes |
769*cfb92d14SAndroid Build Coastguard Worker      * +----------+------------+--------------+--------+------+-------+------+-------+
770*cfb92d14SAndroid Build Coastguard Worker      * | 00021cb9 | fdc7::df79 | 192.168.64.2 |  7196s |    6 |   456 |   11 |  1928 |
771*cfb92d14SAndroid Build Coastguard Worker      * |          |                                TCP |    0 |     0 |    0 |     0 |
772*cfb92d14SAndroid Build Coastguard Worker      * |          |                                UDP |    1 |   136 |   16 |  1608 |
773*cfb92d14SAndroid Build Coastguard Worker      * |          |                               ICMP |    5 |   320 |    5 |   320 |
774*cfb92d14SAndroid Build Coastguard Worker      * @endcode
775*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
776*cfb92d14SAndroid Build Coastguard Worker      * #otNat64GetNextAddressMapping
777*cfb92d14SAndroid Build Coastguard Worker      *
778*cfb92d14SAndroid Build Coastguard Worker      */
779*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "mappings")
780*cfb92d14SAndroid Build Coastguard Worker     {
781*cfb92d14SAndroid Build Coastguard Worker         static const char *const kNat64StatusLevel1Title[] = {"", "Address", "", "4 to 6", "6 to 4"};
782*cfb92d14SAndroid Build Coastguard Worker 
783*cfb92d14SAndroid Build Coastguard Worker         static const uint8_t kNat64StatusLevel1ColumnWidths[] = {
784*cfb92d14SAndroid Build Coastguard Worker             18, 61, 8, 25, 25,
785*cfb92d14SAndroid Build Coastguard Worker         };
786*cfb92d14SAndroid Build Coastguard Worker 
787*cfb92d14SAndroid Build Coastguard Worker         static const char *const kNat64StatusTableHeader[] = {
788*cfb92d14SAndroid Build Coastguard Worker             "ID", "IPv6", "IPv4", "Expiry", "Pkts", "Bytes", "Pkts", "Bytes",
789*cfb92d14SAndroid Build Coastguard Worker         };
790*cfb92d14SAndroid Build Coastguard Worker 
791*cfb92d14SAndroid Build Coastguard Worker         static const uint8_t kNat64StatusTableColumnWidths[] = {
792*cfb92d14SAndroid Build Coastguard Worker             18, 42, 18, 8, 10, 14, 10, 14,
793*cfb92d14SAndroid Build Coastguard Worker         };
794*cfb92d14SAndroid Build Coastguard Worker 
795*cfb92d14SAndroid Build Coastguard Worker         otNat64AddressMappingIterator iterator;
796*cfb92d14SAndroid Build Coastguard Worker         otNat64AddressMapping         mapping;
797*cfb92d14SAndroid Build Coastguard Worker 
798*cfb92d14SAndroid Build Coastguard Worker         OutputTableHeader(kNat64StatusLevel1Title, kNat64StatusLevel1ColumnWidths);
799*cfb92d14SAndroid Build Coastguard Worker         OutputTableHeader(kNat64StatusTableHeader, kNat64StatusTableColumnWidths);
800*cfb92d14SAndroid Build Coastguard Worker 
801*cfb92d14SAndroid Build Coastguard Worker         otNat64InitAddressMappingIterator(GetInstancePtr(), &iterator);
802*cfb92d14SAndroid Build Coastguard Worker         while (otNat64GetNextAddressMapping(GetInstancePtr(), &iterator, &mapping) == OT_ERROR_NONE)
803*cfb92d14SAndroid Build Coastguard Worker         {
804*cfb92d14SAndroid Build Coastguard Worker             char ip4AddressString[OT_IP4_ADDRESS_STRING_SIZE];
805*cfb92d14SAndroid Build Coastguard Worker             char ip6AddressString[OT_IP6_PREFIX_STRING_SIZE];
806*cfb92d14SAndroid Build Coastguard Worker 
807*cfb92d14SAndroid Build Coastguard Worker             otIp6AddressToString(&mapping.mIp6, ip6AddressString, sizeof(ip6AddressString));
808*cfb92d14SAndroid Build Coastguard Worker             otIp4AddressToString(&mapping.mIp4, ip4AddressString, sizeof(ip4AddressString));
809*cfb92d14SAndroid Build Coastguard Worker 
810*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("| %08lx%08lx ", ToUlong(static_cast<uint32_t>(mapping.mId >> 32)),
811*cfb92d14SAndroid Build Coastguard Worker                          ToUlong(static_cast<uint32_t>(mapping.mId & 0xffffffff)));
812*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("| %40s ", ip6AddressString);
813*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("| %16s ", ip4AddressString);
814*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("| %5lus ", ToUlong(mapping.mRemainingTimeMs / 1000));
815*cfb92d14SAndroid Build Coastguard Worker             OutputNat64Counters(mapping.mCounters.mTotal);
816*cfb92d14SAndroid Build Coastguard Worker 
817*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("| %16s ", "");
818*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("| %68s ", "TCP");
819*cfb92d14SAndroid Build Coastguard Worker             OutputNat64Counters(mapping.mCounters.mTcp);
820*cfb92d14SAndroid Build Coastguard Worker 
821*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("| %16s ", "");
822*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("| %68s ", "UDP");
823*cfb92d14SAndroid Build Coastguard Worker             OutputNat64Counters(mapping.mCounters.mUdp);
824*cfb92d14SAndroid Build Coastguard Worker 
825*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("| %16s ", "");
826*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("| %68s ", "ICMP");
827*cfb92d14SAndroid Build Coastguard Worker             OutputNat64Counters(mapping.mCounters.mIcmp);
828*cfb92d14SAndroid Build Coastguard Worker         }
829*cfb92d14SAndroid Build Coastguard Worker     }
830*cfb92d14SAndroid Build Coastguard Worker     /**
831*cfb92d14SAndroid Build Coastguard Worker      * @cli nat64 counters
832*cfb92d14SAndroid Build Coastguard Worker      * @code
833*cfb92d14SAndroid Build Coastguard Worker      * nat64 counters
834*cfb92d14SAndroid Build Coastguard Worker      * |               | 4 to 6                  | 6 to 4                  |
835*cfb92d14SAndroid Build Coastguard Worker      * +---------------+-------------------------+-------------------------+
836*cfb92d14SAndroid Build Coastguard Worker      * | Protocol      | Pkts     | Bytes        | Pkts     | Bytes        |
837*cfb92d14SAndroid Build Coastguard Worker      * +---------------+----------+--------------+----------+--------------+
838*cfb92d14SAndroid Build Coastguard Worker      * |         Total |       11 |          704 |       11 |          704 |
839*cfb92d14SAndroid Build Coastguard Worker      * |           TCP |        0 |            0 |        0 |            0 |
840*cfb92d14SAndroid Build Coastguard Worker      * |           UDP |        0 |            0 |        0 |            0 |
841*cfb92d14SAndroid Build Coastguard Worker      * |          ICMP |       11 |          704 |       11 |          704 |
842*cfb92d14SAndroid Build Coastguard Worker      * | Errors        | Pkts                    | Pkts                    |
843*cfb92d14SAndroid Build Coastguard Worker      * +---------------+-------------------------+-------------------------+
844*cfb92d14SAndroid Build Coastguard Worker      * |         Total |                       8 |                       4 |
845*cfb92d14SAndroid Build Coastguard Worker      * |   Illegal Pkt |                       0 |                       0 |
846*cfb92d14SAndroid Build Coastguard Worker      * |   Unsup Proto |                       0 |                       0 |
847*cfb92d14SAndroid Build Coastguard Worker      * |    No Mapping |                       2 |                       0 |
848*cfb92d14SAndroid Build Coastguard Worker      * Done
849*cfb92d14SAndroid Build Coastguard Worker      * @endcode
850*cfb92d14SAndroid Build Coastguard Worker      * @par
851*cfb92d14SAndroid Build Coastguard Worker      * Gets the NAT64 translator packet and error counters.
852*cfb92d14SAndroid Build Coastguard Worker      * @par
853*cfb92d14SAndroid Build Coastguard Worker      * Available when `OPENTHREAD_CONFIG_NAT64_TRANSLATOR_ENABLE` is enabled.
854*cfb92d14SAndroid Build Coastguard Worker      * @sa otNat64GetCounters
855*cfb92d14SAndroid Build Coastguard Worker      * @sa otNat64GetErrorCounters
856*cfb92d14SAndroid Build Coastguard Worker      *
857*cfb92d14SAndroid Build Coastguard Worker      */
858*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "counters")
859*cfb92d14SAndroid Build Coastguard Worker     {
860*cfb92d14SAndroid Build Coastguard Worker         static const char *const kNat64CounterTableHeader[] = {
861*cfb92d14SAndroid Build Coastguard Worker             "",
862*cfb92d14SAndroid Build Coastguard Worker             "4 to 6",
863*cfb92d14SAndroid Build Coastguard Worker             "6 to 4",
864*cfb92d14SAndroid Build Coastguard Worker         };
865*cfb92d14SAndroid Build Coastguard Worker         static const uint8_t     kNat64CounterTableHeaderColumns[] = {15, 25, 25};
866*cfb92d14SAndroid Build Coastguard Worker         static const char *const kNat64CounterTableSubHeader[]     = {
867*cfb92d14SAndroid Build Coastguard Worker                 "Protocol", "Pkts", "Bytes", "Pkts", "Bytes",
868*cfb92d14SAndroid Build Coastguard Worker         };
869*cfb92d14SAndroid Build Coastguard Worker         static const uint8_t kNat64CounterTableSubHeaderColumns[] = {
870*cfb92d14SAndroid Build Coastguard Worker             15, 10, 14, 10, 14,
871*cfb92d14SAndroid Build Coastguard Worker         };
872*cfb92d14SAndroid Build Coastguard Worker         static const char *const kNat64CounterTableErrorSubHeader[] = {
873*cfb92d14SAndroid Build Coastguard Worker             "Errors",
874*cfb92d14SAndroid Build Coastguard Worker             "Pkts",
875*cfb92d14SAndroid Build Coastguard Worker             "Pkts",
876*cfb92d14SAndroid Build Coastguard Worker         };
877*cfb92d14SAndroid Build Coastguard Worker         static const uint8_t kNat64CounterTableErrorSubHeaderColumns[] = {
878*cfb92d14SAndroid Build Coastguard Worker             15,
879*cfb92d14SAndroid Build Coastguard Worker             25,
880*cfb92d14SAndroid Build Coastguard Worker             25,
881*cfb92d14SAndroid Build Coastguard Worker         };
882*cfb92d14SAndroid Build Coastguard Worker         static const char *const kNat64CounterErrorType[] = {
883*cfb92d14SAndroid Build Coastguard Worker             "Unknown",
884*cfb92d14SAndroid Build Coastguard Worker             "Illegal Pkt",
885*cfb92d14SAndroid Build Coastguard Worker             "Unsup Proto",
886*cfb92d14SAndroid Build Coastguard Worker             "No Mapping",
887*cfb92d14SAndroid Build Coastguard Worker         };
888*cfb92d14SAndroid Build Coastguard Worker 
889*cfb92d14SAndroid Build Coastguard Worker         otNat64ProtocolCounters counters;
890*cfb92d14SAndroid Build Coastguard Worker         otNat64ErrorCounters    errorCounters;
891*cfb92d14SAndroid Build Coastguard Worker         Uint64StringBuffer      u64StringBuffer;
892*cfb92d14SAndroid Build Coastguard Worker 
893*cfb92d14SAndroid Build Coastguard Worker         OutputTableHeader(kNat64CounterTableHeader, kNat64CounterTableHeaderColumns);
894*cfb92d14SAndroid Build Coastguard Worker         OutputTableHeader(kNat64CounterTableSubHeader, kNat64CounterTableSubHeaderColumns);
895*cfb92d14SAndroid Build Coastguard Worker 
896*cfb92d14SAndroid Build Coastguard Worker         otNat64GetCounters(GetInstancePtr(), &counters);
897*cfb92d14SAndroid Build Coastguard Worker         otNat64GetErrorCounters(GetInstancePtr(), &errorCounters);
898*cfb92d14SAndroid Build Coastguard Worker 
899*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("| %13s ", "Total");
900*cfb92d14SAndroid Build Coastguard Worker         OutputNat64Counters(counters.mTotal);
901*cfb92d14SAndroid Build Coastguard Worker 
902*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("| %13s ", "TCP");
903*cfb92d14SAndroid Build Coastguard Worker         OutputNat64Counters(counters.mTcp);
904*cfb92d14SAndroid Build Coastguard Worker 
905*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("| %13s ", "UDP");
906*cfb92d14SAndroid Build Coastguard Worker         OutputNat64Counters(counters.mUdp);
907*cfb92d14SAndroid Build Coastguard Worker 
908*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("| %13s ", "ICMP");
909*cfb92d14SAndroid Build Coastguard Worker         OutputNat64Counters(counters.mIcmp);
910*cfb92d14SAndroid Build Coastguard Worker 
911*cfb92d14SAndroid Build Coastguard Worker         OutputTableHeader(kNat64CounterTableErrorSubHeader, kNat64CounterTableErrorSubHeaderColumns);
912*cfb92d14SAndroid Build Coastguard Worker         for (uint8_t i = 0; i < OT_NAT64_DROP_REASON_COUNT; i++)
913*cfb92d14SAndroid Build Coastguard Worker         {
914*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("| %13s | %23s ", kNat64CounterErrorType[i],
915*cfb92d14SAndroid Build Coastguard Worker                          Uint64ToString(errorCounters.mCount4To6[i], u64StringBuffer));
916*cfb92d14SAndroid Build Coastguard Worker             OutputLine("| %23s |", Uint64ToString(errorCounters.mCount6To4[i], u64StringBuffer));
917*cfb92d14SAndroid Build Coastguard Worker         }
918*cfb92d14SAndroid Build Coastguard Worker     }
919*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_NAT64_TRANSLATOR_ENABLE
920*cfb92d14SAndroid Build Coastguard Worker     else
921*cfb92d14SAndroid Build Coastguard Worker     {
922*cfb92d14SAndroid Build Coastguard Worker         ExitNow(error = OT_ERROR_INVALID_COMMAND);
923*cfb92d14SAndroid Build Coastguard Worker     }
924*cfb92d14SAndroid Build Coastguard Worker 
925*cfb92d14SAndroid Build Coastguard Worker exit:
926*cfb92d14SAndroid Build Coastguard Worker     return error;
927*cfb92d14SAndroid Build Coastguard Worker }
928*cfb92d14SAndroid Build Coastguard Worker 
929*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_NAT64_TRANSLATOR_ENABLE
OutputNat64Counters(const otNat64Counters & aCounters)930*cfb92d14SAndroid Build Coastguard Worker void Interpreter::OutputNat64Counters(const otNat64Counters &aCounters)
931*cfb92d14SAndroid Build Coastguard Worker {
932*cfb92d14SAndroid Build Coastguard Worker     Uint64StringBuffer u64StringBuffer;
933*cfb92d14SAndroid Build Coastguard Worker 
934*cfb92d14SAndroid Build Coastguard Worker     OutputFormat("| %8s ", Uint64ToString(aCounters.m4To6Packets, u64StringBuffer));
935*cfb92d14SAndroid Build Coastguard Worker     OutputFormat("| %12s ", Uint64ToString(aCounters.m4To6Bytes, u64StringBuffer));
936*cfb92d14SAndroid Build Coastguard Worker     OutputFormat("| %8s ", Uint64ToString(aCounters.m6To4Packets, u64StringBuffer));
937*cfb92d14SAndroid Build Coastguard Worker     OutputLine("| %12s |", Uint64ToString(aCounters.m6To4Bytes, u64StringBuffer));
938*cfb92d14SAndroid Build Coastguard Worker }
939*cfb92d14SAndroid Build Coastguard Worker #endif
940*cfb92d14SAndroid Build Coastguard Worker 
941*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_NAT64_TRANSLATOR_ENABLE || OPENTHREAD_CONFIG_NAT64_BORDER_ROUTING_ENABLE
942*cfb92d14SAndroid Build Coastguard Worker 
943*cfb92d14SAndroid Build Coastguard Worker #if (OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2)
944*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])945*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("bbr")>(Arg aArgs[]) { return mBbr.Process(aArgs); }
946*cfb92d14SAndroid Build Coastguard Worker 
947*cfb92d14SAndroid Build Coastguard Worker /**
948*cfb92d14SAndroid Build Coastguard Worker  * @cli domainname
949*cfb92d14SAndroid Build Coastguard Worker  * @code
950*cfb92d14SAndroid Build Coastguard Worker  * domainname
951*cfb92d14SAndroid Build Coastguard Worker  * Thread
952*cfb92d14SAndroid Build Coastguard Worker  * Done
953*cfb92d14SAndroid Build Coastguard Worker  * @endcode
954*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
955*cfb92d14SAndroid Build Coastguard Worker  * #otThreadGetDomainName
956*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])957*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("domainname")>(Arg aArgs[])
958*cfb92d14SAndroid Build Coastguard Worker {
959*cfb92d14SAndroid Build Coastguard Worker     /**
960*cfb92d14SAndroid Build Coastguard Worker      * @cli domainname (set)
961*cfb92d14SAndroid Build Coastguard Worker      * @code
962*cfb92d14SAndroid Build Coastguard Worker      * domainname Test\ Thread
963*cfb92d14SAndroid Build Coastguard Worker      * Done
964*cfb92d14SAndroid Build Coastguard Worker      * @endcode
965*cfb92d14SAndroid Build Coastguard Worker      * @cparam domainname @ca{name}
966*cfb92d14SAndroid Build Coastguard Worker      * Use a `backslash` to escape spaces.
967*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
968*cfb92d14SAndroid Build Coastguard Worker      * #otThreadSetDomainName
969*cfb92d14SAndroid Build Coastguard Worker      */
970*cfb92d14SAndroid Build Coastguard Worker     return ProcessGetSet(aArgs, otThreadGetDomainName, otThreadSetDomainName);
971*cfb92d14SAndroid Build Coastguard Worker }
972*cfb92d14SAndroid Build Coastguard Worker 
973*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DUA_ENABLE
Process(Arg aArgs[])974*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("dua")>(Arg aArgs[])
975*cfb92d14SAndroid Build Coastguard Worker {
976*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
977*cfb92d14SAndroid Build Coastguard Worker 
978*cfb92d14SAndroid Build Coastguard Worker     /**
979*cfb92d14SAndroid Build Coastguard Worker      * @cli dua iid
980*cfb92d14SAndroid Build Coastguard Worker      * @code
981*cfb92d14SAndroid Build Coastguard Worker      * dua iid
982*cfb92d14SAndroid Build Coastguard Worker      * 0004000300020001
983*cfb92d14SAndroid Build Coastguard Worker      * Done
984*cfb92d14SAndroid Build Coastguard Worker      * @endcode
985*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
986*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetFixedDuaInterfaceIdentifier
987*cfb92d14SAndroid Build Coastguard Worker      */
988*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "iid")
989*cfb92d14SAndroid Build Coastguard Worker     {
990*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1].IsEmpty())
991*cfb92d14SAndroid Build Coastguard Worker         {
992*cfb92d14SAndroid Build Coastguard Worker             const otIp6InterfaceIdentifier *iid = otThreadGetFixedDuaInterfaceIdentifier(GetInstancePtr());
993*cfb92d14SAndroid Build Coastguard Worker 
994*cfb92d14SAndroid Build Coastguard Worker             if (iid != nullptr)
995*cfb92d14SAndroid Build Coastguard Worker             {
996*cfb92d14SAndroid Build Coastguard Worker                 OutputBytesLine(iid->mFields.m8);
997*cfb92d14SAndroid Build Coastguard Worker             }
998*cfb92d14SAndroid Build Coastguard Worker         }
999*cfb92d14SAndroid Build Coastguard Worker         /**
1000*cfb92d14SAndroid Build Coastguard Worker          * @cli dua iid (set,clear)
1001*cfb92d14SAndroid Build Coastguard Worker          * @code
1002*cfb92d14SAndroid Build Coastguard Worker          * dua iid 0004000300020001
1003*cfb92d14SAndroid Build Coastguard Worker          * Done
1004*cfb92d14SAndroid Build Coastguard Worker          * @endcode
1005*cfb92d14SAndroid Build Coastguard Worker          * @code
1006*cfb92d14SAndroid Build Coastguard Worker          * dua iid clear
1007*cfb92d14SAndroid Build Coastguard Worker          * Done
1008*cfb92d14SAndroid Build Coastguard Worker          * @endcode
1009*cfb92d14SAndroid Build Coastguard Worker          * @cparam dua iid @ca{iid|clear}
1010*cfb92d14SAndroid Build Coastguard Worker          * `dua iid clear` passes a `nullptr` to #otThreadSetFixedDuaInterfaceIdentifier.
1011*cfb92d14SAndroid Build Coastguard Worker          * Otherwise, you can pass the `iid`.
1012*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
1013*cfb92d14SAndroid Build Coastguard Worker          * #otThreadSetFixedDuaInterfaceIdentifier
1014*cfb92d14SAndroid Build Coastguard Worker          */
1015*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "clear")
1016*cfb92d14SAndroid Build Coastguard Worker         {
1017*cfb92d14SAndroid Build Coastguard Worker             error = otThreadSetFixedDuaInterfaceIdentifier(GetInstancePtr(), nullptr);
1018*cfb92d14SAndroid Build Coastguard Worker         }
1019*cfb92d14SAndroid Build Coastguard Worker         else
1020*cfb92d14SAndroid Build Coastguard Worker         {
1021*cfb92d14SAndroid Build Coastguard Worker             otIp6InterfaceIdentifier iid;
1022*cfb92d14SAndroid Build Coastguard Worker 
1023*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = aArgs[1].ParseAsHexString(iid.mFields.m8));
1024*cfb92d14SAndroid Build Coastguard Worker             error = otThreadSetFixedDuaInterfaceIdentifier(GetInstancePtr(), &iid);
1025*cfb92d14SAndroid Build Coastguard Worker         }
1026*cfb92d14SAndroid Build Coastguard Worker     }
1027*cfb92d14SAndroid Build Coastguard Worker     else
1028*cfb92d14SAndroid Build Coastguard Worker     {
1029*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_COMMAND;
1030*cfb92d14SAndroid Build Coastguard Worker     }
1031*cfb92d14SAndroid Build Coastguard Worker 
1032*cfb92d14SAndroid Build Coastguard Worker exit:
1033*cfb92d14SAndroid Build Coastguard Worker     return error;
1034*cfb92d14SAndroid Build Coastguard Worker }
1035*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_DUA_ENABLE
1036*cfb92d14SAndroid Build Coastguard Worker 
1037*cfb92d14SAndroid Build Coastguard Worker #endif // (OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2)
1038*cfb92d14SAndroid Build Coastguard Worker 
1039*cfb92d14SAndroid Build Coastguard Worker /**
1040*cfb92d14SAndroid Build Coastguard Worker  * @cli bufferinfo
1041*cfb92d14SAndroid Build Coastguard Worker  * @code
1042*cfb92d14SAndroid Build Coastguard Worker  * bufferinfo
1043*cfb92d14SAndroid Build Coastguard Worker  * total: 40
1044*cfb92d14SAndroid Build Coastguard Worker  * free: 40
1045*cfb92d14SAndroid Build Coastguard Worker  * max-used: 5
1046*cfb92d14SAndroid Build Coastguard Worker  * 6lo send: 0 0 0
1047*cfb92d14SAndroid Build Coastguard Worker  * 6lo reas: 0 0 0
1048*cfb92d14SAndroid Build Coastguard Worker  * ip6: 0 0 0
1049*cfb92d14SAndroid Build Coastguard Worker  * mpl: 0 0 0
1050*cfb92d14SAndroid Build Coastguard Worker  * mle: 0 0 0
1051*cfb92d14SAndroid Build Coastguard Worker  * coap: 0 0 0
1052*cfb92d14SAndroid Build Coastguard Worker  * coap secure: 0 0 0
1053*cfb92d14SAndroid Build Coastguard Worker  * application coap: 0 0 0
1054*cfb92d14SAndroid Build Coastguard Worker  * Done
1055*cfb92d14SAndroid Build Coastguard Worker  * @endcode
1056*cfb92d14SAndroid Build Coastguard Worker  * @par
1057*cfb92d14SAndroid Build Coastguard Worker  * Gets the current message buffer information.
1058*cfb92d14SAndroid Build Coastguard Worker  * *   `total` displays the total number of message buffers in pool.
1059*cfb92d14SAndroid Build Coastguard Worker  * *   `free` displays the number of free message buffers.
1060*cfb92d14SAndroid Build Coastguard Worker  * *   `max-used` displays max number of used buffers at the same time since OT stack
1061*cfb92d14SAndroid Build Coastguard Worker  *     initialization or last `bufferinfo reset`.
1062*cfb92d14SAndroid Build Coastguard Worker  * @par
1063*cfb92d14SAndroid Build Coastguard Worker  * Next, the CLI displays info about different queues used by the OpenThread stack,
1064*cfb92d14SAndroid Build Coastguard Worker  * for example `6lo send`. Each line after the queue represents info about a queue:
1065*cfb92d14SAndroid Build Coastguard Worker  * *   The first number shows number messages in the queue.
1066*cfb92d14SAndroid Build Coastguard Worker  * *   The second number shows number of buffers used by all messages in the queue.
1067*cfb92d14SAndroid Build Coastguard Worker  * *   The third number shows total number of bytes of all messages in the queue.
1068*cfb92d14SAndroid Build Coastguard Worker  * @sa otMessageGetBufferInfo
1069*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])1070*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("bufferinfo")>(Arg aArgs[])
1071*cfb92d14SAndroid Build Coastguard Worker {
1072*cfb92d14SAndroid Build Coastguard Worker     struct BufferInfoName
1073*cfb92d14SAndroid Build Coastguard Worker     {
1074*cfb92d14SAndroid Build Coastguard Worker         const otMessageQueueInfo otBufferInfo::*mQueuePtr;
1075*cfb92d14SAndroid Build Coastguard Worker         const char                             *mName;
1076*cfb92d14SAndroid Build Coastguard Worker     };
1077*cfb92d14SAndroid Build Coastguard Worker 
1078*cfb92d14SAndroid Build Coastguard Worker     static const BufferInfoName kBufferInfoNames[] = {
1079*cfb92d14SAndroid Build Coastguard Worker         {&otBufferInfo::m6loSendQueue, "6lo send"},
1080*cfb92d14SAndroid Build Coastguard Worker         {&otBufferInfo::m6loReassemblyQueue, "6lo reas"},
1081*cfb92d14SAndroid Build Coastguard Worker         {&otBufferInfo::mIp6Queue, "ip6"},
1082*cfb92d14SAndroid Build Coastguard Worker         {&otBufferInfo::mMplQueue, "mpl"},
1083*cfb92d14SAndroid Build Coastguard Worker         {&otBufferInfo::mMleQueue, "mle"},
1084*cfb92d14SAndroid Build Coastguard Worker         {&otBufferInfo::mCoapQueue, "coap"},
1085*cfb92d14SAndroid Build Coastguard Worker         {&otBufferInfo::mCoapSecureQueue, "coap secure"},
1086*cfb92d14SAndroid Build Coastguard Worker         {&otBufferInfo::mApplicationCoapQueue, "application coap"},
1087*cfb92d14SAndroid Build Coastguard Worker     };
1088*cfb92d14SAndroid Build Coastguard Worker 
1089*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
1090*cfb92d14SAndroid Build Coastguard Worker 
1091*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
1092*cfb92d14SAndroid Build Coastguard Worker     {
1093*cfb92d14SAndroid Build Coastguard Worker         otBufferInfo bufferInfo;
1094*cfb92d14SAndroid Build Coastguard Worker 
1095*cfb92d14SAndroid Build Coastguard Worker         otMessageGetBufferInfo(GetInstancePtr(), &bufferInfo);
1096*cfb92d14SAndroid Build Coastguard Worker 
1097*cfb92d14SAndroid Build Coastguard Worker         OutputLine("total: %u", bufferInfo.mTotalBuffers);
1098*cfb92d14SAndroid Build Coastguard Worker         OutputLine("free: %u", bufferInfo.mFreeBuffers);
1099*cfb92d14SAndroid Build Coastguard Worker         OutputLine("max-used: %u", bufferInfo.mMaxUsedBuffers);
1100*cfb92d14SAndroid Build Coastguard Worker 
1101*cfb92d14SAndroid Build Coastguard Worker         for (const BufferInfoName &info : kBufferInfoNames)
1102*cfb92d14SAndroid Build Coastguard Worker         {
1103*cfb92d14SAndroid Build Coastguard Worker             OutputLine("%s: %u %u %lu", info.mName, (bufferInfo.*info.mQueuePtr).mNumMessages,
1104*cfb92d14SAndroid Build Coastguard Worker                        (bufferInfo.*info.mQueuePtr).mNumBuffers, ToUlong((bufferInfo.*info.mQueuePtr).mTotalBytes));
1105*cfb92d14SAndroid Build Coastguard Worker         }
1106*cfb92d14SAndroid Build Coastguard Worker     }
1107*cfb92d14SAndroid Build Coastguard Worker     /**
1108*cfb92d14SAndroid Build Coastguard Worker      * @cli bufferinfo reset
1109*cfb92d14SAndroid Build Coastguard Worker      * @code
1110*cfb92d14SAndroid Build Coastguard Worker      * bufferinfo reset
1111*cfb92d14SAndroid Build Coastguard Worker      * Done
1112*cfb92d14SAndroid Build Coastguard Worker      * @endcode
1113*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
1114*cfb92d14SAndroid Build Coastguard Worker      * #otMessageResetBufferInfo
1115*cfb92d14SAndroid Build Coastguard Worker      */
1116*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "reset")
1117*cfb92d14SAndroid Build Coastguard Worker     {
1118*cfb92d14SAndroid Build Coastguard Worker         otMessageResetBufferInfo(GetInstancePtr());
1119*cfb92d14SAndroid Build Coastguard Worker     }
1120*cfb92d14SAndroid Build Coastguard Worker     else
1121*cfb92d14SAndroid Build Coastguard Worker     {
1122*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
1123*cfb92d14SAndroid Build Coastguard Worker     }
1124*cfb92d14SAndroid Build Coastguard Worker 
1125*cfb92d14SAndroid Build Coastguard Worker     return error;
1126*cfb92d14SAndroid Build Coastguard Worker }
1127*cfb92d14SAndroid Build Coastguard Worker 
1128*cfb92d14SAndroid Build Coastguard Worker /**
1129*cfb92d14SAndroid Build Coastguard Worker  * @cli ccathreshold (get,set)
1130*cfb92d14SAndroid Build Coastguard Worker  * @code
1131*cfb92d14SAndroid Build Coastguard Worker  * ccathreshold
1132*cfb92d14SAndroid Build Coastguard Worker  * -75 dBm
1133*cfb92d14SAndroid Build Coastguard Worker  * Done
1134*cfb92d14SAndroid Build Coastguard Worker  * @endcode
1135*cfb92d14SAndroid Build Coastguard Worker  * @code
1136*cfb92d14SAndroid Build Coastguard Worker  * ccathreshold -62
1137*cfb92d14SAndroid Build Coastguard Worker  * Done
1138*cfb92d14SAndroid Build Coastguard Worker  * @endcode
1139*cfb92d14SAndroid Build Coastguard Worker  * @cparam ccathreshold [@ca{CCA-threshold-dBm}]
1140*cfb92d14SAndroid Build Coastguard Worker  * Use the optional `CCA-threshold-dBm` argument to set the CCA threshold.
1141*cfb92d14SAndroid Build Coastguard Worker  * @par
1142*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets the CCA threshold in dBm measured at the antenna connector per
1143*cfb92d14SAndroid Build Coastguard Worker  * IEEE 802.15.4 - 2015 section 10.1.4.
1144*cfb92d14SAndroid Build Coastguard Worker  * @sa otPlatRadioGetCcaEnergyDetectThreshold
1145*cfb92d14SAndroid Build Coastguard Worker  * @sa otPlatRadioSetCcaEnergyDetectThreshold
1146*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])1147*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("ccathreshold")>(Arg aArgs[])
1148*cfb92d14SAndroid Build Coastguard Worker {
1149*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
1150*cfb92d14SAndroid Build Coastguard Worker     int8_t  cca;
1151*cfb92d14SAndroid Build Coastguard Worker 
1152*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
1153*cfb92d14SAndroid Build Coastguard Worker     {
1154*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otPlatRadioGetCcaEnergyDetectThreshold(GetInstancePtr(), &cca));
1155*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%d dBm", cca);
1156*cfb92d14SAndroid Build Coastguard Worker     }
1157*cfb92d14SAndroid Build Coastguard Worker     else
1158*cfb92d14SAndroid Build Coastguard Worker     {
1159*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[0].ParseAsInt8(cca));
1160*cfb92d14SAndroid Build Coastguard Worker         error = otPlatRadioSetCcaEnergyDetectThreshold(GetInstancePtr(), cca);
1161*cfb92d14SAndroid Build Coastguard Worker     }
1162*cfb92d14SAndroid Build Coastguard Worker 
1163*cfb92d14SAndroid Build Coastguard Worker exit:
1164*cfb92d14SAndroid Build Coastguard Worker     return error;
1165*cfb92d14SAndroid Build Coastguard Worker }
1166*cfb92d14SAndroid Build Coastguard Worker 
1167*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
Process(Arg aArgs[])1168*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("ccm")>(Arg aArgs[])
1169*cfb92d14SAndroid Build Coastguard Worker {
1170*cfb92d14SAndroid Build Coastguard Worker     return ProcessEnableDisable(aArgs, otThreadSetCcmEnabled);
1171*cfb92d14SAndroid Build Coastguard Worker }
1172*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])1173*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("test")>(Arg aArgs[])
1174*cfb92d14SAndroid Build Coastguard Worker {
1175*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
1176*cfb92d14SAndroid Build Coastguard Worker 
1177*cfb92d14SAndroid Build Coastguard Worker     /**
1178*cfb92d14SAndroid Build Coastguard Worker      * @cli test tmforiginfilter
1179*cfb92d14SAndroid Build Coastguard Worker      * @code
1180*cfb92d14SAndroid Build Coastguard Worker      * test tmforiginfilter
1181*cfb92d14SAndroid Build Coastguard Worker      * Enabled
1182*cfb92d14SAndroid Build Coastguard Worker      * @endcode
1183*cfb92d14SAndroid Build Coastguard Worker      * @code
1184*cfb92d14SAndroid Build Coastguard Worker      * test tmforiginfilter enable
1185*cfb92d14SAndroid Build Coastguard Worker      * Done
1186*cfb92d14SAndroid Build Coastguard Worker      * @endcode
1187*cfb92d14SAndroid Build Coastguard Worker      * @code
1188*cfb92d14SAndroid Build Coastguard Worker      * test tmforiginfilter disable
1189*cfb92d14SAndroid Build Coastguard Worker      * Done
1190*cfb92d14SAndroid Build Coastguard Worker      * @endcode
1191*cfb92d14SAndroid Build Coastguard Worker      * @cparam test tmforiginfilter [@ca{enable|disable}]
1192*cfb92d14SAndroid Build Coastguard Worker      * @par
1193*cfb92d14SAndroid Build Coastguard Worker      * Enables or disables the filter to drop TMF UDP messages from untrusted origin.
1194*cfb92d14SAndroid Build Coastguard Worker      * @par
1195*cfb92d14SAndroid Build Coastguard Worker      * By default the filter that drops TMF UDP messages from untrusted origin
1196*cfb92d14SAndroid Build Coastguard Worker      * is enabled. When disabled, UDP messages sent to the TMF port that originate
1197*cfb92d14SAndroid Build Coastguard Worker      * from untrusted origin (such as host, CLI or an external IPv6 node) will be
1198*cfb92d14SAndroid Build Coastguard Worker      * allowed.
1199*cfb92d14SAndroid Build Coastguard Worker      * @note `OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE` is required.
1200*cfb92d14SAndroid Build Coastguard Worker      */
1201*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "tmforiginfilter")
1202*cfb92d14SAndroid Build Coastguard Worker     {
1203*cfb92d14SAndroid Build Coastguard Worker         error = ProcessEnableDisable(aArgs + 1, otThreadIsTmfOriginFilterEnabled, otThreadSetTmfOriginFilterEnabled);
1204*cfb92d14SAndroid Build Coastguard Worker     }
1205*cfb92d14SAndroid Build Coastguard Worker 
1206*cfb92d14SAndroid Build Coastguard Worker     return error;
1207*cfb92d14SAndroid Build Coastguard Worker }
1208*cfb92d14SAndroid Build Coastguard Worker 
1209*cfb92d14SAndroid Build Coastguard Worker /**
1210*cfb92d14SAndroid Build Coastguard Worker  * @cli tvcheck (enable,disable)
1211*cfb92d14SAndroid Build Coastguard Worker  * @code
1212*cfb92d14SAndroid Build Coastguard Worker  * tvcheck enable
1213*cfb92d14SAndroid Build Coastguard Worker  * Done
1214*cfb92d14SAndroid Build Coastguard Worker  * @endcode
1215*cfb92d14SAndroid Build Coastguard Worker  * @code
1216*cfb92d14SAndroid Build Coastguard Worker  * tvcheck disable
1217*cfb92d14SAndroid Build Coastguard Worker  * Done
1218*cfb92d14SAndroid Build Coastguard Worker  * @endcode
1219*cfb92d14SAndroid Build Coastguard Worker  * @par
1220*cfb92d14SAndroid Build Coastguard Worker  * Enables or disables the Thread version check when upgrading to router or leader.
1221*cfb92d14SAndroid Build Coastguard Worker  * This check is enabled by default.
1222*cfb92d14SAndroid Build Coastguard Worker  * @note `OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE` is required.
1223*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadSetThreadVersionCheckEnabled
1224*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])1225*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("tvcheck")>(Arg aArgs[])
1226*cfb92d14SAndroid Build Coastguard Worker {
1227*cfb92d14SAndroid Build Coastguard Worker     return ProcessEnableDisable(aArgs, otThreadSetThreadVersionCheckEnabled);
1228*cfb92d14SAndroid Build Coastguard Worker }
1229*cfb92d14SAndroid Build Coastguard Worker #endif
1230*cfb92d14SAndroid Build Coastguard Worker 
1231*cfb92d14SAndroid Build Coastguard Worker /**
1232*cfb92d14SAndroid Build Coastguard Worker  * @cli channel (get,set)
1233*cfb92d14SAndroid Build Coastguard Worker  * @code
1234*cfb92d14SAndroid Build Coastguard Worker  * channel
1235*cfb92d14SAndroid Build Coastguard Worker  * 11
1236*cfb92d14SAndroid Build Coastguard Worker  * Done
1237*cfb92d14SAndroid Build Coastguard Worker  * @endcode
1238*cfb92d14SAndroid Build Coastguard Worker  * @code
1239*cfb92d14SAndroid Build Coastguard Worker  * channel 11
1240*cfb92d14SAndroid Build Coastguard Worker  * Done
1241*cfb92d14SAndroid Build Coastguard Worker  * @endcode
1242*cfb92d14SAndroid Build Coastguard Worker  * @cparam channel [@ca{channel-num}]
1243*cfb92d14SAndroid Build Coastguard Worker  * Use `channel-num` to set the channel.
1244*cfb92d14SAndroid Build Coastguard Worker  * @par
1245*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets the IEEE 802.15.4 Channel value.
1246*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])1247*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("channel")>(Arg aArgs[])
1248*cfb92d14SAndroid Build Coastguard Worker {
1249*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
1250*cfb92d14SAndroid Build Coastguard Worker 
1251*cfb92d14SAndroid Build Coastguard Worker     /**
1252*cfb92d14SAndroid Build Coastguard Worker      * @cli channel supported
1253*cfb92d14SAndroid Build Coastguard Worker      * @code
1254*cfb92d14SAndroid Build Coastguard Worker      * channel supported
1255*cfb92d14SAndroid Build Coastguard Worker      * 0x7fff800
1256*cfb92d14SAndroid Build Coastguard Worker      * Done
1257*cfb92d14SAndroid Build Coastguard Worker      * @endcode
1258*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
1259*cfb92d14SAndroid Build Coastguard Worker      * #otPlatRadioGetSupportedChannelMask
1260*cfb92d14SAndroid Build Coastguard Worker      */
1261*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "supported")
1262*cfb92d14SAndroid Build Coastguard Worker     {
1263*cfb92d14SAndroid Build Coastguard Worker         OutputLine("0x%lx", ToUlong(otPlatRadioGetSupportedChannelMask(GetInstancePtr())));
1264*cfb92d14SAndroid Build Coastguard Worker     }
1265*cfb92d14SAndroid Build Coastguard Worker     /**
1266*cfb92d14SAndroid Build Coastguard Worker      * @cli channel preferred
1267*cfb92d14SAndroid Build Coastguard Worker      * @code
1268*cfb92d14SAndroid Build Coastguard Worker      * channel preferred
1269*cfb92d14SAndroid Build Coastguard Worker      * 0x7fff800
1270*cfb92d14SAndroid Build Coastguard Worker      * Done
1271*cfb92d14SAndroid Build Coastguard Worker      * @endcode
1272*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
1273*cfb92d14SAndroid Build Coastguard Worker      * #otPlatRadioGetPreferredChannelMask
1274*cfb92d14SAndroid Build Coastguard Worker      */
1275*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "preferred")
1276*cfb92d14SAndroid Build Coastguard Worker     {
1277*cfb92d14SAndroid Build Coastguard Worker         OutputLine("0x%lx", ToUlong(otPlatRadioGetPreferredChannelMask(GetInstancePtr())));
1278*cfb92d14SAndroid Build Coastguard Worker     }
1279*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE
1280*cfb92d14SAndroid Build Coastguard Worker     /**
1281*cfb92d14SAndroid Build Coastguard Worker      * @cli channel monitor
1282*cfb92d14SAndroid Build Coastguard Worker      * @code
1283*cfb92d14SAndroid Build Coastguard Worker      * channel monitor
1284*cfb92d14SAndroid Build Coastguard Worker      * enabled: 1
1285*cfb92d14SAndroid Build Coastguard Worker      * interval: 41000
1286*cfb92d14SAndroid Build Coastguard Worker      * threshold: -75
1287*cfb92d14SAndroid Build Coastguard Worker      * window: 960
1288*cfb92d14SAndroid Build Coastguard Worker      * count: 10552
1289*cfb92d14SAndroid Build Coastguard Worker      * occupancies:
1290*cfb92d14SAndroid Build Coastguard Worker      * ch 11 (0x0cb7)  4.96% busy
1291*cfb92d14SAndroid Build Coastguard Worker      * ch 12 (0x2e2b) 18.03% busy
1292*cfb92d14SAndroid Build Coastguard Worker      * ch 13 (0x2f54) 18.48% busy
1293*cfb92d14SAndroid Build Coastguard Worker      * ch 14 (0x0fef)  6.22% busy
1294*cfb92d14SAndroid Build Coastguard Worker      * ch 15 (0x1536)  8.28% busy
1295*cfb92d14SAndroid Build Coastguard Worker      * ch 16 (0x1746)  9.09% busy
1296*cfb92d14SAndroid Build Coastguard Worker      * ch 17 (0x0b8b)  4.50% busy
1297*cfb92d14SAndroid Build Coastguard Worker      * ch 18 (0x60a7) 37.75% busy
1298*cfb92d14SAndroid Build Coastguard Worker      * ch 19 (0x0810)  3.14% busy
1299*cfb92d14SAndroid Build Coastguard Worker      * ch 20 (0x0c2a)  4.75% busy
1300*cfb92d14SAndroid Build Coastguard Worker      * ch 21 (0x08dc)  3.46% busy
1301*cfb92d14SAndroid Build Coastguard Worker      * ch 22 (0x101d)  6.29% busy
1302*cfb92d14SAndroid Build Coastguard Worker      * ch 23 (0x0092)  0.22% busy
1303*cfb92d14SAndroid Build Coastguard Worker      * ch 24 (0x0028)  0.06% busy
1304*cfb92d14SAndroid Build Coastguard Worker      * ch 25 (0x0063)  0.15% busy
1305*cfb92d14SAndroid Build Coastguard Worker      * ch 26 (0x058c)  2.16% busy
1306*cfb92d14SAndroid Build Coastguard Worker      * Done
1307*cfb92d14SAndroid Build Coastguard Worker      * @endcode
1308*cfb92d14SAndroid Build Coastguard Worker      * @par
1309*cfb92d14SAndroid Build Coastguard Worker      * Get the current channel monitor state and channel occupancy.
1310*cfb92d14SAndroid Build Coastguard Worker      * `OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE` is required.
1311*cfb92d14SAndroid Build Coastguard Worker      */
1312*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "monitor")
1313*cfb92d14SAndroid Build Coastguard Worker     {
1314*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1].IsEmpty())
1315*cfb92d14SAndroid Build Coastguard Worker         {
1316*cfb92d14SAndroid Build Coastguard Worker             OutputLine("enabled: %d", otChannelMonitorIsEnabled(GetInstancePtr()));
1317*cfb92d14SAndroid Build Coastguard Worker             if (otChannelMonitorIsEnabled(GetInstancePtr()))
1318*cfb92d14SAndroid Build Coastguard Worker             {
1319*cfb92d14SAndroid Build Coastguard Worker                 uint32_t channelMask = otLinkGetSupportedChannelMask(GetInstancePtr());
1320*cfb92d14SAndroid Build Coastguard Worker                 uint8_t  channelNum  = BitSizeOf(channelMask);
1321*cfb92d14SAndroid Build Coastguard Worker 
1322*cfb92d14SAndroid Build Coastguard Worker                 OutputLine("interval: %lu", ToUlong(otChannelMonitorGetSampleInterval(GetInstancePtr())));
1323*cfb92d14SAndroid Build Coastguard Worker                 OutputLine("threshold: %d", otChannelMonitorGetRssiThreshold(GetInstancePtr()));
1324*cfb92d14SAndroid Build Coastguard Worker                 OutputLine("window: %lu", ToUlong(otChannelMonitorGetSampleWindow(GetInstancePtr())));
1325*cfb92d14SAndroid Build Coastguard Worker                 OutputLine("count: %lu", ToUlong(otChannelMonitorGetSampleCount(GetInstancePtr())));
1326*cfb92d14SAndroid Build Coastguard Worker 
1327*cfb92d14SAndroid Build Coastguard Worker                 OutputLine("occupancies:");
1328*cfb92d14SAndroid Build Coastguard Worker 
1329*cfb92d14SAndroid Build Coastguard Worker                 for (uint8_t channel = 0; channel < channelNum; channel++)
1330*cfb92d14SAndroid Build Coastguard Worker                 {
1331*cfb92d14SAndroid Build Coastguard Worker                     uint16_t               occupancy;
1332*cfb92d14SAndroid Build Coastguard Worker                     PercentageStringBuffer stringBuffer;
1333*cfb92d14SAndroid Build Coastguard Worker 
1334*cfb92d14SAndroid Build Coastguard Worker                     if (!((1UL << channel) & channelMask))
1335*cfb92d14SAndroid Build Coastguard Worker                     {
1336*cfb92d14SAndroid Build Coastguard Worker                         continue;
1337*cfb92d14SAndroid Build Coastguard Worker                     }
1338*cfb92d14SAndroid Build Coastguard Worker 
1339*cfb92d14SAndroid Build Coastguard Worker                     occupancy = otChannelMonitorGetChannelOccupancy(GetInstancePtr(), channel);
1340*cfb92d14SAndroid Build Coastguard Worker 
1341*cfb92d14SAndroid Build Coastguard Worker                     OutputLine("ch %u (0x%04x) %6s%% busy", channel, occupancy,
1342*cfb92d14SAndroid Build Coastguard Worker                                PercentageToString(occupancy, stringBuffer));
1343*cfb92d14SAndroid Build Coastguard Worker                 }
1344*cfb92d14SAndroid Build Coastguard Worker 
1345*cfb92d14SAndroid Build Coastguard Worker                 OutputNewLine();
1346*cfb92d14SAndroid Build Coastguard Worker             }
1347*cfb92d14SAndroid Build Coastguard Worker         }
1348*cfb92d14SAndroid Build Coastguard Worker         /**
1349*cfb92d14SAndroid Build Coastguard Worker          * @cli channel monitor start
1350*cfb92d14SAndroid Build Coastguard Worker          * @code
1351*cfb92d14SAndroid Build Coastguard Worker          * channel monitor start
1352*cfb92d14SAndroid Build Coastguard Worker          * channel monitor start
1353*cfb92d14SAndroid Build Coastguard Worker          * Done
1354*cfb92d14SAndroid Build Coastguard Worker          * @endcode
1355*cfb92d14SAndroid Build Coastguard Worker          * @par
1356*cfb92d14SAndroid Build Coastguard Worker          * Start the channel monitor.
1357*cfb92d14SAndroid Build Coastguard Worker          * OT CLI sends a boolean value of `true` to #otChannelMonitorSetEnabled.
1358*cfb92d14SAndroid Build Coastguard Worker          * `OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE` is required.
1359*cfb92d14SAndroid Build Coastguard Worker          * @sa otChannelMonitorSetEnabled
1360*cfb92d14SAndroid Build Coastguard Worker          */
1361*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "start")
1362*cfb92d14SAndroid Build Coastguard Worker         {
1363*cfb92d14SAndroid Build Coastguard Worker             error = otChannelMonitorSetEnabled(GetInstancePtr(), true);
1364*cfb92d14SAndroid Build Coastguard Worker         }
1365*cfb92d14SAndroid Build Coastguard Worker         /**
1366*cfb92d14SAndroid Build Coastguard Worker          * @cli channel monitor stop
1367*cfb92d14SAndroid Build Coastguard Worker          * @code
1368*cfb92d14SAndroid Build Coastguard Worker          * channel monitor stop
1369*cfb92d14SAndroid Build Coastguard Worker          * channel monitor stop
1370*cfb92d14SAndroid Build Coastguard Worker          * Done
1371*cfb92d14SAndroid Build Coastguard Worker          * @endcode
1372*cfb92d14SAndroid Build Coastguard Worker          * @par
1373*cfb92d14SAndroid Build Coastguard Worker          * Stop the channel monitor.
1374*cfb92d14SAndroid Build Coastguard Worker          * OT CLI sends a boolean value of `false` to #otChannelMonitorSetEnabled.
1375*cfb92d14SAndroid Build Coastguard Worker          * `OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE` is required.
1376*cfb92d14SAndroid Build Coastguard Worker          * @sa otChannelMonitorSetEnabled
1377*cfb92d14SAndroid Build Coastguard Worker          */
1378*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "stop")
1379*cfb92d14SAndroid Build Coastguard Worker         {
1380*cfb92d14SAndroid Build Coastguard Worker             error = otChannelMonitorSetEnabled(GetInstancePtr(), false);
1381*cfb92d14SAndroid Build Coastguard Worker         }
1382*cfb92d14SAndroid Build Coastguard Worker         else
1383*cfb92d14SAndroid Build Coastguard Worker         {
1384*cfb92d14SAndroid Build Coastguard Worker             ExitNow(error = OT_ERROR_INVALID_ARGS);
1385*cfb92d14SAndroid Build Coastguard Worker         }
1386*cfb92d14SAndroid Build Coastguard Worker     }
1387*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE
1388*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE && \
1389*cfb92d14SAndroid Build Coastguard Worker     (OPENTHREAD_FTD || OPENTHREAD_CONFIG_CHANNEL_MANAGER_CSL_CHANNEL_SELECT_ENABLE)
1390*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "manager")
1391*cfb92d14SAndroid Build Coastguard Worker     {
1392*cfb92d14SAndroid Build Coastguard Worker         /**
1393*cfb92d14SAndroid Build Coastguard Worker          * @cli channel manager
1394*cfb92d14SAndroid Build Coastguard Worker          * @code
1395*cfb92d14SAndroid Build Coastguard Worker          * channel manager
1396*cfb92d14SAndroid Build Coastguard Worker          * channel: 11
1397*cfb92d14SAndroid Build Coastguard Worker          * auto: 1
1398*cfb92d14SAndroid Build Coastguard Worker          * delay: 120
1399*cfb92d14SAndroid Build Coastguard Worker          * interval: 10800
1400*cfb92d14SAndroid Build Coastguard Worker          * supported: { 11-26}
1401*cfb92d14SAndroid Build Coastguard Worker          * favored: { 11-26}
1402*cfb92d14SAndroid Build Coastguard Worker          * Done
1403*cfb92d14SAndroid Build Coastguard Worker          * @endcode
1404*cfb92d14SAndroid Build Coastguard Worker          * @par
1405*cfb92d14SAndroid Build Coastguard Worker          * Get the channel manager state.
1406*cfb92d14SAndroid Build Coastguard Worker          * `OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE` or `OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE &&
1407*cfb92d14SAndroid Build Coastguard Worker          * OPENTHREAD_CONFIG_CHANNEL_MANAGER_CSL_CHANNEL_SELECT_ENABLE` is required.
1408*cfb92d14SAndroid Build Coastguard Worker          * @sa otChannelManagerGetRequestedChannel
1409*cfb92d14SAndroid Build Coastguard Worker          */
1410*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1].IsEmpty())
1411*cfb92d14SAndroid Build Coastguard Worker         {
1412*cfb92d14SAndroid Build Coastguard Worker             OutputLine("channel: %u", otChannelManagerGetRequestedChannel(GetInstancePtr()));
1413*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
1414*cfb92d14SAndroid Build Coastguard Worker             OutputLine("auto: %d", otChannelManagerGetAutoChannelSelectionEnabled(GetInstancePtr()));
1415*cfb92d14SAndroid Build Coastguard Worker #endif
1416*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_CHANNEL_MANAGER_CSL_CHANNEL_SELECT_ENABLE
1417*cfb92d14SAndroid Build Coastguard Worker             OutputLine("autocsl: %u", otChannelManagerGetAutoCslChannelSelectionEnabled(GetInstancePtr()));
1418*cfb92d14SAndroid Build Coastguard Worker #endif
1419*cfb92d14SAndroid Build Coastguard Worker 
1420*cfb92d14SAndroid Build Coastguard Worker #if (OPENTHREAD_FTD && OPENTHREAD_CONFIG_CHANNEL_MANAGER_CSL_CHANNEL_SELECT_ENABLE)
1421*cfb92d14SAndroid Build Coastguard Worker             if (otChannelManagerGetAutoChannelSelectionEnabled(GetInstancePtr()) ||
1422*cfb92d14SAndroid Build Coastguard Worker                 otChannelManagerGetAutoCslChannelSelectionEnabled(GetInstancePtr()))
1423*cfb92d14SAndroid Build Coastguard Worker #elif OPENTHREAD_FTD
1424*cfb92d14SAndroid Build Coastguard Worker             if (otChannelManagerGetAutoChannelSelectionEnabled(GetInstancePtr()))
1425*cfb92d14SAndroid Build Coastguard Worker #elif OPENTHREAD_CONFIG_CHANNEL_MANAGER_CSL_CHANNEL_SELECT_ENABLE
1426*cfb92d14SAndroid Build Coastguard Worker             if (otChannelManagerGetAutoCslChannelSelectionEnabled(GetInstancePtr()))
1427*cfb92d14SAndroid Build Coastguard Worker #endif
1428*cfb92d14SAndroid Build Coastguard Worker             {
1429*cfb92d14SAndroid Build Coastguard Worker                 Mac::ChannelMask supportedMask(otChannelManagerGetSupportedChannels(GetInstancePtr()));
1430*cfb92d14SAndroid Build Coastguard Worker                 Mac::ChannelMask favoredMask(otChannelManagerGetFavoredChannels(GetInstancePtr()));
1431*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
1432*cfb92d14SAndroid Build Coastguard Worker                 OutputLine("delay: %u", otChannelManagerGetDelay(GetInstancePtr()));
1433*cfb92d14SAndroid Build Coastguard Worker #endif
1434*cfb92d14SAndroid Build Coastguard Worker                 OutputLine("interval: %lu", ToUlong(otChannelManagerGetAutoChannelSelectionInterval(GetInstancePtr())));
1435*cfb92d14SAndroid Build Coastguard Worker                 OutputLine("cca threshold: 0x%04x", otChannelManagerGetCcaFailureRateThreshold(GetInstancePtr()));
1436*cfb92d14SAndroid Build Coastguard Worker                 OutputLine("supported: %s", supportedMask.ToString().AsCString());
1437*cfb92d14SAndroid Build Coastguard Worker                 OutputLine("favored: %s", favoredMask.ToString().AsCString());
1438*cfb92d14SAndroid Build Coastguard Worker             }
1439*cfb92d14SAndroid Build Coastguard Worker         }
1440*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
1441*cfb92d14SAndroid Build Coastguard Worker         /**
1442*cfb92d14SAndroid Build Coastguard Worker          * @cli channel manager change
1443*cfb92d14SAndroid Build Coastguard Worker          * @code
1444*cfb92d14SAndroid Build Coastguard Worker          * channel manager change 11
1445*cfb92d14SAndroid Build Coastguard Worker          * channel manager change 11
1446*cfb92d14SAndroid Build Coastguard Worker          * Done
1447*cfb92d14SAndroid Build Coastguard Worker          * @endcode
1448*cfb92d14SAndroid Build Coastguard Worker          * @cparam channel manager change @ca{channel-num}
1449*cfb92d14SAndroid Build Coastguard Worker          * @par
1450*cfb92d14SAndroid Build Coastguard Worker          * `OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE` is required.
1451*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
1452*cfb92d14SAndroid Build Coastguard Worker          * #otChannelManagerRequestChannelChange
1453*cfb92d14SAndroid Build Coastguard Worker          */
1454*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "change")
1455*cfb92d14SAndroid Build Coastguard Worker         {
1456*cfb92d14SAndroid Build Coastguard Worker             error = ProcessSet(aArgs + 2, otChannelManagerRequestChannelChange);
1457*cfb92d14SAndroid Build Coastguard Worker         }
1458*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE
1459*cfb92d14SAndroid Build Coastguard Worker         /**
1460*cfb92d14SAndroid Build Coastguard Worker          * @cli channel manager select
1461*cfb92d14SAndroid Build Coastguard Worker          * @code
1462*cfb92d14SAndroid Build Coastguard Worker          * channel manager select 1
1463*cfb92d14SAndroid Build Coastguard Worker          * channel manager select 1
1464*cfb92d14SAndroid Build Coastguard Worker          * Done
1465*cfb92d14SAndroid Build Coastguard Worker          * @endcode
1466*cfb92d14SAndroid Build Coastguard Worker          * @cparam channel manager select @ca{skip-quality-check}
1467*cfb92d14SAndroid Build Coastguard Worker          * Use a `1` or `0` for the boolean `skip-quality-check`.
1468*cfb92d14SAndroid Build Coastguard Worker          * @par
1469*cfb92d14SAndroid Build Coastguard Worker          * `OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE` or `OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE &&
1470*cfb92d14SAndroid Build Coastguard Worker          * OPENTHREAD_CONFIG_CHANNEL_MANAGER_CSL_CHANNEL_SELECT_ENABLE`, and `OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE`
1471*cfb92d14SAndroid Build Coastguard Worker          * are required.
1472*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
1473*cfb92d14SAndroid Build Coastguard Worker          * #otChannelManagerRequestChannelSelect
1474*cfb92d14SAndroid Build Coastguard Worker          */
1475*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "select")
1476*cfb92d14SAndroid Build Coastguard Worker         {
1477*cfb92d14SAndroid Build Coastguard Worker             bool enable;
1478*cfb92d14SAndroid Build Coastguard Worker 
1479*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = aArgs[2].ParseAsBool(enable));
1480*cfb92d14SAndroid Build Coastguard Worker             error = otChannelManagerRequestChannelSelect(GetInstancePtr(), enable);
1481*cfb92d14SAndroid Build Coastguard Worker         }
1482*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE
1483*cfb92d14SAndroid Build Coastguard Worker         /**
1484*cfb92d14SAndroid Build Coastguard Worker          * @cli channel manager auto
1485*cfb92d14SAndroid Build Coastguard Worker          * @code
1486*cfb92d14SAndroid Build Coastguard Worker          * channel manager auto 1
1487*cfb92d14SAndroid Build Coastguard Worker          * channel manager auto 1
1488*cfb92d14SAndroid Build Coastguard Worker          * Done
1489*cfb92d14SAndroid Build Coastguard Worker          * @endcode
1490*cfb92d14SAndroid Build Coastguard Worker          * @cparam channel manager auto @ca{enable}
1491*cfb92d14SAndroid Build Coastguard Worker          * `1` is a boolean to `enable`.
1492*cfb92d14SAndroid Build Coastguard Worker          * @par
1493*cfb92d14SAndroid Build Coastguard Worker          * `OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE` or `OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE &&
1494*cfb92d14SAndroid Build Coastguard Worker          * OPENTHREAD_CONFIG_CHANNEL_MANAGER_CSL_CHANNEL_SELECT_ENABLE`, and `OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE`
1495*cfb92d14SAndroid Build Coastguard Worker          * are required.
1496*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
1497*cfb92d14SAndroid Build Coastguard Worker          * #otChannelManagerSetAutoChannelSelectionEnabled
1498*cfb92d14SAndroid Build Coastguard Worker          */
1499*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "auto")
1500*cfb92d14SAndroid Build Coastguard Worker         {
1501*cfb92d14SAndroid Build Coastguard Worker             bool enable;
1502*cfb92d14SAndroid Build Coastguard Worker 
1503*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = aArgs[2].ParseAsBool(enable));
1504*cfb92d14SAndroid Build Coastguard Worker             otChannelManagerSetAutoChannelSelectionEnabled(GetInstancePtr(), enable);
1505*cfb92d14SAndroid Build Coastguard Worker         }
1506*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_FTD
1507*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_CHANNEL_MANAGER_CSL_CHANNEL_SELECT_ENABLE
1508*cfb92d14SAndroid Build Coastguard Worker         /**
1509*cfb92d14SAndroid Build Coastguard Worker          * @cli channel manager autocsl
1510*cfb92d14SAndroid Build Coastguard Worker          * @code
1511*cfb92d14SAndroid Build Coastguard Worker          * channel manager autocsl 1
1512*cfb92d14SAndroid Build Coastguard Worker          * Done
1513*cfb92d14SAndroid Build Coastguard Worker          * @endcode
1514*cfb92d14SAndroid Build Coastguard Worker          * @cparam channel manager autocsl @ca{enable}
1515*cfb92d14SAndroid Build Coastguard Worker          * `1` is a boolean to `enable`.
1516*cfb92d14SAndroid Build Coastguard Worker          * @par
1517*cfb92d14SAndroid Build Coastguard Worker          * Enables or disables the auto channel selection functionality for a CSL channel.
1518*cfb92d14SAndroid Build Coastguard Worker          * `OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE` or `OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE &&
1519*cfb92d14SAndroid Build Coastguard Worker          * OPENTHREAD_CONFIG_CHANNEL_MANAGER_CSL_CHANNEL_SELECT_ENABLE`, and `OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE`
1520*cfb92d14SAndroid Build Coastguard Worker          * are required.
1521*cfb92d14SAndroid Build Coastguard Worker          * @sa otChannelManagerSetAutoCslChannelSelectionEnabled
1522*cfb92d14SAndroid Build Coastguard Worker          */
1523*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "autocsl")
1524*cfb92d14SAndroid Build Coastguard Worker         {
1525*cfb92d14SAndroid Build Coastguard Worker             bool enable;
1526*cfb92d14SAndroid Build Coastguard Worker 
1527*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = aArgs[2].ParseAsBool(enable));
1528*cfb92d14SAndroid Build Coastguard Worker             otChannelManagerSetAutoCslChannelSelectionEnabled(GetInstancePtr(), enable);
1529*cfb92d14SAndroid Build Coastguard Worker         }
1530*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_CHANNEL_MANAGER_CSL_CHANNEL_SELECT_ENABLE
1531*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
1532*cfb92d14SAndroid Build Coastguard Worker         /**
1533*cfb92d14SAndroid Build Coastguard Worker          * @cli channel manager delay
1534*cfb92d14SAndroid Build Coastguard Worker          * @code
1535*cfb92d14SAndroid Build Coastguard Worker          * channel manager delay 120
1536*cfb92d14SAndroid Build Coastguard Worker          * channel manager delay 120
1537*cfb92d14SAndroid Build Coastguard Worker          * Done
1538*cfb92d14SAndroid Build Coastguard Worker          * @endcode
1539*cfb92d14SAndroid Build Coastguard Worker          * @cparam channel manager delay @ca{delay-seconds}
1540*cfb92d14SAndroid Build Coastguard Worker          * @par
1541*cfb92d14SAndroid Build Coastguard Worker          * `OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE` and `OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE` are required.
1542*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
1543*cfb92d14SAndroid Build Coastguard Worker          * #otChannelManagerSetDelay
1544*cfb92d14SAndroid Build Coastguard Worker          */
1545*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "delay")
1546*cfb92d14SAndroid Build Coastguard Worker         {
1547*cfb92d14SAndroid Build Coastguard Worker             error = ProcessGetSet(aArgs + 2, otChannelManagerGetDelay, otChannelManagerSetDelay);
1548*cfb92d14SAndroid Build Coastguard Worker         }
1549*cfb92d14SAndroid Build Coastguard Worker #endif
1550*cfb92d14SAndroid Build Coastguard Worker         /**
1551*cfb92d14SAndroid Build Coastguard Worker          * @cli channel manager interval
1552*cfb92d14SAndroid Build Coastguard Worker          * @code
1553*cfb92d14SAndroid Build Coastguard Worker          * channel manager interval 10800
1554*cfb92d14SAndroid Build Coastguard Worker          * channel manager interval 10800
1555*cfb92d14SAndroid Build Coastguard Worker          * Done
1556*cfb92d14SAndroid Build Coastguard Worker          * @endcode
1557*cfb92d14SAndroid Build Coastguard Worker          * @cparam channel manager interval @ca{interval-seconds}
1558*cfb92d14SAndroid Build Coastguard Worker          * @par
1559*cfb92d14SAndroid Build Coastguard Worker          * `OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE` or `OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE &&
1560*cfb92d14SAndroid Build Coastguard Worker          * OPENTHREAD_CONFIG_CHANNEL_MANAGER_CSL_CHANNEL_SELECT_ENABLE`, and `OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE`
1561*cfb92d14SAndroid Build Coastguard Worker          * are required.
1562*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
1563*cfb92d14SAndroid Build Coastguard Worker          * #otChannelManagerSetAutoChannelSelectionInterval
1564*cfb92d14SAndroid Build Coastguard Worker          */
1565*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "interval")
1566*cfb92d14SAndroid Build Coastguard Worker         {
1567*cfb92d14SAndroid Build Coastguard Worker             error = ProcessSet(aArgs + 2, otChannelManagerSetAutoChannelSelectionInterval);
1568*cfb92d14SAndroid Build Coastguard Worker         }
1569*cfb92d14SAndroid Build Coastguard Worker         /**
1570*cfb92d14SAndroid Build Coastguard Worker          * @cli channel manager supported
1571*cfb92d14SAndroid Build Coastguard Worker          * @code
1572*cfb92d14SAndroid Build Coastguard Worker          * channel manager supported 0x7fffc00
1573*cfb92d14SAndroid Build Coastguard Worker          * channel manager supported 0x7fffc00
1574*cfb92d14SAndroid Build Coastguard Worker          * Done
1575*cfb92d14SAndroid Build Coastguard Worker          * @endcode
1576*cfb92d14SAndroid Build Coastguard Worker          * @cparam channel manager supported @ca{mask}
1577*cfb92d14SAndroid Build Coastguard Worker          * @par
1578*cfb92d14SAndroid Build Coastguard Worker          * `OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE` or `OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE &&
1579*cfb92d14SAndroid Build Coastguard Worker          * OPENTHREAD_CONFIG_CHANNEL_MANAGER_CSL_CHANNEL_SELECT_ENABLE`, and `OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE`
1580*cfb92d14SAndroid Build Coastguard Worker          * are required.
1581*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
1582*cfb92d14SAndroid Build Coastguard Worker          * #otChannelManagerSetSupportedChannels
1583*cfb92d14SAndroid Build Coastguard Worker          */
1584*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "supported")
1585*cfb92d14SAndroid Build Coastguard Worker         {
1586*cfb92d14SAndroid Build Coastguard Worker             error = ProcessSet(aArgs + 2, otChannelManagerSetSupportedChannels);
1587*cfb92d14SAndroid Build Coastguard Worker         }
1588*cfb92d14SAndroid Build Coastguard Worker         /**
1589*cfb92d14SAndroid Build Coastguard Worker          * @cli channel manager favored
1590*cfb92d14SAndroid Build Coastguard Worker          * @code
1591*cfb92d14SAndroid Build Coastguard Worker          * channel manager favored 0x7fffc00
1592*cfb92d14SAndroid Build Coastguard Worker          * channel manager favored 0x7fffc00
1593*cfb92d14SAndroid Build Coastguard Worker          * Done
1594*cfb92d14SAndroid Build Coastguard Worker          * @endcode
1595*cfb92d14SAndroid Build Coastguard Worker          * @cparam channel manager favored @ca{mask}
1596*cfb92d14SAndroid Build Coastguard Worker          * @par
1597*cfb92d14SAndroid Build Coastguard Worker          * `OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE` or `OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE &&
1598*cfb92d14SAndroid Build Coastguard Worker          * OPENTHREAD_CONFIG_CHANNEL_MANAGER_CSL_CHANNEL_SELECT_ENABLE`, and `OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE`
1599*cfb92d14SAndroid Build Coastguard Worker          * are required.
1600*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
1601*cfb92d14SAndroid Build Coastguard Worker          * #otChannelManagerSetFavoredChannels
1602*cfb92d14SAndroid Build Coastguard Worker          */
1603*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "favored")
1604*cfb92d14SAndroid Build Coastguard Worker         {
1605*cfb92d14SAndroid Build Coastguard Worker             error = ProcessSet(aArgs + 2, otChannelManagerSetFavoredChannels);
1606*cfb92d14SAndroid Build Coastguard Worker         }
1607*cfb92d14SAndroid Build Coastguard Worker         /**
1608*cfb92d14SAndroid Build Coastguard Worker          * @cli channel manager threshold
1609*cfb92d14SAndroid Build Coastguard Worker          * @code
1610*cfb92d14SAndroid Build Coastguard Worker          * channel manager threshold 0xffff
1611*cfb92d14SAndroid Build Coastguard Worker          * channel manager threshold 0xffff
1612*cfb92d14SAndroid Build Coastguard Worker          * Done
1613*cfb92d14SAndroid Build Coastguard Worker          * @endcode
1614*cfb92d14SAndroid Build Coastguard Worker          * @cparam channel manager threshold @ca{threshold-percent}
1615*cfb92d14SAndroid Build Coastguard Worker          * Use a hex value for `threshold-percent`. `0` maps to 0% and `0xffff` maps to 100%.
1616*cfb92d14SAndroid Build Coastguard Worker          * @par
1617*cfb92d14SAndroid Build Coastguard Worker          * `OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE` or `OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE &&
1618*cfb92d14SAndroid Build Coastguard Worker          * OPENTHREAD_CONFIG_CHANNEL_MANAGER_CSL_CHANNEL_SELECT_ENABLE`, and `OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE`
1619*cfb92d14SAndroid Build Coastguard Worker          * are required.
1620*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
1621*cfb92d14SAndroid Build Coastguard Worker          * #otChannelManagerSetCcaFailureRateThreshold
1622*cfb92d14SAndroid Build Coastguard Worker          */
1623*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "threshold")
1624*cfb92d14SAndroid Build Coastguard Worker         {
1625*cfb92d14SAndroid Build Coastguard Worker             error = ProcessSet(aArgs + 2, otChannelManagerSetCcaFailureRateThreshold);
1626*cfb92d14SAndroid Build Coastguard Worker         }
1627*cfb92d14SAndroid Build Coastguard Worker         else
1628*cfb92d14SAndroid Build Coastguard Worker         {
1629*cfb92d14SAndroid Build Coastguard Worker             ExitNow(error = OT_ERROR_INVALID_ARGS);
1630*cfb92d14SAndroid Build Coastguard Worker         }
1631*cfb92d14SAndroid Build Coastguard Worker     }
1632*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE && OPENTHREAD_FTD
1633*cfb92d14SAndroid Build Coastguard Worker     else
1634*cfb92d14SAndroid Build Coastguard Worker     {
1635*cfb92d14SAndroid Build Coastguard Worker         ExitNow(error = ProcessGetSet(aArgs, otLinkGetChannel, otLinkSetChannel));
1636*cfb92d14SAndroid Build Coastguard Worker     }
1637*cfb92d14SAndroid Build Coastguard Worker 
1638*cfb92d14SAndroid Build Coastguard Worker exit:
1639*cfb92d14SAndroid Build Coastguard Worker     return error;
1640*cfb92d14SAndroid Build Coastguard Worker }
1641*cfb92d14SAndroid Build Coastguard Worker 
1642*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
Process(Arg aArgs[])1643*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("child")>(Arg aArgs[])
1644*cfb92d14SAndroid Build Coastguard Worker {
1645*cfb92d14SAndroid Build Coastguard Worker     otError          error = OT_ERROR_NONE;
1646*cfb92d14SAndroid Build Coastguard Worker     otChildInfo      childInfo;
1647*cfb92d14SAndroid Build Coastguard Worker     uint16_t         childId;
1648*cfb92d14SAndroid Build Coastguard Worker     bool             isTable;
1649*cfb92d14SAndroid Build Coastguard Worker     otLinkModeConfig linkMode;
1650*cfb92d14SAndroid Build Coastguard Worker     char             linkModeString[kLinkModeStringSize];
1651*cfb92d14SAndroid Build Coastguard Worker 
1652*cfb92d14SAndroid Build Coastguard Worker     isTable = (aArgs[0] == "table");
1653*cfb92d14SAndroid Build Coastguard Worker 
1654*cfb92d14SAndroid Build Coastguard Worker     if (isTable || (aArgs[0] == "list"))
1655*cfb92d14SAndroid Build Coastguard Worker     {
1656*cfb92d14SAndroid Build Coastguard Worker         uint16_t maxChildren;
1657*cfb92d14SAndroid Build Coastguard Worker 
1658*cfb92d14SAndroid Build Coastguard Worker         /**
1659*cfb92d14SAndroid Build Coastguard Worker          * @cli child table
1660*cfb92d14SAndroid Build Coastguard Worker          * @code
1661*cfb92d14SAndroid Build Coastguard Worker          * child table
1662*cfb92d14SAndroid Build Coastguard Worker          * | ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|D|N|Ver|CSL|QMsgCnt| Extended MAC     |
1663*cfb92d14SAndroid Build Coastguard Worker          * +-----+--------+------------+------------+-------+------+-+-+-+---+---+-------+------------------+
1664*cfb92d14SAndroid Build Coastguard Worker          * |   1 | 0xc801 |        240 |         24 |     3 |  131 |1|0|0|  3| 0 |     0 | 4ecede68435358ac |
1665*cfb92d14SAndroid Build Coastguard Worker          * |   2 | 0xc802 |        240 |          2 |     3 |  131 |0|0|0|  3| 1 |     0 | a672a601d2ce37d8 |
1666*cfb92d14SAndroid Build Coastguard Worker          * Done
1667*cfb92d14SAndroid Build Coastguard Worker          * @endcode
1668*cfb92d14SAndroid Build Coastguard Worker          * @par
1669*cfb92d14SAndroid Build Coastguard Worker          * Prints a table of the attached children.
1670*cfb92d14SAndroid Build Coastguard Worker          * @sa otThreadGetChildInfoByIndex
1671*cfb92d14SAndroid Build Coastguard Worker          */
1672*cfb92d14SAndroid Build Coastguard Worker         if (isTable)
1673*cfb92d14SAndroid Build Coastguard Worker         {
1674*cfb92d14SAndroid Build Coastguard Worker             static const char *const kChildTableTitles[] = {
1675*cfb92d14SAndroid Build Coastguard Worker                 "ID", "RLOC16", "Timeout", "Age", "LQ In",   "C_VN",    "R",
1676*cfb92d14SAndroid Build Coastguard Worker                 "D",  "N",      "Ver",     "CSL", "QMsgCnt", "Suprvsn", "Extended MAC",
1677*cfb92d14SAndroid Build Coastguard Worker             };
1678*cfb92d14SAndroid Build Coastguard Worker 
1679*cfb92d14SAndroid Build Coastguard Worker             static const uint8_t kChildTableColumnWidths[] = {
1680*cfb92d14SAndroid Build Coastguard Worker                 5, 8, 12, 12, 7, 6, 1, 1, 1, 3, 3, 7, 7, 18,
1681*cfb92d14SAndroid Build Coastguard Worker             };
1682*cfb92d14SAndroid Build Coastguard Worker 
1683*cfb92d14SAndroid Build Coastguard Worker             OutputTableHeader(kChildTableTitles, kChildTableColumnWidths);
1684*cfb92d14SAndroid Build Coastguard Worker         }
1685*cfb92d14SAndroid Build Coastguard Worker 
1686*cfb92d14SAndroid Build Coastguard Worker         maxChildren = otThreadGetMaxAllowedChildren(GetInstancePtr());
1687*cfb92d14SAndroid Build Coastguard Worker 
1688*cfb92d14SAndroid Build Coastguard Worker         for (uint16_t i = 0; i < maxChildren; i++)
1689*cfb92d14SAndroid Build Coastguard Worker         {
1690*cfb92d14SAndroid Build Coastguard Worker             if ((otThreadGetChildInfoByIndex(GetInstancePtr(), i, &childInfo) != OT_ERROR_NONE) ||
1691*cfb92d14SAndroid Build Coastguard Worker                 childInfo.mIsStateRestoring)
1692*cfb92d14SAndroid Build Coastguard Worker             {
1693*cfb92d14SAndroid Build Coastguard Worker                 continue;
1694*cfb92d14SAndroid Build Coastguard Worker             }
1695*cfb92d14SAndroid Build Coastguard Worker 
1696*cfb92d14SAndroid Build Coastguard Worker             if (isTable)
1697*cfb92d14SAndroid Build Coastguard Worker             {
1698*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %3u ", childInfo.mChildId);
1699*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| 0x%04x ", childInfo.mRloc16);
1700*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %10lu ", ToUlong(childInfo.mTimeout));
1701*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %10lu ", ToUlong(childInfo.mAge));
1702*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %5u ", childInfo.mLinkQualityIn);
1703*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %4u ", childInfo.mNetworkDataVersion);
1704*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("|%1d", childInfo.mRxOnWhenIdle);
1705*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("|%1d", childInfo.mFullThreadDevice);
1706*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("|%1d", childInfo.mFullNetworkData);
1707*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("|%3u", childInfo.mVersion);
1708*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %1d ", childInfo.mIsCslSynced);
1709*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %5u ", childInfo.mQueuedMessageCnt);
1710*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %5u ", childInfo.mSupervisionInterval);
1711*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| ");
1712*cfb92d14SAndroid Build Coastguard Worker                 OutputExtAddress(childInfo.mExtAddress);
1713*cfb92d14SAndroid Build Coastguard Worker                 OutputLine(" |");
1714*cfb92d14SAndroid Build Coastguard Worker             }
1715*cfb92d14SAndroid Build Coastguard Worker             /**
1716*cfb92d14SAndroid Build Coastguard Worker              * @cli child list
1717*cfb92d14SAndroid Build Coastguard Worker              * @code
1718*cfb92d14SAndroid Build Coastguard Worker              * child list
1719*cfb92d14SAndroid Build Coastguard Worker              * 1 2 3 6 7 8
1720*cfb92d14SAndroid Build Coastguard Worker              * Done
1721*cfb92d14SAndroid Build Coastguard Worker              * @endcode
1722*cfb92d14SAndroid Build Coastguard Worker              * @par
1723*cfb92d14SAndroid Build Coastguard Worker              * Returns a list of attached Child IDs.
1724*cfb92d14SAndroid Build Coastguard Worker              * @sa otThreadGetChildInfoByIndex
1725*cfb92d14SAndroid Build Coastguard Worker              */
1726*cfb92d14SAndroid Build Coastguard Worker             else
1727*cfb92d14SAndroid Build Coastguard Worker             {
1728*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("%u ", childInfo.mChildId);
1729*cfb92d14SAndroid Build Coastguard Worker             }
1730*cfb92d14SAndroid Build Coastguard Worker         }
1731*cfb92d14SAndroid Build Coastguard Worker 
1732*cfb92d14SAndroid Build Coastguard Worker         OutputNewLine();
1733*cfb92d14SAndroid Build Coastguard Worker         ExitNow();
1734*cfb92d14SAndroid Build Coastguard Worker     }
1735*cfb92d14SAndroid Build Coastguard Worker 
1736*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = aArgs[0].ParseAsUint16(childId));
1737*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = otThreadGetChildInfoById(GetInstancePtr(), childId, &childInfo));
1738*cfb92d14SAndroid Build Coastguard Worker 
1739*cfb92d14SAndroid Build Coastguard Worker     /**
1740*cfb92d14SAndroid Build Coastguard Worker      * @cli child (id)
1741*cfb92d14SAndroid Build Coastguard Worker      * @code
1742*cfb92d14SAndroid Build Coastguard Worker      * child 1
1743*cfb92d14SAndroid Build Coastguard Worker      * Child ID: 1
1744*cfb92d14SAndroid Build Coastguard Worker      * Rloc: 9c01
1745*cfb92d14SAndroid Build Coastguard Worker      * Ext Addr: e2b3540590b0fd87
1746*cfb92d14SAndroid Build Coastguard Worker      * Mode: rn
1747*cfb92d14SAndroid Build Coastguard Worker      * CSL Synchronized: 1
1748*cfb92d14SAndroid Build Coastguard Worker      * Net Data: 184
1749*cfb92d14SAndroid Build Coastguard Worker      * Timeout: 100
1750*cfb92d14SAndroid Build Coastguard Worker      * Age: 0
1751*cfb92d14SAndroid Build Coastguard Worker      * Link Quality In: 3
1752*cfb92d14SAndroid Build Coastguard Worker      * RSSI: -20
1753*cfb92d14SAndroid Build Coastguard Worker      * Done
1754*cfb92d14SAndroid Build Coastguard Worker      * @endcode
1755*cfb92d14SAndroid Build Coastguard Worker      * @cparam child @ca{child-id}
1756*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
1757*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetChildInfoById
1758*cfb92d14SAndroid Build Coastguard Worker      */
1759*cfb92d14SAndroid Build Coastguard Worker     OutputLine("Child ID: %u", childInfo.mChildId);
1760*cfb92d14SAndroid Build Coastguard Worker     OutputLine("Rloc: %04x", childInfo.mRloc16);
1761*cfb92d14SAndroid Build Coastguard Worker     OutputFormat("Ext Addr: ");
1762*cfb92d14SAndroid Build Coastguard Worker     OutputExtAddressLine(childInfo.mExtAddress);
1763*cfb92d14SAndroid Build Coastguard Worker     linkMode.mRxOnWhenIdle = childInfo.mRxOnWhenIdle;
1764*cfb92d14SAndroid Build Coastguard Worker     linkMode.mDeviceType   = childInfo.mFullThreadDevice;
1765*cfb92d14SAndroid Build Coastguard Worker     linkMode.mNetworkData  = childInfo.mFullThreadDevice;
1766*cfb92d14SAndroid Build Coastguard Worker     OutputLine("Mode: %s", LinkModeToString(linkMode, linkModeString));
1767*cfb92d14SAndroid Build Coastguard Worker     OutputLine("CSL Synchronized: %d ", childInfo.mIsCslSynced);
1768*cfb92d14SAndroid Build Coastguard Worker     OutputLine("Net Data: %u", childInfo.mNetworkDataVersion);
1769*cfb92d14SAndroid Build Coastguard Worker     OutputLine("Timeout: %lu", ToUlong(childInfo.mTimeout));
1770*cfb92d14SAndroid Build Coastguard Worker     OutputLine("Age: %lu", ToUlong(childInfo.mAge));
1771*cfb92d14SAndroid Build Coastguard Worker     OutputLine("Link Quality In: %u", childInfo.mLinkQualityIn);
1772*cfb92d14SAndroid Build Coastguard Worker     OutputLine("RSSI: %d", childInfo.mAverageRssi);
1773*cfb92d14SAndroid Build Coastguard Worker     OutputLine("Supervision Interval: %d", childInfo.mSupervisionInterval);
1774*cfb92d14SAndroid Build Coastguard Worker 
1775*cfb92d14SAndroid Build Coastguard Worker exit:
1776*cfb92d14SAndroid Build Coastguard Worker     return error;
1777*cfb92d14SAndroid Build Coastguard Worker }
1778*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])1779*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("childip")>(Arg aArgs[])
1780*cfb92d14SAndroid Build Coastguard Worker {
1781*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
1782*cfb92d14SAndroid Build Coastguard Worker 
1783*cfb92d14SAndroid Build Coastguard Worker     /**
1784*cfb92d14SAndroid Build Coastguard Worker      * @cli childip
1785*cfb92d14SAndroid Build Coastguard Worker      * @code
1786*cfb92d14SAndroid Build Coastguard Worker      * childip
1787*cfb92d14SAndroid Build Coastguard Worker      * 3401: fdde:ad00:beef:0:3037:3e03:8c5f:bc0c
1788*cfb92d14SAndroid Build Coastguard Worker      * Done
1789*cfb92d14SAndroid Build Coastguard Worker      * @endcode
1790*cfb92d14SAndroid Build Coastguard Worker      * @par
1791*cfb92d14SAndroid Build Coastguard Worker      * Gets a list of IP addresses stored for MTD children.
1792*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadGetChildNextIp6Address
1793*cfb92d14SAndroid Build Coastguard Worker      */
1794*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
1795*cfb92d14SAndroid Build Coastguard Worker     {
1796*cfb92d14SAndroid Build Coastguard Worker         uint16_t maxChildren = otThreadGetMaxAllowedChildren(GetInstancePtr());
1797*cfb92d14SAndroid Build Coastguard Worker 
1798*cfb92d14SAndroid Build Coastguard Worker         for (uint16_t childIndex = 0; childIndex < maxChildren; childIndex++)
1799*cfb92d14SAndroid Build Coastguard Worker         {
1800*cfb92d14SAndroid Build Coastguard Worker             otChildIp6AddressIterator iterator = OT_CHILD_IP6_ADDRESS_ITERATOR_INIT;
1801*cfb92d14SAndroid Build Coastguard Worker             otIp6Address              ip6Address;
1802*cfb92d14SAndroid Build Coastguard Worker             otChildInfo               childInfo;
1803*cfb92d14SAndroid Build Coastguard Worker 
1804*cfb92d14SAndroid Build Coastguard Worker             if ((otThreadGetChildInfoByIndex(GetInstancePtr(), childIndex, &childInfo) != OT_ERROR_NONE) ||
1805*cfb92d14SAndroid Build Coastguard Worker                 childInfo.mIsStateRestoring)
1806*cfb92d14SAndroid Build Coastguard Worker             {
1807*cfb92d14SAndroid Build Coastguard Worker                 continue;
1808*cfb92d14SAndroid Build Coastguard Worker             }
1809*cfb92d14SAndroid Build Coastguard Worker 
1810*cfb92d14SAndroid Build Coastguard Worker             iterator = OT_CHILD_IP6_ADDRESS_ITERATOR_INIT;
1811*cfb92d14SAndroid Build Coastguard Worker 
1812*cfb92d14SAndroid Build Coastguard Worker             while (otThreadGetChildNextIp6Address(GetInstancePtr(), childIndex, &iterator, &ip6Address) ==
1813*cfb92d14SAndroid Build Coastguard Worker                    OT_ERROR_NONE)
1814*cfb92d14SAndroid Build Coastguard Worker             {
1815*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("%04x: ", childInfo.mRloc16);
1816*cfb92d14SAndroid Build Coastguard Worker                 OutputIp6AddressLine(ip6Address);
1817*cfb92d14SAndroid Build Coastguard Worker             }
1818*cfb92d14SAndroid Build Coastguard Worker         }
1819*cfb92d14SAndroid Build Coastguard Worker     }
1820*cfb92d14SAndroid Build Coastguard Worker     /**
1821*cfb92d14SAndroid Build Coastguard Worker      * @cli childip max
1822*cfb92d14SAndroid Build Coastguard Worker      * @code
1823*cfb92d14SAndroid Build Coastguard Worker      * childip max
1824*cfb92d14SAndroid Build Coastguard Worker      * 4
1825*cfb92d14SAndroid Build Coastguard Worker      * Done
1826*cfb92d14SAndroid Build Coastguard Worker      * @endcode
1827*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
1828*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetMaxChildIpAddresses
1829*cfb92d14SAndroid Build Coastguard Worker      */
1830*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "max")
1831*cfb92d14SAndroid Build Coastguard Worker     {
1832*cfb92d14SAndroid Build Coastguard Worker #if !OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
1833*cfb92d14SAndroid Build Coastguard Worker         error = ProcessGet(aArgs + 1, otThreadGetMaxChildIpAddresses);
1834*cfb92d14SAndroid Build Coastguard Worker #else
1835*cfb92d14SAndroid Build Coastguard Worker         /**
1836*cfb92d14SAndroid Build Coastguard Worker          * @cli childip max (set)
1837*cfb92d14SAndroid Build Coastguard Worker          * @code
1838*cfb92d14SAndroid Build Coastguard Worker          * childip max 2
1839*cfb92d14SAndroid Build Coastguard Worker          * Done
1840*cfb92d14SAndroid Build Coastguard Worker          * @endcode
1841*cfb92d14SAndroid Build Coastguard Worker          * @cparam childip max @ca{count}
1842*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
1843*cfb92d14SAndroid Build Coastguard Worker          * #otThreadSetMaxChildIpAddresses
1844*cfb92d14SAndroid Build Coastguard Worker          */
1845*cfb92d14SAndroid Build Coastguard Worker         error = ProcessGetSet(aArgs + 1, otThreadGetMaxChildIpAddresses, otThreadSetMaxChildIpAddresses);
1846*cfb92d14SAndroid Build Coastguard Worker #endif
1847*cfb92d14SAndroid Build Coastguard Worker     }
1848*cfb92d14SAndroid Build Coastguard Worker     else
1849*cfb92d14SAndroid Build Coastguard Worker     {
1850*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_COMMAND;
1851*cfb92d14SAndroid Build Coastguard Worker     }
1852*cfb92d14SAndroid Build Coastguard Worker 
1853*cfb92d14SAndroid Build Coastguard Worker     return error;
1854*cfb92d14SAndroid Build Coastguard Worker }
1855*cfb92d14SAndroid Build Coastguard Worker 
1856*cfb92d14SAndroid Build Coastguard Worker /**
1857*cfb92d14SAndroid Build Coastguard Worker  * @cli childmax
1858*cfb92d14SAndroid Build Coastguard Worker  * @code
1859*cfb92d14SAndroid Build Coastguard Worker  * childmax
1860*cfb92d14SAndroid Build Coastguard Worker  * 5
1861*cfb92d14SAndroid Build Coastguard Worker  * Done
1862*cfb92d14SAndroid Build Coastguard Worker  * @endcode
1863*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
1864*cfb92d14SAndroid Build Coastguard Worker  * #otThreadGetMaxAllowedChildren
1865*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])1866*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("childmax")>(Arg aArgs[])
1867*cfb92d14SAndroid Build Coastguard Worker {
1868*cfb92d14SAndroid Build Coastguard Worker     /**
1869*cfb92d14SAndroid Build Coastguard Worker      * @cli childmax (set)
1870*cfb92d14SAndroid Build Coastguard Worker      * @code
1871*cfb92d14SAndroid Build Coastguard Worker      * childmax 2
1872*cfb92d14SAndroid Build Coastguard Worker      * Done
1873*cfb92d14SAndroid Build Coastguard Worker      * @endcode
1874*cfb92d14SAndroid Build Coastguard Worker      * @cparam childmax @ca{count}
1875*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
1876*cfb92d14SAndroid Build Coastguard Worker      * #otThreadSetMaxAllowedChildren
1877*cfb92d14SAndroid Build Coastguard Worker      */
1878*cfb92d14SAndroid Build Coastguard Worker     return ProcessGetSet(aArgs, otThreadGetMaxAllowedChildren, otThreadSetMaxAllowedChildren);
1879*cfb92d14SAndroid Build Coastguard Worker }
1880*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_FTD
1881*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])1882*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("childsupervision")>(Arg aArgs[])
1883*cfb92d14SAndroid Build Coastguard Worker {
1884*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_INVALID_ARGS;
1885*cfb92d14SAndroid Build Coastguard Worker 
1886*cfb92d14SAndroid Build Coastguard Worker     /**
1887*cfb92d14SAndroid Build Coastguard Worker      * @cli childsupervision checktimeout
1888*cfb92d14SAndroid Build Coastguard Worker      * @code
1889*cfb92d14SAndroid Build Coastguard Worker      * childsupervision checktimeout
1890*cfb92d14SAndroid Build Coastguard Worker      * 30
1891*cfb92d14SAndroid Build Coastguard Worker      * Done
1892*cfb92d14SAndroid Build Coastguard Worker      * @endcode
1893*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
1894*cfb92d14SAndroid Build Coastguard Worker      * #otChildSupervisionGetCheckTimeout
1895*cfb92d14SAndroid Build Coastguard Worker      */
1896*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "checktimeout")
1897*cfb92d14SAndroid Build Coastguard Worker     {
1898*cfb92d14SAndroid Build Coastguard Worker         /** @cli childsupervision checktimeout (set)
1899*cfb92d14SAndroid Build Coastguard Worker          * @code
1900*cfb92d14SAndroid Build Coastguard Worker          * childsupervision checktimeout 30
1901*cfb92d14SAndroid Build Coastguard Worker          * Done
1902*cfb92d14SAndroid Build Coastguard Worker          * @endcode
1903*cfb92d14SAndroid Build Coastguard Worker          * @cparam childsupervision checktimeout @ca{timeout-seconds}
1904*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
1905*cfb92d14SAndroid Build Coastguard Worker          * #otChildSupervisionSetCheckTimeout
1906*cfb92d14SAndroid Build Coastguard Worker          */
1907*cfb92d14SAndroid Build Coastguard Worker         error = ProcessGetSet(aArgs + 1, otChildSupervisionGetCheckTimeout, otChildSupervisionSetCheckTimeout);
1908*cfb92d14SAndroid Build Coastguard Worker     }
1909*cfb92d14SAndroid Build Coastguard Worker     /**
1910*cfb92d14SAndroid Build Coastguard Worker      * @cli childsupervision interval
1911*cfb92d14SAndroid Build Coastguard Worker      * @code
1912*cfb92d14SAndroid Build Coastguard Worker      * childsupervision interval
1913*cfb92d14SAndroid Build Coastguard Worker      * 30
1914*cfb92d14SAndroid Build Coastguard Worker      * Done
1915*cfb92d14SAndroid Build Coastguard Worker      * @endcode
1916*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
1917*cfb92d14SAndroid Build Coastguard Worker      * #otChildSupervisionGetInterval
1918*cfb92d14SAndroid Build Coastguard Worker      */
1919*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "interval")
1920*cfb92d14SAndroid Build Coastguard Worker     {
1921*cfb92d14SAndroid Build Coastguard Worker         /**
1922*cfb92d14SAndroid Build Coastguard Worker          * @cli childsupervision interval (set)
1923*cfb92d14SAndroid Build Coastguard Worker          * @code
1924*cfb92d14SAndroid Build Coastguard Worker          * childsupervision interval 30
1925*cfb92d14SAndroid Build Coastguard Worker          * Done
1926*cfb92d14SAndroid Build Coastguard Worker          * @endcode
1927*cfb92d14SAndroid Build Coastguard Worker          * @cparam childsupervision interval @ca{interval-seconds}
1928*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
1929*cfb92d14SAndroid Build Coastguard Worker          * #otChildSupervisionSetInterval
1930*cfb92d14SAndroid Build Coastguard Worker          */
1931*cfb92d14SAndroid Build Coastguard Worker         error = ProcessGetSet(aArgs + 1, otChildSupervisionGetInterval, otChildSupervisionSetInterval);
1932*cfb92d14SAndroid Build Coastguard Worker     }
1933*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "failcounter")
1934*cfb92d14SAndroid Build Coastguard Worker     {
1935*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1].IsEmpty())
1936*cfb92d14SAndroid Build Coastguard Worker         {
1937*cfb92d14SAndroid Build Coastguard Worker             OutputLine("%u", otChildSupervisionGetCheckFailureCounter(GetInstancePtr()));
1938*cfb92d14SAndroid Build Coastguard Worker             error = OT_ERROR_NONE;
1939*cfb92d14SAndroid Build Coastguard Worker         }
1940*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "reset")
1941*cfb92d14SAndroid Build Coastguard Worker         {
1942*cfb92d14SAndroid Build Coastguard Worker             otChildSupervisionResetCheckFailureCounter(GetInstancePtr());
1943*cfb92d14SAndroid Build Coastguard Worker             error = OT_ERROR_NONE;
1944*cfb92d14SAndroid Build Coastguard Worker         }
1945*cfb92d14SAndroid Build Coastguard Worker     }
1946*cfb92d14SAndroid Build Coastguard Worker 
1947*cfb92d14SAndroid Build Coastguard Worker     return error;
1948*cfb92d14SAndroid Build Coastguard Worker }
1949*cfb92d14SAndroid Build Coastguard Worker 
1950*cfb92d14SAndroid Build Coastguard Worker /** @cli childtimeout
1951*cfb92d14SAndroid Build Coastguard Worker  * @code
1952*cfb92d14SAndroid Build Coastguard Worker  * childtimeout
1953*cfb92d14SAndroid Build Coastguard Worker  * 300
1954*cfb92d14SAndroid Build Coastguard Worker  * Done
1955*cfb92d14SAndroid Build Coastguard Worker  * @endcode
1956*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
1957*cfb92d14SAndroid Build Coastguard Worker  * #otThreadGetChildTimeout
1958*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])1959*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("childtimeout")>(Arg aArgs[])
1960*cfb92d14SAndroid Build Coastguard Worker {
1961*cfb92d14SAndroid Build Coastguard Worker     /** @cli childtimeout (set)
1962*cfb92d14SAndroid Build Coastguard Worker      * @code
1963*cfb92d14SAndroid Build Coastguard Worker      * childtimeout 300
1964*cfb92d14SAndroid Build Coastguard Worker      * Done
1965*cfb92d14SAndroid Build Coastguard Worker      * @endcode
1966*cfb92d14SAndroid Build Coastguard Worker      * @cparam childtimeout @ca{timeout-seconds}
1967*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
1968*cfb92d14SAndroid Build Coastguard Worker      * #otThreadSetChildTimeout
1969*cfb92d14SAndroid Build Coastguard Worker      */
1970*cfb92d14SAndroid Build Coastguard Worker     return ProcessGetSet(aArgs, otThreadGetChildTimeout, otThreadSetChildTimeout);
1971*cfb92d14SAndroid Build Coastguard Worker }
1972*cfb92d14SAndroid Build Coastguard Worker 
1973*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_API_ENABLE
Process(Arg aArgs[])1974*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("coap")>(Arg aArgs[]) { return mCoap.Process(aArgs); }
1975*cfb92d14SAndroid Build Coastguard Worker #endif
1976*cfb92d14SAndroid Build Coastguard Worker 
1977*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_SECURE_API_ENABLE
Process(Arg aArgs[])1978*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("coaps")>(Arg aArgs[]) { return mCoapSecure.Process(aArgs); }
1979*cfb92d14SAndroid Build Coastguard Worker #endif
1980*cfb92d14SAndroid Build Coastguard Worker 
1981*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_RADIO_COEX_ENABLE
Process(Arg aArgs[])1982*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("coex")>(Arg aArgs[])
1983*cfb92d14SAndroid Build Coastguard Worker {
1984*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
1985*cfb92d14SAndroid Build Coastguard Worker 
1986*cfb92d14SAndroid Build Coastguard Worker     if (ProcessEnableDisable(aArgs, otPlatRadioIsCoexEnabled, otPlatRadioSetCoexEnabled) == OT_ERROR_NONE)
1987*cfb92d14SAndroid Build Coastguard Worker     {
1988*cfb92d14SAndroid Build Coastguard Worker     }
1989*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "metrics")
1990*cfb92d14SAndroid Build Coastguard Worker     {
1991*cfb92d14SAndroid Build Coastguard Worker         struct RadioCoexMetricName
1992*cfb92d14SAndroid Build Coastguard Worker         {
1993*cfb92d14SAndroid Build Coastguard Worker             const uint32_t otRadioCoexMetrics::*mValuePtr;
1994*cfb92d14SAndroid Build Coastguard Worker             const char                         *mName;
1995*cfb92d14SAndroid Build Coastguard Worker         };
1996*cfb92d14SAndroid Build Coastguard Worker 
1997*cfb92d14SAndroid Build Coastguard Worker         static const RadioCoexMetricName kTxMetricNames[] = {
1998*cfb92d14SAndroid Build Coastguard Worker             {&otRadioCoexMetrics::mNumTxRequest, "Request"},
1999*cfb92d14SAndroid Build Coastguard Worker             {&otRadioCoexMetrics::mNumTxGrantImmediate, "Grant Immediate"},
2000*cfb92d14SAndroid Build Coastguard Worker             {&otRadioCoexMetrics::mNumTxGrantWait, "Grant Wait"},
2001*cfb92d14SAndroid Build Coastguard Worker             {&otRadioCoexMetrics::mNumTxGrantWaitActivated, "Grant Wait Activated"},
2002*cfb92d14SAndroid Build Coastguard Worker             {&otRadioCoexMetrics::mNumTxGrantWaitTimeout, "Grant Wait Timeout"},
2003*cfb92d14SAndroid Build Coastguard Worker             {&otRadioCoexMetrics::mNumTxGrantDeactivatedDuringRequest, "Grant Deactivated During Request"},
2004*cfb92d14SAndroid Build Coastguard Worker             {&otRadioCoexMetrics::mNumTxDelayedGrant, "Delayed Grant"},
2005*cfb92d14SAndroid Build Coastguard Worker             {&otRadioCoexMetrics::mAvgTxRequestToGrantTime, "Average Request To Grant Time"},
2006*cfb92d14SAndroid Build Coastguard Worker         };
2007*cfb92d14SAndroid Build Coastguard Worker 
2008*cfb92d14SAndroid Build Coastguard Worker         static const RadioCoexMetricName kRxMetricNames[] = {
2009*cfb92d14SAndroid Build Coastguard Worker             {&otRadioCoexMetrics::mNumRxRequest, "Request"},
2010*cfb92d14SAndroid Build Coastguard Worker             {&otRadioCoexMetrics::mNumRxGrantImmediate, "Grant Immediate"},
2011*cfb92d14SAndroid Build Coastguard Worker             {&otRadioCoexMetrics::mNumRxGrantWait, "Grant Wait"},
2012*cfb92d14SAndroid Build Coastguard Worker             {&otRadioCoexMetrics::mNumRxGrantWaitActivated, "Grant Wait Activated"},
2013*cfb92d14SAndroid Build Coastguard Worker             {&otRadioCoexMetrics::mNumRxGrantWaitTimeout, "Grant Wait Timeout"},
2014*cfb92d14SAndroid Build Coastguard Worker             {&otRadioCoexMetrics::mNumRxGrantDeactivatedDuringRequest, "Grant Deactivated During Request"},
2015*cfb92d14SAndroid Build Coastguard Worker             {&otRadioCoexMetrics::mNumRxDelayedGrant, "Delayed Grant"},
2016*cfb92d14SAndroid Build Coastguard Worker             {&otRadioCoexMetrics::mAvgRxRequestToGrantTime, "Average Request To Grant Time"},
2017*cfb92d14SAndroid Build Coastguard Worker             {&otRadioCoexMetrics::mNumRxGrantNone, "Grant None"},
2018*cfb92d14SAndroid Build Coastguard Worker         };
2019*cfb92d14SAndroid Build Coastguard Worker 
2020*cfb92d14SAndroid Build Coastguard Worker         otRadioCoexMetrics metrics;
2021*cfb92d14SAndroid Build Coastguard Worker 
2022*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otPlatRadioGetCoexMetrics(GetInstancePtr(), &metrics));
2023*cfb92d14SAndroid Build Coastguard Worker 
2024*cfb92d14SAndroid Build Coastguard Worker         OutputLine("Stopped: %s", metrics.mStopped ? "true" : "false");
2025*cfb92d14SAndroid Build Coastguard Worker         OutputLine("Grant Glitch: %lu", ToUlong(metrics.mNumGrantGlitch));
2026*cfb92d14SAndroid Build Coastguard Worker         OutputLine("Transmit metrics");
2027*cfb92d14SAndroid Build Coastguard Worker 
2028*cfb92d14SAndroid Build Coastguard Worker         for (const RadioCoexMetricName &metric : kTxMetricNames)
2029*cfb92d14SAndroid Build Coastguard Worker         {
2030*cfb92d14SAndroid Build Coastguard Worker             OutputLine(kIndentSize, "%s: %lu", metric.mName, ToUlong(metrics.*metric.mValuePtr));
2031*cfb92d14SAndroid Build Coastguard Worker         }
2032*cfb92d14SAndroid Build Coastguard Worker 
2033*cfb92d14SAndroid Build Coastguard Worker         OutputLine("Receive metrics");
2034*cfb92d14SAndroid Build Coastguard Worker 
2035*cfb92d14SAndroid Build Coastguard Worker         for (const RadioCoexMetricName &metric : kRxMetricNames)
2036*cfb92d14SAndroid Build Coastguard Worker         {
2037*cfb92d14SAndroid Build Coastguard Worker             OutputLine(kIndentSize, "%s: %lu", metric.mName, ToUlong(metrics.*metric.mValuePtr));
2038*cfb92d14SAndroid Build Coastguard Worker         }
2039*cfb92d14SAndroid Build Coastguard Worker     }
2040*cfb92d14SAndroid Build Coastguard Worker     else
2041*cfb92d14SAndroid Build Coastguard Worker     {
2042*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
2043*cfb92d14SAndroid Build Coastguard Worker     }
2044*cfb92d14SAndroid Build Coastguard Worker 
2045*cfb92d14SAndroid Build Coastguard Worker exit:
2046*cfb92d14SAndroid Build Coastguard Worker     return error;
2047*cfb92d14SAndroid Build Coastguard Worker }
2048*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_PLATFORM_RADIO_COEX_ENABLE
2049*cfb92d14SAndroid Build Coastguard Worker 
2050*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
2051*cfb92d14SAndroid Build Coastguard Worker /**
2052*cfb92d14SAndroid Build Coastguard Worker  * @cli contextreusedelay (get,set)
2053*cfb92d14SAndroid Build Coastguard Worker  * @code
2054*cfb92d14SAndroid Build Coastguard Worker  * contextreusedelay
2055*cfb92d14SAndroid Build Coastguard Worker  * 11
2056*cfb92d14SAndroid Build Coastguard Worker  * Done
2057*cfb92d14SAndroid Build Coastguard Worker  * @endcode
2058*cfb92d14SAndroid Build Coastguard Worker  * @code
2059*cfb92d14SAndroid Build Coastguard Worker  * contextreusedelay 11
2060*cfb92d14SAndroid Build Coastguard Worker  * Done
2061*cfb92d14SAndroid Build Coastguard Worker  * @endcode
2062*cfb92d14SAndroid Build Coastguard Worker  * @cparam contextreusedelay @ca{delay}
2063*cfb92d14SAndroid Build Coastguard Worker  * Use the optional `delay` argument to set the `CONTEXT_ID_REUSE_DELAY`.
2064*cfb92d14SAndroid Build Coastguard Worker  * @par
2065*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets the `CONTEXT_ID_REUSE_DELAY` value.
2066*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadGetContextIdReuseDelay
2067*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadSetContextIdReuseDelay
2068*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])2069*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("contextreusedelay")>(Arg aArgs[])
2070*cfb92d14SAndroid Build Coastguard Worker {
2071*cfb92d14SAndroid Build Coastguard Worker     return ProcessGetSet(aArgs, otThreadGetContextIdReuseDelay, otThreadSetContextIdReuseDelay);
2072*cfb92d14SAndroid Build Coastguard Worker }
2073*cfb92d14SAndroid Build Coastguard Worker #endif
2074*cfb92d14SAndroid Build Coastguard Worker 
2075*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_IP6_BR_COUNTERS_ENABLE
OutputBorderRouterCounters(void)2076*cfb92d14SAndroid Build Coastguard Worker void Interpreter::OutputBorderRouterCounters(void)
2077*cfb92d14SAndroid Build Coastguard Worker {
2078*cfb92d14SAndroid Build Coastguard Worker     struct BrCounterName
2079*cfb92d14SAndroid Build Coastguard Worker     {
2080*cfb92d14SAndroid Build Coastguard Worker         const otPacketsAndBytes otBorderRoutingCounters::*mPacketsAndBytes;
2081*cfb92d14SAndroid Build Coastguard Worker         const char                                       *mName;
2082*cfb92d14SAndroid Build Coastguard Worker     };
2083*cfb92d14SAndroid Build Coastguard Worker 
2084*cfb92d14SAndroid Build Coastguard Worker     static const BrCounterName kCounterNames[] = {
2085*cfb92d14SAndroid Build Coastguard Worker         {&otBorderRoutingCounters::mInboundUnicast, "Inbound Unicast"},
2086*cfb92d14SAndroid Build Coastguard Worker         {&otBorderRoutingCounters::mInboundMulticast, "Inbound Multicast"},
2087*cfb92d14SAndroid Build Coastguard Worker         {&otBorderRoutingCounters::mOutboundUnicast, "Outbound Unicast"},
2088*cfb92d14SAndroid Build Coastguard Worker         {&otBorderRoutingCounters::mOutboundMulticast, "Outbound Multicast"},
2089*cfb92d14SAndroid Build Coastguard Worker     };
2090*cfb92d14SAndroid Build Coastguard Worker 
2091*cfb92d14SAndroid Build Coastguard Worker     const otBorderRoutingCounters *brCounters = otIp6GetBorderRoutingCounters(GetInstancePtr());
2092*cfb92d14SAndroid Build Coastguard Worker     Uint64StringBuffer             uint64StringBuffer;
2093*cfb92d14SAndroid Build Coastguard Worker 
2094*cfb92d14SAndroid Build Coastguard Worker     for (const BrCounterName &counter : kCounterNames)
2095*cfb92d14SAndroid Build Coastguard Worker     {
2096*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("%s:", counter.mName);
2097*cfb92d14SAndroid Build Coastguard Worker         OutputFormat(" Packets %s",
2098*cfb92d14SAndroid Build Coastguard Worker                      Uint64ToString((brCounters->*counter.mPacketsAndBytes).mPackets, uint64StringBuffer));
2099*cfb92d14SAndroid Build Coastguard Worker         OutputLine(" Bytes %s", Uint64ToString((brCounters->*counter.mPacketsAndBytes).mBytes, uint64StringBuffer));
2100*cfb92d14SAndroid Build Coastguard Worker     }
2101*cfb92d14SAndroid Build Coastguard Worker 
2102*cfb92d14SAndroid Build Coastguard Worker     OutputLine("RA Rx: %lu", ToUlong(brCounters->mRaRx));
2103*cfb92d14SAndroid Build Coastguard Worker     OutputLine("RA TxSuccess: %lu", ToUlong(brCounters->mRaTxSuccess));
2104*cfb92d14SAndroid Build Coastguard Worker     OutputLine("RA TxFailed: %lu", ToUlong(brCounters->mRaTxFailure));
2105*cfb92d14SAndroid Build Coastguard Worker     OutputLine("RS Rx: %lu", ToUlong(brCounters->mRsRx));
2106*cfb92d14SAndroid Build Coastguard Worker     OutputLine("RS TxSuccess: %lu", ToUlong(brCounters->mRsTxSuccess));
2107*cfb92d14SAndroid Build Coastguard Worker     OutputLine("RS TxFailed: %lu", ToUlong(brCounters->mRsTxFailure));
2108*cfb92d14SAndroid Build Coastguard Worker }
2109*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_IP6_BR_COUNTERS_ENABLE
2110*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])2111*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("counters")>(Arg aArgs[])
2112*cfb92d14SAndroid Build Coastguard Worker {
2113*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
2114*cfb92d14SAndroid Build Coastguard Worker 
2115*cfb92d14SAndroid Build Coastguard Worker     /**
2116*cfb92d14SAndroid Build Coastguard Worker      * @cli counters
2117*cfb92d14SAndroid Build Coastguard Worker      * @code
2118*cfb92d14SAndroid Build Coastguard Worker      * counters
2119*cfb92d14SAndroid Build Coastguard Worker      * ip
2120*cfb92d14SAndroid Build Coastguard Worker      * mac
2121*cfb92d14SAndroid Build Coastguard Worker      * mle
2122*cfb92d14SAndroid Build Coastguard Worker      * Done
2123*cfb92d14SAndroid Build Coastguard Worker      * @endcode
2124*cfb92d14SAndroid Build Coastguard Worker      * @par
2125*cfb92d14SAndroid Build Coastguard Worker      * Gets the supported counter names.
2126*cfb92d14SAndroid Build Coastguard Worker      */
2127*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
2128*cfb92d14SAndroid Build Coastguard Worker     {
2129*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_IP6_BR_COUNTERS_ENABLE
2130*cfb92d14SAndroid Build Coastguard Worker         OutputLine("br");
2131*cfb92d14SAndroid Build Coastguard Worker #endif
2132*cfb92d14SAndroid Build Coastguard Worker         OutputLine("ip");
2133*cfb92d14SAndroid Build Coastguard Worker         OutputLine("mac");
2134*cfb92d14SAndroid Build Coastguard Worker         OutputLine("mle");
2135*cfb92d14SAndroid Build Coastguard Worker     }
2136*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_IP6_BR_COUNTERS_ENABLE
2137*cfb92d14SAndroid Build Coastguard Worker     /**
2138*cfb92d14SAndroid Build Coastguard Worker      * @cli counters br
2139*cfb92d14SAndroid Build Coastguard Worker      * @code
2140*cfb92d14SAndroid Build Coastguard Worker      * counters br
2141*cfb92d14SAndroid Build Coastguard Worker      * Inbound Unicast: Packets 4 Bytes 320
2142*cfb92d14SAndroid Build Coastguard Worker      * Inbound Multicast: Packets 0 Bytes 0
2143*cfb92d14SAndroid Build Coastguard Worker      * Outbound Unicast: Packets 2 Bytes 160
2144*cfb92d14SAndroid Build Coastguard Worker      * Outbound Multicast: Packets 0 Bytes 0
2145*cfb92d14SAndroid Build Coastguard Worker      * RA Rx: 4
2146*cfb92d14SAndroid Build Coastguard Worker      * RA TxSuccess: 2
2147*cfb92d14SAndroid Build Coastguard Worker      * RA TxFailed: 0
2148*cfb92d14SAndroid Build Coastguard Worker      * RS Rx: 0
2149*cfb92d14SAndroid Build Coastguard Worker      * RS TxSuccess: 2
2150*cfb92d14SAndroid Build Coastguard Worker      * RS TxFailed: 0
2151*cfb92d14SAndroid Build Coastguard Worker      * Done
2152*cfb92d14SAndroid Build Coastguard Worker      * @endcode
2153*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
2154*cfb92d14SAndroid Build Coastguard Worker      * #otIp6GetBorderRoutingCounters
2155*cfb92d14SAndroid Build Coastguard Worker      */
2156*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "br")
2157*cfb92d14SAndroid Build Coastguard Worker     {
2158*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1].IsEmpty())
2159*cfb92d14SAndroid Build Coastguard Worker         {
2160*cfb92d14SAndroid Build Coastguard Worker             OutputBorderRouterCounters();
2161*cfb92d14SAndroid Build Coastguard Worker         }
2162*cfb92d14SAndroid Build Coastguard Worker         /**
2163*cfb92d14SAndroid Build Coastguard Worker          * @cli counters br reset
2164*cfb92d14SAndroid Build Coastguard Worker          * @code
2165*cfb92d14SAndroid Build Coastguard Worker          * counters br reset
2166*cfb92d14SAndroid Build Coastguard Worker          * Done
2167*cfb92d14SAndroid Build Coastguard Worker          * @endcode
2168*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
2169*cfb92d14SAndroid Build Coastguard Worker          * #otIp6ResetBorderRoutingCounters
2170*cfb92d14SAndroid Build Coastguard Worker          */
2171*cfb92d14SAndroid Build Coastguard Worker         else if ((aArgs[1] == "reset") && aArgs[2].IsEmpty())
2172*cfb92d14SAndroid Build Coastguard Worker         {
2173*cfb92d14SAndroid Build Coastguard Worker             otIp6ResetBorderRoutingCounters(GetInstancePtr());
2174*cfb92d14SAndroid Build Coastguard Worker         }
2175*cfb92d14SAndroid Build Coastguard Worker         else
2176*cfb92d14SAndroid Build Coastguard Worker         {
2177*cfb92d14SAndroid Build Coastguard Worker             error = OT_ERROR_INVALID_ARGS;
2178*cfb92d14SAndroid Build Coastguard Worker         }
2179*cfb92d14SAndroid Build Coastguard Worker     }
2180*cfb92d14SAndroid Build Coastguard Worker #endif
2181*cfb92d14SAndroid Build Coastguard Worker     /**
2182*cfb92d14SAndroid Build Coastguard Worker      * @cli counters (mac)
2183*cfb92d14SAndroid Build Coastguard Worker      * @code
2184*cfb92d14SAndroid Build Coastguard Worker      * counters mac
2185*cfb92d14SAndroid Build Coastguard Worker      * TxTotal: 10
2186*cfb92d14SAndroid Build Coastguard Worker      *    TxUnicast: 3
2187*cfb92d14SAndroid Build Coastguard Worker      *    TxBroadcast: 7
2188*cfb92d14SAndroid Build Coastguard Worker      *    TxAckRequested: 3
2189*cfb92d14SAndroid Build Coastguard Worker      *    TxAcked: 3
2190*cfb92d14SAndroid Build Coastguard Worker      *    TxNoAckRequested: 7
2191*cfb92d14SAndroid Build Coastguard Worker      *    TxData: 10
2192*cfb92d14SAndroid Build Coastguard Worker      *    TxDataPoll: 0
2193*cfb92d14SAndroid Build Coastguard Worker      *    TxBeacon: 0
2194*cfb92d14SAndroid Build Coastguard Worker      *    TxBeaconRequest: 0
2195*cfb92d14SAndroid Build Coastguard Worker      *    TxOther: 0
2196*cfb92d14SAndroid Build Coastguard Worker      *    TxRetry: 0
2197*cfb92d14SAndroid Build Coastguard Worker      *    TxErrCca: 0
2198*cfb92d14SAndroid Build Coastguard Worker      *    TxErrBusyChannel: 0
2199*cfb92d14SAndroid Build Coastguard Worker      * RxTotal: 2
2200*cfb92d14SAndroid Build Coastguard Worker      *    RxUnicast: 1
2201*cfb92d14SAndroid Build Coastguard Worker      *    RxBroadcast: 1
2202*cfb92d14SAndroid Build Coastguard Worker      *    RxData: 2
2203*cfb92d14SAndroid Build Coastguard Worker      *    RxDataPoll: 0
2204*cfb92d14SAndroid Build Coastguard Worker      *    RxBeacon: 0
2205*cfb92d14SAndroid Build Coastguard Worker      *    RxBeaconRequest: 0
2206*cfb92d14SAndroid Build Coastguard Worker      *    RxOther: 0
2207*cfb92d14SAndroid Build Coastguard Worker      *    RxAddressFiltered: 0
2208*cfb92d14SAndroid Build Coastguard Worker      *    RxDestAddrFiltered: 0
2209*cfb92d14SAndroid Build Coastguard Worker      *    RxDuplicated: 0
2210*cfb92d14SAndroid Build Coastguard Worker      *    RxErrNoFrame: 0
2211*cfb92d14SAndroid Build Coastguard Worker      *    RxErrNoUnknownNeighbor: 0
2212*cfb92d14SAndroid Build Coastguard Worker      *    RxErrInvalidSrcAddr: 0
2213*cfb92d14SAndroid Build Coastguard Worker      *    RxErrSec: 0
2214*cfb92d14SAndroid Build Coastguard Worker      *    RxErrFcs: 0
2215*cfb92d14SAndroid Build Coastguard Worker      *    RxErrOther: 0
2216*cfb92d14SAndroid Build Coastguard Worker      * Done
2217*cfb92d14SAndroid Build Coastguard Worker      * @endcode
2218*cfb92d14SAndroid Build Coastguard Worker      * @cparam counters @ca{mac}
2219*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
2220*cfb92d14SAndroid Build Coastguard Worker      * #otLinkGetCounters
2221*cfb92d14SAndroid Build Coastguard Worker      */
2222*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "mac")
2223*cfb92d14SAndroid Build Coastguard Worker     {
2224*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1].IsEmpty())
2225*cfb92d14SAndroid Build Coastguard Worker         {
2226*cfb92d14SAndroid Build Coastguard Worker             struct MacCounterName
2227*cfb92d14SAndroid Build Coastguard Worker             {
2228*cfb92d14SAndroid Build Coastguard Worker                 const uint32_t otMacCounters::*mValuePtr;
2229*cfb92d14SAndroid Build Coastguard Worker                 const char                    *mName;
2230*cfb92d14SAndroid Build Coastguard Worker             };
2231*cfb92d14SAndroid Build Coastguard Worker 
2232*cfb92d14SAndroid Build Coastguard Worker             static const MacCounterName kTxCounterNames[] = {
2233*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mTxUnicast, "TxUnicast"},
2234*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mTxBroadcast, "TxBroadcast"},
2235*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mTxAckRequested, "TxAckRequested"},
2236*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mTxAcked, "TxAcked"},
2237*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mTxNoAckRequested, "TxNoAckRequested"},
2238*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mTxData, "TxData"},
2239*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mTxDataPoll, "TxDataPoll"},
2240*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mTxBeacon, "TxBeacon"},
2241*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mTxBeaconRequest, "TxBeaconRequest"},
2242*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mTxOther, "TxOther"},
2243*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mTxRetry, "TxRetry"},
2244*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mTxErrCca, "TxErrCca"},
2245*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mTxErrBusyChannel, "TxErrBusyChannel"},
2246*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mTxErrAbort, "TxErrAbort"},
2247*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mTxDirectMaxRetryExpiry, "TxDirectMaxRetryExpiry"},
2248*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mTxIndirectMaxRetryExpiry, "TxIndirectMaxRetryExpiry"},
2249*cfb92d14SAndroid Build Coastguard Worker             };
2250*cfb92d14SAndroid Build Coastguard Worker 
2251*cfb92d14SAndroid Build Coastguard Worker             static const MacCounterName kRxCounterNames[] = {
2252*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mRxUnicast, "RxUnicast"},
2253*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mRxBroadcast, "RxBroadcast"},
2254*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mRxData, "RxData"},
2255*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mRxDataPoll, "RxDataPoll"},
2256*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mRxBeacon, "RxBeacon"},
2257*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mRxBeaconRequest, "RxBeaconRequest"},
2258*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mRxOther, "RxOther"},
2259*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mRxAddressFiltered, "RxAddressFiltered"},
2260*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mRxDestAddrFiltered, "RxDestAddrFiltered"},
2261*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mRxDuplicated, "RxDuplicated"},
2262*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mRxErrNoFrame, "RxErrNoFrame"},
2263*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mRxErrUnknownNeighbor, "RxErrNoUnknownNeighbor"},
2264*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mRxErrInvalidSrcAddr, "RxErrInvalidSrcAddr"},
2265*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mRxErrSec, "RxErrSec"},
2266*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mRxErrFcs, "RxErrFcs"},
2267*cfb92d14SAndroid Build Coastguard Worker                 {&otMacCounters::mRxErrOther, "RxErrOther"},
2268*cfb92d14SAndroid Build Coastguard Worker             };
2269*cfb92d14SAndroid Build Coastguard Worker 
2270*cfb92d14SAndroid Build Coastguard Worker             const otMacCounters *macCounters = otLinkGetCounters(GetInstancePtr());
2271*cfb92d14SAndroid Build Coastguard Worker 
2272*cfb92d14SAndroid Build Coastguard Worker             OutputLine("TxTotal: %lu", ToUlong(macCounters->mTxTotal));
2273*cfb92d14SAndroid Build Coastguard Worker 
2274*cfb92d14SAndroid Build Coastguard Worker             for (const MacCounterName &counter : kTxCounterNames)
2275*cfb92d14SAndroid Build Coastguard Worker             {
2276*cfb92d14SAndroid Build Coastguard Worker                 OutputLine(kIndentSize, "%s: %lu", counter.mName, ToUlong(macCounters->*counter.mValuePtr));
2277*cfb92d14SAndroid Build Coastguard Worker             }
2278*cfb92d14SAndroid Build Coastguard Worker 
2279*cfb92d14SAndroid Build Coastguard Worker             OutputLine("RxTotal: %lu", ToUlong(macCounters->mRxTotal));
2280*cfb92d14SAndroid Build Coastguard Worker 
2281*cfb92d14SAndroid Build Coastguard Worker             for (const MacCounterName &counter : kRxCounterNames)
2282*cfb92d14SAndroid Build Coastguard Worker             {
2283*cfb92d14SAndroid Build Coastguard Worker                 OutputLine(kIndentSize, "%s: %lu", counter.mName, ToUlong(macCounters->*counter.mValuePtr));
2284*cfb92d14SAndroid Build Coastguard Worker             }
2285*cfb92d14SAndroid Build Coastguard Worker         }
2286*cfb92d14SAndroid Build Coastguard Worker         /**
2287*cfb92d14SAndroid Build Coastguard Worker          * @cli counters mac reset
2288*cfb92d14SAndroid Build Coastguard Worker          * @code
2289*cfb92d14SAndroid Build Coastguard Worker          * counters mac reset
2290*cfb92d14SAndroid Build Coastguard Worker          * Done
2291*cfb92d14SAndroid Build Coastguard Worker          * @endcode
2292*cfb92d14SAndroid Build Coastguard Worker          * @cparam counters @ca{mac} reset
2293*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
2294*cfb92d14SAndroid Build Coastguard Worker          * #otLinkResetCounters
2295*cfb92d14SAndroid Build Coastguard Worker          */
2296*cfb92d14SAndroid Build Coastguard Worker         else if ((aArgs[1] == "reset") && aArgs[2].IsEmpty())
2297*cfb92d14SAndroid Build Coastguard Worker         {
2298*cfb92d14SAndroid Build Coastguard Worker             otLinkResetCounters(GetInstancePtr());
2299*cfb92d14SAndroid Build Coastguard Worker         }
2300*cfb92d14SAndroid Build Coastguard Worker         else
2301*cfb92d14SAndroid Build Coastguard Worker         {
2302*cfb92d14SAndroid Build Coastguard Worker             error = OT_ERROR_INVALID_ARGS;
2303*cfb92d14SAndroid Build Coastguard Worker         }
2304*cfb92d14SAndroid Build Coastguard Worker     }
2305*cfb92d14SAndroid Build Coastguard Worker     /**
2306*cfb92d14SAndroid Build Coastguard Worker      * @cli counters (mle)
2307*cfb92d14SAndroid Build Coastguard Worker      * @code
2308*cfb92d14SAndroid Build Coastguard Worker      * counters mle
2309*cfb92d14SAndroid Build Coastguard Worker      * Role Disabled: 0
2310*cfb92d14SAndroid Build Coastguard Worker      * Role Detached: 1
2311*cfb92d14SAndroid Build Coastguard Worker      * Role Child: 0
2312*cfb92d14SAndroid Build Coastguard Worker      * Role Router: 0
2313*cfb92d14SAndroid Build Coastguard Worker      * Role Leader: 1
2314*cfb92d14SAndroid Build Coastguard Worker      * Attach Attempts: 1
2315*cfb92d14SAndroid Build Coastguard Worker      * Partition Id Changes: 1
2316*cfb92d14SAndroid Build Coastguard Worker      * Better Partition Attach Attempts: 0
2317*cfb92d14SAndroid Build Coastguard Worker      * Parent Changes: 0
2318*cfb92d14SAndroid Build Coastguard Worker      * Done
2319*cfb92d14SAndroid Build Coastguard Worker      * @endcode
2320*cfb92d14SAndroid Build Coastguard Worker      * @cparam counters @ca{mle}
2321*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
2322*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetMleCounters
2323*cfb92d14SAndroid Build Coastguard Worker      */
2324*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "mle")
2325*cfb92d14SAndroid Build Coastguard Worker     {
2326*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1].IsEmpty())
2327*cfb92d14SAndroid Build Coastguard Worker         {
2328*cfb92d14SAndroid Build Coastguard Worker             struct MleCounterName
2329*cfb92d14SAndroid Build Coastguard Worker             {
2330*cfb92d14SAndroid Build Coastguard Worker                 const uint16_t otMleCounters::*mValuePtr;
2331*cfb92d14SAndroid Build Coastguard Worker                 const char                    *mName;
2332*cfb92d14SAndroid Build Coastguard Worker             };
2333*cfb92d14SAndroid Build Coastguard Worker 
2334*cfb92d14SAndroid Build Coastguard Worker             static const MleCounterName kCounterNames[] = {
2335*cfb92d14SAndroid Build Coastguard Worker                 {&otMleCounters::mDisabledRole, "Role Disabled"},
2336*cfb92d14SAndroid Build Coastguard Worker                 {&otMleCounters::mDetachedRole, "Role Detached"},
2337*cfb92d14SAndroid Build Coastguard Worker                 {&otMleCounters::mChildRole, "Role Child"},
2338*cfb92d14SAndroid Build Coastguard Worker                 {&otMleCounters::mRouterRole, "Role Router"},
2339*cfb92d14SAndroid Build Coastguard Worker                 {&otMleCounters::mLeaderRole, "Role Leader"},
2340*cfb92d14SAndroid Build Coastguard Worker                 {&otMleCounters::mAttachAttempts, "Attach Attempts"},
2341*cfb92d14SAndroid Build Coastguard Worker                 {&otMleCounters::mPartitionIdChanges, "Partition Id Changes"},
2342*cfb92d14SAndroid Build Coastguard Worker                 {&otMleCounters::mBetterPartitionAttachAttempts, "Better Partition Attach Attempts"},
2343*cfb92d14SAndroid Build Coastguard Worker                 {&otMleCounters::mParentChanges, "Parent Changes"},
2344*cfb92d14SAndroid Build Coastguard Worker             };
2345*cfb92d14SAndroid Build Coastguard Worker 
2346*cfb92d14SAndroid Build Coastguard Worker             const otMleCounters *mleCounters = otThreadGetMleCounters(GetInstancePtr());
2347*cfb92d14SAndroid Build Coastguard Worker 
2348*cfb92d14SAndroid Build Coastguard Worker             for (const MleCounterName &counter : kCounterNames)
2349*cfb92d14SAndroid Build Coastguard Worker             {
2350*cfb92d14SAndroid Build Coastguard Worker                 OutputLine("%s: %u", counter.mName, mleCounters->*counter.mValuePtr);
2351*cfb92d14SAndroid Build Coastguard Worker             }
2352*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_UPTIME_ENABLE
2353*cfb92d14SAndroid Build Coastguard Worker             {
2354*cfb92d14SAndroid Build Coastguard Worker                 struct MleTimeCounterName
2355*cfb92d14SAndroid Build Coastguard Worker                 {
2356*cfb92d14SAndroid Build Coastguard Worker                     const uint64_t otMleCounters::*mValuePtr;
2357*cfb92d14SAndroid Build Coastguard Worker                     const char                    *mName;
2358*cfb92d14SAndroid Build Coastguard Worker                 };
2359*cfb92d14SAndroid Build Coastguard Worker 
2360*cfb92d14SAndroid Build Coastguard Worker                 static const MleTimeCounterName kTimeCounterNames[] = {
2361*cfb92d14SAndroid Build Coastguard Worker                     {&otMleCounters::mDisabledTime, "Disabled"}, {&otMleCounters::mDetachedTime, "Detached"},
2362*cfb92d14SAndroid Build Coastguard Worker                     {&otMleCounters::mChildTime, "Child"},       {&otMleCounters::mRouterTime, "Router"},
2363*cfb92d14SAndroid Build Coastguard Worker                     {&otMleCounters::mLeaderTime, "Leader"},
2364*cfb92d14SAndroid Build Coastguard Worker                 };
2365*cfb92d14SAndroid Build Coastguard Worker 
2366*cfb92d14SAndroid Build Coastguard Worker                 for (const MleTimeCounterName &counter : kTimeCounterNames)
2367*cfb92d14SAndroid Build Coastguard Worker                 {
2368*cfb92d14SAndroid Build Coastguard Worker                     OutputFormat("Time %s Milli: ", counter.mName);
2369*cfb92d14SAndroid Build Coastguard Worker                     OutputUint64Line(mleCounters->*counter.mValuePtr);
2370*cfb92d14SAndroid Build Coastguard Worker                 }
2371*cfb92d14SAndroid Build Coastguard Worker 
2372*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("Time Tracked Milli: ");
2373*cfb92d14SAndroid Build Coastguard Worker                 OutputUint64Line(mleCounters->mTrackedTime);
2374*cfb92d14SAndroid Build Coastguard Worker             }
2375*cfb92d14SAndroid Build Coastguard Worker #endif
2376*cfb92d14SAndroid Build Coastguard Worker         }
2377*cfb92d14SAndroid Build Coastguard Worker         /**
2378*cfb92d14SAndroid Build Coastguard Worker          * @cli counters mle reset
2379*cfb92d14SAndroid Build Coastguard Worker          * @code
2380*cfb92d14SAndroid Build Coastguard Worker          * counters mle reset
2381*cfb92d14SAndroid Build Coastguard Worker          * Done
2382*cfb92d14SAndroid Build Coastguard Worker          * @endcode
2383*cfb92d14SAndroid Build Coastguard Worker          * @cparam counters @ca{mle} reset
2384*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
2385*cfb92d14SAndroid Build Coastguard Worker          * #otThreadResetMleCounters
2386*cfb92d14SAndroid Build Coastguard Worker          */
2387*cfb92d14SAndroid Build Coastguard Worker         else if ((aArgs[1] == "reset") && aArgs[2].IsEmpty())
2388*cfb92d14SAndroid Build Coastguard Worker         {
2389*cfb92d14SAndroid Build Coastguard Worker             otThreadResetMleCounters(GetInstancePtr());
2390*cfb92d14SAndroid Build Coastguard Worker         }
2391*cfb92d14SAndroid Build Coastguard Worker         else
2392*cfb92d14SAndroid Build Coastguard Worker         {
2393*cfb92d14SAndroid Build Coastguard Worker             error = OT_ERROR_INVALID_ARGS;
2394*cfb92d14SAndroid Build Coastguard Worker         }
2395*cfb92d14SAndroid Build Coastguard Worker     }
2396*cfb92d14SAndroid Build Coastguard Worker     /**
2397*cfb92d14SAndroid Build Coastguard Worker      * @cli counters ip
2398*cfb92d14SAndroid Build Coastguard Worker      * @code
2399*cfb92d14SAndroid Build Coastguard Worker      * counters ip
2400*cfb92d14SAndroid Build Coastguard Worker      * TxSuccess: 10
2401*cfb92d14SAndroid Build Coastguard Worker      * TxFailed: 0
2402*cfb92d14SAndroid Build Coastguard Worker      * RxSuccess: 5
2403*cfb92d14SAndroid Build Coastguard Worker      * RxFailed: 0
2404*cfb92d14SAndroid Build Coastguard Worker      * Done
2405*cfb92d14SAndroid Build Coastguard Worker      * @endcode
2406*cfb92d14SAndroid Build Coastguard Worker      * @cparam counters @ca{ip}
2407*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
2408*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetIp6Counters
2409*cfb92d14SAndroid Build Coastguard Worker      */
2410*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "ip")
2411*cfb92d14SAndroid Build Coastguard Worker     {
2412*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1].IsEmpty())
2413*cfb92d14SAndroid Build Coastguard Worker         {
2414*cfb92d14SAndroid Build Coastguard Worker             struct IpCounterName
2415*cfb92d14SAndroid Build Coastguard Worker             {
2416*cfb92d14SAndroid Build Coastguard Worker                 const uint32_t otIpCounters::*mValuePtr;
2417*cfb92d14SAndroid Build Coastguard Worker                 const char                   *mName;
2418*cfb92d14SAndroid Build Coastguard Worker             };
2419*cfb92d14SAndroid Build Coastguard Worker 
2420*cfb92d14SAndroid Build Coastguard Worker             static const IpCounterName kCounterNames[] = {
2421*cfb92d14SAndroid Build Coastguard Worker                 {&otIpCounters::mTxSuccess, "TxSuccess"},
2422*cfb92d14SAndroid Build Coastguard Worker                 {&otIpCounters::mTxFailure, "TxFailed"},
2423*cfb92d14SAndroid Build Coastguard Worker                 {&otIpCounters::mRxSuccess, "RxSuccess"},
2424*cfb92d14SAndroid Build Coastguard Worker                 {&otIpCounters::mRxFailure, "RxFailed"},
2425*cfb92d14SAndroid Build Coastguard Worker             };
2426*cfb92d14SAndroid Build Coastguard Worker 
2427*cfb92d14SAndroid Build Coastguard Worker             const otIpCounters *ipCounters = otThreadGetIp6Counters(GetInstancePtr());
2428*cfb92d14SAndroid Build Coastguard Worker 
2429*cfb92d14SAndroid Build Coastguard Worker             for (const IpCounterName &counter : kCounterNames)
2430*cfb92d14SAndroid Build Coastguard Worker             {
2431*cfb92d14SAndroid Build Coastguard Worker                 OutputLine("%s: %lu", counter.mName, ToUlong(ipCounters->*counter.mValuePtr));
2432*cfb92d14SAndroid Build Coastguard Worker             }
2433*cfb92d14SAndroid Build Coastguard Worker         }
2434*cfb92d14SAndroid Build Coastguard Worker         /**
2435*cfb92d14SAndroid Build Coastguard Worker          * @cli counters ip reset
2436*cfb92d14SAndroid Build Coastguard Worker          * @code
2437*cfb92d14SAndroid Build Coastguard Worker          * counters ip reset
2438*cfb92d14SAndroid Build Coastguard Worker          * Done
2439*cfb92d14SAndroid Build Coastguard Worker          * @endcode
2440*cfb92d14SAndroid Build Coastguard Worker          * @cparam counters @ca{ip} reset
2441*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
2442*cfb92d14SAndroid Build Coastguard Worker          * #otThreadResetIp6Counters
2443*cfb92d14SAndroid Build Coastguard Worker          */
2444*cfb92d14SAndroid Build Coastguard Worker         else if ((aArgs[1] == "reset") && aArgs[2].IsEmpty())
2445*cfb92d14SAndroid Build Coastguard Worker         {
2446*cfb92d14SAndroid Build Coastguard Worker             otThreadResetIp6Counters(GetInstancePtr());
2447*cfb92d14SAndroid Build Coastguard Worker         }
2448*cfb92d14SAndroid Build Coastguard Worker         else
2449*cfb92d14SAndroid Build Coastguard Worker         {
2450*cfb92d14SAndroid Build Coastguard Worker             error = OT_ERROR_INVALID_ARGS;
2451*cfb92d14SAndroid Build Coastguard Worker         }
2452*cfb92d14SAndroid Build Coastguard Worker     }
2453*cfb92d14SAndroid Build Coastguard Worker     else
2454*cfb92d14SAndroid Build Coastguard Worker     {
2455*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
2456*cfb92d14SAndroid Build Coastguard Worker     }
2457*cfb92d14SAndroid Build Coastguard Worker 
2458*cfb92d14SAndroid Build Coastguard Worker     return error;
2459*cfb92d14SAndroid Build Coastguard Worker }
2460*cfb92d14SAndroid Build Coastguard Worker 
2461*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
Process(Arg aArgs[])2462*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("csl")>(Arg aArgs[])
2463*cfb92d14SAndroid Build Coastguard Worker {
2464*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
2465*cfb92d14SAndroid Build Coastguard Worker 
2466*cfb92d14SAndroid Build Coastguard Worker     /**
2467*cfb92d14SAndroid Build Coastguard Worker      * @cli csl
2468*cfb92d14SAndroid Build Coastguard Worker      * @code
2469*cfb92d14SAndroid Build Coastguard Worker      * csl
2470*cfb92d14SAndroid Build Coastguard Worker      * Channel: 11
2471*cfb92d14SAndroid Build Coastguard Worker      * Period: 160000us
2472*cfb92d14SAndroid Build Coastguard Worker      * Timeout: 1000s
2473*cfb92d14SAndroid Build Coastguard Worker      * Done
2474*cfb92d14SAndroid Build Coastguard Worker      * @endcode
2475*cfb92d14SAndroid Build Coastguard Worker      * @par
2476*cfb92d14SAndroid Build Coastguard Worker      * Gets the CSL configuration.
2477*cfb92d14SAndroid Build Coastguard Worker      * @sa otLinkGetCslChannel
2478*cfb92d14SAndroid Build Coastguard Worker      * @sa otLinkGetCslPeriod
2479*cfb92d14SAndroid Build Coastguard Worker      * @sa otLinkGetCslPeriod
2480*cfb92d14SAndroid Build Coastguard Worker      * @sa otLinkGetCslTimeout
2481*cfb92d14SAndroid Build Coastguard Worker      */
2482*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
2483*cfb92d14SAndroid Build Coastguard Worker     {
2484*cfb92d14SAndroid Build Coastguard Worker         OutputLine("channel: %u", otLinkGetCslChannel(GetInstancePtr()));
2485*cfb92d14SAndroid Build Coastguard Worker         OutputLine("period: %luus", ToUlong(otLinkGetCslPeriod(GetInstancePtr())));
2486*cfb92d14SAndroid Build Coastguard Worker         OutputLine("timeout: %lus", ToUlong(otLinkGetCslTimeout(GetInstancePtr())));
2487*cfb92d14SAndroid Build Coastguard Worker     }
2488*cfb92d14SAndroid Build Coastguard Worker     /**
2489*cfb92d14SAndroid Build Coastguard Worker      * @cli csl channel
2490*cfb92d14SAndroid Build Coastguard Worker      * @code
2491*cfb92d14SAndroid Build Coastguard Worker      * csl channel 20
2492*cfb92d14SAndroid Build Coastguard Worker      * Done
2493*cfb92d14SAndroid Build Coastguard Worker      * @endcode
2494*cfb92d14SAndroid Build Coastguard Worker      * @cparam csl channel @ca{channel}
2495*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
2496*cfb92d14SAndroid Build Coastguard Worker      * #otLinkSetCslChannel
2497*cfb92d14SAndroid Build Coastguard Worker      */
2498*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "channel")
2499*cfb92d14SAndroid Build Coastguard Worker     {
2500*cfb92d14SAndroid Build Coastguard Worker         error = ProcessSet(aArgs + 1, otLinkSetCslChannel);
2501*cfb92d14SAndroid Build Coastguard Worker     }
2502*cfb92d14SAndroid Build Coastguard Worker     /**
2503*cfb92d14SAndroid Build Coastguard Worker      * @cli csl period
2504*cfb92d14SAndroid Build Coastguard Worker      * @code
2505*cfb92d14SAndroid Build Coastguard Worker      * csl period 3000000
2506*cfb92d14SAndroid Build Coastguard Worker      * Done
2507*cfb92d14SAndroid Build Coastguard Worker      * @endcode
2508*cfb92d14SAndroid Build Coastguard Worker      * @cparam csl period @ca{period}
2509*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
2510*cfb92d14SAndroid Build Coastguard Worker      * #otLinkSetCslPeriod
2511*cfb92d14SAndroid Build Coastguard Worker      */
2512*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "period")
2513*cfb92d14SAndroid Build Coastguard Worker     {
2514*cfb92d14SAndroid Build Coastguard Worker         error = ProcessSet(aArgs + 1, otLinkSetCslPeriod);
2515*cfb92d14SAndroid Build Coastguard Worker     }
2516*cfb92d14SAndroid Build Coastguard Worker     /**
2517*cfb92d14SAndroid Build Coastguard Worker      * @cli csl timeout
2518*cfb92d14SAndroid Build Coastguard Worker      * @code
2519*cfb92d14SAndroid Build Coastguard Worker      * cls timeout 10
2520*cfb92d14SAndroid Build Coastguard Worker      * Done
2521*cfb92d14SAndroid Build Coastguard Worker      * @endcode
2522*cfb92d14SAndroid Build Coastguard Worker      * @cparam csl timeout @ca{timeout}
2523*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
2524*cfb92d14SAndroid Build Coastguard Worker      * #otLinkSetCslTimeout
2525*cfb92d14SAndroid Build Coastguard Worker      */
2526*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "timeout")
2527*cfb92d14SAndroid Build Coastguard Worker     {
2528*cfb92d14SAndroid Build Coastguard Worker         error = ProcessSet(aArgs + 1, otLinkSetCslTimeout);
2529*cfb92d14SAndroid Build Coastguard Worker     }
2530*cfb92d14SAndroid Build Coastguard Worker     else
2531*cfb92d14SAndroid Build Coastguard Worker     {
2532*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
2533*cfb92d14SAndroid Build Coastguard Worker     }
2534*cfb92d14SAndroid Build Coastguard Worker 
2535*cfb92d14SAndroid Build Coastguard Worker     return error;
2536*cfb92d14SAndroid Build Coastguard Worker }
2537*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
2538*cfb92d14SAndroid Build Coastguard Worker 
2539*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
Process(Arg aArgs[])2540*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("delaytimermin")>(Arg aArgs[])
2541*cfb92d14SAndroid Build Coastguard Worker {
2542*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
2543*cfb92d14SAndroid Build Coastguard Worker 
2544*cfb92d14SAndroid Build Coastguard Worker     /**
2545*cfb92d14SAndroid Build Coastguard Worker      * @cli delaytimermin
2546*cfb92d14SAndroid Build Coastguard Worker      * @code
2547*cfb92d14SAndroid Build Coastguard Worker      * delaytimermin
2548*cfb92d14SAndroid Build Coastguard Worker      * 30
2549*cfb92d14SAndroid Build Coastguard Worker      * Done
2550*cfb92d14SAndroid Build Coastguard Worker      * @endcode
2551*cfb92d14SAndroid Build Coastguard Worker      * @par
2552*cfb92d14SAndroid Build Coastguard Worker      * Get the minimal delay timer (in seconds).
2553*cfb92d14SAndroid Build Coastguard Worker      * @sa otDatasetGetDelayTimerMinimal
2554*cfb92d14SAndroid Build Coastguard Worker      */
2555*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
2556*cfb92d14SAndroid Build Coastguard Worker     {
2557*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%lu", ToUlong((otDatasetGetDelayTimerMinimal(GetInstancePtr()) / 1000)));
2558*cfb92d14SAndroid Build Coastguard Worker     }
2559*cfb92d14SAndroid Build Coastguard Worker     /**
2560*cfb92d14SAndroid Build Coastguard Worker      * @cli delaytimermin (set)
2561*cfb92d14SAndroid Build Coastguard Worker      * @code
2562*cfb92d14SAndroid Build Coastguard Worker      * delaytimermin 60
2563*cfb92d14SAndroid Build Coastguard Worker      * Done
2564*cfb92d14SAndroid Build Coastguard Worker      * @endcode
2565*cfb92d14SAndroid Build Coastguard Worker      * @cparam delaytimermin @ca{delaytimermin}
2566*cfb92d14SAndroid Build Coastguard Worker      * @par
2567*cfb92d14SAndroid Build Coastguard Worker      * Sets the minimal delay timer (in seconds).
2568*cfb92d14SAndroid Build Coastguard Worker      * @sa otDatasetSetDelayTimerMinimal
2569*cfb92d14SAndroid Build Coastguard Worker      */
2570*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[1].IsEmpty())
2571*cfb92d14SAndroid Build Coastguard Worker     {
2572*cfb92d14SAndroid Build Coastguard Worker         uint32_t delay;
2573*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[0].ParseAsUint32(delay));
2574*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otDatasetSetDelayTimerMinimal(GetInstancePtr(), static_cast<uint32_t>(delay * 1000)));
2575*cfb92d14SAndroid Build Coastguard Worker     }
2576*cfb92d14SAndroid Build Coastguard Worker     else
2577*cfb92d14SAndroid Build Coastguard Worker     {
2578*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
2579*cfb92d14SAndroid Build Coastguard Worker     }
2580*cfb92d14SAndroid Build Coastguard Worker 
2581*cfb92d14SAndroid Build Coastguard Worker exit:
2582*cfb92d14SAndroid Build Coastguard Worker     return error;
2583*cfb92d14SAndroid Build Coastguard Worker }
2584*cfb92d14SAndroid Build Coastguard Worker #endif
2585*cfb92d14SAndroid Build Coastguard Worker 
2586*cfb92d14SAndroid Build Coastguard Worker /**
2587*cfb92d14SAndroid Build Coastguard Worker  * @cli detach
2588*cfb92d14SAndroid Build Coastguard Worker  * @code
2589*cfb92d14SAndroid Build Coastguard Worker  * detach
2590*cfb92d14SAndroid Build Coastguard Worker  * Finished detaching
2591*cfb92d14SAndroid Build Coastguard Worker  * Done
2592*cfb92d14SAndroid Build Coastguard Worker  * @endcode
2593*cfb92d14SAndroid Build Coastguard Worker  * @par
2594*cfb92d14SAndroid Build Coastguard Worker  * Start the graceful detach process by first notifying other nodes (sending Address Release if acting as a router, or
2595*cfb92d14SAndroid Build Coastguard Worker  * setting Child Timeout value to zero on parent if acting as a child) and then stopping Thread protocol operation.
2596*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadDetachGracefully
2597*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])2598*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("detach")>(Arg aArgs[])
2599*cfb92d14SAndroid Build Coastguard Worker {
2600*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
2601*cfb92d14SAndroid Build Coastguard Worker 
2602*cfb92d14SAndroid Build Coastguard Worker     /**
2603*cfb92d14SAndroid Build Coastguard Worker      * @cli detach async
2604*cfb92d14SAndroid Build Coastguard Worker      * @code
2605*cfb92d14SAndroid Build Coastguard Worker      * detach async
2606*cfb92d14SAndroid Build Coastguard Worker      * Done
2607*cfb92d14SAndroid Build Coastguard Worker      * @endcode
2608*cfb92d14SAndroid Build Coastguard Worker      * @par
2609*cfb92d14SAndroid Build Coastguard Worker      * Start the graceful detach process similar to the `detach` command without blocking and waiting for the callback
2610*cfb92d14SAndroid Build Coastguard Worker      * indicating that detach is finished.
2611*cfb92d14SAndroid Build Coastguard Worker      * @csa{detach}
2612*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadDetachGracefully
2613*cfb92d14SAndroid Build Coastguard Worker      */
2614*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "async")
2615*cfb92d14SAndroid Build Coastguard Worker     {
2616*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otThreadDetachGracefully(GetInstancePtr(), nullptr, nullptr));
2617*cfb92d14SAndroid Build Coastguard Worker     }
2618*cfb92d14SAndroid Build Coastguard Worker     else
2619*cfb92d14SAndroid Build Coastguard Worker     {
2620*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otThreadDetachGracefully(GetInstancePtr(), HandleDetachGracefullyResult, this));
2621*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_PENDING;
2622*cfb92d14SAndroid Build Coastguard Worker     }
2623*cfb92d14SAndroid Build Coastguard Worker 
2624*cfb92d14SAndroid Build Coastguard Worker exit:
2625*cfb92d14SAndroid Build Coastguard Worker     return error;
2626*cfb92d14SAndroid Build Coastguard Worker }
2627*cfb92d14SAndroid Build Coastguard Worker 
HandleDetachGracefullyResult(void * aContext)2628*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleDetachGracefullyResult(void *aContext)
2629*cfb92d14SAndroid Build Coastguard Worker {
2630*cfb92d14SAndroid Build Coastguard Worker     static_cast<Interpreter *>(aContext)->HandleDetachGracefullyResult();
2631*cfb92d14SAndroid Build Coastguard Worker }
2632*cfb92d14SAndroid Build Coastguard Worker 
HandleDetachGracefullyResult(void)2633*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleDetachGracefullyResult(void)
2634*cfb92d14SAndroid Build Coastguard Worker {
2635*cfb92d14SAndroid Build Coastguard Worker     OutputLine("Finished detaching");
2636*cfb92d14SAndroid Build Coastguard Worker     OutputResult(OT_ERROR_NONE);
2637*cfb92d14SAndroid Build Coastguard Worker }
2638*cfb92d14SAndroid Build Coastguard Worker 
2639*cfb92d14SAndroid Build Coastguard Worker /**
2640*cfb92d14SAndroid Build Coastguard Worker  * @cli discover
2641*cfb92d14SAndroid Build Coastguard Worker  * @code
2642*cfb92d14SAndroid Build Coastguard Worker  * discover
2643*cfb92d14SAndroid Build Coastguard Worker  * | J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
2644*cfb92d14SAndroid Build Coastguard Worker  * +---+------------------+------------------+------+------------------+----+-----+-----+
2645*cfb92d14SAndroid Build Coastguard Worker  * | 0 | OpenThread       | dead00beef00cafe | ffff | f1d92a82c8d8fe43 | 11 | -20 |   0 |
2646*cfb92d14SAndroid Build Coastguard Worker  * Done
2647*cfb92d14SAndroid Build Coastguard Worker  * @endcode
2648*cfb92d14SAndroid Build Coastguard Worker  * @cparam discover [@ca{channel}]
2649*cfb92d14SAndroid Build Coastguard Worker  * `channel`: The channel to discover on. If no channel is provided, the discovery will cover all
2650*cfb92d14SAndroid Build Coastguard Worker  * valid channels.
2651*cfb92d14SAndroid Build Coastguard Worker  * @par
2652*cfb92d14SAndroid Build Coastguard Worker  * Perform an MLE Discovery operation.
2653*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadDiscover
2654*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])2655*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("discover")>(Arg aArgs[])
2656*cfb92d14SAndroid Build Coastguard Worker {
2657*cfb92d14SAndroid Build Coastguard Worker     otError  error        = OT_ERROR_NONE;
2658*cfb92d14SAndroid Build Coastguard Worker     uint32_t scanChannels = 0;
2659*cfb92d14SAndroid Build Coastguard Worker 
2660*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
2661*cfb92d14SAndroid Build Coastguard Worker     /**
2662*cfb92d14SAndroid Build Coastguard Worker      * @cli discover reqcallback (enable,disable)
2663*cfb92d14SAndroid Build Coastguard Worker      * @code
2664*cfb92d14SAndroid Build Coastguard Worker      * discover reqcallback enable
2665*cfb92d14SAndroid Build Coastguard Worker      * Done
2666*cfb92d14SAndroid Build Coastguard Worker      * @endcode
2667*cfb92d14SAndroid Build Coastguard Worker      * @cparam discover reqcallback @ca{enable|disable}
2668*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
2669*cfb92d14SAndroid Build Coastguard Worker      * #otThreadSetDiscoveryRequestCallback
2670*cfb92d14SAndroid Build Coastguard Worker      */
2671*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "reqcallback")
2672*cfb92d14SAndroid Build Coastguard Worker     {
2673*cfb92d14SAndroid Build Coastguard Worker         bool                             enable;
2674*cfb92d14SAndroid Build Coastguard Worker         otThreadDiscoveryRequestCallback callback = nullptr;
2675*cfb92d14SAndroid Build Coastguard Worker         void                            *context  = nullptr;
2676*cfb92d14SAndroid Build Coastguard Worker 
2677*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = ParseEnableOrDisable(aArgs[1], enable));
2678*cfb92d14SAndroid Build Coastguard Worker 
2679*cfb92d14SAndroid Build Coastguard Worker         if (enable)
2680*cfb92d14SAndroid Build Coastguard Worker         {
2681*cfb92d14SAndroid Build Coastguard Worker             callback = &Interpreter::HandleDiscoveryRequest;
2682*cfb92d14SAndroid Build Coastguard Worker             context  = this;
2683*cfb92d14SAndroid Build Coastguard Worker         }
2684*cfb92d14SAndroid Build Coastguard Worker 
2685*cfb92d14SAndroid Build Coastguard Worker         otThreadSetDiscoveryRequestCallback(GetInstancePtr(), callback, context);
2686*cfb92d14SAndroid Build Coastguard Worker         ExitNow();
2687*cfb92d14SAndroid Build Coastguard Worker     }
2688*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_FTD
2689*cfb92d14SAndroid Build Coastguard Worker 
2690*cfb92d14SAndroid Build Coastguard Worker     if (!aArgs[0].IsEmpty())
2691*cfb92d14SAndroid Build Coastguard Worker     {
2692*cfb92d14SAndroid Build Coastguard Worker         uint8_t channel;
2693*cfb92d14SAndroid Build Coastguard Worker 
2694*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[0].ParseAsUint8(channel));
2695*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(channel < BitSizeOf(scanChannels), error = OT_ERROR_INVALID_ARGS);
2696*cfb92d14SAndroid Build Coastguard Worker         scanChannels = 1 << channel;
2697*cfb92d14SAndroid Build Coastguard Worker     }
2698*cfb92d14SAndroid Build Coastguard Worker 
2699*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = otThreadDiscover(GetInstancePtr(), scanChannels, OT_PANID_BROADCAST, false, false,
2700*cfb92d14SAndroid Build Coastguard Worker                                            &Interpreter::HandleActiveScanResult, this));
2701*cfb92d14SAndroid Build Coastguard Worker 
2702*cfb92d14SAndroid Build Coastguard Worker     static const char *const kScanTableTitles[] = {
2703*cfb92d14SAndroid Build Coastguard Worker         "Network Name", "Extended PAN", "PAN", "MAC Address", "Ch", "dBm", "LQI",
2704*cfb92d14SAndroid Build Coastguard Worker     };
2705*cfb92d14SAndroid Build Coastguard Worker 
2706*cfb92d14SAndroid Build Coastguard Worker     static const uint8_t kScanTableColumnWidths[] = {
2707*cfb92d14SAndroid Build Coastguard Worker         18, 18, 6, 18, 4, 5, 5,
2708*cfb92d14SAndroid Build Coastguard Worker     };
2709*cfb92d14SAndroid Build Coastguard Worker 
2710*cfb92d14SAndroid Build Coastguard Worker     OutputTableHeader(kScanTableTitles, kScanTableColumnWidths);
2711*cfb92d14SAndroid Build Coastguard Worker 
2712*cfb92d14SAndroid Build Coastguard Worker     error = OT_ERROR_PENDING;
2713*cfb92d14SAndroid Build Coastguard Worker 
2714*cfb92d14SAndroid Build Coastguard Worker exit:
2715*cfb92d14SAndroid Build Coastguard Worker     return error;
2716*cfb92d14SAndroid Build Coastguard Worker }
2717*cfb92d14SAndroid Build Coastguard Worker 
2718*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CLI_DNS_ENABLE
Process(Arg aArgs[])2719*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("dns")>(Arg aArgs[]) { return mDns.Process(aArgs); }
2720*cfb92d14SAndroid Build Coastguard Worker #endif
2721*cfb92d14SAndroid Build Coastguard Worker 
2722*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MULTICAST_DNS_ENABLE && OPENTHREAD_CONFIG_MULTICAST_DNS_PUBLIC_API_ENABLE
Process(Arg aArgs[])2723*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("mdns")>(Arg aArgs[]) { return mMdns.Process(aArgs); }
2724*cfb92d14SAndroid Build Coastguard Worker #endif
2725*cfb92d14SAndroid Build Coastguard Worker 
2726*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
OutputEidCacheEntry(const otCacheEntryInfo & aEntry)2727*cfb92d14SAndroid Build Coastguard Worker void Interpreter::OutputEidCacheEntry(const otCacheEntryInfo &aEntry)
2728*cfb92d14SAndroid Build Coastguard Worker {
2729*cfb92d14SAndroid Build Coastguard Worker     static const char *const kStateStrings[] = {
2730*cfb92d14SAndroid Build Coastguard Worker         "cache", // (0) OT_CACHE_ENTRY_STATE_CACHED
2731*cfb92d14SAndroid Build Coastguard Worker         "snoop", // (1) OT_CACHE_ENTRY_STATE_SNOOPED
2732*cfb92d14SAndroid Build Coastguard Worker         "query", // (2) OT_CACHE_ENTRY_STATE_QUERY
2733*cfb92d14SAndroid Build Coastguard Worker         "retry", // (3) OT_CACHE_ENTRY_STATE_RETRY_QUERY
2734*cfb92d14SAndroid Build Coastguard Worker     };
2735*cfb92d14SAndroid Build Coastguard Worker 
2736*cfb92d14SAndroid Build Coastguard Worker     static_assert(0 == OT_CACHE_ENTRY_STATE_CACHED, "OT_CACHE_ENTRY_STATE_CACHED value is incorrect");
2737*cfb92d14SAndroid Build Coastguard Worker     static_assert(1 == OT_CACHE_ENTRY_STATE_SNOOPED, "OT_CACHE_ENTRY_STATE_SNOOPED value is incorrect");
2738*cfb92d14SAndroid Build Coastguard Worker     static_assert(2 == OT_CACHE_ENTRY_STATE_QUERY, "OT_CACHE_ENTRY_STATE_QUERY value is incorrect");
2739*cfb92d14SAndroid Build Coastguard Worker     static_assert(3 == OT_CACHE_ENTRY_STATE_RETRY_QUERY, "OT_CACHE_ENTRY_STATE_RETRY_QUERY value is incorrect");
2740*cfb92d14SAndroid Build Coastguard Worker 
2741*cfb92d14SAndroid Build Coastguard Worker     OutputIp6Address(aEntry.mTarget);
2742*cfb92d14SAndroid Build Coastguard Worker     OutputFormat(" %04x", aEntry.mRloc16);
2743*cfb92d14SAndroid Build Coastguard Worker     OutputFormat(" %s", Stringify(aEntry.mState, kStateStrings));
2744*cfb92d14SAndroid Build Coastguard Worker     OutputFormat(" canEvict=%d", aEntry.mCanEvict);
2745*cfb92d14SAndroid Build Coastguard Worker 
2746*cfb92d14SAndroid Build Coastguard Worker     if (aEntry.mState == OT_CACHE_ENTRY_STATE_CACHED)
2747*cfb92d14SAndroid Build Coastguard Worker     {
2748*cfb92d14SAndroid Build Coastguard Worker         if (aEntry.mValidLastTrans)
2749*cfb92d14SAndroid Build Coastguard Worker         {
2750*cfb92d14SAndroid Build Coastguard Worker             OutputFormat(" transTime=%lu eid=", ToUlong(aEntry.mLastTransTime));
2751*cfb92d14SAndroid Build Coastguard Worker             OutputIp6Address(aEntry.mMeshLocalEid);
2752*cfb92d14SAndroid Build Coastguard Worker         }
2753*cfb92d14SAndroid Build Coastguard Worker     }
2754*cfb92d14SAndroid Build Coastguard Worker     else
2755*cfb92d14SAndroid Build Coastguard Worker     {
2756*cfb92d14SAndroid Build Coastguard Worker         OutputFormat(" timeout=%u", aEntry.mTimeout);
2757*cfb92d14SAndroid Build Coastguard Worker     }
2758*cfb92d14SAndroid Build Coastguard Worker 
2759*cfb92d14SAndroid Build Coastguard Worker     if (aEntry.mState == OT_CACHE_ENTRY_STATE_RETRY_QUERY)
2760*cfb92d14SAndroid Build Coastguard Worker     {
2761*cfb92d14SAndroid Build Coastguard Worker         OutputFormat(" retryDelay=%u rampDown=%d", aEntry.mRetryDelay, aEntry.mRampDown);
2762*cfb92d14SAndroid Build Coastguard Worker     }
2763*cfb92d14SAndroid Build Coastguard Worker 
2764*cfb92d14SAndroid Build Coastguard Worker     OutputNewLine();
2765*cfb92d14SAndroid Build Coastguard Worker }
2766*cfb92d14SAndroid Build Coastguard Worker 
2767*cfb92d14SAndroid Build Coastguard Worker /**
2768*cfb92d14SAndroid Build Coastguard Worker  * @cli eidcache
2769*cfb92d14SAndroid Build Coastguard Worker  * @code
2770*cfb92d14SAndroid Build Coastguard Worker  * eidcache
2771*cfb92d14SAndroid Build Coastguard Worker  * fd49:caf4:a29f:dc0e:97fc:69dd:3c16:df7d 2000 cache canEvict=1 transTime=0 eid=fd49:caf4:a29f:dc0e:97fc:69dd:3c16:df7d
2772*cfb92d14SAndroid Build Coastguard Worker  * fd49:caf4:a29f:dc0e:97fc:69dd:3c16:df7f fffe retry canEvict=1 timeout=10 retryDelay=30
2773*cfb92d14SAndroid Build Coastguard Worker  * Done
2774*cfb92d14SAndroid Build Coastguard Worker  * @endcode
2775*cfb92d14SAndroid Build Coastguard Worker  * @par
2776*cfb92d14SAndroid Build Coastguard Worker  * Returns the EID-to-RLOC cache entries.
2777*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadGetNextCacheEntry
2778*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])2779*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("eidcache")>(Arg aArgs[])
2780*cfb92d14SAndroid Build Coastguard Worker {
2781*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aArgs);
2782*cfb92d14SAndroid Build Coastguard Worker 
2783*cfb92d14SAndroid Build Coastguard Worker     otCacheEntryIterator iterator;
2784*cfb92d14SAndroid Build Coastguard Worker     otCacheEntryInfo     entry;
2785*cfb92d14SAndroid Build Coastguard Worker 
2786*cfb92d14SAndroid Build Coastguard Worker     ClearAllBytes(iterator);
2787*cfb92d14SAndroid Build Coastguard Worker 
2788*cfb92d14SAndroid Build Coastguard Worker     while (true)
2789*cfb92d14SAndroid Build Coastguard Worker     {
2790*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(otThreadGetNextCacheEntry(GetInstancePtr(), &entry, &iterator));
2791*cfb92d14SAndroid Build Coastguard Worker         OutputEidCacheEntry(entry);
2792*cfb92d14SAndroid Build Coastguard Worker     }
2793*cfb92d14SAndroid Build Coastguard Worker 
2794*cfb92d14SAndroid Build Coastguard Worker exit:
2795*cfb92d14SAndroid Build Coastguard Worker     return OT_ERROR_NONE;
2796*cfb92d14SAndroid Build Coastguard Worker }
2797*cfb92d14SAndroid Build Coastguard Worker #endif
2798*cfb92d14SAndroid Build Coastguard Worker 
2799*cfb92d14SAndroid Build Coastguard Worker /**
2800*cfb92d14SAndroid Build Coastguard Worker  * @cli eui64
2801*cfb92d14SAndroid Build Coastguard Worker  * @code
2802*cfb92d14SAndroid Build Coastguard Worker  * eui64
2803*cfb92d14SAndroid Build Coastguard Worker  * 0615aae900124b00
2804*cfb92d14SAndroid Build Coastguard Worker  * Done
2805*cfb92d14SAndroid Build Coastguard Worker  * @endcode
2806*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
2807*cfb92d14SAndroid Build Coastguard Worker  * #otPlatRadioGetIeeeEui64
2808*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])2809*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("eui64")>(Arg aArgs[])
2810*cfb92d14SAndroid Build Coastguard Worker {
2811*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aArgs);
2812*cfb92d14SAndroid Build Coastguard Worker 
2813*cfb92d14SAndroid Build Coastguard Worker     otError      error = OT_ERROR_NONE;
2814*cfb92d14SAndroid Build Coastguard Worker     otExtAddress extAddress;
2815*cfb92d14SAndroid Build Coastguard Worker 
2816*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(aArgs[0].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
2817*cfb92d14SAndroid Build Coastguard Worker 
2818*cfb92d14SAndroid Build Coastguard Worker     otLinkGetFactoryAssignedIeeeEui64(GetInstancePtr(), &extAddress);
2819*cfb92d14SAndroid Build Coastguard Worker     OutputExtAddressLine(extAddress);
2820*cfb92d14SAndroid Build Coastguard Worker 
2821*cfb92d14SAndroid Build Coastguard Worker exit:
2822*cfb92d14SAndroid Build Coastguard Worker     return error;
2823*cfb92d14SAndroid Build Coastguard Worker }
2824*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])2825*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("extaddr")>(Arg aArgs[])
2826*cfb92d14SAndroid Build Coastguard Worker {
2827*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
2828*cfb92d14SAndroid Build Coastguard Worker 
2829*cfb92d14SAndroid Build Coastguard Worker     /**
2830*cfb92d14SAndroid Build Coastguard Worker      * @cli extaddr
2831*cfb92d14SAndroid Build Coastguard Worker      * @code
2832*cfb92d14SAndroid Build Coastguard Worker      * extaddr
2833*cfb92d14SAndroid Build Coastguard Worker      * dead00beef00cafe
2834*cfb92d14SAndroid Build Coastguard Worker      * Done
2835*cfb92d14SAndroid Build Coastguard Worker      * @endcode
2836*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
2837*cfb92d14SAndroid Build Coastguard Worker      * #otLinkGetExtendedAddress
2838*cfb92d14SAndroid Build Coastguard Worker      */
2839*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
2840*cfb92d14SAndroid Build Coastguard Worker     {
2841*cfb92d14SAndroid Build Coastguard Worker         OutputExtAddressLine(*otLinkGetExtendedAddress(GetInstancePtr()));
2842*cfb92d14SAndroid Build Coastguard Worker     }
2843*cfb92d14SAndroid Build Coastguard Worker     /**
2844*cfb92d14SAndroid Build Coastguard Worker      * @cli extaddr (set)
2845*cfb92d14SAndroid Build Coastguard Worker      * @code
2846*cfb92d14SAndroid Build Coastguard Worker      * extaddr dead00beef00cafe
2847*cfb92d14SAndroid Build Coastguard Worker      * dead00beef00cafe
2848*cfb92d14SAndroid Build Coastguard Worker      * Done
2849*cfb92d14SAndroid Build Coastguard Worker      * @endcode
2850*cfb92d14SAndroid Build Coastguard Worker      * @cparam extaddr @ca{extaddr}
2851*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
2852*cfb92d14SAndroid Build Coastguard Worker      * #otLinkSetExtendedAddress
2853*cfb92d14SAndroid Build Coastguard Worker      */
2854*cfb92d14SAndroid Build Coastguard Worker     else
2855*cfb92d14SAndroid Build Coastguard Worker     {
2856*cfb92d14SAndroid Build Coastguard Worker         otExtAddress extAddress;
2857*cfb92d14SAndroid Build Coastguard Worker 
2858*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[0].ParseAsHexString(extAddress.m8));
2859*cfb92d14SAndroid Build Coastguard Worker         error = otLinkSetExtendedAddress(GetInstancePtr(), &extAddress);
2860*cfb92d14SAndroid Build Coastguard Worker     }
2861*cfb92d14SAndroid Build Coastguard Worker 
2862*cfb92d14SAndroid Build Coastguard Worker exit:
2863*cfb92d14SAndroid Build Coastguard Worker     return error;
2864*cfb92d14SAndroid Build Coastguard Worker }
2865*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])2866*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("log")>(Arg aArgs[])
2867*cfb92d14SAndroid Build Coastguard Worker {
2868*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
2869*cfb92d14SAndroid Build Coastguard Worker 
2870*cfb92d14SAndroid Build Coastguard Worker     /**
2871*cfb92d14SAndroid Build Coastguard Worker      * @cli log level
2872*cfb92d14SAndroid Build Coastguard Worker      * @code
2873*cfb92d14SAndroid Build Coastguard Worker      * log level
2874*cfb92d14SAndroid Build Coastguard Worker      * 1
2875*cfb92d14SAndroid Build Coastguard Worker      * Done
2876*cfb92d14SAndroid Build Coastguard Worker      * @endcode
2877*cfb92d14SAndroid Build Coastguard Worker      * @par
2878*cfb92d14SAndroid Build Coastguard Worker      * Get the log level.
2879*cfb92d14SAndroid Build Coastguard Worker      * @sa otLoggingGetLevel
2880*cfb92d14SAndroid Build Coastguard Worker      */
2881*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "level")
2882*cfb92d14SAndroid Build Coastguard Worker     {
2883*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1].IsEmpty())
2884*cfb92d14SAndroid Build Coastguard Worker         {
2885*cfb92d14SAndroid Build Coastguard Worker             OutputLine("%d", otLoggingGetLevel());
2886*cfb92d14SAndroid Build Coastguard Worker         }
2887*cfb92d14SAndroid Build Coastguard Worker         else
2888*cfb92d14SAndroid Build Coastguard Worker         {
2889*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_LOG_LEVEL_DYNAMIC_ENABLE
2890*cfb92d14SAndroid Build Coastguard Worker             uint8_t level;
2891*cfb92d14SAndroid Build Coastguard Worker 
2892*cfb92d14SAndroid Build Coastguard Worker             /**
2893*cfb92d14SAndroid Build Coastguard Worker              * @cli log level (set)
2894*cfb92d14SAndroid Build Coastguard Worker              * @code
2895*cfb92d14SAndroid Build Coastguard Worker              * log level 4
2896*cfb92d14SAndroid Build Coastguard Worker              * Done
2897*cfb92d14SAndroid Build Coastguard Worker              * @endcode
2898*cfb92d14SAndroid Build Coastguard Worker              * @par api_copy
2899*cfb92d14SAndroid Build Coastguard Worker              * #otLoggingSetLevel
2900*cfb92d14SAndroid Build Coastguard Worker              * @cparam log level @ca{level}
2901*cfb92d14SAndroid Build Coastguard Worker              */
2902*cfb92d14SAndroid Build Coastguard Worker             VerifyOrExit(aArgs[2].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
2903*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = aArgs[1].ParseAsUint8(level));
2904*cfb92d14SAndroid Build Coastguard Worker             error = otLoggingSetLevel(static_cast<otLogLevel>(level));
2905*cfb92d14SAndroid Build Coastguard Worker #else
2906*cfb92d14SAndroid Build Coastguard Worker             error = OT_ERROR_INVALID_ARGS;
2907*cfb92d14SAndroid Build Coastguard Worker #endif
2908*cfb92d14SAndroid Build Coastguard Worker         }
2909*cfb92d14SAndroid Build Coastguard Worker     }
2910*cfb92d14SAndroid Build Coastguard Worker #if (OPENTHREAD_CONFIG_LOG_OUTPUT == OPENTHREAD_CONFIG_LOG_OUTPUT_DEBUG_UART) && OPENTHREAD_POSIX
2911*cfb92d14SAndroid Build Coastguard Worker     /**
2912*cfb92d14SAndroid Build Coastguard Worker      * @cli log filename
2913*cfb92d14SAndroid Build Coastguard Worker      * @par
2914*cfb92d14SAndroid Build Coastguard Worker      * Specifies filename to capture `otPlatLog()` messages, useful when debugging
2915*cfb92d14SAndroid Build Coastguard Worker      * automated test scripts on Linux when logging disrupts the automated test scripts.
2916*cfb92d14SAndroid Build Coastguard Worker      * @par
2917*cfb92d14SAndroid Build Coastguard Worker      * Requires `OPENTHREAD_CONFIG_LOG_OUTPUT == OPENTHREAD_CONFIG_LOG_OUTPUT_DEBUG_UART`
2918*cfb92d14SAndroid Build Coastguard Worker      * and `OPENTHREAD_POSIX`.
2919*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
2920*cfb92d14SAndroid Build Coastguard Worker      * #otPlatDebugUart_logfile
2921*cfb92d14SAndroid Build Coastguard Worker      * @cparam log filename @ca{filename}
2922*cfb92d14SAndroid Build Coastguard Worker      */
2923*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "filename")
2924*cfb92d14SAndroid Build Coastguard Worker     {
2925*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(!aArgs[1].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
2926*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otPlatDebugUart_logfile(aArgs[1].GetCString()));
2927*cfb92d14SAndroid Build Coastguard Worker     }
2928*cfb92d14SAndroid Build Coastguard Worker #endif
2929*cfb92d14SAndroid Build Coastguard Worker     else
2930*cfb92d14SAndroid Build Coastguard Worker     {
2931*cfb92d14SAndroid Build Coastguard Worker         ExitNow(error = OT_ERROR_INVALID_ARGS);
2932*cfb92d14SAndroid Build Coastguard Worker     }
2933*cfb92d14SAndroid Build Coastguard Worker 
2934*cfb92d14SAndroid Build Coastguard Worker exit:
2935*cfb92d14SAndroid Build Coastguard Worker     return error;
2936*cfb92d14SAndroid Build Coastguard Worker }
2937*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])2938*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("extpanid")>(Arg aArgs[])
2939*cfb92d14SAndroid Build Coastguard Worker {
2940*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
2941*cfb92d14SAndroid Build Coastguard Worker 
2942*cfb92d14SAndroid Build Coastguard Worker     /**
2943*cfb92d14SAndroid Build Coastguard Worker      * @cli extpanid
2944*cfb92d14SAndroid Build Coastguard Worker      * @code
2945*cfb92d14SAndroid Build Coastguard Worker      * extpanid
2946*cfb92d14SAndroid Build Coastguard Worker      * dead00beef00cafe
2947*cfb92d14SAndroid Build Coastguard Worker      * Done
2948*cfb92d14SAndroid Build Coastguard Worker      * @endcode
2949*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
2950*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetExtendedPanId
2951*cfb92d14SAndroid Build Coastguard Worker      */
2952*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
2953*cfb92d14SAndroid Build Coastguard Worker     {
2954*cfb92d14SAndroid Build Coastguard Worker         OutputBytesLine(otThreadGetExtendedPanId(GetInstancePtr())->m8);
2955*cfb92d14SAndroid Build Coastguard Worker     }
2956*cfb92d14SAndroid Build Coastguard Worker     /**
2957*cfb92d14SAndroid Build Coastguard Worker      * @cli extpanid (set)
2958*cfb92d14SAndroid Build Coastguard Worker      * @code
2959*cfb92d14SAndroid Build Coastguard Worker      * extpanid dead00beef00cafe
2960*cfb92d14SAndroid Build Coastguard Worker      * Done
2961*cfb92d14SAndroid Build Coastguard Worker      * @endcode
2962*cfb92d14SAndroid Build Coastguard Worker      * @cparam extpanid @ca{extpanid}
2963*cfb92d14SAndroid Build Coastguard Worker      * @par
2964*cfb92d14SAndroid Build Coastguard Worker      * @note The current commissioning credential becomes stale after changing this value.
2965*cfb92d14SAndroid Build Coastguard Worker      * Use `pskc` to reset.
2966*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
2967*cfb92d14SAndroid Build Coastguard Worker      * #otThreadSetExtendedPanId
2968*cfb92d14SAndroid Build Coastguard Worker      */
2969*cfb92d14SAndroid Build Coastguard Worker     else
2970*cfb92d14SAndroid Build Coastguard Worker     {
2971*cfb92d14SAndroid Build Coastguard Worker         otExtendedPanId extPanId;
2972*cfb92d14SAndroid Build Coastguard Worker 
2973*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[0].ParseAsHexString(extPanId.m8));
2974*cfb92d14SAndroid Build Coastguard Worker         error = otThreadSetExtendedPanId(GetInstancePtr(), &extPanId);
2975*cfb92d14SAndroid Build Coastguard Worker     }
2976*cfb92d14SAndroid Build Coastguard Worker 
2977*cfb92d14SAndroid Build Coastguard Worker exit:
2978*cfb92d14SAndroid Build Coastguard Worker     return error;
2979*cfb92d14SAndroid Build Coastguard Worker }
2980*cfb92d14SAndroid Build Coastguard Worker 
2981*cfb92d14SAndroid Build Coastguard Worker /**
2982*cfb92d14SAndroid Build Coastguard Worker  * @cli factoryreset
2983*cfb92d14SAndroid Build Coastguard Worker  * @code
2984*cfb92d14SAndroid Build Coastguard Worker  * factoryreset
2985*cfb92d14SAndroid Build Coastguard Worker  * @endcode
2986*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
2987*cfb92d14SAndroid Build Coastguard Worker  * #otInstanceFactoryReset
2988*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])2989*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("factoryreset")>(Arg aArgs[])
2990*cfb92d14SAndroid Build Coastguard Worker {
2991*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aArgs);
2992*cfb92d14SAndroid Build Coastguard Worker 
2993*cfb92d14SAndroid Build Coastguard Worker     otInstanceFactoryReset(GetInstancePtr());
2994*cfb92d14SAndroid Build Coastguard Worker 
2995*cfb92d14SAndroid Build Coastguard Worker     return OT_ERROR_NONE;
2996*cfb92d14SAndroid Build Coastguard Worker }
2997*cfb92d14SAndroid Build Coastguard Worker 
2998*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
Process(Arg aArgs[])2999*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("fake")>(Arg aArgs[])
3000*cfb92d14SAndroid Build Coastguard Worker {
3001*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_INVALID_COMMAND;
3002*cfb92d14SAndroid Build Coastguard Worker 
3003*cfb92d14SAndroid Build Coastguard Worker     /**
3004*cfb92d14SAndroid Build Coastguard Worker      * @cli fake (a,an)
3005*cfb92d14SAndroid Build Coastguard Worker      * @code
3006*cfb92d14SAndroid Build Coastguard Worker      * fake /a/an fdde:ad00:beef:0:0:ff:fe00:a800 fd00:7d03:7d03:7d03:55f2:bb6a:7a43:a03b 1111222233334444
3007*cfb92d14SAndroid Build Coastguard Worker      * Done
3008*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3009*cfb92d14SAndroid Build Coastguard Worker      * @cparam fake /a/an @ca{dst-ipaddr} @ca{target} @ca{meshLocalIid}
3010*cfb92d14SAndroid Build Coastguard Worker      * @par
3011*cfb92d14SAndroid Build Coastguard Worker      * Sends fake Thread messages.
3012*cfb92d14SAndroid Build Coastguard Worker      * @par
3013*cfb92d14SAndroid Build Coastguard Worker      * Available when `OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE` is enabled.
3014*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadSendAddressNotification
3015*cfb92d14SAndroid Build Coastguard Worker      */
3016*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "/a/an")
3017*cfb92d14SAndroid Build Coastguard Worker     {
3018*cfb92d14SAndroid Build Coastguard Worker         otIp6Address             destination, target;
3019*cfb92d14SAndroid Build Coastguard Worker         otIp6InterfaceIdentifier mlIid;
3020*cfb92d14SAndroid Build Coastguard Worker 
3021*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[1].ParseAsIp6Address(destination));
3022*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[2].ParseAsIp6Address(target));
3023*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[3].ParseAsHexString(mlIid.mFields.m8));
3024*cfb92d14SAndroid Build Coastguard Worker         otThreadSendAddressNotification(GetInstancePtr(), &destination, &target, &mlIid);
3025*cfb92d14SAndroid Build Coastguard Worker     }
3026*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE
3027*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "/b/ba")
3028*cfb92d14SAndroid Build Coastguard Worker     {
3029*cfb92d14SAndroid Build Coastguard Worker         otIp6Address             target;
3030*cfb92d14SAndroid Build Coastguard Worker         otIp6InterfaceIdentifier mlIid;
3031*cfb92d14SAndroid Build Coastguard Worker         uint32_t                 timeSinceLastTransaction;
3032*cfb92d14SAndroid Build Coastguard Worker 
3033*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[1].ParseAsIp6Address(target));
3034*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[2].ParseAsHexString(mlIid.mFields.m8));
3035*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[3].ParseAsUint32(timeSinceLastTransaction));
3036*cfb92d14SAndroid Build Coastguard Worker 
3037*cfb92d14SAndroid Build Coastguard Worker         error = otThreadSendProactiveBackboneNotification(GetInstancePtr(), &target, &mlIid, timeSinceLastTransaction);
3038*cfb92d14SAndroid Build Coastguard Worker     }
3039*cfb92d14SAndroid Build Coastguard Worker #endif
3040*cfb92d14SAndroid Build Coastguard Worker 
3041*cfb92d14SAndroid Build Coastguard Worker exit:
3042*cfb92d14SAndroid Build Coastguard Worker     return error;
3043*cfb92d14SAndroid Build Coastguard Worker }
3044*cfb92d14SAndroid Build Coastguard Worker #endif
3045*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])3046*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("fem")>(Arg aArgs[])
3047*cfb92d14SAndroid Build Coastguard Worker {
3048*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
3049*cfb92d14SAndroid Build Coastguard Worker 
3050*cfb92d14SAndroid Build Coastguard Worker     /**
3051*cfb92d14SAndroid Build Coastguard Worker      * @cli fem
3052*cfb92d14SAndroid Build Coastguard Worker      * @code
3053*cfb92d14SAndroid Build Coastguard Worker      * fem
3054*cfb92d14SAndroid Build Coastguard Worker      * LNA gain 11 dBm
3055*cfb92d14SAndroid Build Coastguard Worker      * Done
3056*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3057*cfb92d14SAndroid Build Coastguard Worker      * @par
3058*cfb92d14SAndroid Build Coastguard Worker      * Gets external FEM parameters.
3059*cfb92d14SAndroid Build Coastguard Worker      * @sa otPlatRadioGetFemLnaGain
3060*cfb92d14SAndroid Build Coastguard Worker      */
3061*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
3062*cfb92d14SAndroid Build Coastguard Worker     {
3063*cfb92d14SAndroid Build Coastguard Worker         int8_t lnaGain;
3064*cfb92d14SAndroid Build Coastguard Worker 
3065*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otPlatRadioGetFemLnaGain(GetInstancePtr(), &lnaGain));
3066*cfb92d14SAndroid Build Coastguard Worker         OutputLine("LNA gain %d dBm", lnaGain);
3067*cfb92d14SAndroid Build Coastguard Worker     }
3068*cfb92d14SAndroid Build Coastguard Worker     /**
3069*cfb92d14SAndroid Build Coastguard Worker      * @cli fem lnagain (get)
3070*cfb92d14SAndroid Build Coastguard Worker      * @code
3071*cfb92d14SAndroid Build Coastguard Worker      * fem lnagain
3072*cfb92d14SAndroid Build Coastguard Worker      * 11
3073*cfb92d14SAndroid Build Coastguard Worker      * Done
3074*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3075*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3076*cfb92d14SAndroid Build Coastguard Worker      * #otPlatRadioGetFemLnaGain
3077*cfb92d14SAndroid Build Coastguard Worker      */
3078*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "lnagain")
3079*cfb92d14SAndroid Build Coastguard Worker     {
3080*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1].IsEmpty())
3081*cfb92d14SAndroid Build Coastguard Worker         {
3082*cfb92d14SAndroid Build Coastguard Worker             int8_t lnaGain;
3083*cfb92d14SAndroid Build Coastguard Worker 
3084*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = otPlatRadioGetFemLnaGain(GetInstancePtr(), &lnaGain));
3085*cfb92d14SAndroid Build Coastguard Worker             OutputLine("%d", lnaGain);
3086*cfb92d14SAndroid Build Coastguard Worker         }
3087*cfb92d14SAndroid Build Coastguard Worker         /**
3088*cfb92d14SAndroid Build Coastguard Worker          * @cli fem lnagain (set)
3089*cfb92d14SAndroid Build Coastguard Worker          * @code
3090*cfb92d14SAndroid Build Coastguard Worker          * fem lnagain 8
3091*cfb92d14SAndroid Build Coastguard Worker          * Done
3092*cfb92d14SAndroid Build Coastguard Worker          * @endcode
3093*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
3094*cfb92d14SAndroid Build Coastguard Worker          * #otPlatRadioSetFemLnaGain
3095*cfb92d14SAndroid Build Coastguard Worker          */
3096*cfb92d14SAndroid Build Coastguard Worker         else
3097*cfb92d14SAndroid Build Coastguard Worker         {
3098*cfb92d14SAndroid Build Coastguard Worker             int8_t lnaGain;
3099*cfb92d14SAndroid Build Coastguard Worker 
3100*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = aArgs[1].ParseAsInt8(lnaGain));
3101*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = otPlatRadioSetFemLnaGain(GetInstancePtr(), lnaGain));
3102*cfb92d14SAndroid Build Coastguard Worker         }
3103*cfb92d14SAndroid Build Coastguard Worker     }
3104*cfb92d14SAndroid Build Coastguard Worker     else
3105*cfb92d14SAndroid Build Coastguard Worker     {
3106*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
3107*cfb92d14SAndroid Build Coastguard Worker     }
3108*cfb92d14SAndroid Build Coastguard Worker 
3109*cfb92d14SAndroid Build Coastguard Worker exit:
3110*cfb92d14SAndroid Build Coastguard Worker     return error;
3111*cfb92d14SAndroid Build Coastguard Worker }
3112*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])3113*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("ifconfig")>(Arg aArgs[])
3114*cfb92d14SAndroid Build Coastguard Worker {
3115*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
3116*cfb92d14SAndroid Build Coastguard Worker 
3117*cfb92d14SAndroid Build Coastguard Worker     /**
3118*cfb92d14SAndroid Build Coastguard Worker      * @cli ifconfig
3119*cfb92d14SAndroid Build Coastguard Worker      * @code
3120*cfb92d14SAndroid Build Coastguard Worker      * ifconfig
3121*cfb92d14SAndroid Build Coastguard Worker      * down
3122*cfb92d14SAndroid Build Coastguard Worker      * Done
3123*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3124*cfb92d14SAndroid Build Coastguard Worker      * @code
3125*cfb92d14SAndroid Build Coastguard Worker      * ifconfig
3126*cfb92d14SAndroid Build Coastguard Worker      * up
3127*cfb92d14SAndroid Build Coastguard Worker      * Done
3128*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3129*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3130*cfb92d14SAndroid Build Coastguard Worker      * #otIp6IsEnabled
3131*cfb92d14SAndroid Build Coastguard Worker      */
3132*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
3133*cfb92d14SAndroid Build Coastguard Worker     {
3134*cfb92d14SAndroid Build Coastguard Worker         if (otIp6IsEnabled(GetInstancePtr()))
3135*cfb92d14SAndroid Build Coastguard Worker         {
3136*cfb92d14SAndroid Build Coastguard Worker             OutputLine("up");
3137*cfb92d14SAndroid Build Coastguard Worker         }
3138*cfb92d14SAndroid Build Coastguard Worker         else
3139*cfb92d14SAndroid Build Coastguard Worker         {
3140*cfb92d14SAndroid Build Coastguard Worker             OutputLine("down");
3141*cfb92d14SAndroid Build Coastguard Worker         }
3142*cfb92d14SAndroid Build Coastguard Worker     }
3143*cfb92d14SAndroid Build Coastguard Worker     /**
3144*cfb92d14SAndroid Build Coastguard Worker      * @cli ifconfig (up,down)
3145*cfb92d14SAndroid Build Coastguard Worker      * @code
3146*cfb92d14SAndroid Build Coastguard Worker      * ifconfig up
3147*cfb92d14SAndroid Build Coastguard Worker      * Done
3148*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3149*cfb92d14SAndroid Build Coastguard Worker      * @code
3150*cfb92d14SAndroid Build Coastguard Worker      * ifconfig down
3151*cfb92d14SAndroid Build Coastguard Worker      * Done
3152*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3153*cfb92d14SAndroid Build Coastguard Worker      * @cparam ifconfig @ca{up|down}
3154*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3155*cfb92d14SAndroid Build Coastguard Worker      * #otIp6SetEnabled
3156*cfb92d14SAndroid Build Coastguard Worker      */
3157*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "up")
3158*cfb92d14SAndroid Build Coastguard Worker     {
3159*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otIp6SetEnabled(GetInstancePtr(), true));
3160*cfb92d14SAndroid Build Coastguard Worker     }
3161*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "down")
3162*cfb92d14SAndroid Build Coastguard Worker     {
3163*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otIp6SetEnabled(GetInstancePtr(), false));
3164*cfb92d14SAndroid Build Coastguard Worker     }
3165*cfb92d14SAndroid Build Coastguard Worker     else
3166*cfb92d14SAndroid Build Coastguard Worker     {
3167*cfb92d14SAndroid Build Coastguard Worker         ExitNow(error = OT_ERROR_INVALID_ARGS);
3168*cfb92d14SAndroid Build Coastguard Worker     }
3169*cfb92d14SAndroid Build Coastguard Worker 
3170*cfb92d14SAndroid Build Coastguard Worker exit:
3171*cfb92d14SAndroid Build Coastguard Worker     return error;
3172*cfb92d14SAndroid Build Coastguard Worker }
3173*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])3174*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("instanceid")>(Arg aArgs[])
3175*cfb92d14SAndroid Build Coastguard Worker {
3176*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_INVALID_ARGS;
3177*cfb92d14SAndroid Build Coastguard Worker 
3178*cfb92d14SAndroid Build Coastguard Worker     /**
3179*cfb92d14SAndroid Build Coastguard Worker      * @cli instanceid
3180*cfb92d14SAndroid Build Coastguard Worker      * @code
3181*cfb92d14SAndroid Build Coastguard Worker      * instanceid
3182*cfb92d14SAndroid Build Coastguard Worker      * 468697314
3183*cfb92d14SAndroid Build Coastguard Worker      * Done
3184*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3185*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3186*cfb92d14SAndroid Build Coastguard Worker      * #otInstanceGetId
3187*cfb92d14SAndroid Build Coastguard Worker      */
3188*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
3189*cfb92d14SAndroid Build Coastguard Worker     {
3190*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%lu", ToUlong(otInstanceGetId(GetInstancePtr())));
3191*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_NONE;
3192*cfb92d14SAndroid Build Coastguard Worker     }
3193*cfb92d14SAndroid Build Coastguard Worker 
3194*cfb92d14SAndroid Build Coastguard Worker     return error;
3195*cfb92d14SAndroid Build Coastguard Worker }
3196*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])3197*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("ipaddr")>(Arg aArgs[])
3198*cfb92d14SAndroid Build Coastguard Worker {
3199*cfb92d14SAndroid Build Coastguard Worker     otError error   = OT_ERROR_NONE;
3200*cfb92d14SAndroid Build Coastguard Worker     bool    verbose = false;
3201*cfb92d14SAndroid Build Coastguard Worker 
3202*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "-v")
3203*cfb92d14SAndroid Build Coastguard Worker     {
3204*cfb92d14SAndroid Build Coastguard Worker         aArgs++;
3205*cfb92d14SAndroid Build Coastguard Worker         verbose = true;
3206*cfb92d14SAndroid Build Coastguard Worker     }
3207*cfb92d14SAndroid Build Coastguard Worker 
3208*cfb92d14SAndroid Build Coastguard Worker     /**
3209*cfb92d14SAndroid Build Coastguard Worker      * @cli ipaddr
3210*cfb92d14SAndroid Build Coastguard Worker      * @code
3211*cfb92d14SAndroid Build Coastguard Worker      * ipaddr
3212*cfb92d14SAndroid Build Coastguard Worker      * fdde:ad00:beef:0:0:ff:fe00:0
3213*cfb92d14SAndroid Build Coastguard Worker      * fdde:ad00:beef:0:558:f56b:d688:799
3214*cfb92d14SAndroid Build Coastguard Worker      * fe80:0:0:0:f3d9:2a82:c8d8:fe43
3215*cfb92d14SAndroid Build Coastguard Worker      * Done
3216*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3217*cfb92d14SAndroid Build Coastguard Worker      * @code
3218*cfb92d14SAndroid Build Coastguard Worker      * ipaddr -v
3219*cfb92d14SAndroid Build Coastguard Worker      * fd5e:18fa:f4a5:b8:0:ff:fe00:fc00 origin:thread plen:64 preferred:0 valid:1
3220*cfb92d14SAndroid Build Coastguard Worker      * fd5e:18fa:f4a5:b8:0:ff:fe00:dc00 origin:thread plen:64 preferred:0 valid:1
3221*cfb92d14SAndroid Build Coastguard Worker      * fd5e:18fa:f4a5:b8:f8e:5d95:87a0:e82c origin:thread plen:64 preferred:0 valid:1
3222*cfb92d14SAndroid Build Coastguard Worker      * fe80:0:0:0:4891:b191:e277:8826 origin:thread plen:64 preferred:1 valid:1
3223*cfb92d14SAndroid Build Coastguard Worker      * Done
3224*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3225*cfb92d14SAndroid Build Coastguard Worker      * @cparam ipaddr [@ca{-v}]
3226*cfb92d14SAndroid Build Coastguard Worker      * Use `-v` to get more verbose information about the address:
3227*cfb92d14SAndroid Build Coastguard Worker      * - `origin`: can be `thread`, `slaac`, `dhcp6`, `manual` and indicates the origin of the address
3228*cfb92d14SAndroid Build Coastguard Worker      * - `plen`: prefix length
3229*cfb92d14SAndroid Build Coastguard Worker      * - `preferred`: preferred flag (boolean)
3230*cfb92d14SAndroid Build Coastguard Worker      * - `valid`: valid flag (boolean)
3231*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3232*cfb92d14SAndroid Build Coastguard Worker      * #otIp6GetUnicastAddresses
3233*cfb92d14SAndroid Build Coastguard Worker      */
3234*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
3235*cfb92d14SAndroid Build Coastguard Worker     {
3236*cfb92d14SAndroid Build Coastguard Worker         const otNetifAddress *unicastAddrs = otIp6GetUnicastAddresses(GetInstancePtr());
3237*cfb92d14SAndroid Build Coastguard Worker 
3238*cfb92d14SAndroid Build Coastguard Worker         for (const otNetifAddress *addr = unicastAddrs; addr; addr = addr->mNext)
3239*cfb92d14SAndroid Build Coastguard Worker         {
3240*cfb92d14SAndroid Build Coastguard Worker             OutputIp6Address(addr->mAddress);
3241*cfb92d14SAndroid Build Coastguard Worker 
3242*cfb92d14SAndroid Build Coastguard Worker             if (verbose)
3243*cfb92d14SAndroid Build Coastguard Worker             {
3244*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat(" origin:%s plen:%u preferred:%u valid:%u", AddressOriginToString(addr->mAddressOrigin),
3245*cfb92d14SAndroid Build Coastguard Worker                              addr->mPrefixLength, addr->mPreferred, addr->mValid);
3246*cfb92d14SAndroid Build Coastguard Worker             }
3247*cfb92d14SAndroid Build Coastguard Worker 
3248*cfb92d14SAndroid Build Coastguard Worker             OutputNewLine();
3249*cfb92d14SAndroid Build Coastguard Worker         }
3250*cfb92d14SAndroid Build Coastguard Worker     }
3251*cfb92d14SAndroid Build Coastguard Worker     /**
3252*cfb92d14SAndroid Build Coastguard Worker      * @cli ipaddr add
3253*cfb92d14SAndroid Build Coastguard Worker      * @code
3254*cfb92d14SAndroid Build Coastguard Worker      * ipaddr add 2001::dead:beef:cafe
3255*cfb92d14SAndroid Build Coastguard Worker      * Done
3256*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3257*cfb92d14SAndroid Build Coastguard Worker      * @cparam ipaddr add @ca{aAddress}
3258*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3259*cfb92d14SAndroid Build Coastguard Worker      * #otIp6AddUnicastAddress
3260*cfb92d14SAndroid Build Coastguard Worker      */
3261*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "add")
3262*cfb92d14SAndroid Build Coastguard Worker     {
3263*cfb92d14SAndroid Build Coastguard Worker         otNetifAddress address;
3264*cfb92d14SAndroid Build Coastguard Worker 
3265*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[1].ParseAsIp6Address(address.mAddress));
3266*cfb92d14SAndroid Build Coastguard Worker         address.mPrefixLength  = 64;
3267*cfb92d14SAndroid Build Coastguard Worker         address.mPreferred     = true;
3268*cfb92d14SAndroid Build Coastguard Worker         address.mValid         = true;
3269*cfb92d14SAndroid Build Coastguard Worker         address.mAddressOrigin = OT_ADDRESS_ORIGIN_MANUAL;
3270*cfb92d14SAndroid Build Coastguard Worker 
3271*cfb92d14SAndroid Build Coastguard Worker         error = otIp6AddUnicastAddress(GetInstancePtr(), &address);
3272*cfb92d14SAndroid Build Coastguard Worker     }
3273*cfb92d14SAndroid Build Coastguard Worker     /**
3274*cfb92d14SAndroid Build Coastguard Worker      * @cli ipaddr del
3275*cfb92d14SAndroid Build Coastguard Worker      * @code
3276*cfb92d14SAndroid Build Coastguard Worker      * ipaddr del 2001::dead:beef:cafe
3277*cfb92d14SAndroid Build Coastguard Worker      * Done
3278*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3279*cfb92d14SAndroid Build Coastguard Worker      * @cparam ipaddr del @ca{aAddress}
3280*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3281*cfb92d14SAndroid Build Coastguard Worker      * #otIp6RemoveUnicastAddress
3282*cfb92d14SAndroid Build Coastguard Worker      */
3283*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "del")
3284*cfb92d14SAndroid Build Coastguard Worker     {
3285*cfb92d14SAndroid Build Coastguard Worker         otIp6Address address;
3286*cfb92d14SAndroid Build Coastguard Worker 
3287*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[1].ParseAsIp6Address(address));
3288*cfb92d14SAndroid Build Coastguard Worker         error = otIp6RemoveUnicastAddress(GetInstancePtr(), &address);
3289*cfb92d14SAndroid Build Coastguard Worker     }
3290*cfb92d14SAndroid Build Coastguard Worker     /**
3291*cfb92d14SAndroid Build Coastguard Worker      * @cli ipaddr linklocal
3292*cfb92d14SAndroid Build Coastguard Worker      * @code
3293*cfb92d14SAndroid Build Coastguard Worker      * ipaddr linklocal
3294*cfb92d14SAndroid Build Coastguard Worker      * fe80:0:0:0:f3d9:2a82:c8d8:fe43
3295*cfb92d14SAndroid Build Coastguard Worker      * Done
3296*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3297*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3298*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetLinkLocalIp6Address
3299*cfb92d14SAndroid Build Coastguard Worker      */
3300*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "linklocal")
3301*cfb92d14SAndroid Build Coastguard Worker     {
3302*cfb92d14SAndroid Build Coastguard Worker         OutputIp6AddressLine(*otThreadGetLinkLocalIp6Address(GetInstancePtr()));
3303*cfb92d14SAndroid Build Coastguard Worker     }
3304*cfb92d14SAndroid Build Coastguard Worker     /**
3305*cfb92d14SAndroid Build Coastguard Worker      * @cli ipaddr rloc
3306*cfb92d14SAndroid Build Coastguard Worker      * @code
3307*cfb92d14SAndroid Build Coastguard Worker      * ipaddr rloc
3308*cfb92d14SAndroid Build Coastguard Worker      * fdde:ad00:beef:0:0:ff:fe00:0
3309*cfb92d14SAndroid Build Coastguard Worker      * Done
3310*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3311*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3312*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetRloc
3313*cfb92d14SAndroid Build Coastguard Worker      */
3314*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "rloc")
3315*cfb92d14SAndroid Build Coastguard Worker     {
3316*cfb92d14SAndroid Build Coastguard Worker         OutputIp6AddressLine(*otThreadGetRloc(GetInstancePtr()));
3317*cfb92d14SAndroid Build Coastguard Worker     }
3318*cfb92d14SAndroid Build Coastguard Worker     /**
3319*cfb92d14SAndroid Build Coastguard Worker      * @cli ipaddr mleid
3320*cfb92d14SAndroid Build Coastguard Worker      * @code
3321*cfb92d14SAndroid Build Coastguard Worker      * ipaddr mleid
3322*cfb92d14SAndroid Build Coastguard Worker      * fdde:ad00:beef:0:558:f56b:d688:799
3323*cfb92d14SAndroid Build Coastguard Worker      * Done
3324*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3325*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3326*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetMeshLocalEid
3327*cfb92d14SAndroid Build Coastguard Worker      */
3328*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "mleid")
3329*cfb92d14SAndroid Build Coastguard Worker     {
3330*cfb92d14SAndroid Build Coastguard Worker         OutputIp6AddressLine(*otThreadGetMeshLocalEid(GetInstancePtr()));
3331*cfb92d14SAndroid Build Coastguard Worker     }
3332*cfb92d14SAndroid Build Coastguard Worker     else
3333*cfb92d14SAndroid Build Coastguard Worker     {
3334*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_COMMAND;
3335*cfb92d14SAndroid Build Coastguard Worker     }
3336*cfb92d14SAndroid Build Coastguard Worker 
3337*cfb92d14SAndroid Build Coastguard Worker exit:
3338*cfb92d14SAndroid Build Coastguard Worker     return error;
3339*cfb92d14SAndroid Build Coastguard Worker }
3340*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])3341*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("ipmaddr")>(Arg aArgs[])
3342*cfb92d14SAndroid Build Coastguard Worker {
3343*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
3344*cfb92d14SAndroid Build Coastguard Worker 
3345*cfb92d14SAndroid Build Coastguard Worker     /**
3346*cfb92d14SAndroid Build Coastguard Worker      * @cli ipmaddr
3347*cfb92d14SAndroid Build Coastguard Worker      * @code
3348*cfb92d14SAndroid Build Coastguard Worker      * ipmaddr
3349*cfb92d14SAndroid Build Coastguard Worker      * ff05:0:0:0:0:0:0:1
3350*cfb92d14SAndroid Build Coastguard Worker      * ff33:40:fdde:ad00:beef:0:0:1
3351*cfb92d14SAndroid Build Coastguard Worker      * ff32:40:fdde:ad00:beef:0:0:1
3352*cfb92d14SAndroid Build Coastguard Worker      * Done
3353*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3354*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3355*cfb92d14SAndroid Build Coastguard Worker      * #otIp6GetMulticastAddresses
3356*cfb92d14SAndroid Build Coastguard Worker      */
3357*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
3358*cfb92d14SAndroid Build Coastguard Worker     {
3359*cfb92d14SAndroid Build Coastguard Worker         for (const otNetifMulticastAddress *addr = otIp6GetMulticastAddresses(GetInstancePtr()); addr;
3360*cfb92d14SAndroid Build Coastguard Worker              addr                                = addr->mNext)
3361*cfb92d14SAndroid Build Coastguard Worker         {
3362*cfb92d14SAndroid Build Coastguard Worker             OutputIp6AddressLine(addr->mAddress);
3363*cfb92d14SAndroid Build Coastguard Worker         }
3364*cfb92d14SAndroid Build Coastguard Worker     }
3365*cfb92d14SAndroid Build Coastguard Worker     /**
3366*cfb92d14SAndroid Build Coastguard Worker      * @cli ipmaddr add
3367*cfb92d14SAndroid Build Coastguard Worker      * @code
3368*cfb92d14SAndroid Build Coastguard Worker      * ipmaddr add ff05::1
3369*cfb92d14SAndroid Build Coastguard Worker      * Done
3370*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3371*cfb92d14SAndroid Build Coastguard Worker      * @cparam ipmaddr add @ca{aAddress}
3372*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3373*cfb92d14SAndroid Build Coastguard Worker      * #otIp6SubscribeMulticastAddress
3374*cfb92d14SAndroid Build Coastguard Worker      */
3375*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "add")
3376*cfb92d14SAndroid Build Coastguard Worker     {
3377*cfb92d14SAndroid Build Coastguard Worker         otIp6Address address;
3378*cfb92d14SAndroid Build Coastguard Worker 
3379*cfb92d14SAndroid Build Coastguard Worker         aArgs++;
3380*cfb92d14SAndroid Build Coastguard Worker 
3381*cfb92d14SAndroid Build Coastguard Worker         do
3382*cfb92d14SAndroid Build Coastguard Worker         {
3383*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = aArgs->ParseAsIp6Address(address));
3384*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = otIp6SubscribeMulticastAddress(GetInstancePtr(), &address));
3385*cfb92d14SAndroid Build Coastguard Worker         }
3386*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
3387*cfb92d14SAndroid Build Coastguard Worker         while (!(++aArgs)->IsEmpty());
3388*cfb92d14SAndroid Build Coastguard Worker #else
3389*cfb92d14SAndroid Build Coastguard Worker         while (false);
3390*cfb92d14SAndroid Build Coastguard Worker #endif
3391*cfb92d14SAndroid Build Coastguard Worker     }
3392*cfb92d14SAndroid Build Coastguard Worker     /**
3393*cfb92d14SAndroid Build Coastguard Worker      * @cli ipmaddr del
3394*cfb92d14SAndroid Build Coastguard Worker      * @code
3395*cfb92d14SAndroid Build Coastguard Worker      * ipmaddr del ff05::1
3396*cfb92d14SAndroid Build Coastguard Worker      * Done
3397*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3398*cfb92d14SAndroid Build Coastguard Worker      * @cparam ipmaddr del @ca{aAddress}
3399*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3400*cfb92d14SAndroid Build Coastguard Worker      * #otIp6UnsubscribeMulticastAddress
3401*cfb92d14SAndroid Build Coastguard Worker      */
3402*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "del")
3403*cfb92d14SAndroid Build Coastguard Worker     {
3404*cfb92d14SAndroid Build Coastguard Worker         otIp6Address address;
3405*cfb92d14SAndroid Build Coastguard Worker 
3406*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[1].ParseAsIp6Address(address));
3407*cfb92d14SAndroid Build Coastguard Worker         error = otIp6UnsubscribeMulticastAddress(GetInstancePtr(), &address);
3408*cfb92d14SAndroid Build Coastguard Worker     }
3409*cfb92d14SAndroid Build Coastguard Worker     /**
3410*cfb92d14SAndroid Build Coastguard Worker      * @cli ipmaddr llatn
3411*cfb92d14SAndroid Build Coastguard Worker      * @code
3412*cfb92d14SAndroid Build Coastguard Worker      * ipmaddr llatn
3413*cfb92d14SAndroid Build Coastguard Worker      * ff32:40:fdde:ad00:beef:0:0:1
3414*cfb92d14SAndroid Build Coastguard Worker      * Done
3415*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3416*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3417*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetLinkLocalAllThreadNodesMulticastAddress
3418*cfb92d14SAndroid Build Coastguard Worker      */
3419*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "llatn")
3420*cfb92d14SAndroid Build Coastguard Worker     {
3421*cfb92d14SAndroid Build Coastguard Worker         OutputIp6AddressLine(*otThreadGetLinkLocalAllThreadNodesMulticastAddress(GetInstancePtr()));
3422*cfb92d14SAndroid Build Coastguard Worker     }
3423*cfb92d14SAndroid Build Coastguard Worker     /**
3424*cfb92d14SAndroid Build Coastguard Worker      * @cli ipmaddr rlatn
3425*cfb92d14SAndroid Build Coastguard Worker      * @code
3426*cfb92d14SAndroid Build Coastguard Worker      * ipmaddr rlatn
3427*cfb92d14SAndroid Build Coastguard Worker      * ff33:40:fdde:ad00:beef:0:0:1
3428*cfb92d14SAndroid Build Coastguard Worker      * Done
3429*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3430*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3431*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetRealmLocalAllThreadNodesMulticastAddress
3432*cfb92d14SAndroid Build Coastguard Worker      */
3433*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "rlatn")
3434*cfb92d14SAndroid Build Coastguard Worker     {
3435*cfb92d14SAndroid Build Coastguard Worker         OutputIp6AddressLine(*otThreadGetRealmLocalAllThreadNodesMulticastAddress(GetInstancePtr()));
3436*cfb92d14SAndroid Build Coastguard Worker     }
3437*cfb92d14SAndroid Build Coastguard Worker     else
3438*cfb92d14SAndroid Build Coastguard Worker     {
3439*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_COMMAND;
3440*cfb92d14SAndroid Build Coastguard Worker     }
3441*cfb92d14SAndroid Build Coastguard Worker 
3442*cfb92d14SAndroid Build Coastguard Worker exit:
3443*cfb92d14SAndroid Build Coastguard Worker     return error;
3444*cfb92d14SAndroid Build Coastguard Worker }
3445*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])3446*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("keysequence")>(Arg aArgs[])
3447*cfb92d14SAndroid Build Coastguard Worker {
3448*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_INVALID_ARGS;
3449*cfb92d14SAndroid Build Coastguard Worker 
3450*cfb92d14SAndroid Build Coastguard Worker     /**
3451*cfb92d14SAndroid Build Coastguard Worker      * @cli keysequence counter
3452*cfb92d14SAndroid Build Coastguard Worker      * @code
3453*cfb92d14SAndroid Build Coastguard Worker      * keysequence counter
3454*cfb92d14SAndroid Build Coastguard Worker      * 10
3455*cfb92d14SAndroid Build Coastguard Worker      * Done
3456*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3457*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3458*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetKeySequenceCounter
3459*cfb92d14SAndroid Build Coastguard Worker      */
3460*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "counter")
3461*cfb92d14SAndroid Build Coastguard Worker     {
3462*cfb92d14SAndroid Build Coastguard Worker         /**
3463*cfb92d14SAndroid Build Coastguard Worker          * @cli keysequence counter (set)
3464*cfb92d14SAndroid Build Coastguard Worker          * @code
3465*cfb92d14SAndroid Build Coastguard Worker          * keysequence counter 10
3466*cfb92d14SAndroid Build Coastguard Worker          * Done
3467*cfb92d14SAndroid Build Coastguard Worker          * @endcode
3468*cfb92d14SAndroid Build Coastguard Worker          * @cparam keysequence counter @ca{counter}
3469*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
3470*cfb92d14SAndroid Build Coastguard Worker          * #otThreadSetKeySequenceCounter
3471*cfb92d14SAndroid Build Coastguard Worker          */
3472*cfb92d14SAndroid Build Coastguard Worker         error = ProcessGetSet(aArgs + 1, otThreadGetKeySequenceCounter, otThreadSetKeySequenceCounter);
3473*cfb92d14SAndroid Build Coastguard Worker     }
3474*cfb92d14SAndroid Build Coastguard Worker     /**
3475*cfb92d14SAndroid Build Coastguard Worker      * @cli keysequence guardtime
3476*cfb92d14SAndroid Build Coastguard Worker      * @code
3477*cfb92d14SAndroid Build Coastguard Worker      * keysequence guardtime
3478*cfb92d14SAndroid Build Coastguard Worker      * 0
3479*cfb92d14SAndroid Build Coastguard Worker      * Done
3480*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3481*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3482*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetKeySwitchGuardTime
3483*cfb92d14SAndroid Build Coastguard Worker      */
3484*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "guardtime")
3485*cfb92d14SAndroid Build Coastguard Worker     {
3486*cfb92d14SAndroid Build Coastguard Worker         /**
3487*cfb92d14SAndroid Build Coastguard Worker          * @cli keysequence guardtime (set)
3488*cfb92d14SAndroid Build Coastguard Worker          * @code
3489*cfb92d14SAndroid Build Coastguard Worker          * keysequence guardtime 0
3490*cfb92d14SAndroid Build Coastguard Worker          * Done
3491*cfb92d14SAndroid Build Coastguard Worker          * @endcode
3492*cfb92d14SAndroid Build Coastguard Worker          * @cparam keysequence guardtime @ca{guardtime-hours}
3493*cfb92d14SAndroid Build Coastguard Worker          * Use `0` to `Thread Key Switch` immediately if there's a key index match.
3494*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
3495*cfb92d14SAndroid Build Coastguard Worker          * #otThreadSetKeySwitchGuardTime
3496*cfb92d14SAndroid Build Coastguard Worker          */
3497*cfb92d14SAndroid Build Coastguard Worker         error = ProcessGetSet(aArgs + 1, otThreadGetKeySwitchGuardTime, otThreadSetKeySwitchGuardTime);
3498*cfb92d14SAndroid Build Coastguard Worker     }
3499*cfb92d14SAndroid Build Coastguard Worker 
3500*cfb92d14SAndroid Build Coastguard Worker     return error;
3501*cfb92d14SAndroid Build Coastguard Worker }
3502*cfb92d14SAndroid Build Coastguard Worker 
3503*cfb92d14SAndroid Build Coastguard Worker /**
3504*cfb92d14SAndroid Build Coastguard Worker  * @cli leaderdata
3505*cfb92d14SAndroid Build Coastguard Worker  * @code
3506*cfb92d14SAndroid Build Coastguard Worker  * leaderdata
3507*cfb92d14SAndroid Build Coastguard Worker  * Partition ID: 1077744240
3508*cfb92d14SAndroid Build Coastguard Worker  * Weighting: 64
3509*cfb92d14SAndroid Build Coastguard Worker  * Data Version: 109
3510*cfb92d14SAndroid Build Coastguard Worker  * Stable Data Version: 211
3511*cfb92d14SAndroid Build Coastguard Worker  * Leader Router ID: 60
3512*cfb92d14SAndroid Build Coastguard Worker  * Done
3513*cfb92d14SAndroid Build Coastguard Worker  * @endcode
3514*cfb92d14SAndroid Build Coastguard Worker  * @par
3515*cfb92d14SAndroid Build Coastguard Worker  * Gets the Thread Leader Data.
3516*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadGetLeaderData
3517*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])3518*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("leaderdata")>(Arg aArgs[])
3519*cfb92d14SAndroid Build Coastguard Worker {
3520*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aArgs);
3521*cfb92d14SAndroid Build Coastguard Worker 
3522*cfb92d14SAndroid Build Coastguard Worker     otError      error;
3523*cfb92d14SAndroid Build Coastguard Worker     otLeaderData leaderData;
3524*cfb92d14SAndroid Build Coastguard Worker 
3525*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = otThreadGetLeaderData(GetInstancePtr(), &leaderData));
3526*cfb92d14SAndroid Build Coastguard Worker 
3527*cfb92d14SAndroid Build Coastguard Worker     OutputLine("Partition ID: %lu", ToUlong(leaderData.mPartitionId));
3528*cfb92d14SAndroid Build Coastguard Worker     OutputLine("Weighting: %u", leaderData.mWeighting);
3529*cfb92d14SAndroid Build Coastguard Worker     OutputLine("Data Version: %u", leaderData.mDataVersion);
3530*cfb92d14SAndroid Build Coastguard Worker     OutputLine("Stable Data Version: %u", leaderData.mStableDataVersion);
3531*cfb92d14SAndroid Build Coastguard Worker     OutputLine("Leader Router ID: %u", leaderData.mLeaderRouterId);
3532*cfb92d14SAndroid Build Coastguard Worker 
3533*cfb92d14SAndroid Build Coastguard Worker exit:
3534*cfb92d14SAndroid Build Coastguard Worker     return error;
3535*cfb92d14SAndroid Build Coastguard Worker }
3536*cfb92d14SAndroid Build Coastguard Worker 
3537*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
Process(Arg aArgs[])3538*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("partitionid")>(Arg aArgs[])
3539*cfb92d14SAndroid Build Coastguard Worker {
3540*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_INVALID_COMMAND;
3541*cfb92d14SAndroid Build Coastguard Worker 
3542*cfb92d14SAndroid Build Coastguard Worker     /**
3543*cfb92d14SAndroid Build Coastguard Worker      * @cli partitionid
3544*cfb92d14SAndroid Build Coastguard Worker      * @code
3545*cfb92d14SAndroid Build Coastguard Worker      * partitionid
3546*cfb92d14SAndroid Build Coastguard Worker      * 4294967295
3547*cfb92d14SAndroid Build Coastguard Worker      * Done
3548*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3549*cfb92d14SAndroid Build Coastguard Worker      * @par
3550*cfb92d14SAndroid Build Coastguard Worker      * Get the Thread Network Partition ID.
3551*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadGetPartitionId
3552*cfb92d14SAndroid Build Coastguard Worker      */
3553*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
3554*cfb92d14SAndroid Build Coastguard Worker     {
3555*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%lu", ToUlong(otThreadGetPartitionId(GetInstancePtr())));
3556*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_NONE;
3557*cfb92d14SAndroid Build Coastguard Worker     }
3558*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
3559*cfb92d14SAndroid Build Coastguard Worker     /**
3560*cfb92d14SAndroid Build Coastguard Worker      * @cli partitionid preferred (get,set)
3561*cfb92d14SAndroid Build Coastguard Worker      * @code
3562*cfb92d14SAndroid Build Coastguard Worker      * partitionid preferred
3563*cfb92d14SAndroid Build Coastguard Worker      * 4294967295
3564*cfb92d14SAndroid Build Coastguard Worker      * Done
3565*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3566*cfb92d14SAndroid Build Coastguard Worker      * @code
3567*cfb92d14SAndroid Build Coastguard Worker      * partitionid preferred 0xffffffff
3568*cfb92d14SAndroid Build Coastguard Worker      * Done
3569*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3570*cfb92d14SAndroid Build Coastguard Worker      * @cparam partitionid preferred @ca{partitionid}
3571*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadGetPreferredLeaderPartitionId
3572*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadSetPreferredLeaderPartitionId
3573*cfb92d14SAndroid Build Coastguard Worker      * @par
3574*cfb92d14SAndroid Build Coastguard Worker      * `OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE` is required.
3575*cfb92d14SAndroid Build Coastguard Worker      */
3576*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "preferred")
3577*cfb92d14SAndroid Build Coastguard Worker     {
3578*cfb92d14SAndroid Build Coastguard Worker         error = ProcessGetSet(aArgs + 1, otThreadGetPreferredLeaderPartitionId, otThreadSetPreferredLeaderPartitionId);
3579*cfb92d14SAndroid Build Coastguard Worker     }
3580*cfb92d14SAndroid Build Coastguard Worker #endif
3581*cfb92d14SAndroid Build Coastguard Worker 
3582*cfb92d14SAndroid Build Coastguard Worker     return error;
3583*cfb92d14SAndroid Build Coastguard Worker }
3584*cfb92d14SAndroid Build Coastguard Worker 
3585*cfb92d14SAndroid Build Coastguard Worker /**
3586*cfb92d14SAndroid Build Coastguard Worker  * @cli leaderweight
3587*cfb92d14SAndroid Build Coastguard Worker  * @code
3588*cfb92d14SAndroid Build Coastguard Worker  * leaderweight
3589*cfb92d14SAndroid Build Coastguard Worker  * 128
3590*cfb92d14SAndroid Build Coastguard Worker  * Done
3591*cfb92d14SAndroid Build Coastguard Worker  * @endcode
3592*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
3593*cfb92d14SAndroid Build Coastguard Worker  * #otThreadGetLocalLeaderWeight
3594*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])3595*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("leaderweight")>(Arg aArgs[])
3596*cfb92d14SAndroid Build Coastguard Worker {
3597*cfb92d14SAndroid Build Coastguard Worker     /**
3598*cfb92d14SAndroid Build Coastguard Worker      * @cli leaderweight (set)
3599*cfb92d14SAndroid Build Coastguard Worker      * @code
3600*cfb92d14SAndroid Build Coastguard Worker      * leaderweight 128
3601*cfb92d14SAndroid Build Coastguard Worker      * Done
3602*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3603*cfb92d14SAndroid Build Coastguard Worker      * @cparam leaderweight @ca{weight}
3604*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3605*cfb92d14SAndroid Build Coastguard Worker      * #otThreadSetLocalLeaderWeight
3606*cfb92d14SAndroid Build Coastguard Worker      */
3607*cfb92d14SAndroid Build Coastguard Worker     return ProcessGetSet(aArgs, otThreadGetLocalLeaderWeight, otThreadSetLocalLeaderWeight);
3608*cfb92d14SAndroid Build Coastguard Worker }
3609*cfb92d14SAndroid Build Coastguard Worker 
3610*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MLE_DEVICE_PROPERTY_LEADER_WEIGHT_ENABLE
Process(Arg aArgs[])3611*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("deviceprops")>(Arg aArgs[])
3612*cfb92d14SAndroid Build Coastguard Worker {
3613*cfb92d14SAndroid Build Coastguard Worker     static const char *const kPowerSupplyStrings[4] = {
3614*cfb92d14SAndroid Build Coastguard Worker         "battery",           // (0) OT_POWER_SUPPLY_BATTERY
3615*cfb92d14SAndroid Build Coastguard Worker         "external",          // (1) OT_POWER_SUPPLY_EXTERNAL
3616*cfb92d14SAndroid Build Coastguard Worker         "external-stable",   // (2) OT_POWER_SUPPLY_EXTERNAL_STABLE
3617*cfb92d14SAndroid Build Coastguard Worker         "external-unstable", // (3) OT_POWER_SUPPLY_EXTERNAL_UNSTABLE
3618*cfb92d14SAndroid Build Coastguard Worker     };
3619*cfb92d14SAndroid Build Coastguard Worker 
3620*cfb92d14SAndroid Build Coastguard Worker     static_assert(0 == OT_POWER_SUPPLY_BATTERY, "OT_POWER_SUPPLY_BATTERY value is incorrect");
3621*cfb92d14SAndroid Build Coastguard Worker     static_assert(1 == OT_POWER_SUPPLY_EXTERNAL, "OT_POWER_SUPPLY_EXTERNAL value is incorrect");
3622*cfb92d14SAndroid Build Coastguard Worker     static_assert(2 == OT_POWER_SUPPLY_EXTERNAL_STABLE, "OT_POWER_SUPPLY_EXTERNAL_STABLE value is incorrect");
3623*cfb92d14SAndroid Build Coastguard Worker     static_assert(3 == OT_POWER_SUPPLY_EXTERNAL_UNSTABLE, "OT_POWER_SUPPLY_EXTERNAL_UNSTABLE value is incorrect");
3624*cfb92d14SAndroid Build Coastguard Worker 
3625*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
3626*cfb92d14SAndroid Build Coastguard Worker 
3627*cfb92d14SAndroid Build Coastguard Worker     /**
3628*cfb92d14SAndroid Build Coastguard Worker      * @cli deviceprops
3629*cfb92d14SAndroid Build Coastguard Worker      * @code
3630*cfb92d14SAndroid Build Coastguard Worker      * deviceprops
3631*cfb92d14SAndroid Build Coastguard Worker      * PowerSupply      : external
3632*cfb92d14SAndroid Build Coastguard Worker      * IsBorderRouter   : yes
3633*cfb92d14SAndroid Build Coastguard Worker      * SupportsCcm      : no
3634*cfb92d14SAndroid Build Coastguard Worker      * IsUnstable       : no
3635*cfb92d14SAndroid Build Coastguard Worker      * WeightAdjustment : 0
3636*cfb92d14SAndroid Build Coastguard Worker      * Done
3637*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3638*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3639*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetDeviceProperties
3640*cfb92d14SAndroid Build Coastguard Worker      */
3641*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
3642*cfb92d14SAndroid Build Coastguard Worker     {
3643*cfb92d14SAndroid Build Coastguard Worker         const otDeviceProperties *props = otThreadGetDeviceProperties(GetInstancePtr());
3644*cfb92d14SAndroid Build Coastguard Worker 
3645*cfb92d14SAndroid Build Coastguard Worker         OutputLine("PowerSupply      : %s", Stringify(props->mPowerSupply, kPowerSupplyStrings));
3646*cfb92d14SAndroid Build Coastguard Worker         OutputLine("IsBorderRouter   : %s", props->mIsBorderRouter ? "yes" : "no");
3647*cfb92d14SAndroid Build Coastguard Worker         OutputLine("SupportsCcm      : %s", props->mSupportsCcm ? "yes" : "no");
3648*cfb92d14SAndroid Build Coastguard Worker         OutputLine("IsUnstable       : %s", props->mIsUnstable ? "yes" : "no");
3649*cfb92d14SAndroid Build Coastguard Worker         OutputLine("WeightAdjustment : %d", props->mLeaderWeightAdjustment);
3650*cfb92d14SAndroid Build Coastguard Worker     }
3651*cfb92d14SAndroid Build Coastguard Worker     /**
3652*cfb92d14SAndroid Build Coastguard Worker      * @cli deviceprops (set)
3653*cfb92d14SAndroid Build Coastguard Worker      * @code
3654*cfb92d14SAndroid Build Coastguard Worker      * deviceprops battery 0 0 0 -5
3655*cfb92d14SAndroid Build Coastguard Worker      * Done
3656*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3657*cfb92d14SAndroid Build Coastguard Worker      * @code
3658*cfb92d14SAndroid Build Coastguard Worker      * deviceprops
3659*cfb92d14SAndroid Build Coastguard Worker      * PowerSupply      : battery
3660*cfb92d14SAndroid Build Coastguard Worker      * IsBorderRouter   : no
3661*cfb92d14SAndroid Build Coastguard Worker      * SupportsCcm      : no
3662*cfb92d14SAndroid Build Coastguard Worker      * IsUnstable       : no
3663*cfb92d14SAndroid Build Coastguard Worker      * WeightAdjustment : -5
3664*cfb92d14SAndroid Build Coastguard Worker      * Done
3665*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3666*cfb92d14SAndroid Build Coastguard Worker      * @cparam deviceprops @ca{powerSupply} @ca{isBr} @ca{supportsCcm} @ca{isUnstable} @ca{weightAdjustment}
3667*cfb92d14SAndroid Build Coastguard Worker      * `powerSupply`: should be 'battery', 'external', 'external-stable', 'external-unstable'.
3668*cfb92d14SAndroid Build Coastguard Worker      * @par
3669*cfb92d14SAndroid Build Coastguard Worker      * Sets the device properties.
3670*cfb92d14SAndroid Build Coastguard Worker      * @csa{leaderweight}
3671*cfb92d14SAndroid Build Coastguard Worker      * @csa{leaderweight (set)}
3672*cfb92d14SAndroid Build Coastguard Worker      * @sa #otThreadSetDeviceProperties
3673*cfb92d14SAndroid Build Coastguard Worker      */
3674*cfb92d14SAndroid Build Coastguard Worker     else
3675*cfb92d14SAndroid Build Coastguard Worker     {
3676*cfb92d14SAndroid Build Coastguard Worker         otDeviceProperties props;
3677*cfb92d14SAndroid Build Coastguard Worker         bool               value;
3678*cfb92d14SAndroid Build Coastguard Worker         uint8_t            index;
3679*cfb92d14SAndroid Build Coastguard Worker 
3680*cfb92d14SAndroid Build Coastguard Worker         for (index = 0; index < OT_ARRAY_LENGTH(kPowerSupplyStrings); index++)
3681*cfb92d14SAndroid Build Coastguard Worker         {
3682*cfb92d14SAndroid Build Coastguard Worker             if (aArgs[0] == kPowerSupplyStrings[index])
3683*cfb92d14SAndroid Build Coastguard Worker             {
3684*cfb92d14SAndroid Build Coastguard Worker                 props.mPowerSupply = static_cast<otPowerSupply>(index);
3685*cfb92d14SAndroid Build Coastguard Worker                 break;
3686*cfb92d14SAndroid Build Coastguard Worker             }
3687*cfb92d14SAndroid Build Coastguard Worker         }
3688*cfb92d14SAndroid Build Coastguard Worker 
3689*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(index < OT_ARRAY_LENGTH(kPowerSupplyStrings), error = OT_ERROR_INVALID_ARGS);
3690*cfb92d14SAndroid Build Coastguard Worker 
3691*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[1].ParseAsBool(value));
3692*cfb92d14SAndroid Build Coastguard Worker         props.mIsBorderRouter = value;
3693*cfb92d14SAndroid Build Coastguard Worker 
3694*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[2].ParseAsBool(value));
3695*cfb92d14SAndroid Build Coastguard Worker         props.mSupportsCcm = value;
3696*cfb92d14SAndroid Build Coastguard Worker 
3697*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[3].ParseAsBool(value));
3698*cfb92d14SAndroid Build Coastguard Worker         props.mIsUnstable = value;
3699*cfb92d14SAndroid Build Coastguard Worker 
3700*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[4].ParseAsInt8(props.mLeaderWeightAdjustment));
3701*cfb92d14SAndroid Build Coastguard Worker 
3702*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(aArgs[5].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
3703*cfb92d14SAndroid Build Coastguard Worker         otThreadSetDeviceProperties(GetInstancePtr(), &props);
3704*cfb92d14SAndroid Build Coastguard Worker     }
3705*cfb92d14SAndroid Build Coastguard Worker 
3706*cfb92d14SAndroid Build Coastguard Worker exit:
3707*cfb92d14SAndroid Build Coastguard Worker     return error;
3708*cfb92d14SAndroid Build Coastguard Worker }
3709*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_MLE_DEVICE_PROPERTY_LEADER_WEIGHT_ENABLE
3710*cfb92d14SAndroid Build Coastguard Worker 
3711*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_FTD
3712*cfb92d14SAndroid Build Coastguard Worker 
3713*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE
3714*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])3715*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("linkmetrics")>(Arg aArgs[]) { return mLinkMetrics.Process(aArgs); }
3716*cfb92d14SAndroid Build Coastguard Worker 
3717*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_LINK_METRICS_MANAGER_ENABLE
Process(Arg aArgs[])3718*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("linkmetricsmgr")>(Arg aArgs[])
3719*cfb92d14SAndroid Build Coastguard Worker {
3720*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
3721*cfb92d14SAndroid Build Coastguard Worker 
3722*cfb92d14SAndroid Build Coastguard Worker     /**
3723*cfb92d14SAndroid Build Coastguard Worker      * @cli linkmetricsmgr (enable,disable)
3724*cfb92d14SAndroid Build Coastguard Worker      * @code
3725*cfb92d14SAndroid Build Coastguard Worker      * linkmetricmgr enable
3726*cfb92d14SAndroid Build Coastguard Worker      * Done
3727*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3728*cfb92d14SAndroid Build Coastguard Worker      * @code
3729*cfb92d14SAndroid Build Coastguard Worker      * linkmetricmgr disable
3730*cfb92d14SAndroid Build Coastguard Worker      * Done
3731*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3732*cfb92d14SAndroid Build Coastguard Worker      * @cparam linkmetricsmgr @ca{enable|disable}
3733*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3734*cfb92d14SAndroid Build Coastguard Worker      * #otLinkMetricsManagerSetEnabled
3735*cfb92d14SAndroid Build Coastguard Worker      *
3736*cfb92d14SAndroid Build Coastguard Worker      */
3737*cfb92d14SAndroid Build Coastguard Worker     if (ProcessEnableDisable(aArgs, otLinkMetricsManagerIsEnabled, otLinkMetricsManagerSetEnabled) == OT_ERROR_NONE)
3738*cfb92d14SAndroid Build Coastguard Worker     {
3739*cfb92d14SAndroid Build Coastguard Worker     }
3740*cfb92d14SAndroid Build Coastguard Worker     /**
3741*cfb92d14SAndroid Build Coastguard Worker      * @cli linkmetricsmgr show
3742*cfb92d14SAndroid Build Coastguard Worker      * @code
3743*cfb92d14SAndroid Build Coastguard Worker      * linkmetricsmgr show
3744*cfb92d14SAndroid Build Coastguard Worker      * ExtAddr:827aa7f7f63e1234, LinkMargin:80, Rssi:-20
3745*cfb92d14SAndroid Build Coastguard Worker      * Done
3746*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3747*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3748*cfb92d14SAndroid Build Coastguard Worker      * #otLinkMetricsManagerGetMetricsValueByExtAddr
3749*cfb92d14SAndroid Build Coastguard Worker      *
3750*cfb92d14SAndroid Build Coastguard Worker      */
3751*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "show")
3752*cfb92d14SAndroid Build Coastguard Worker     {
3753*cfb92d14SAndroid Build Coastguard Worker         otNeighborInfoIterator iterator = OT_NEIGHBOR_INFO_ITERATOR_INIT;
3754*cfb92d14SAndroid Build Coastguard Worker         otNeighborInfo         neighborInfo;
3755*cfb92d14SAndroid Build Coastguard Worker 
3756*cfb92d14SAndroid Build Coastguard Worker         while (otThreadGetNextNeighborInfo(GetInstancePtr(), &iterator, &neighborInfo) == OT_ERROR_NONE)
3757*cfb92d14SAndroid Build Coastguard Worker         {
3758*cfb92d14SAndroid Build Coastguard Worker             otLinkMetricsValues linkMetricsValues;
3759*cfb92d14SAndroid Build Coastguard Worker 
3760*cfb92d14SAndroid Build Coastguard Worker             if (otLinkMetricsManagerGetMetricsValueByExtAddr(GetInstancePtr(), &neighborInfo.mExtAddress,
3761*cfb92d14SAndroid Build Coastguard Worker                                                              &linkMetricsValues) != OT_ERROR_NONE)
3762*cfb92d14SAndroid Build Coastguard Worker             {
3763*cfb92d14SAndroid Build Coastguard Worker                 continue;
3764*cfb92d14SAndroid Build Coastguard Worker             }
3765*cfb92d14SAndroid Build Coastguard Worker 
3766*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("ExtAddr:");
3767*cfb92d14SAndroid Build Coastguard Worker             OutputExtAddress(neighborInfo.mExtAddress);
3768*cfb92d14SAndroid Build Coastguard Worker             OutputLine(", LinkMargin:%u, Rssi:%d", linkMetricsValues.mLinkMarginValue, linkMetricsValues.mRssiValue);
3769*cfb92d14SAndroid Build Coastguard Worker         }
3770*cfb92d14SAndroid Build Coastguard Worker     }
3771*cfb92d14SAndroid Build Coastguard Worker     else
3772*cfb92d14SAndroid Build Coastguard Worker     {
3773*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_COMMAND;
3774*cfb92d14SAndroid Build Coastguard Worker     }
3775*cfb92d14SAndroid Build Coastguard Worker 
3776*cfb92d14SAndroid Build Coastguard Worker     return error;
3777*cfb92d14SAndroid Build Coastguard Worker }
3778*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_LINK_METRICS_MANAGER_ENABLE
3779*cfb92d14SAndroid Build Coastguard Worker 
3780*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE
3781*cfb92d14SAndroid Build Coastguard Worker 
3782*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_TMF_ANYCAST_LOCATOR_ENABLE
3783*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])3784*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("locate")>(Arg aArgs[])
3785*cfb92d14SAndroid Build Coastguard Worker {
3786*cfb92d14SAndroid Build Coastguard Worker     otError      error = OT_ERROR_INVALID_ARGS;
3787*cfb92d14SAndroid Build Coastguard Worker     otIp6Address anycastAddress;
3788*cfb92d14SAndroid Build Coastguard Worker 
3789*cfb92d14SAndroid Build Coastguard Worker     /**
3790*cfb92d14SAndroid Build Coastguard Worker      * @cli locate
3791*cfb92d14SAndroid Build Coastguard Worker      * @code
3792*cfb92d14SAndroid Build Coastguard Worker      * locate
3793*cfb92d14SAndroid Build Coastguard Worker      * Idle
3794*cfb92d14SAndroid Build Coastguard Worker      * Done
3795*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3796*cfb92d14SAndroid Build Coastguard Worker      * @code
3797*cfb92d14SAndroid Build Coastguard Worker      * locate fdde:ad00:beef:0:0:ff:fe00:fc10
3798*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3799*cfb92d14SAndroid Build Coastguard Worker      * @code
3800*cfb92d14SAndroid Build Coastguard Worker      * locate
3801*cfb92d14SAndroid Build Coastguard Worker      * In Progress
3802*cfb92d14SAndroid Build Coastguard Worker      * Done
3803*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3804*cfb92d14SAndroid Build Coastguard Worker      * @par
3805*cfb92d14SAndroid Build Coastguard Worker      * Gets the current state (`In Progress` or `Idle`) of anycast locator.
3806*cfb92d14SAndroid Build Coastguard Worker      * @par
3807*cfb92d14SAndroid Build Coastguard Worker      * Available when `OPENTHREAD_CONFIG_TMF_ANYCAST_LOCATOR_ENABLE` is enabled.
3808*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadIsAnycastLocateInProgress
3809*cfb92d14SAndroid Build Coastguard Worker      */
3810*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
3811*cfb92d14SAndroid Build Coastguard Worker     {
3812*cfb92d14SAndroid Build Coastguard Worker         OutputLine(otThreadIsAnycastLocateInProgress(GetInstancePtr()) ? "In Progress" : "Idle");
3813*cfb92d14SAndroid Build Coastguard Worker         ExitNow(error = OT_ERROR_NONE);
3814*cfb92d14SAndroid Build Coastguard Worker     }
3815*cfb92d14SAndroid Build Coastguard Worker 
3816*cfb92d14SAndroid Build Coastguard Worker     /**
3817*cfb92d14SAndroid Build Coastguard Worker      * @cli locate (set)
3818*cfb92d14SAndroid Build Coastguard Worker      * @code
3819*cfb92d14SAndroid Build Coastguard Worker      * locate fdde:ad00:beef:0:0:ff:fe00:fc00
3820*cfb92d14SAndroid Build Coastguard Worker      * fdde:ad00:beef:0:d9d3:9000:16b:d03b 0xc800
3821*cfb92d14SAndroid Build Coastguard Worker      * Done
3822*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3823*cfb92d14SAndroid Build Coastguard Worker      * @par
3824*cfb92d14SAndroid Build Coastguard Worker      * Locate the closest destination of an anycast address (i.e., find the
3825*cfb92d14SAndroid Build Coastguard Worker      * destination's mesh local EID and RLOC16).
3826*cfb92d14SAndroid Build Coastguard Worker      * @par
3827*cfb92d14SAndroid Build Coastguard Worker      * The closest destination is determined based on the current routing
3828*cfb92d14SAndroid Build Coastguard Worker      * table and path costs within the Thread mesh.
3829*cfb92d14SAndroid Build Coastguard Worker      * @par
3830*cfb92d14SAndroid Build Coastguard Worker      * Available when `OPENTHREAD_CONFIG_TMF_ANYCAST_LOCATOR_ENABLE` is enabled.
3831*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadLocateAnycastDestination
3832*cfb92d14SAndroid Build Coastguard Worker      * @cparam locate @ca{anycastaddr}
3833*cfb92d14SAndroid Build Coastguard Worker      */
3834*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = aArgs[0].ParseAsIp6Address(anycastAddress));
3835*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error =
3836*cfb92d14SAndroid Build Coastguard Worker                       otThreadLocateAnycastDestination(GetInstancePtr(), &anycastAddress, HandleLocateResult, this));
3837*cfb92d14SAndroid Build Coastguard Worker     SetCommandTimeout(kLocateTimeoutMsecs);
3838*cfb92d14SAndroid Build Coastguard Worker     mLocateInProgress = true;
3839*cfb92d14SAndroid Build Coastguard Worker     error             = OT_ERROR_PENDING;
3840*cfb92d14SAndroid Build Coastguard Worker 
3841*cfb92d14SAndroid Build Coastguard Worker exit:
3842*cfb92d14SAndroid Build Coastguard Worker     return error;
3843*cfb92d14SAndroid Build Coastguard Worker }
3844*cfb92d14SAndroid Build Coastguard Worker 
HandleLocateResult(void * aContext,otError aError,const otIp6Address * aMeshLocalAddress,uint16_t aRloc16)3845*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleLocateResult(void               *aContext,
3846*cfb92d14SAndroid Build Coastguard Worker                                      otError             aError,
3847*cfb92d14SAndroid Build Coastguard Worker                                      const otIp6Address *aMeshLocalAddress,
3848*cfb92d14SAndroid Build Coastguard Worker                                      uint16_t            aRloc16)
3849*cfb92d14SAndroid Build Coastguard Worker {
3850*cfb92d14SAndroid Build Coastguard Worker     static_cast<Interpreter *>(aContext)->HandleLocateResult(aError, aMeshLocalAddress, aRloc16);
3851*cfb92d14SAndroid Build Coastguard Worker }
3852*cfb92d14SAndroid Build Coastguard Worker 
HandleLocateResult(otError aError,const otIp6Address * aMeshLocalAddress,uint16_t aRloc16)3853*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleLocateResult(otError aError, const otIp6Address *aMeshLocalAddress, uint16_t aRloc16)
3854*cfb92d14SAndroid Build Coastguard Worker {
3855*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(mLocateInProgress);
3856*cfb92d14SAndroid Build Coastguard Worker 
3857*cfb92d14SAndroid Build Coastguard Worker     mLocateInProgress = false;
3858*cfb92d14SAndroid Build Coastguard Worker 
3859*cfb92d14SAndroid Build Coastguard Worker     if (aError == OT_ERROR_NONE)
3860*cfb92d14SAndroid Build Coastguard Worker     {
3861*cfb92d14SAndroid Build Coastguard Worker         OutputIp6Address(*aMeshLocalAddress);
3862*cfb92d14SAndroid Build Coastguard Worker         OutputLine(" 0x%04x", aRloc16);
3863*cfb92d14SAndroid Build Coastguard Worker     }
3864*cfb92d14SAndroid Build Coastguard Worker 
3865*cfb92d14SAndroid Build Coastguard Worker     OutputResult(aError);
3866*cfb92d14SAndroid Build Coastguard Worker 
3867*cfb92d14SAndroid Build Coastguard Worker exit:
3868*cfb92d14SAndroid Build Coastguard Worker     return;
3869*cfb92d14SAndroid Build Coastguard Worker }
3870*cfb92d14SAndroid Build Coastguard Worker 
3871*cfb92d14SAndroid Build Coastguard Worker #endif //  OPENTHREAD_CONFIG_TMF_ANYCAST_LOCATOR_ENABLE
3872*cfb92d14SAndroid Build Coastguard Worker 
3873*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
Process(Arg aArgs[])3874*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("pskc")>(Arg aArgs[])
3875*cfb92d14SAndroid Build Coastguard Worker {
3876*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
3877*cfb92d14SAndroid Build Coastguard Worker     otPskc  pskc;
3878*cfb92d14SAndroid Build Coastguard Worker 
3879*cfb92d14SAndroid Build Coastguard Worker     /**
3880*cfb92d14SAndroid Build Coastguard Worker      * @cli pskc
3881*cfb92d14SAndroid Build Coastguard Worker      * @code
3882*cfb92d14SAndroid Build Coastguard Worker      * pskc
3883*cfb92d14SAndroid Build Coastguard Worker      * 67c0c203aa0b042bfb5381c47aef4d9e
3884*cfb92d14SAndroid Build Coastguard Worker      * Done
3885*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3886*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3887*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetPskc
3888*cfb92d14SAndroid Build Coastguard Worker      */
3889*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
3890*cfb92d14SAndroid Build Coastguard Worker     {
3891*cfb92d14SAndroid Build Coastguard Worker         otThreadGetPskc(GetInstancePtr(), &pskc);
3892*cfb92d14SAndroid Build Coastguard Worker         OutputBytesLine(pskc.m8);
3893*cfb92d14SAndroid Build Coastguard Worker     }
3894*cfb92d14SAndroid Build Coastguard Worker     else
3895*cfb92d14SAndroid Build Coastguard Worker     /**
3896*cfb92d14SAndroid Build Coastguard Worker      * @cli pskc (set)
3897*cfb92d14SAndroid Build Coastguard Worker      * @code
3898*cfb92d14SAndroid Build Coastguard Worker      * pskc 67c0c203aa0b042bfb5381c47aef4d9e
3899*cfb92d14SAndroid Build Coastguard Worker      * Done
3900*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3901*cfb92d14SAndroid Build Coastguard Worker      * @cparam pskc @ca{key}
3902*cfb92d14SAndroid Build Coastguard Worker      * @par
3903*cfb92d14SAndroid Build Coastguard Worker      * Sets the pskc in hexadecimal format.
3904*cfb92d14SAndroid Build Coastguard Worker      */
3905*cfb92d14SAndroid Build Coastguard Worker     {
3906*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1].IsEmpty())
3907*cfb92d14SAndroid Build Coastguard Worker         {
3908*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = aArgs[0].ParseAsHexString(pskc.m8));
3909*cfb92d14SAndroid Build Coastguard Worker         }
3910*cfb92d14SAndroid Build Coastguard Worker         /**
3911*cfb92d14SAndroid Build Coastguard Worker          * @cli pskc -p
3912*cfb92d14SAndroid Build Coastguard Worker          * @code
3913*cfb92d14SAndroid Build Coastguard Worker          * pskc -p 123456
3914*cfb92d14SAndroid Build Coastguard Worker          * Done
3915*cfb92d14SAndroid Build Coastguard Worker          * @endcode
3916*cfb92d14SAndroid Build Coastguard Worker          * @cparam pskc -p @ca{passphrase}
3917*cfb92d14SAndroid Build Coastguard Worker          * @par
3918*cfb92d14SAndroid Build Coastguard Worker          * Generates the pskc from the passphrase (UTF-8 encoded), together with the current network name and extended
3919*cfb92d14SAndroid Build Coastguard Worker          * PAN ID.
3920*cfb92d14SAndroid Build Coastguard Worker          */
3921*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[0] == "-p")
3922*cfb92d14SAndroid Build Coastguard Worker         {
3923*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = otDatasetGeneratePskc(
3924*cfb92d14SAndroid Build Coastguard Worker                               aArgs[1].GetCString(),
3925*cfb92d14SAndroid Build Coastguard Worker                               reinterpret_cast<const otNetworkName *>(otThreadGetNetworkName(GetInstancePtr())),
3926*cfb92d14SAndroid Build Coastguard Worker                               otThreadGetExtendedPanId(GetInstancePtr()), &pskc));
3927*cfb92d14SAndroid Build Coastguard Worker         }
3928*cfb92d14SAndroid Build Coastguard Worker         else
3929*cfb92d14SAndroid Build Coastguard Worker         {
3930*cfb92d14SAndroid Build Coastguard Worker             ExitNow(error = OT_ERROR_INVALID_ARGS);
3931*cfb92d14SAndroid Build Coastguard Worker         }
3932*cfb92d14SAndroid Build Coastguard Worker 
3933*cfb92d14SAndroid Build Coastguard Worker         error = otThreadSetPskc(GetInstancePtr(), &pskc);
3934*cfb92d14SAndroid Build Coastguard Worker     }
3935*cfb92d14SAndroid Build Coastguard Worker 
3936*cfb92d14SAndroid Build Coastguard Worker exit:
3937*cfb92d14SAndroid Build Coastguard Worker     return error;
3938*cfb92d14SAndroid Build Coastguard Worker }
3939*cfb92d14SAndroid Build Coastguard Worker 
3940*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_KEY_REFERENCES_ENABLE
Process(Arg aArgs[])3941*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("pskcref")>(Arg aArgs[])
3942*cfb92d14SAndroid Build Coastguard Worker {
3943*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
3944*cfb92d14SAndroid Build Coastguard Worker 
3945*cfb92d14SAndroid Build Coastguard Worker     /**
3946*cfb92d14SAndroid Build Coastguard Worker      * @cli pskcref
3947*cfb92d14SAndroid Build Coastguard Worker      * @code
3948*cfb92d14SAndroid Build Coastguard Worker      * pskcref
3949*cfb92d14SAndroid Build Coastguard Worker      * 0x80000000
3950*cfb92d14SAndroid Build Coastguard Worker      * Done
3951*cfb92d14SAndroid Build Coastguard Worker      * @endcode
3952*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
3953*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetPskcRef
3954*cfb92d14SAndroid Build Coastguard Worker      */
3955*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
3956*cfb92d14SAndroid Build Coastguard Worker     {
3957*cfb92d14SAndroid Build Coastguard Worker         OutputLine("0x%08lx", ToUlong(otThreadGetPskcRef(GetInstancePtr())));
3958*cfb92d14SAndroid Build Coastguard Worker     }
3959*cfb92d14SAndroid Build Coastguard Worker     else
3960*cfb92d14SAndroid Build Coastguard Worker     {
3961*cfb92d14SAndroid Build Coastguard Worker         otPskcRef pskcRef;
3962*cfb92d14SAndroid Build Coastguard Worker 
3963*cfb92d14SAndroid Build Coastguard Worker         /**
3964*cfb92d14SAndroid Build Coastguard Worker          * @cli pskcref (set)
3965*cfb92d14SAndroid Build Coastguard Worker          * @code
3966*cfb92d14SAndroid Build Coastguard Worker          * pskc 0x20017
3967*cfb92d14SAndroid Build Coastguard Worker          * Done
3968*cfb92d14SAndroid Build Coastguard Worker          * @endcode
3969*cfb92d14SAndroid Build Coastguard Worker          * @cparam pskc @ca{keyref}
3970*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
3971*cfb92d14SAndroid Build Coastguard Worker          * #otThreadSetPskcRef
3972*cfb92d14SAndroid Build Coastguard Worker          */
3973*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1].IsEmpty())
3974*cfb92d14SAndroid Build Coastguard Worker         {
3975*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = aArgs[0].ParseAsUint32(pskcRef));
3976*cfb92d14SAndroid Build Coastguard Worker         }
3977*cfb92d14SAndroid Build Coastguard Worker         else
3978*cfb92d14SAndroid Build Coastguard Worker         {
3979*cfb92d14SAndroid Build Coastguard Worker             ExitNow(error = OT_ERROR_INVALID_ARGS);
3980*cfb92d14SAndroid Build Coastguard Worker         }
3981*cfb92d14SAndroid Build Coastguard Worker 
3982*cfb92d14SAndroid Build Coastguard Worker         error = otThreadSetPskcRef(GetInstancePtr(), pskcRef);
3983*cfb92d14SAndroid Build Coastguard Worker     }
3984*cfb92d14SAndroid Build Coastguard Worker 
3985*cfb92d14SAndroid Build Coastguard Worker exit:
3986*cfb92d14SAndroid Build Coastguard Worker     return error;
3987*cfb92d14SAndroid Build Coastguard Worker }
3988*cfb92d14SAndroid Build Coastguard Worker #endif
3989*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_FTD
3990*cfb92d14SAndroid Build Coastguard Worker 
3991*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
3992*cfb92d14SAndroid Build Coastguard Worker /**
3993*cfb92d14SAndroid Build Coastguard Worker  * @cli mleadvimax
3994*cfb92d14SAndroid Build Coastguard Worker  * @code
3995*cfb92d14SAndroid Build Coastguard Worker  * mleadvimax
3996*cfb92d14SAndroid Build Coastguard Worker  * 12000
3997*cfb92d14SAndroid Build Coastguard Worker  * Done
3998*cfb92d14SAndroid Build Coastguard Worker  * @endcode
3999*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
4000*cfb92d14SAndroid Build Coastguard Worker  * #otThreadGetAdvertisementTrickleIntervalMax
4001*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])4002*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("mleadvimax")>(Arg aArgs[])
4003*cfb92d14SAndroid Build Coastguard Worker {
4004*cfb92d14SAndroid Build Coastguard Worker     return ProcessGet(aArgs, otThreadGetAdvertisementTrickleIntervalMax);
4005*cfb92d14SAndroid Build Coastguard Worker }
4006*cfb92d14SAndroid Build Coastguard Worker #endif
4007*cfb92d14SAndroid Build Coastguard Worker 
4008*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
4009*cfb92d14SAndroid Build Coastguard Worker /**
4010*cfb92d14SAndroid Build Coastguard Worker  * @cli mliid
4011*cfb92d14SAndroid Build Coastguard Worker  * @code
4012*cfb92d14SAndroid Build Coastguard Worker  * mliid 1122334455667788
4013*cfb92d14SAndroid Build Coastguard Worker  * Done
4014*cfb92d14SAndroid Build Coastguard Worker  * @endcode
4015*cfb92d14SAndroid Build Coastguard Worker  * @par
4016*cfb92d14SAndroid Build Coastguard Worker  * It must be used before Thread stack is enabled.
4017*cfb92d14SAndroid Build Coastguard Worker  * @par
4018*cfb92d14SAndroid Build Coastguard Worker  * Only for testing/reference device.
4019*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
4020*cfb92d14SAndroid Build Coastguard Worker  * #otIp6SetMeshLocalIid
4021*cfb92d14SAndroid Build Coastguard Worker  * @cparam mliid @ca{iid}
4022*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])4023*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("mliid")>(Arg aArgs[])
4024*cfb92d14SAndroid Build Coastguard Worker {
4025*cfb92d14SAndroid Build Coastguard Worker     otError                  error = OT_ERROR_NONE;
4026*cfb92d14SAndroid Build Coastguard Worker     otIp6InterfaceIdentifier iid;
4027*cfb92d14SAndroid Build Coastguard Worker 
4028*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(aArgs[1].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
4029*cfb92d14SAndroid Build Coastguard Worker 
4030*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = aArgs[0].ParseAsHexString(iid.mFields.m8));
4031*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = otIp6SetMeshLocalIid(GetInstancePtr(), &iid));
4032*cfb92d14SAndroid Build Coastguard Worker 
4033*cfb92d14SAndroid Build Coastguard Worker exit:
4034*cfb92d14SAndroid Build Coastguard Worker     return error;
4035*cfb92d14SAndroid Build Coastguard Worker }
4036*cfb92d14SAndroid Build Coastguard Worker #endif
4037*cfb92d14SAndroid Build Coastguard Worker 
4038*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_TMF_PROXY_MLR_ENABLE && OPENTHREAD_CONFIG_COMMISSIONER_ENABLE
4039*cfb92d14SAndroid Build Coastguard Worker /**
4040*cfb92d14SAndroid Build Coastguard Worker  * @cli mlr reg
4041*cfb92d14SAndroid Build Coastguard Worker  * @code
4042*cfb92d14SAndroid Build Coastguard Worker  * mlr reg ff04::1
4043*cfb92d14SAndroid Build Coastguard Worker  * status 0, 0 failed
4044*cfb92d14SAndroid Build Coastguard Worker  * Done
4045*cfb92d14SAndroid Build Coastguard Worker  * @endcode
4046*cfb92d14SAndroid Build Coastguard Worker  * @code
4047*cfb92d14SAndroid Build Coastguard Worker  * mlr reg ff04::1 ff04::2 ff02::1
4048*cfb92d14SAndroid Build Coastguard Worker  * status 2, 1 failed
4049*cfb92d14SAndroid Build Coastguard Worker  * ff02:0:0:0:0:0:0:1
4050*cfb92d14SAndroid Build Coastguard Worker  * Done
4051*cfb92d14SAndroid Build Coastguard Worker  * @endcode
4052*cfb92d14SAndroid Build Coastguard Worker  * @code
4053*cfb92d14SAndroid Build Coastguard Worker  * mlr reg ff04::1 ff04::2 1000
4054*cfb92d14SAndroid Build Coastguard Worker  * status 0, 0 failed
4055*cfb92d14SAndroid Build Coastguard Worker  * Done
4056*cfb92d14SAndroid Build Coastguard Worker  * @endcode
4057*cfb92d14SAndroid Build Coastguard Worker  * @code
4058*cfb92d14SAndroid Build Coastguard Worker  * mlr reg ff04::1 ff04::2 0
4059*cfb92d14SAndroid Build Coastguard Worker  * status 0, 0 failed
4060*cfb92d14SAndroid Build Coastguard Worker  * Done
4061*cfb92d14SAndroid Build Coastguard Worker  * @endcode
4062*cfb92d14SAndroid Build Coastguard Worker  * @par
4063*cfb92d14SAndroid Build Coastguard Worker  * Omit timeout to use the default MLR timeout on the Primary Backbone Router.
4064*cfb92d14SAndroid Build Coastguard Worker  * @par
4065*cfb92d14SAndroid Build Coastguard Worker  * Use timeout = 0 to deregister Multicast Listeners.
4066*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
4067*cfb92d14SAndroid Build Coastguard Worker  * #otIp6RegisterMulticastListeners
4068*cfb92d14SAndroid Build Coastguard Worker  * @cparam mlr reg @ca{ipaddr} [@ca{timeout}]
4069*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])4070*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("mlr")>(Arg aArgs[])
4071*cfb92d14SAndroid Build Coastguard Worker {
4072*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_INVALID_COMMAND;
4073*cfb92d14SAndroid Build Coastguard Worker 
4074*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "reg")
4075*cfb92d14SAndroid Build Coastguard Worker     {
4076*cfb92d14SAndroid Build Coastguard Worker         otIp6Address addresses[OT_IP6_MAX_MLR_ADDRESSES];
4077*cfb92d14SAndroid Build Coastguard Worker         uint32_t     timeout;
4078*cfb92d14SAndroid Build Coastguard Worker         bool         hasTimeout   = false;
4079*cfb92d14SAndroid Build Coastguard Worker         uint8_t      numAddresses = 0;
4080*cfb92d14SAndroid Build Coastguard Worker 
4081*cfb92d14SAndroid Build Coastguard Worker         aArgs++;
4082*cfb92d14SAndroid Build Coastguard Worker 
4083*cfb92d14SAndroid Build Coastguard Worker         while (aArgs->ParseAsIp6Address(addresses[numAddresses]) == OT_ERROR_NONE)
4084*cfb92d14SAndroid Build Coastguard Worker         {
4085*cfb92d14SAndroid Build Coastguard Worker             aArgs++;
4086*cfb92d14SAndroid Build Coastguard Worker             numAddresses++;
4087*cfb92d14SAndroid Build Coastguard Worker 
4088*cfb92d14SAndroid Build Coastguard Worker             if (numAddresses == OT_ARRAY_LENGTH(addresses))
4089*cfb92d14SAndroid Build Coastguard Worker             {
4090*cfb92d14SAndroid Build Coastguard Worker                 break;
4091*cfb92d14SAndroid Build Coastguard Worker             }
4092*cfb92d14SAndroid Build Coastguard Worker         }
4093*cfb92d14SAndroid Build Coastguard Worker 
4094*cfb92d14SAndroid Build Coastguard Worker         if (aArgs->ParseAsUint32(timeout) == OT_ERROR_NONE)
4095*cfb92d14SAndroid Build Coastguard Worker         {
4096*cfb92d14SAndroid Build Coastguard Worker             aArgs++;
4097*cfb92d14SAndroid Build Coastguard Worker             hasTimeout = true;
4098*cfb92d14SAndroid Build Coastguard Worker         }
4099*cfb92d14SAndroid Build Coastguard Worker 
4100*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(aArgs->IsEmpty() && (numAddresses > 0), error = OT_ERROR_INVALID_ARGS);
4101*cfb92d14SAndroid Build Coastguard Worker 
4102*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otIp6RegisterMulticastListeners(GetInstancePtr(), addresses, numAddresses,
4103*cfb92d14SAndroid Build Coastguard Worker                                                               hasTimeout ? &timeout : nullptr,
4104*cfb92d14SAndroid Build Coastguard Worker                                                               Interpreter::HandleMlrRegResult, this));
4105*cfb92d14SAndroid Build Coastguard Worker 
4106*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_PENDING;
4107*cfb92d14SAndroid Build Coastguard Worker     }
4108*cfb92d14SAndroid Build Coastguard Worker 
4109*cfb92d14SAndroid Build Coastguard Worker exit:
4110*cfb92d14SAndroid Build Coastguard Worker     return error;
4111*cfb92d14SAndroid Build Coastguard Worker }
4112*cfb92d14SAndroid Build Coastguard Worker 
HandleMlrRegResult(void * aContext,otError aError,uint8_t aMlrStatus,const otIp6Address * aFailedAddresses,uint8_t aFailedAddressNum)4113*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleMlrRegResult(void               *aContext,
4114*cfb92d14SAndroid Build Coastguard Worker                                      otError             aError,
4115*cfb92d14SAndroid Build Coastguard Worker                                      uint8_t             aMlrStatus,
4116*cfb92d14SAndroid Build Coastguard Worker                                      const otIp6Address *aFailedAddresses,
4117*cfb92d14SAndroid Build Coastguard Worker                                      uint8_t             aFailedAddressNum)
4118*cfb92d14SAndroid Build Coastguard Worker {
4119*cfb92d14SAndroid Build Coastguard Worker     static_cast<Interpreter *>(aContext)->HandleMlrRegResult(aError, aMlrStatus, aFailedAddresses, aFailedAddressNum);
4120*cfb92d14SAndroid Build Coastguard Worker }
4121*cfb92d14SAndroid Build Coastguard Worker 
HandleMlrRegResult(otError aError,uint8_t aMlrStatus,const otIp6Address * aFailedAddresses,uint8_t aFailedAddressNum)4122*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleMlrRegResult(otError             aError,
4123*cfb92d14SAndroid Build Coastguard Worker                                      uint8_t             aMlrStatus,
4124*cfb92d14SAndroid Build Coastguard Worker                                      const otIp6Address *aFailedAddresses,
4125*cfb92d14SAndroid Build Coastguard Worker                                      uint8_t             aFailedAddressNum)
4126*cfb92d14SAndroid Build Coastguard Worker {
4127*cfb92d14SAndroid Build Coastguard Worker     if (aError == OT_ERROR_NONE)
4128*cfb92d14SAndroid Build Coastguard Worker     {
4129*cfb92d14SAndroid Build Coastguard Worker         OutputLine("status %d, %d failed", aMlrStatus, aFailedAddressNum);
4130*cfb92d14SAndroid Build Coastguard Worker 
4131*cfb92d14SAndroid Build Coastguard Worker         for (uint8_t i = 0; i < aFailedAddressNum; i++)
4132*cfb92d14SAndroid Build Coastguard Worker         {
4133*cfb92d14SAndroid Build Coastguard Worker             OutputIp6AddressLine(aFailedAddresses[i]);
4134*cfb92d14SAndroid Build Coastguard Worker         }
4135*cfb92d14SAndroid Build Coastguard Worker     }
4136*cfb92d14SAndroid Build Coastguard Worker 
4137*cfb92d14SAndroid Build Coastguard Worker     OutputResult(aError);
4138*cfb92d14SAndroid Build Coastguard Worker }
4139*cfb92d14SAndroid Build Coastguard Worker 
4140*cfb92d14SAndroid Build Coastguard Worker #endif // (OPENTHREAD_FTD && OPENTHREAD_CONFIG_TMF_PROXY_MLR_ENABLE) && OPENTHREAD_CONFIG_COMMISSIONER_ENABLE
4141*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])4142*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("mode")>(Arg aArgs[])
4143*cfb92d14SAndroid Build Coastguard Worker {
4144*cfb92d14SAndroid Build Coastguard Worker     otError          error = OT_ERROR_NONE;
4145*cfb92d14SAndroid Build Coastguard Worker     otLinkModeConfig linkMode;
4146*cfb92d14SAndroid Build Coastguard Worker 
4147*cfb92d14SAndroid Build Coastguard Worker     ClearAllBytes(linkMode);
4148*cfb92d14SAndroid Build Coastguard Worker 
4149*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
4150*cfb92d14SAndroid Build Coastguard Worker     {
4151*cfb92d14SAndroid Build Coastguard Worker         char linkModeString[kLinkModeStringSize];
4152*cfb92d14SAndroid Build Coastguard Worker 
4153*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%s", LinkModeToString(otThreadGetLinkMode(GetInstancePtr()), linkModeString));
4154*cfb92d14SAndroid Build Coastguard Worker         ExitNow();
4155*cfb92d14SAndroid Build Coastguard Worker     }
4156*cfb92d14SAndroid Build Coastguard Worker 
4157*cfb92d14SAndroid Build Coastguard Worker     /**
4158*cfb92d14SAndroid Build Coastguard Worker      * @cli mode (get,set)
4159*cfb92d14SAndroid Build Coastguard Worker      * @code
4160*cfb92d14SAndroid Build Coastguard Worker      * mode rdn
4161*cfb92d14SAndroid Build Coastguard Worker      * Done
4162*cfb92d14SAndroid Build Coastguard Worker      * @endcode
4163*cfb92d14SAndroid Build Coastguard Worker      * @code
4164*cfb92d14SAndroid Build Coastguard Worker      * mode -
4165*cfb92d14SAndroid Build Coastguard Worker      * Done
4166*cfb92d14SAndroid Build Coastguard Worker      * @endcode
4167*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
4168*cfb92d14SAndroid Build Coastguard Worker      * #otThreadSetLinkMode
4169*cfb92d14SAndroid Build Coastguard Worker      * @cparam mode [@ca{rdn}]
4170*cfb92d14SAndroid Build Coastguard Worker      * - `-`: no flags set (rx-off-when-idle, minimal Thread device, stable network data)
4171*cfb92d14SAndroid Build Coastguard Worker      * - `r`: rx-on-when-idle
4172*cfb92d14SAndroid Build Coastguard Worker      * - `d`: Full Thread Device
4173*cfb92d14SAndroid Build Coastguard Worker      * - `n`: Full Network Data
4174*cfb92d14SAndroid Build Coastguard Worker      */
4175*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] != "-")
4176*cfb92d14SAndroid Build Coastguard Worker     {
4177*cfb92d14SAndroid Build Coastguard Worker         for (const char *arg = aArgs[0].GetCString(); *arg != '\0'; arg++)
4178*cfb92d14SAndroid Build Coastguard Worker         {
4179*cfb92d14SAndroid Build Coastguard Worker             switch (*arg)
4180*cfb92d14SAndroid Build Coastguard Worker             {
4181*cfb92d14SAndroid Build Coastguard Worker             case 'r':
4182*cfb92d14SAndroid Build Coastguard Worker                 linkMode.mRxOnWhenIdle = true;
4183*cfb92d14SAndroid Build Coastguard Worker                 break;
4184*cfb92d14SAndroid Build Coastguard Worker 
4185*cfb92d14SAndroid Build Coastguard Worker             case 'd':
4186*cfb92d14SAndroid Build Coastguard Worker                 linkMode.mDeviceType = true;
4187*cfb92d14SAndroid Build Coastguard Worker                 break;
4188*cfb92d14SAndroid Build Coastguard Worker 
4189*cfb92d14SAndroid Build Coastguard Worker             case 'n':
4190*cfb92d14SAndroid Build Coastguard Worker                 linkMode.mNetworkData = true;
4191*cfb92d14SAndroid Build Coastguard Worker                 break;
4192*cfb92d14SAndroid Build Coastguard Worker 
4193*cfb92d14SAndroid Build Coastguard Worker             default:
4194*cfb92d14SAndroid Build Coastguard Worker                 ExitNow(error = OT_ERROR_INVALID_ARGS);
4195*cfb92d14SAndroid Build Coastguard Worker             }
4196*cfb92d14SAndroid Build Coastguard Worker         }
4197*cfb92d14SAndroid Build Coastguard Worker     }
4198*cfb92d14SAndroid Build Coastguard Worker 
4199*cfb92d14SAndroid Build Coastguard Worker     error = otThreadSetLinkMode(GetInstancePtr(), linkMode);
4200*cfb92d14SAndroid Build Coastguard Worker 
4201*cfb92d14SAndroid Build Coastguard Worker exit:
4202*cfb92d14SAndroid Build Coastguard Worker     return error;
4203*cfb92d14SAndroid Build Coastguard Worker }
4204*cfb92d14SAndroid Build Coastguard Worker 
4205*cfb92d14SAndroid Build Coastguard Worker /**
4206*cfb92d14SAndroid Build Coastguard Worker  * @cli multiradio
4207*cfb92d14SAndroid Build Coastguard Worker  * @code
4208*cfb92d14SAndroid Build Coastguard Worker  * multiradio
4209*cfb92d14SAndroid Build Coastguard Worker  * [15.4, TREL]
4210*cfb92d14SAndroid Build Coastguard Worker  * Done
4211*cfb92d14SAndroid Build Coastguard Worker  * @endcode
4212*cfb92d14SAndroid Build Coastguard Worker  * @par
4213*cfb92d14SAndroid Build Coastguard Worker  * Get the list of supported radio links by the device.
4214*cfb92d14SAndroid Build Coastguard Worker  * @par
4215*cfb92d14SAndroid Build Coastguard Worker  * This command is always available, even when only a single radio is supported by the device.
4216*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])4217*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("multiradio")>(Arg aArgs[])
4218*cfb92d14SAndroid Build Coastguard Worker {
4219*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
4220*cfb92d14SAndroid Build Coastguard Worker 
4221*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aArgs);
4222*cfb92d14SAndroid Build Coastguard Worker 
4223*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
4224*cfb92d14SAndroid Build Coastguard Worker     {
4225*cfb92d14SAndroid Build Coastguard Worker         bool isFirst = true;
4226*cfb92d14SAndroid Build Coastguard Worker 
4227*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("[");
4228*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_RADIO_LINK_IEEE_802_15_4_ENABLE
4229*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("15.4");
4230*cfb92d14SAndroid Build Coastguard Worker         isFirst = false;
4231*cfb92d14SAndroid Build Coastguard Worker #endif
4232*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE
4233*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("%sTREL", isFirst ? "" : ", ");
4234*cfb92d14SAndroid Build Coastguard Worker #endif
4235*cfb92d14SAndroid Build Coastguard Worker         OutputLine("]");
4236*cfb92d14SAndroid Build Coastguard Worker 
4237*cfb92d14SAndroid Build Coastguard Worker         OT_UNUSED_VARIABLE(isFirst);
4238*cfb92d14SAndroid Build Coastguard Worker     }
4239*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MULTI_RADIO
4240*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "neighbor")
4241*cfb92d14SAndroid Build Coastguard Worker     {
4242*cfb92d14SAndroid Build Coastguard Worker         otMultiRadioNeighborInfo multiRadioInfo;
4243*cfb92d14SAndroid Build Coastguard Worker 
4244*cfb92d14SAndroid Build Coastguard Worker         /**
4245*cfb92d14SAndroid Build Coastguard Worker          * @cli multiradio neighbor list
4246*cfb92d14SAndroid Build Coastguard Worker          * @code
4247*cfb92d14SAndroid Build Coastguard Worker          * multiradio neighbor list
4248*cfb92d14SAndroid Build Coastguard Worker          * ExtAddr:3a65bc38dbe4a5be, RLOC16:0xcc00, Radios:[15.4(255), TREL(255)]
4249*cfb92d14SAndroid Build Coastguard Worker          * ExtAddr:17df23452ee4a4be, RLOC16:0x1300, Radios:[15.4(255)]
4250*cfb92d14SAndroid Build Coastguard Worker          * Done
4251*cfb92d14SAndroid Build Coastguard Worker          * @endcode
4252*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
4253*cfb92d14SAndroid Build Coastguard Worker          * #otMultiRadioGetNeighborInfo
4254*cfb92d14SAndroid Build Coastguard Worker          */
4255*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1] == "list")
4256*cfb92d14SAndroid Build Coastguard Worker         {
4257*cfb92d14SAndroid Build Coastguard Worker             otNeighborInfoIterator iterator = OT_NEIGHBOR_INFO_ITERATOR_INIT;
4258*cfb92d14SAndroid Build Coastguard Worker             otNeighborInfo         neighInfo;
4259*cfb92d14SAndroid Build Coastguard Worker 
4260*cfb92d14SAndroid Build Coastguard Worker             while (otThreadGetNextNeighborInfo(GetInstancePtr(), &iterator, &neighInfo) == OT_ERROR_NONE)
4261*cfb92d14SAndroid Build Coastguard Worker             {
4262*cfb92d14SAndroid Build Coastguard Worker                 if (otMultiRadioGetNeighborInfo(GetInstancePtr(), &neighInfo.mExtAddress, &multiRadioInfo) !=
4263*cfb92d14SAndroid Build Coastguard Worker                     OT_ERROR_NONE)
4264*cfb92d14SAndroid Build Coastguard Worker                 {
4265*cfb92d14SAndroid Build Coastguard Worker                     continue;
4266*cfb92d14SAndroid Build Coastguard Worker                 }
4267*cfb92d14SAndroid Build Coastguard Worker 
4268*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("ExtAddr:");
4269*cfb92d14SAndroid Build Coastguard Worker                 OutputExtAddress(neighInfo.mExtAddress);
4270*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat(", RLOC16:0x%04x, Radios:", neighInfo.mRloc16);
4271*cfb92d14SAndroid Build Coastguard Worker                 OutputMultiRadioInfo(multiRadioInfo);
4272*cfb92d14SAndroid Build Coastguard Worker             }
4273*cfb92d14SAndroid Build Coastguard Worker         }
4274*cfb92d14SAndroid Build Coastguard Worker         else
4275*cfb92d14SAndroid Build Coastguard Worker         {
4276*cfb92d14SAndroid Build Coastguard Worker             /**
4277*cfb92d14SAndroid Build Coastguard Worker              * @cli multiradio neighbor
4278*cfb92d14SAndroid Build Coastguard Worker              * @code
4279*cfb92d14SAndroid Build Coastguard Worker              * multiradio neighbor 3a65bc38dbe4a5be
4280*cfb92d14SAndroid Build Coastguard Worker              * [15.4(255), TREL(255)]
4281*cfb92d14SAndroid Build Coastguard Worker              * Done
4282*cfb92d14SAndroid Build Coastguard Worker              * @endcode
4283*cfb92d14SAndroid Build Coastguard Worker              * @par api_copy
4284*cfb92d14SAndroid Build Coastguard Worker              * #otMultiRadioGetNeighborInfo
4285*cfb92d14SAndroid Build Coastguard Worker              * @cparam multiradio neighbor @ca{ext-address}
4286*cfb92d14SAndroid Build Coastguard Worker              */
4287*cfb92d14SAndroid Build Coastguard Worker             otExtAddress extAddress;
4288*cfb92d14SAndroid Build Coastguard Worker 
4289*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = aArgs[1].ParseAsHexString(extAddress.m8));
4290*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = otMultiRadioGetNeighborInfo(GetInstancePtr(), &extAddress, &multiRadioInfo));
4291*cfb92d14SAndroid Build Coastguard Worker             OutputMultiRadioInfo(multiRadioInfo);
4292*cfb92d14SAndroid Build Coastguard Worker         }
4293*cfb92d14SAndroid Build Coastguard Worker     }
4294*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_MULTI_RADIO
4295*cfb92d14SAndroid Build Coastguard Worker     else
4296*cfb92d14SAndroid Build Coastguard Worker     {
4297*cfb92d14SAndroid Build Coastguard Worker         ExitNow(error = OT_ERROR_INVALID_COMMAND);
4298*cfb92d14SAndroid Build Coastguard Worker     }
4299*cfb92d14SAndroid Build Coastguard Worker 
4300*cfb92d14SAndroid Build Coastguard Worker exit:
4301*cfb92d14SAndroid Build Coastguard Worker     return error;
4302*cfb92d14SAndroid Build Coastguard Worker }
4303*cfb92d14SAndroid Build Coastguard Worker 
4304*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MULTI_RADIO
OutputMultiRadioInfo(const otMultiRadioNeighborInfo & aMultiRadioInfo)4305*cfb92d14SAndroid Build Coastguard Worker void Interpreter::OutputMultiRadioInfo(const otMultiRadioNeighborInfo &aMultiRadioInfo)
4306*cfb92d14SAndroid Build Coastguard Worker {
4307*cfb92d14SAndroid Build Coastguard Worker     bool isFirst = true;
4308*cfb92d14SAndroid Build Coastguard Worker 
4309*cfb92d14SAndroid Build Coastguard Worker     OutputFormat("[");
4310*cfb92d14SAndroid Build Coastguard Worker 
4311*cfb92d14SAndroid Build Coastguard Worker     if (aMultiRadioInfo.mSupportsIeee802154)
4312*cfb92d14SAndroid Build Coastguard Worker     {
4313*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("15.4(%u)", aMultiRadioInfo.mIeee802154Info.mPreference);
4314*cfb92d14SAndroid Build Coastguard Worker         isFirst = false;
4315*cfb92d14SAndroid Build Coastguard Worker     }
4316*cfb92d14SAndroid Build Coastguard Worker 
4317*cfb92d14SAndroid Build Coastguard Worker     if (aMultiRadioInfo.mSupportsTrelUdp6)
4318*cfb92d14SAndroid Build Coastguard Worker     {
4319*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("%sTREL(%u)", isFirst ? "" : ", ", aMultiRadioInfo.mTrelUdp6Info.mPreference);
4320*cfb92d14SAndroid Build Coastguard Worker     }
4321*cfb92d14SAndroid Build Coastguard Worker 
4322*cfb92d14SAndroid Build Coastguard Worker     OutputLine("]");
4323*cfb92d14SAndroid Build Coastguard Worker }
4324*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_MULTI_RADIO
4325*cfb92d14SAndroid Build Coastguard Worker 
4326*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
Process(Arg aArgs[])4327*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("neighbor")>(Arg aArgs[])
4328*cfb92d14SAndroid Build Coastguard Worker {
4329*cfb92d14SAndroid Build Coastguard Worker     otError                error = OT_ERROR_NONE;
4330*cfb92d14SAndroid Build Coastguard Worker     otNeighborInfo         neighborInfo;
4331*cfb92d14SAndroid Build Coastguard Worker     bool                   isTable;
4332*cfb92d14SAndroid Build Coastguard Worker     otNeighborInfoIterator iterator = OT_NEIGHBOR_INFO_ITERATOR_INIT;
4333*cfb92d14SAndroid Build Coastguard Worker 
4334*cfb92d14SAndroid Build Coastguard Worker     isTable = (aArgs[0] == "table");
4335*cfb92d14SAndroid Build Coastguard Worker 
4336*cfb92d14SAndroid Build Coastguard Worker     if (isTable || (aArgs[0] == "list"))
4337*cfb92d14SAndroid Build Coastguard Worker     {
4338*cfb92d14SAndroid Build Coastguard Worker         if (isTable)
4339*cfb92d14SAndroid Build Coastguard Worker         {
4340*cfb92d14SAndroid Build Coastguard Worker             static const char *const kNeighborTableTitles[] = {
4341*cfb92d14SAndroid Build Coastguard Worker                 "Role", "RLOC16", "Age", "Avg RSSI", "Last RSSI", "R", "D", "N", "Extended MAC", "Version",
4342*cfb92d14SAndroid Build Coastguard Worker             };
4343*cfb92d14SAndroid Build Coastguard Worker 
4344*cfb92d14SAndroid Build Coastguard Worker             static const uint8_t kNeighborTableColumnWidths[] = {
4345*cfb92d14SAndroid Build Coastguard Worker                 6, 8, 5, 10, 11, 1, 1, 1, 18, 9,
4346*cfb92d14SAndroid Build Coastguard Worker             };
4347*cfb92d14SAndroid Build Coastguard Worker 
4348*cfb92d14SAndroid Build Coastguard Worker             OutputTableHeader(kNeighborTableTitles, kNeighborTableColumnWidths);
4349*cfb92d14SAndroid Build Coastguard Worker         }
4350*cfb92d14SAndroid Build Coastguard Worker 
4351*cfb92d14SAndroid Build Coastguard Worker         while (otThreadGetNextNeighborInfo(GetInstancePtr(), &iterator, &neighborInfo) == OT_ERROR_NONE)
4352*cfb92d14SAndroid Build Coastguard Worker         {
4353*cfb92d14SAndroid Build Coastguard Worker             /**
4354*cfb92d14SAndroid Build Coastguard Worker              * @cli neighbor table
4355*cfb92d14SAndroid Build Coastguard Worker              * @code
4356*cfb92d14SAndroid Build Coastguard Worker              * neighbor table
4357*cfb92d14SAndroid Build Coastguard Worker              * | Role | RLOC16 | Age | Avg RSSI | Last RSSI |R|D|N| Extended MAC     |
4358*cfb92d14SAndroid Build Coastguard Worker              * +------+--------+-----+----------+-----------+-+-+-+------------------+
4359*cfb92d14SAndroid Build Coastguard Worker              * |   C  | 0xcc01 |  96 |      -46 |       -46 |1|1|1| 1eb9ba8a6522636b |
4360*cfb92d14SAndroid Build Coastguard Worker              * |   R  | 0xc800 |   2 |      -29 |       -29 |1|1|1| 9a91556102c39ddb |
4361*cfb92d14SAndroid Build Coastguard Worker              * |   R  | 0xf000 |   3 |      -28 |       -28 |1|1|1| 0ad7ed6beaa6016d |
4362*cfb92d14SAndroid Build Coastguard Worker              * Done
4363*cfb92d14SAndroid Build Coastguard Worker              * @endcode
4364*cfb92d14SAndroid Build Coastguard Worker              * @par
4365*cfb92d14SAndroid Build Coastguard Worker              * Prints information in table format about all neighbors.
4366*cfb92d14SAndroid Build Coastguard Worker              * @par
4367*cfb92d14SAndroid Build Coastguard Worker              * For `Role`, the only possible values for this table are `C` (Child) or `R` (Router).
4368*cfb92d14SAndroid Build Coastguard Worker              * @par
4369*cfb92d14SAndroid Build Coastguard Worker              * The following columns provide information about the device mode of neighbors.
4370*cfb92d14SAndroid Build Coastguard Worker              * Each column has a value of `0` (off) or `1` (on).
4371*cfb92d14SAndroid Build Coastguard Worker              * - `R`: RX on when idle
4372*cfb92d14SAndroid Build Coastguard Worker              * - `D`: Full Thread device
4373*cfb92d14SAndroid Build Coastguard Worker              * - `N`: Full network data
4374*cfb92d14SAndroid Build Coastguard Worker              * @sa otThreadGetNextNeighborInfo
4375*cfb92d14SAndroid Build Coastguard Worker              */
4376*cfb92d14SAndroid Build Coastguard Worker             if (isTable)
4377*cfb92d14SAndroid Build Coastguard Worker             {
4378*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %3c  ", neighborInfo.mIsChild ? 'C' : 'R');
4379*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| 0x%04x ", neighborInfo.mRloc16);
4380*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %3lu ", ToUlong(neighborInfo.mAge));
4381*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %8d ", neighborInfo.mAverageRssi);
4382*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %9d ", neighborInfo.mLastRssi);
4383*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("|%1d", neighborInfo.mRxOnWhenIdle);
4384*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("|%1d", neighborInfo.mFullThreadDevice);
4385*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("|%1d", neighborInfo.mFullNetworkData);
4386*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| ");
4387*cfb92d14SAndroid Build Coastguard Worker                 OutputExtAddress(neighborInfo.mExtAddress);
4388*cfb92d14SAndroid Build Coastguard Worker                 OutputLine(" | %7d |", neighborInfo.mVersion);
4389*cfb92d14SAndroid Build Coastguard Worker             }
4390*cfb92d14SAndroid Build Coastguard Worker             /**
4391*cfb92d14SAndroid Build Coastguard Worker              * @cli neighbor list
4392*cfb92d14SAndroid Build Coastguard Worker              * @code
4393*cfb92d14SAndroid Build Coastguard Worker              * neighbor list
4394*cfb92d14SAndroid Build Coastguard Worker              * 0xcc01 0xc800 0xf000
4395*cfb92d14SAndroid Build Coastguard Worker              * Done
4396*cfb92d14SAndroid Build Coastguard Worker              * @endcode
4397*cfb92d14SAndroid Build Coastguard Worker              * @par
4398*cfb92d14SAndroid Build Coastguard Worker              * Lists the RLOC16 of each neighbor.
4399*cfb92d14SAndroid Build Coastguard Worker              */
4400*cfb92d14SAndroid Build Coastguard Worker             else
4401*cfb92d14SAndroid Build Coastguard Worker             {
4402*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("0x%04x ", neighborInfo.mRloc16);
4403*cfb92d14SAndroid Build Coastguard Worker             }
4404*cfb92d14SAndroid Build Coastguard Worker         }
4405*cfb92d14SAndroid Build Coastguard Worker 
4406*cfb92d14SAndroid Build Coastguard Worker         OutputNewLine();
4407*cfb92d14SAndroid Build Coastguard Worker     }
4408*cfb92d14SAndroid Build Coastguard Worker     /**
4409*cfb92d14SAndroid Build Coastguard Worker      * @cli neighbor linkquality
4410*cfb92d14SAndroid Build Coastguard Worker      * @code
4411*cfb92d14SAndroid Build Coastguard Worker      * neighbor linkquality
4412*cfb92d14SAndroid Build Coastguard Worker      * | RLOC16 | Extended MAC     | Frame Error | Msg Error | Avg RSS | Last RSS | Age   |
4413*cfb92d14SAndroid Build Coastguard Worker      * +--------+------------------+-------------+-----------+---------+----------+-------+
4414*cfb92d14SAndroid Build Coastguard Worker      * | 0xe800 | 9e2fa4e1b84f92db |      0.00 % |    0.00 % |     -46 |      -48 |     1 |
4415*cfb92d14SAndroid Build Coastguard Worker      * | 0xc001 | 0ad7ed6beaa6016d |      4.67 % |    0.08 % |     -68 |      -72 |    10 |
4416*cfb92d14SAndroid Build Coastguard Worker      * Done
4417*cfb92d14SAndroid Build Coastguard Worker      * @endcode
4418*cfb92d14SAndroid Build Coastguard Worker      * @par
4419*cfb92d14SAndroid Build Coastguard Worker      * Prints link quality information about all neighbors.
4420*cfb92d14SAndroid Build Coastguard Worker      */
4421*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "linkquality")
4422*cfb92d14SAndroid Build Coastguard Worker     {
4423*cfb92d14SAndroid Build Coastguard Worker         static const char *const kLinkQualityTableTitles[] = {
4424*cfb92d14SAndroid Build Coastguard Worker             "RLOC16", "Extended MAC", "Frame Error", "Msg Error", "Avg RSS", "Last RSS", "Age",
4425*cfb92d14SAndroid Build Coastguard Worker         };
4426*cfb92d14SAndroid Build Coastguard Worker 
4427*cfb92d14SAndroid Build Coastguard Worker         static const uint8_t kLinkQualityTableColumnWidths[] = {
4428*cfb92d14SAndroid Build Coastguard Worker             8, 18, 13, 11, 9, 10, 7,
4429*cfb92d14SAndroid Build Coastguard Worker         };
4430*cfb92d14SAndroid Build Coastguard Worker 
4431*cfb92d14SAndroid Build Coastguard Worker         OutputTableHeader(kLinkQualityTableTitles, kLinkQualityTableColumnWidths);
4432*cfb92d14SAndroid Build Coastguard Worker 
4433*cfb92d14SAndroid Build Coastguard Worker         while (otThreadGetNextNeighborInfo(GetInstancePtr(), &iterator, &neighborInfo) == OT_ERROR_NONE)
4434*cfb92d14SAndroid Build Coastguard Worker         {
4435*cfb92d14SAndroid Build Coastguard Worker             PercentageStringBuffer stringBuffer;
4436*cfb92d14SAndroid Build Coastguard Worker 
4437*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("| 0x%04x | ", neighborInfo.mRloc16);
4438*cfb92d14SAndroid Build Coastguard Worker             OutputExtAddress(neighborInfo.mExtAddress);
4439*cfb92d14SAndroid Build Coastguard Worker             OutputFormat(" | %9s %% ", PercentageToString(neighborInfo.mFrameErrorRate, stringBuffer));
4440*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("| %7s %% ", PercentageToString(neighborInfo.mMessageErrorRate, stringBuffer));
4441*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("| %7d ", neighborInfo.mAverageRssi);
4442*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("| %8d ", neighborInfo.mLastRssi);
4443*cfb92d14SAndroid Build Coastguard Worker             OutputLine("| %5lu |", ToUlong(neighborInfo.mAge));
4444*cfb92d14SAndroid Build Coastguard Worker         }
4445*cfb92d14SAndroid Build Coastguard Worker     }
4446*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_UPTIME_ENABLE
4447*cfb92d14SAndroid Build Coastguard Worker     /**
4448*cfb92d14SAndroid Build Coastguard Worker      * @cli neighbor conntime
4449*cfb92d14SAndroid Build Coastguard Worker      * @code
4450*cfb92d14SAndroid Build Coastguard Worker      * neighbor conntime
4451*cfb92d14SAndroid Build Coastguard Worker      * | RLOC16 | Extended MAC     | Last Heard (Age) | Connection Time  |
4452*cfb92d14SAndroid Build Coastguard Worker      * +--------+------------------+------------------+------------------+
4453*cfb92d14SAndroid Build Coastguard Worker      * | 0x8401 | 1a28be396a14a318 |         00:00:13 |         00:07:59 |
4454*cfb92d14SAndroid Build Coastguard Worker      * | 0x5c00 | 723ebf0d9eba3264 |         00:00:03 |         00:11:27 |
4455*cfb92d14SAndroid Build Coastguard Worker      * | 0xe800 | ce53628a1e3f5b3c |         00:00:02 |         00:00:15 |
4456*cfb92d14SAndroid Build Coastguard Worker      * Done
4457*cfb92d14SAndroid Build Coastguard Worker      * @endcode
4458*cfb92d14SAndroid Build Coastguard Worker      * @par
4459*cfb92d14SAndroid Build Coastguard Worker      * Prints the connection time and age of neighbors. Information per neighbor:
4460*cfb92d14SAndroid Build Coastguard Worker      * - RLOC16
4461*cfb92d14SAndroid Build Coastguard Worker      * - Extended MAC
4462*cfb92d14SAndroid Build Coastguard Worker      * - Last Heard (Age): Number of seconds since last heard from neighbor.
4463*cfb92d14SAndroid Build Coastguard Worker      * - Connection Time: Number of seconds since link establishment with neighbor.
4464*cfb92d14SAndroid Build Coastguard Worker      * Duration intervals are formatted as `{hh}:{mm}:{ss}` for hours, minutes, and seconds if the duration is less
4465*cfb92d14SAndroid Build Coastguard Worker      * than one day. If the duration is longer than one day, the format is `{dd}d.{hh}:{mm}:{ss}`.
4466*cfb92d14SAndroid Build Coastguard Worker      * @csa{neighbor conntime list}
4467*cfb92d14SAndroid Build Coastguard Worker      */
4468*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "conntime")
4469*cfb92d14SAndroid Build Coastguard Worker     {
4470*cfb92d14SAndroid Build Coastguard Worker         /**
4471*cfb92d14SAndroid Build Coastguard Worker          * @cli neighbor conntime list
4472*cfb92d14SAndroid Build Coastguard Worker          * @code
4473*cfb92d14SAndroid Build Coastguard Worker          * neighbor conntime list
4474*cfb92d14SAndroid Build Coastguard Worker          * 0x8401 1a28be396a14a318 age:63 conn-time:644
4475*cfb92d14SAndroid Build Coastguard Worker          * 0x5c00 723ebf0d9eba3264 age:23 conn-time:852
4476*cfb92d14SAndroid Build Coastguard Worker          * 0xe800 ce53628a1e3f5b3c age:23 conn-time:180
4477*cfb92d14SAndroid Build Coastguard Worker          * Done
4478*cfb92d14SAndroid Build Coastguard Worker          * @endcode
4479*cfb92d14SAndroid Build Coastguard Worker          * @par
4480*cfb92d14SAndroid Build Coastguard Worker          * Prints the connection time and age of neighbors.
4481*cfb92d14SAndroid Build Coastguard Worker          * This command is similar to `neighbor conntime`, but it displays the information in a list format. The age
4482*cfb92d14SAndroid Build Coastguard Worker          * and connection time are both displayed in seconds.
4483*cfb92d14SAndroid Build Coastguard Worker          * @csa{neighbor conntime}
4484*cfb92d14SAndroid Build Coastguard Worker          */
4485*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1] == "list")
4486*cfb92d14SAndroid Build Coastguard Worker         {
4487*cfb92d14SAndroid Build Coastguard Worker             isTable = false;
4488*cfb92d14SAndroid Build Coastguard Worker         }
4489*cfb92d14SAndroid Build Coastguard Worker         else
4490*cfb92d14SAndroid Build Coastguard Worker         {
4491*cfb92d14SAndroid Build Coastguard Worker             static const char *const kConnTimeTableTitles[] = {
4492*cfb92d14SAndroid Build Coastguard Worker                 "RLOC16",
4493*cfb92d14SAndroid Build Coastguard Worker                 "Extended MAC",
4494*cfb92d14SAndroid Build Coastguard Worker                 "Last Heard (Age)",
4495*cfb92d14SAndroid Build Coastguard Worker                 "Connection Time",
4496*cfb92d14SAndroid Build Coastguard Worker             };
4497*cfb92d14SAndroid Build Coastguard Worker 
4498*cfb92d14SAndroid Build Coastguard Worker             static const uint8_t kConnTimeTableColumnWidths[] = {8, 18, 18, 18};
4499*cfb92d14SAndroid Build Coastguard Worker 
4500*cfb92d14SAndroid Build Coastguard Worker             isTable = true;
4501*cfb92d14SAndroid Build Coastguard Worker             OutputTableHeader(kConnTimeTableTitles, kConnTimeTableColumnWidths);
4502*cfb92d14SAndroid Build Coastguard Worker         }
4503*cfb92d14SAndroid Build Coastguard Worker 
4504*cfb92d14SAndroid Build Coastguard Worker         while (otThreadGetNextNeighborInfo(GetInstancePtr(), &iterator, &neighborInfo) == OT_ERROR_NONE)
4505*cfb92d14SAndroid Build Coastguard Worker         {
4506*cfb92d14SAndroid Build Coastguard Worker             if (isTable)
4507*cfb92d14SAndroid Build Coastguard Worker             {
4508*cfb92d14SAndroid Build Coastguard Worker                 char string[OT_DURATION_STRING_SIZE];
4509*cfb92d14SAndroid Build Coastguard Worker 
4510*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| 0x%04x | ", neighborInfo.mRloc16);
4511*cfb92d14SAndroid Build Coastguard Worker                 OutputExtAddress(neighborInfo.mExtAddress);
4512*cfb92d14SAndroid Build Coastguard Worker                 otConvertDurationInSecondsToString(neighborInfo.mAge, string, sizeof(string));
4513*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat(" | %16s", string);
4514*cfb92d14SAndroid Build Coastguard Worker                 otConvertDurationInSecondsToString(neighborInfo.mConnectionTime, string, sizeof(string));
4515*cfb92d14SAndroid Build Coastguard Worker                 OutputLine(" | %16s |", string);
4516*cfb92d14SAndroid Build Coastguard Worker             }
4517*cfb92d14SAndroid Build Coastguard Worker             else
4518*cfb92d14SAndroid Build Coastguard Worker             {
4519*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("0x%04x ", neighborInfo.mRloc16);
4520*cfb92d14SAndroid Build Coastguard Worker                 OutputExtAddress(neighborInfo.mExtAddress);
4521*cfb92d14SAndroid Build Coastguard Worker                 OutputLine(" age:%lu conn-time:%lu", ToUlong(neighborInfo.mAge), ToUlong(neighborInfo.mConnectionTime));
4522*cfb92d14SAndroid Build Coastguard Worker             }
4523*cfb92d14SAndroid Build Coastguard Worker         }
4524*cfb92d14SAndroid Build Coastguard Worker     }
4525*cfb92d14SAndroid Build Coastguard Worker #endif
4526*cfb92d14SAndroid Build Coastguard Worker     else
4527*cfb92d14SAndroid Build Coastguard Worker     {
4528*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
4529*cfb92d14SAndroid Build Coastguard Worker     }
4530*cfb92d14SAndroid Build Coastguard Worker 
4531*cfb92d14SAndroid Build Coastguard Worker     return error;
4532*cfb92d14SAndroid Build Coastguard Worker }
4533*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_FTD
4534*cfb92d14SAndroid Build Coastguard Worker 
4535*cfb92d14SAndroid Build Coastguard Worker /**
4536*cfb92d14SAndroid Build Coastguard Worker  * @cli netstat
4537*cfb92d14SAndroid Build Coastguard Worker  * @code
4538*cfb92d14SAndroid Build Coastguard Worker  * netstat
4539*cfb92d14SAndroid Build Coastguard Worker  * | Local Address                                   | Peer Address                                    |
4540*cfb92d14SAndroid Build Coastguard Worker  * +-------------------------------------------------+-------------------------------------------------+
4541*cfb92d14SAndroid Build Coastguard Worker  * | [0:0:0:0:0:0:0:0]:49153                         | [0:0:0:0:0:0:0:0]:0                             |
4542*cfb92d14SAndroid Build Coastguard Worker  * | [0:0:0:0:0:0:0:0]:49152                         | [0:0:0:0:0:0:0:0]:0                             |
4543*cfb92d14SAndroid Build Coastguard Worker  * | [0:0:0:0:0:0:0:0]:61631                         | [0:0:0:0:0:0:0:0]:0                             |
4544*cfb92d14SAndroid Build Coastguard Worker  * | [0:0:0:0:0:0:0:0]:19788                         | [0:0:0:0:0:0:0:0]:0                             |
4545*cfb92d14SAndroid Build Coastguard Worker  * Done
4546*cfb92d14SAndroid Build Coastguard Worker  * @endcode
4547*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
4548*cfb92d14SAndroid Build Coastguard Worker  * #otUdpGetSockets
4549*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])4550*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("netstat")>(Arg aArgs[])
4551*cfb92d14SAndroid Build Coastguard Worker {
4552*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aArgs);
4553*cfb92d14SAndroid Build Coastguard Worker 
4554*cfb92d14SAndroid Build Coastguard Worker     static const char *const kNetstatTableTitles[]       = {"Local Address", "Peer Address"};
4555*cfb92d14SAndroid Build Coastguard Worker     static const uint8_t     kNetstatTableColumnWidths[] = {49, 49};
4556*cfb92d14SAndroid Build Coastguard Worker 
4557*cfb92d14SAndroid Build Coastguard Worker     char string[OT_IP6_SOCK_ADDR_STRING_SIZE];
4558*cfb92d14SAndroid Build Coastguard Worker 
4559*cfb92d14SAndroid Build Coastguard Worker     OutputTableHeader(kNetstatTableTitles, kNetstatTableColumnWidths);
4560*cfb92d14SAndroid Build Coastguard Worker 
4561*cfb92d14SAndroid Build Coastguard Worker     for (const otUdpSocket *socket = otUdpGetSockets(GetInstancePtr()); socket != nullptr; socket = socket->mNext)
4562*cfb92d14SAndroid Build Coastguard Worker     {
4563*cfb92d14SAndroid Build Coastguard Worker         otIp6SockAddrToString(&socket->mSockName, string, sizeof(string));
4564*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("| %-47s ", string);
4565*cfb92d14SAndroid Build Coastguard Worker         otIp6SockAddrToString(&socket->mPeerName, string, sizeof(string));
4566*cfb92d14SAndroid Build Coastguard Worker         OutputLine("| %-47s |", string);
4567*cfb92d14SAndroid Build Coastguard Worker     }
4568*cfb92d14SAndroid Build Coastguard Worker 
4569*cfb92d14SAndroid Build Coastguard Worker     return OT_ERROR_NONE;
4570*cfb92d14SAndroid Build Coastguard Worker }
4571*cfb92d14SAndroid Build Coastguard Worker 
4572*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_TMF_NETDATA_SERVICE_ENABLE
Process(Arg aArgs[])4573*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("service")>(Arg aArgs[])
4574*cfb92d14SAndroid Build Coastguard Worker {
4575*cfb92d14SAndroid Build Coastguard Worker     otError         error = OT_ERROR_INVALID_COMMAND;
4576*cfb92d14SAndroid Build Coastguard Worker     otServiceConfig cfg;
4577*cfb92d14SAndroid Build Coastguard Worker 
4578*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
4579*cfb92d14SAndroid Build Coastguard Worker     {
4580*cfb92d14SAndroid Build Coastguard Worker         otNetworkDataIterator iterator = OT_NETWORK_DATA_ITERATOR_INIT;
4581*cfb92d14SAndroid Build Coastguard Worker         otServiceConfig       config;
4582*cfb92d14SAndroid Build Coastguard Worker 
4583*cfb92d14SAndroid Build Coastguard Worker         while (otServerGetNextService(GetInstancePtr(), &iterator, &config) == OT_ERROR_NONE)
4584*cfb92d14SAndroid Build Coastguard Worker         {
4585*cfb92d14SAndroid Build Coastguard Worker             mNetworkData.OutputService(config);
4586*cfb92d14SAndroid Build Coastguard Worker         }
4587*cfb92d14SAndroid Build Coastguard Worker 
4588*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_NONE;
4589*cfb92d14SAndroid Build Coastguard Worker     }
4590*cfb92d14SAndroid Build Coastguard Worker     else
4591*cfb92d14SAndroid Build Coastguard Worker     {
4592*cfb92d14SAndroid Build Coastguard Worker         uint16_t length;
4593*cfb92d14SAndroid Build Coastguard Worker 
4594*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[1].ParseAsUint32(cfg.mEnterpriseNumber));
4595*cfb92d14SAndroid Build Coastguard Worker 
4596*cfb92d14SAndroid Build Coastguard Worker         length = sizeof(cfg.mServiceData);
4597*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[2].ParseAsHexString(length, cfg.mServiceData));
4598*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(length > 0, error = OT_ERROR_INVALID_ARGS);
4599*cfb92d14SAndroid Build Coastguard Worker         cfg.mServiceDataLength = static_cast<uint8_t>(length);
4600*cfb92d14SAndroid Build Coastguard Worker 
4601*cfb92d14SAndroid Build Coastguard Worker         /**
4602*cfb92d14SAndroid Build Coastguard Worker          * @cli service add
4603*cfb92d14SAndroid Build Coastguard Worker          * @code
4604*cfb92d14SAndroid Build Coastguard Worker          * service add 44970 112233 aabbcc
4605*cfb92d14SAndroid Build Coastguard Worker          * Done
4606*cfb92d14SAndroid Build Coastguard Worker          * @endcode
4607*cfb92d14SAndroid Build Coastguard Worker          * @code
4608*cfb92d14SAndroid Build Coastguard Worker          * netdata register
4609*cfb92d14SAndroid Build Coastguard Worker          * Done
4610*cfb92d14SAndroid Build Coastguard Worker          * @endcode
4611*cfb92d14SAndroid Build Coastguard Worker          * @cparam service add @ca{enterpriseNumber} @ca{serviceData} [@ca{serverData}]
4612*cfb92d14SAndroid Build Coastguard Worker          * @par
4613*cfb92d14SAndroid Build Coastguard Worker          * Adds service to the network data.
4614*cfb92d14SAndroid Build Coastguard Worker          * @par
4615*cfb92d14SAndroid Build Coastguard Worker          * - enterpriseNumber: IANA enterprise number
4616*cfb92d14SAndroid Build Coastguard Worker          * - serviceData: Hex-encoded binary service data
4617*cfb92d14SAndroid Build Coastguard Worker          * - serverData: Hex-encoded binary server data (empty if not provided)
4618*cfb92d14SAndroid Build Coastguard Worker          * @par
4619*cfb92d14SAndroid Build Coastguard Worker          * Note: For each change in service registration to take effect, run
4620*cfb92d14SAndroid Build Coastguard Worker          * the `netdata register` command after running the `service add` command to notify the leader.
4621*cfb92d14SAndroid Build Coastguard Worker          * @sa otServerAddService
4622*cfb92d14SAndroid Build Coastguard Worker          * @csa{netdata register}
4623*cfb92d14SAndroid Build Coastguard Worker          */
4624*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[0] == "add")
4625*cfb92d14SAndroid Build Coastguard Worker         {
4626*cfb92d14SAndroid Build Coastguard Worker             if (!aArgs[3].IsEmpty())
4627*cfb92d14SAndroid Build Coastguard Worker             {
4628*cfb92d14SAndroid Build Coastguard Worker                 length = sizeof(cfg.mServerConfig.mServerData);
4629*cfb92d14SAndroid Build Coastguard Worker                 SuccessOrExit(error = aArgs[3].ParseAsHexString(length, cfg.mServerConfig.mServerData));
4630*cfb92d14SAndroid Build Coastguard Worker                 VerifyOrExit(length > 0, error = OT_ERROR_INVALID_ARGS);
4631*cfb92d14SAndroid Build Coastguard Worker                 cfg.mServerConfig.mServerDataLength = static_cast<uint8_t>(length);
4632*cfb92d14SAndroid Build Coastguard Worker             }
4633*cfb92d14SAndroid Build Coastguard Worker             else
4634*cfb92d14SAndroid Build Coastguard Worker             {
4635*cfb92d14SAndroid Build Coastguard Worker                 cfg.mServerConfig.mServerDataLength = 0;
4636*cfb92d14SAndroid Build Coastguard Worker             }
4637*cfb92d14SAndroid Build Coastguard Worker 
4638*cfb92d14SAndroid Build Coastguard Worker             cfg.mServerConfig.mStable = true;
4639*cfb92d14SAndroid Build Coastguard Worker 
4640*cfb92d14SAndroid Build Coastguard Worker             error = otServerAddService(GetInstancePtr(), &cfg);
4641*cfb92d14SAndroid Build Coastguard Worker         }
4642*cfb92d14SAndroid Build Coastguard Worker         /**
4643*cfb92d14SAndroid Build Coastguard Worker          * @cli service remove
4644*cfb92d14SAndroid Build Coastguard Worker          * @code
4645*cfb92d14SAndroid Build Coastguard Worker          * service remove 44970 112233
4646*cfb92d14SAndroid Build Coastguard Worker          * Done
4647*cfb92d14SAndroid Build Coastguard Worker          * @endcode
4648*cfb92d14SAndroid Build Coastguard Worker          * @code
4649*cfb92d14SAndroid Build Coastguard Worker          * netdata register
4650*cfb92d14SAndroid Build Coastguard Worker          * Done
4651*cfb92d14SAndroid Build Coastguard Worker          * @endcode
4652*cfb92d14SAndroid Build Coastguard Worker          * @cparam service remove @ca{enterpriseNumber} @ca{serviceData}
4653*cfb92d14SAndroid Build Coastguard Worker          * @par
4654*cfb92d14SAndroid Build Coastguard Worker          * Removes service from the network data.
4655*cfb92d14SAndroid Build Coastguard Worker          * @par
4656*cfb92d14SAndroid Build Coastguard Worker          * - enterpriseNumber: IANA enterprise number
4657*cfb92d14SAndroid Build Coastguard Worker          * - serviceData: Hex-encoded binary service data
4658*cfb92d14SAndroid Build Coastguard Worker          * @par
4659*cfb92d14SAndroid Build Coastguard Worker          * Note: For each change in service registration to take effect, run
4660*cfb92d14SAndroid Build Coastguard Worker          * the `netdata register` command after running the `service remove` command to notify the leader.
4661*cfb92d14SAndroid Build Coastguard Worker          * @sa otServerRemoveService
4662*cfb92d14SAndroid Build Coastguard Worker          * @csa{netdata register}
4663*cfb92d14SAndroid Build Coastguard Worker          */
4664*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[0] == "remove")
4665*cfb92d14SAndroid Build Coastguard Worker         {
4666*cfb92d14SAndroid Build Coastguard Worker             error = otServerRemoveService(GetInstancePtr(), cfg.mEnterpriseNumber, cfg.mServiceData,
4667*cfb92d14SAndroid Build Coastguard Worker                                           cfg.mServiceDataLength);
4668*cfb92d14SAndroid Build Coastguard Worker         }
4669*cfb92d14SAndroid Build Coastguard Worker     }
4670*cfb92d14SAndroid Build Coastguard Worker 
4671*cfb92d14SAndroid Build Coastguard Worker exit:
4672*cfb92d14SAndroid Build Coastguard Worker     return error;
4673*cfb92d14SAndroid Build Coastguard Worker }
4674*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_TMF_NETDATA_SERVICE_ENABLE
4675*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])4676*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("netdata")>(Arg aArgs[]) { return mNetworkData.Process(aArgs); }
4677*cfb92d14SAndroid Build Coastguard Worker 
4678*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
4679*cfb92d14SAndroid Build Coastguard Worker /**
4680*cfb92d14SAndroid Build Coastguard Worker  * @cli networkidtimeout (get,set)
4681*cfb92d14SAndroid Build Coastguard Worker  * @code
4682*cfb92d14SAndroid Build Coastguard Worker  * networkidtimeout 120
4683*cfb92d14SAndroid Build Coastguard Worker  * Done
4684*cfb92d14SAndroid Build Coastguard Worker  * @endcode
4685*cfb92d14SAndroid Build Coastguard Worker  * @code
4686*cfb92d14SAndroid Build Coastguard Worker  * networkidtimeout
4687*cfb92d14SAndroid Build Coastguard Worker  * 120
4688*cfb92d14SAndroid Build Coastguard Worker  * Done
4689*cfb92d14SAndroid Build Coastguard Worker  * @endcode
4690*cfb92d14SAndroid Build Coastguard Worker  * @cparam networkidtimeout [@ca{timeout}]
4691*cfb92d14SAndroid Build Coastguard Worker  * Use the optional `timeout` argument to set the value of the `NETWORK_ID_TIMEOUT` parameter.
4692*cfb92d14SAndroid Build Coastguard Worker  * @par
4693*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets the `NETWORK_ID_TIMEOUT` parameter.
4694*cfb92d14SAndroid Build Coastguard Worker  * @note This command is reserved for testing and demo purposes only.
4695*cfb92d14SAndroid Build Coastguard Worker  * Changing settings with this API will render a production application
4696*cfb92d14SAndroid Build Coastguard Worker  * non-compliant with the Thread Specification.
4697*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadGetNetworkIdTimeout
4698*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadSetNetworkIdTimeout
4699*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])4700*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("networkidtimeout")>(Arg aArgs[])
4701*cfb92d14SAndroid Build Coastguard Worker {
4702*cfb92d14SAndroid Build Coastguard Worker     return ProcessGetSet(aArgs, otThreadGetNetworkIdTimeout, otThreadSetNetworkIdTimeout);
4703*cfb92d14SAndroid Build Coastguard Worker }
4704*cfb92d14SAndroid Build Coastguard Worker #endif
4705*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])4706*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("networkkey")>(Arg aArgs[])
4707*cfb92d14SAndroid Build Coastguard Worker {
4708*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
4709*cfb92d14SAndroid Build Coastguard Worker 
4710*cfb92d14SAndroid Build Coastguard Worker     /**
4711*cfb92d14SAndroid Build Coastguard Worker      * @cli networkkey
4712*cfb92d14SAndroid Build Coastguard Worker      * @code
4713*cfb92d14SAndroid Build Coastguard Worker      * networkkey
4714*cfb92d14SAndroid Build Coastguard Worker      * 00112233445566778899aabbccddeeff
4715*cfb92d14SAndroid Build Coastguard Worker      * Done
4716*cfb92d14SAndroid Build Coastguard Worker      * @endcode
4717*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
4718*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetNetworkKey
4719*cfb92d14SAndroid Build Coastguard Worker      */
4720*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
4721*cfb92d14SAndroid Build Coastguard Worker     {
4722*cfb92d14SAndroid Build Coastguard Worker         otNetworkKey networkKey;
4723*cfb92d14SAndroid Build Coastguard Worker 
4724*cfb92d14SAndroid Build Coastguard Worker         otThreadGetNetworkKey(GetInstancePtr(), &networkKey);
4725*cfb92d14SAndroid Build Coastguard Worker         OutputBytesLine(networkKey.m8);
4726*cfb92d14SAndroid Build Coastguard Worker     }
4727*cfb92d14SAndroid Build Coastguard Worker     /**
4728*cfb92d14SAndroid Build Coastguard Worker      * @cli networkkey (key)
4729*cfb92d14SAndroid Build Coastguard Worker      * @code
4730*cfb92d14SAndroid Build Coastguard Worker      * networkkey 00112233445566778899aabbccddeeff
4731*cfb92d14SAndroid Build Coastguard Worker      * Done
4732*cfb92d14SAndroid Build Coastguard Worker      * @endcode
4733*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
4734*cfb92d14SAndroid Build Coastguard Worker      * #otThreadSetNetworkKey
4735*cfb92d14SAndroid Build Coastguard Worker      * @cparam networkkey @ca{key}
4736*cfb92d14SAndroid Build Coastguard Worker      */
4737*cfb92d14SAndroid Build Coastguard Worker     else
4738*cfb92d14SAndroid Build Coastguard Worker     {
4739*cfb92d14SAndroid Build Coastguard Worker         otNetworkKey key;
4740*cfb92d14SAndroid Build Coastguard Worker 
4741*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[0].ParseAsHexString(key.m8));
4742*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otThreadSetNetworkKey(GetInstancePtr(), &key));
4743*cfb92d14SAndroid Build Coastguard Worker     }
4744*cfb92d14SAndroid Build Coastguard Worker 
4745*cfb92d14SAndroid Build Coastguard Worker exit:
4746*cfb92d14SAndroid Build Coastguard Worker     return error;
4747*cfb92d14SAndroid Build Coastguard Worker }
4748*cfb92d14SAndroid Build Coastguard Worker 
4749*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_KEY_REFERENCES_ENABLE
Process(Arg aArgs[])4750*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("networkkeyref")>(Arg aArgs[])
4751*cfb92d14SAndroid Build Coastguard Worker {
4752*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
4753*cfb92d14SAndroid Build Coastguard Worker 
4754*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
4755*cfb92d14SAndroid Build Coastguard Worker     {
4756*cfb92d14SAndroid Build Coastguard Worker         OutputLine("0x%08lx", ToUlong(otThreadGetNetworkKeyRef(GetInstancePtr())));
4757*cfb92d14SAndroid Build Coastguard Worker     }
4758*cfb92d14SAndroid Build Coastguard Worker     else
4759*cfb92d14SAndroid Build Coastguard Worker     {
4760*cfb92d14SAndroid Build Coastguard Worker         otNetworkKeyRef keyRef;
4761*cfb92d14SAndroid Build Coastguard Worker 
4762*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[0].ParseAsUint32(keyRef));
4763*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otThreadSetNetworkKeyRef(GetInstancePtr(), keyRef));
4764*cfb92d14SAndroid Build Coastguard Worker     }
4765*cfb92d14SAndroid Build Coastguard Worker 
4766*cfb92d14SAndroid Build Coastguard Worker exit:
4767*cfb92d14SAndroid Build Coastguard Worker     return error;
4768*cfb92d14SAndroid Build Coastguard Worker }
4769*cfb92d14SAndroid Build Coastguard Worker #endif
4770*cfb92d14SAndroid Build Coastguard Worker 
4771*cfb92d14SAndroid Build Coastguard Worker /**
4772*cfb92d14SAndroid Build Coastguard Worker  * @cli networkname
4773*cfb92d14SAndroid Build Coastguard Worker  * @code
4774*cfb92d14SAndroid Build Coastguard Worker  * networkname
4775*cfb92d14SAndroid Build Coastguard Worker  * OpenThread
4776*cfb92d14SAndroid Build Coastguard Worker  * Done
4777*cfb92d14SAndroid Build Coastguard Worker  * @endcode
4778*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
4779*cfb92d14SAndroid Build Coastguard Worker  * #otThreadGetNetworkName
4780*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])4781*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("networkname")>(Arg aArgs[])
4782*cfb92d14SAndroid Build Coastguard Worker {
4783*cfb92d14SAndroid Build Coastguard Worker     /**
4784*cfb92d14SAndroid Build Coastguard Worker      * @cli networkname (name)
4785*cfb92d14SAndroid Build Coastguard Worker      * @code
4786*cfb92d14SAndroid Build Coastguard Worker      * networkname OpenThread
4787*cfb92d14SAndroid Build Coastguard Worker      * Done
4788*cfb92d14SAndroid Build Coastguard Worker      * @endcode
4789*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
4790*cfb92d14SAndroid Build Coastguard Worker      * #otThreadSetNetworkName
4791*cfb92d14SAndroid Build Coastguard Worker      * @cparam networkname @ca{name}
4792*cfb92d14SAndroid Build Coastguard Worker      * @par
4793*cfb92d14SAndroid Build Coastguard Worker      * Note: The current commissioning credential becomes stale after changing this value. Use `pskc` to reset.
4794*cfb92d14SAndroid Build Coastguard Worker      */
4795*cfb92d14SAndroid Build Coastguard Worker     return ProcessGetSet(aArgs, otThreadGetNetworkName, otThreadSetNetworkName);
4796*cfb92d14SAndroid Build Coastguard Worker }
4797*cfb92d14SAndroid Build Coastguard Worker 
4798*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
Process(Arg aArgs[])4799*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("networktime")>(Arg aArgs[])
4800*cfb92d14SAndroid Build Coastguard Worker {
4801*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
4802*cfb92d14SAndroid Build Coastguard Worker 
4803*cfb92d14SAndroid Build Coastguard Worker     /**
4804*cfb92d14SAndroid Build Coastguard Worker      * @cli networktime
4805*cfb92d14SAndroid Build Coastguard Worker      * @code
4806*cfb92d14SAndroid Build Coastguard Worker      * networktime
4807*cfb92d14SAndroid Build Coastguard Worker      * Network Time:     21084154us (synchronized)
4808*cfb92d14SAndroid Build Coastguard Worker      * Time Sync Period: 100s
4809*cfb92d14SAndroid Build Coastguard Worker      * XTAL Threshold:   300ppm
4810*cfb92d14SAndroid Build Coastguard Worker      * Done
4811*cfb92d14SAndroid Build Coastguard Worker      * @endcode
4812*cfb92d14SAndroid Build Coastguard Worker      * @par
4813*cfb92d14SAndroid Build Coastguard Worker      * Gets the Thread network time and the time sync parameters.
4814*cfb92d14SAndroid Build Coastguard Worker      * @sa otNetworkTimeGet
4815*cfb92d14SAndroid Build Coastguard Worker      * @sa otNetworkTimeGetSyncPeriod
4816*cfb92d14SAndroid Build Coastguard Worker      * @sa otNetworkTimeGetXtalThreshold
4817*cfb92d14SAndroid Build Coastguard Worker      */
4818*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
4819*cfb92d14SAndroid Build Coastguard Worker     {
4820*cfb92d14SAndroid Build Coastguard Worker         uint64_t            time;
4821*cfb92d14SAndroid Build Coastguard Worker         otNetworkTimeStatus networkTimeStatus;
4822*cfb92d14SAndroid Build Coastguard Worker 
4823*cfb92d14SAndroid Build Coastguard Worker         networkTimeStatus = otNetworkTimeGet(GetInstancePtr(), &time);
4824*cfb92d14SAndroid Build Coastguard Worker 
4825*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("Network Time:     ");
4826*cfb92d14SAndroid Build Coastguard Worker         OutputUint64(time);
4827*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("us");
4828*cfb92d14SAndroid Build Coastguard Worker 
4829*cfb92d14SAndroid Build Coastguard Worker         switch (networkTimeStatus)
4830*cfb92d14SAndroid Build Coastguard Worker         {
4831*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_TIME_UNSYNCHRONIZED:
4832*cfb92d14SAndroid Build Coastguard Worker             OutputLine(" (unsynchronized)");
4833*cfb92d14SAndroid Build Coastguard Worker             break;
4834*cfb92d14SAndroid Build Coastguard Worker 
4835*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_TIME_RESYNC_NEEDED:
4836*cfb92d14SAndroid Build Coastguard Worker             OutputLine(" (resync needed)");
4837*cfb92d14SAndroid Build Coastguard Worker             break;
4838*cfb92d14SAndroid Build Coastguard Worker 
4839*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_TIME_SYNCHRONIZED:
4840*cfb92d14SAndroid Build Coastguard Worker             OutputLine(" (synchronized)");
4841*cfb92d14SAndroid Build Coastguard Worker             break;
4842*cfb92d14SAndroid Build Coastguard Worker 
4843*cfb92d14SAndroid Build Coastguard Worker         default:
4844*cfb92d14SAndroid Build Coastguard Worker             break;
4845*cfb92d14SAndroid Build Coastguard Worker         }
4846*cfb92d14SAndroid Build Coastguard Worker 
4847*cfb92d14SAndroid Build Coastguard Worker         OutputLine("Time Sync Period: %us", otNetworkTimeGetSyncPeriod(GetInstancePtr()));
4848*cfb92d14SAndroid Build Coastguard Worker         OutputLine("XTAL Threshold:   %uppm", otNetworkTimeGetXtalThreshold(GetInstancePtr()));
4849*cfb92d14SAndroid Build Coastguard Worker     }
4850*cfb92d14SAndroid Build Coastguard Worker     /**
4851*cfb92d14SAndroid Build Coastguard Worker      * @cli networktime (set)
4852*cfb92d14SAndroid Build Coastguard Worker      * @code
4853*cfb92d14SAndroid Build Coastguard Worker      * networktime 100 300
4854*cfb92d14SAndroid Build Coastguard Worker      * Done
4855*cfb92d14SAndroid Build Coastguard Worker      * @endcode
4856*cfb92d14SAndroid Build Coastguard Worker      * @cparam networktime @ca{timesyncperiod} @ca{xtalthreshold}
4857*cfb92d14SAndroid Build Coastguard Worker      * @par
4858*cfb92d14SAndroid Build Coastguard Worker      * Sets the time sync parameters.
4859*cfb92d14SAndroid Build Coastguard Worker      * *   `timesyncperiod`: The time synchronization period, in seconds.
4860*cfb92d14SAndroid Build Coastguard Worker      * *   `xtalthreshold`: The XTAL accuracy threshold for a device to become Router-Capable device, in PPM.
4861*cfb92d14SAndroid Build Coastguard Worker      * @sa otNetworkTimeSetSyncPeriod
4862*cfb92d14SAndroid Build Coastguard Worker      * @sa otNetworkTimeSetXtalThreshold
4863*cfb92d14SAndroid Build Coastguard Worker      */
4864*cfb92d14SAndroid Build Coastguard Worker     else
4865*cfb92d14SAndroid Build Coastguard Worker     {
4866*cfb92d14SAndroid Build Coastguard Worker         uint16_t period;
4867*cfb92d14SAndroid Build Coastguard Worker         uint16_t xtalThreshold;
4868*cfb92d14SAndroid Build Coastguard Worker 
4869*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[0].ParseAsUint16(period));
4870*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[1].ParseAsUint16(xtalThreshold));
4871*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otNetworkTimeSetSyncPeriod(GetInstancePtr(), period));
4872*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otNetworkTimeSetXtalThreshold(GetInstancePtr(), xtalThreshold));
4873*cfb92d14SAndroid Build Coastguard Worker     }
4874*cfb92d14SAndroid Build Coastguard Worker 
4875*cfb92d14SAndroid Build Coastguard Worker exit:
4876*cfb92d14SAndroid Build Coastguard Worker     return error;
4877*cfb92d14SAndroid Build Coastguard Worker }
4878*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
4879*cfb92d14SAndroid Build Coastguard Worker 
4880*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
Process(Arg aArgs[])4881*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("nexthop")>(Arg aArgs[])
4882*cfb92d14SAndroid Build Coastguard Worker {
4883*cfb92d14SAndroid Build Coastguard Worker     constexpr uint8_t  kRouterIdOffset = 10; // Bit offset of Router ID in RLOC16
4884*cfb92d14SAndroid Build Coastguard Worker     constexpr uint16_t kInvalidRloc16  = 0xfffe;
4885*cfb92d14SAndroid Build Coastguard Worker 
4886*cfb92d14SAndroid Build Coastguard Worker     otError  error = OT_ERROR_NONE;
4887*cfb92d14SAndroid Build Coastguard Worker     uint16_t destRloc16;
4888*cfb92d14SAndroid Build Coastguard Worker     uint16_t nextHopRloc16;
4889*cfb92d14SAndroid Build Coastguard Worker     uint8_t  pathCost;
4890*cfb92d14SAndroid Build Coastguard Worker 
4891*cfb92d14SAndroid Build Coastguard Worker     /**
4892*cfb92d14SAndroid Build Coastguard Worker      * @cli nexthop
4893*cfb92d14SAndroid Build Coastguard Worker      * @code
4894*cfb92d14SAndroid Build Coastguard Worker      * nexthop
4895*cfb92d14SAndroid Build Coastguard Worker      * | ID   |NxtHop| Cost |
4896*cfb92d14SAndroid Build Coastguard Worker      * +------+------+------+
4897*cfb92d14SAndroid Build Coastguard Worker      * |    9 |    9 |    1 |
4898*cfb92d14SAndroid Build Coastguard Worker      * |   25 |   25 |    0 |
4899*cfb92d14SAndroid Build Coastguard Worker      * |   30 |   30 |    1 |
4900*cfb92d14SAndroid Build Coastguard Worker      * |   46 |    - |    - |
4901*cfb92d14SAndroid Build Coastguard Worker      * |   50 |   30 |    3 |
4902*cfb92d14SAndroid Build Coastguard Worker      * |   60 |   30 |    2 |
4903*cfb92d14SAndroid Build Coastguard Worker      * Done
4904*cfb92d14SAndroid Build Coastguard Worker      * @endcode
4905*cfb92d14SAndroid Build Coastguard Worker      * @par
4906*cfb92d14SAndroid Build Coastguard Worker      * Output table of allocated Router IDs and current next hop and path
4907*cfb92d14SAndroid Build Coastguard Worker      * cost for each router.
4908*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadGetNextHopAndPathCost
4909*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadIsRouterIdAllocated
4910*cfb92d14SAndroid Build Coastguard Worker      */
4911*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
4912*cfb92d14SAndroid Build Coastguard Worker     {
4913*cfb92d14SAndroid Build Coastguard Worker         static const char *const kNextHopTableTitles[] = {
4914*cfb92d14SAndroid Build Coastguard Worker             "ID",
4915*cfb92d14SAndroid Build Coastguard Worker             "NxtHop",
4916*cfb92d14SAndroid Build Coastguard Worker             "Cost",
4917*cfb92d14SAndroid Build Coastguard Worker         };
4918*cfb92d14SAndroid Build Coastguard Worker 
4919*cfb92d14SAndroid Build Coastguard Worker         static const uint8_t kNextHopTableColumnWidths[] = {
4920*cfb92d14SAndroid Build Coastguard Worker             6,
4921*cfb92d14SAndroid Build Coastguard Worker             6,
4922*cfb92d14SAndroid Build Coastguard Worker             6,
4923*cfb92d14SAndroid Build Coastguard Worker         };
4924*cfb92d14SAndroid Build Coastguard Worker 
4925*cfb92d14SAndroid Build Coastguard Worker         OutputTableHeader(kNextHopTableTitles, kNextHopTableColumnWidths);
4926*cfb92d14SAndroid Build Coastguard Worker 
4927*cfb92d14SAndroid Build Coastguard Worker         for (uint8_t routerId = 0; routerId <= OT_NETWORK_MAX_ROUTER_ID; routerId++)
4928*cfb92d14SAndroid Build Coastguard Worker         {
4929*cfb92d14SAndroid Build Coastguard Worker             if (!otThreadIsRouterIdAllocated(GetInstancePtr(), routerId))
4930*cfb92d14SAndroid Build Coastguard Worker             {
4931*cfb92d14SAndroid Build Coastguard Worker                 continue;
4932*cfb92d14SAndroid Build Coastguard Worker             }
4933*cfb92d14SAndroid Build Coastguard Worker 
4934*cfb92d14SAndroid Build Coastguard Worker             destRloc16 = routerId;
4935*cfb92d14SAndroid Build Coastguard Worker             destRloc16 <<= kRouterIdOffset;
4936*cfb92d14SAndroid Build Coastguard Worker 
4937*cfb92d14SAndroid Build Coastguard Worker             otThreadGetNextHopAndPathCost(GetInstancePtr(), destRloc16, &nextHopRloc16, &pathCost);
4938*cfb92d14SAndroid Build Coastguard Worker 
4939*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("| %4u | ", routerId);
4940*cfb92d14SAndroid Build Coastguard Worker 
4941*cfb92d14SAndroid Build Coastguard Worker             if (nextHopRloc16 != kInvalidRloc16)
4942*cfb92d14SAndroid Build Coastguard Worker             {
4943*cfb92d14SAndroid Build Coastguard Worker                 OutputLine("%4u | %4u |", nextHopRloc16 >> kRouterIdOffset, pathCost);
4944*cfb92d14SAndroid Build Coastguard Worker             }
4945*cfb92d14SAndroid Build Coastguard Worker             else
4946*cfb92d14SAndroid Build Coastguard Worker             {
4947*cfb92d14SAndroid Build Coastguard Worker                 OutputLine("%4s | %4s |", "-", "-");
4948*cfb92d14SAndroid Build Coastguard Worker             }
4949*cfb92d14SAndroid Build Coastguard Worker         }
4950*cfb92d14SAndroid Build Coastguard Worker     }
4951*cfb92d14SAndroid Build Coastguard Worker     /**
4952*cfb92d14SAndroid Build Coastguard Worker      * @cli nexthop (get)
4953*cfb92d14SAndroid Build Coastguard Worker      * @code
4954*cfb92d14SAndroid Build Coastguard Worker      * nexthop 0xc000
4955*cfb92d14SAndroid Build Coastguard Worker      * 0xc000 cost:0
4956*cfb92d14SAndroid Build Coastguard Worker      * Done
4957*cfb92d14SAndroid Build Coastguard Worker      * @endcode
4958*cfb92d14SAndroid Build Coastguard Worker      * @code
4959*cfb92d14SAndroid Build Coastguard Worker      * nexthop 0x8001
4960*cfb92d14SAndroid Build Coastguard Worker      * 0x2000 cost:3
4961*cfb92d14SAndroid Build Coastguard Worker      * Done
4962*cfb92d14SAndroid Build Coastguard Worker      * @endcode
4963*cfb92d14SAndroid Build Coastguard Worker      * @cparam nexthop @ca{rloc16}
4964*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
4965*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetNextHopAndPathCost
4966*cfb92d14SAndroid Build Coastguard Worker      */
4967*cfb92d14SAndroid Build Coastguard Worker     else
4968*cfb92d14SAndroid Build Coastguard Worker     {
4969*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[0].ParseAsUint16(destRloc16));
4970*cfb92d14SAndroid Build Coastguard Worker         otThreadGetNextHopAndPathCost(GetInstancePtr(), destRloc16, &nextHopRloc16, &pathCost);
4971*cfb92d14SAndroid Build Coastguard Worker         OutputLine("0x%04x cost:%u", nextHopRloc16, pathCost);
4972*cfb92d14SAndroid Build Coastguard Worker     }
4973*cfb92d14SAndroid Build Coastguard Worker 
4974*cfb92d14SAndroid Build Coastguard Worker exit:
4975*cfb92d14SAndroid Build Coastguard Worker     return error;
4976*cfb92d14SAndroid Build Coastguard Worker }
4977*cfb92d14SAndroid Build Coastguard Worker 
4978*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MESH_DIAG_ENABLE
4979*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])4980*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("meshdiag")>(Arg aArgs[])
4981*cfb92d14SAndroid Build Coastguard Worker {
4982*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
4983*cfb92d14SAndroid Build Coastguard Worker 
4984*cfb92d14SAndroid Build Coastguard Worker     /**
4985*cfb92d14SAndroid Build Coastguard Worker      * @cli meshdiag topology
4986*cfb92d14SAndroid Build Coastguard Worker      * @code
4987*cfb92d14SAndroid Build Coastguard Worker      * meshdiag topology
4988*cfb92d14SAndroid Build Coastguard Worker      * id:02 rloc16:0x0800 ext-addr:8aa57d2c603fe16c ver:4 - me - leader
4989*cfb92d14SAndroid Build Coastguard Worker      *    3-links:{ 46 }
4990*cfb92d14SAndroid Build Coastguard Worker      * id:46 rloc16:0xb800 ext-addr:fe109d277e0175cc ver:4
4991*cfb92d14SAndroid Build Coastguard Worker      *    3-links:{ 02 51 57 }
4992*cfb92d14SAndroid Build Coastguard Worker      * id:33 rloc16:0x8400 ext-addr:d2e511a146b9e54d ver:4
4993*cfb92d14SAndroid Build Coastguard Worker      *    3-links:{ 51 57 }
4994*cfb92d14SAndroid Build Coastguard Worker      * id:51 rloc16:0xcc00 ext-addr:9aab43ababf05352 ver:4
4995*cfb92d14SAndroid Build Coastguard Worker      *    3-links:{ 33 57 }
4996*cfb92d14SAndroid Build Coastguard Worker      *    2-links:{ 46 }
4997*cfb92d14SAndroid Build Coastguard Worker      * id:57 rloc16:0xe400 ext-addr:dae9c4c0e9da55ff ver:4
4998*cfb92d14SAndroid Build Coastguard Worker      *    3-links:{ 46 51 }
4999*cfb92d14SAndroid Build Coastguard Worker      *    1-links:{ 33 }
5000*cfb92d14SAndroid Build Coastguard Worker      * Done
5001*cfb92d14SAndroid Build Coastguard Worker      * @endcode
5002*cfb92d14SAndroid Build Coastguard Worker      * @par
5003*cfb92d14SAndroid Build Coastguard Worker      * Discover network topology (list of routers and their connections).
5004*cfb92d14SAndroid Build Coastguard Worker      * Parameters are optional and indicate additional items to discover. Can be added in any order.
5005*cfb92d14SAndroid Build Coastguard Worker      * * `ip6-addrs` to discover the list of IPv6 addresses of every router.
5006*cfb92d14SAndroid Build Coastguard Worker      * * `children` to discover the child table of every router.
5007*cfb92d14SAndroid Build Coastguard Worker      * @par
5008*cfb92d14SAndroid Build Coastguard Worker      * Information per router:
5009*cfb92d14SAndroid Build Coastguard Worker      * * Router ID
5010*cfb92d14SAndroid Build Coastguard Worker      * * RLOC16
5011*cfb92d14SAndroid Build Coastguard Worker      * * Extended MAC address
5012*cfb92d14SAndroid Build Coastguard Worker      * * Thread Version (if known)
5013*cfb92d14SAndroid Build Coastguard Worker      * * Whether the router is this device is itself (`me`)
5014*cfb92d14SAndroid Build Coastguard Worker      * * Whether the router is the parent of this device when device is a child (`parent`)
5015*cfb92d14SAndroid Build Coastguard Worker      * * Whether the router is `leader`
5016*cfb92d14SAndroid Build Coastguard Worker      * * Whether the router acts as a border router providing external connectivity (`br`)
5017*cfb92d14SAndroid Build Coastguard Worker      * * List of routers to which this router has a link:
5018*cfb92d14SAndroid Build Coastguard Worker      *   * `3-links`: Router IDs to which this router has a incoming link with link quality 3
5019*cfb92d14SAndroid Build Coastguard Worker      *   * `2-links`: Router IDs to which this router has a incoming link with link quality 2
5020*cfb92d14SAndroid Build Coastguard Worker      *   * `1-links`: Router IDs to which this router has a incoming link with link quality 1
5021*cfb92d14SAndroid Build Coastguard Worker      *   * If a list if empty, it is omitted in the out.
5022*cfb92d14SAndroid Build Coastguard Worker      * * If `ip6-addrs`, list of IPv6 addresses of the router
5023*cfb92d14SAndroid Build Coastguard Worker      * * If `children`, list of all children of the router. Information per child:
5024*cfb92d14SAndroid Build Coastguard Worker      *   * RLOC16
5025*cfb92d14SAndroid Build Coastguard Worker      *   * Incoming Link Quality from perspective of parent to child (zero indicates unknown)
5026*cfb92d14SAndroid Build Coastguard Worker      *   * Child Device mode (`r` rx-on-when-idle, `d` Full Thread Device, `n` Full Network Data, `-` no flags set)
5027*cfb92d14SAndroid Build Coastguard Worker      *   * Whether the child is this device itself (`me`)
5028*cfb92d14SAndroid Build Coastguard Worker      *   * Whether the child acts as a border router providing external connectivity (`br`)
5029*cfb92d14SAndroid Build Coastguard Worker      * @cparam meshdiag topology [@ca{ip6-addrs}] [@ca{children}]
5030*cfb92d14SAndroid Build Coastguard Worker      * @sa otMeshDiagDiscoverTopology
5031*cfb92d14SAndroid Build Coastguard Worker      */
5032*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "topology")
5033*cfb92d14SAndroid Build Coastguard Worker     {
5034*cfb92d14SAndroid Build Coastguard Worker         otMeshDiagDiscoverConfig config;
5035*cfb92d14SAndroid Build Coastguard Worker 
5036*cfb92d14SAndroid Build Coastguard Worker         config.mDiscoverIp6Addresses = false;
5037*cfb92d14SAndroid Build Coastguard Worker         config.mDiscoverChildTable   = false;
5038*cfb92d14SAndroid Build Coastguard Worker 
5039*cfb92d14SAndroid Build Coastguard Worker         aArgs++;
5040*cfb92d14SAndroid Build Coastguard Worker 
5041*cfb92d14SAndroid Build Coastguard Worker         for (; !aArgs->IsEmpty(); aArgs++)
5042*cfb92d14SAndroid Build Coastguard Worker         {
5043*cfb92d14SAndroid Build Coastguard Worker             if (*aArgs == "ip6-addrs")
5044*cfb92d14SAndroid Build Coastguard Worker             {
5045*cfb92d14SAndroid Build Coastguard Worker                 config.mDiscoverIp6Addresses = true;
5046*cfb92d14SAndroid Build Coastguard Worker             }
5047*cfb92d14SAndroid Build Coastguard Worker             else if (*aArgs == "children")
5048*cfb92d14SAndroid Build Coastguard Worker             {
5049*cfb92d14SAndroid Build Coastguard Worker                 config.mDiscoverChildTable = true;
5050*cfb92d14SAndroid Build Coastguard Worker             }
5051*cfb92d14SAndroid Build Coastguard Worker             else
5052*cfb92d14SAndroid Build Coastguard Worker             {
5053*cfb92d14SAndroid Build Coastguard Worker                 ExitNow(error = OT_ERROR_INVALID_ARGS);
5054*cfb92d14SAndroid Build Coastguard Worker             }
5055*cfb92d14SAndroid Build Coastguard Worker         }
5056*cfb92d14SAndroid Build Coastguard Worker 
5057*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otMeshDiagDiscoverTopology(GetInstancePtr(), &config, HandleMeshDiagDiscoverDone, this));
5058*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_PENDING;
5059*cfb92d14SAndroid Build Coastguard Worker     }
5060*cfb92d14SAndroid Build Coastguard Worker     /**
5061*cfb92d14SAndroid Build Coastguard Worker      * @cli meshdiag childtable
5062*cfb92d14SAndroid Build Coastguard Worker      * @code
5063*cfb92d14SAndroid Build Coastguard Worker      * meshdiag childtable 0x6400
5064*cfb92d14SAndroid Build Coastguard Worker      * rloc16:0x6402 ext-addr:8e6f4d323bbed1fe ver:4
5065*cfb92d14SAndroid Build Coastguard Worker      *     timeout:120 age:36 supvn:129 q-msg:0
5066*cfb92d14SAndroid Build Coastguard Worker      *     rx-on:yes type:ftd full-net:yes
5067*cfb92d14SAndroid Build Coastguard Worker      *     rss - ave:-20 last:-20 margin:80
5068*cfb92d14SAndroid Build Coastguard Worker      *     err-rate - frame:11.51% msg:0.76%
5069*cfb92d14SAndroid Build Coastguard Worker      *     conn-time:00:11:07
5070*cfb92d14SAndroid Build Coastguard Worker      *     csl - sync:no period:0 timeout:0 channel:0
5071*cfb92d14SAndroid Build Coastguard Worker      * rloc16:0x6403 ext-addr:ee24e64ecf8c079a ver:4
5072*cfb92d14SAndroid Build Coastguard Worker      *     timeout:120 age:19 supvn:129 q-msg:0
5073*cfb92d14SAndroid Build Coastguard Worker      *     rx-on:no type:mtd full-net:no
5074*cfb92d14SAndroid Build Coastguard Worker      *     rss - ave:-20 last:-20  margin:80
5075*cfb92d14SAndroid Build Coastguard Worker      *     err-rate - frame:0.73% msg:0.00%
5076*cfb92d14SAndroid Build Coastguard Worker      *     conn-time:01:08:53
5077*cfb92d14SAndroid Build Coastguard Worker      *     csl - sync:no period:0 timeout:0 channel:0
5078*cfb92d14SAndroid Build Coastguard Worker      * Done
5079*cfb92d14SAndroid Build Coastguard Worker      * @endcode
5080*cfb92d14SAndroid Build Coastguard Worker      * @par
5081*cfb92d14SAndroid Build Coastguard Worker      * Start a query for child table of a router with a given RLOC16.
5082*cfb92d14SAndroid Build Coastguard Worker      * Output lists all child entries. Information per child:
5083*cfb92d14SAndroid Build Coastguard Worker      * - RLOC16
5084*cfb92d14SAndroid Build Coastguard Worker      * - Extended MAC address
5085*cfb92d14SAndroid Build Coastguard Worker      * - Thread Version
5086*cfb92d14SAndroid Build Coastguard Worker      * - Timeout (in seconds)
5087*cfb92d14SAndroid Build Coastguard Worker      * - Age (seconds since last heard)
5088*cfb92d14SAndroid Build Coastguard Worker      * - Supervision interval (in seconds)
5089*cfb92d14SAndroid Build Coastguard Worker      * - Number of queued messages (in case child is sleepy)
5090*cfb92d14SAndroid Build Coastguard Worker      * - Device Mode
5091*cfb92d14SAndroid Build Coastguard Worker      * - RSS (average and last)
5092*cfb92d14SAndroid Build Coastguard Worker      * - Error rates: frame tx (at MAC layer), IPv6 message tx (above MAC)
5093*cfb92d14SAndroid Build Coastguard Worker      * - Connection time (seconds since link establishment `{dd}d.{hh}:{mm}:{ss}` format)
5094*cfb92d14SAndroid Build Coastguard Worker      * - CSL info:
5095*cfb92d14SAndroid Build Coastguard Worker      *   - If synchronized
5096*cfb92d14SAndroid Build Coastguard Worker      *   - Period (in unit of 10-symbols-time)
5097*cfb92d14SAndroid Build Coastguard Worker      *   - Timeout (in seconds)
5098*cfb92d14SAndroid Build Coastguard Worker      *
5099*cfb92d14SAndroid Build Coastguard Worker      * @cparam meshdiag childtable @ca{router-rloc16}
5100*cfb92d14SAndroid Build Coastguard Worker      * @sa otMeshDiagQueryChildTable
5101*cfb92d14SAndroid Build Coastguard Worker      */
5102*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "childtable")
5103*cfb92d14SAndroid Build Coastguard Worker     {
5104*cfb92d14SAndroid Build Coastguard Worker         uint16_t routerRloc16;
5105*cfb92d14SAndroid Build Coastguard Worker 
5106*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[1].ParseAsUint16(routerRloc16));
5107*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(aArgs[2].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
5108*cfb92d14SAndroid Build Coastguard Worker 
5109*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otMeshDiagQueryChildTable(GetInstancePtr(), routerRloc16,
5110*cfb92d14SAndroid Build Coastguard Worker                                                         HandleMeshDiagQueryChildTableResult, this));
5111*cfb92d14SAndroid Build Coastguard Worker 
5112*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_PENDING;
5113*cfb92d14SAndroid Build Coastguard Worker     }
5114*cfb92d14SAndroid Build Coastguard Worker     /**
5115*cfb92d14SAndroid Build Coastguard Worker      * @cli meshdiag childip6
5116*cfb92d14SAndroid Build Coastguard Worker      * @code
5117*cfb92d14SAndroid Build Coastguard Worker      * meshdiag childip6 0xdc00
5118*cfb92d14SAndroid Build Coastguard Worker      * child-rloc16: 0xdc02
5119*cfb92d14SAndroid Build Coastguard Worker      *     fdde:ad00:beef:0:ded8:cd58:b73:2c21
5120*cfb92d14SAndroid Build Coastguard Worker      *     fd00:2:0:0:c24a:456:3b6b:c597
5121*cfb92d14SAndroid Build Coastguard Worker      *     fd00:1:0:0:120b:95fe:3ecc:d238
5122*cfb92d14SAndroid Build Coastguard Worker      * child-rloc16: 0xdc03
5123*cfb92d14SAndroid Build Coastguard Worker      *     fdde:ad00:beef:0:3aa6:b8bf:e7d6:eefe
5124*cfb92d14SAndroid Build Coastguard Worker      *     fd00:2:0:0:8ff8:a188:7436:6720
5125*cfb92d14SAndroid Build Coastguard Worker      *     fd00:1:0:0:1fcf:5495:790a:370f
5126*cfb92d14SAndroid Build Coastguard Worker      * Done
5127*cfb92d14SAndroid Build Coastguard Worker      * @endcode
5128*cfb92d14SAndroid Build Coastguard Worker      * @par
5129*cfb92d14SAndroid Build Coastguard Worker      * Send a query to a parent to retrieve the IPv6 addresses of all its MTD children.
5130*cfb92d14SAndroid Build Coastguard Worker      * @cparam meshdiag childip6 @ca{parent-rloc16}
5131*cfb92d14SAndroid Build Coastguard Worker      * @sa otMeshDiagQueryChildrenIp6Addrs
5132*cfb92d14SAndroid Build Coastguard Worker      */
5133*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "childip6")
5134*cfb92d14SAndroid Build Coastguard Worker     {
5135*cfb92d14SAndroid Build Coastguard Worker         uint16_t parentRloc16;
5136*cfb92d14SAndroid Build Coastguard Worker 
5137*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[1].ParseAsUint16(parentRloc16));
5138*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(aArgs[2].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
5139*cfb92d14SAndroid Build Coastguard Worker 
5140*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otMeshDiagQueryChildrenIp6Addrs(GetInstancePtr(), parentRloc16,
5141*cfb92d14SAndroid Build Coastguard Worker                                                               HandleMeshDiagQueryChildIp6Addrs, this));
5142*cfb92d14SAndroid Build Coastguard Worker 
5143*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_PENDING;
5144*cfb92d14SAndroid Build Coastguard Worker     }
5145*cfb92d14SAndroid Build Coastguard Worker     /**
5146*cfb92d14SAndroid Build Coastguard Worker      * @cli meshdiag routerneighbortable
5147*cfb92d14SAndroid Build Coastguard Worker      * @code
5148*cfb92d14SAndroid Build Coastguard Worker      * meshdiag routerneighbortable 0x7400
5149*cfb92d14SAndroid Build Coastguard Worker      * rloc16:0x9c00 ext-addr:764788cf6e57a4d2 ver:4
5150*cfb92d14SAndroid Build Coastguard Worker      *    rss - ave:-20 last:-20 margin:80
5151*cfb92d14SAndroid Build Coastguard Worker      *    err-rate - frame:1.38% msg:0.00%
5152*cfb92d14SAndroid Build Coastguard Worker      *    conn-time:01:54:02
5153*cfb92d14SAndroid Build Coastguard Worker      * rloc16:0x7c00 ext-addr:4ed24fceec9bf6d3 ver:4
5154*cfb92d14SAndroid Build Coastguard Worker      *    rss - ave:-20 last:-20 margin:80
5155*cfb92d14SAndroid Build Coastguard Worker      *    err-rate - frame:0.72% msg:0.00%
5156*cfb92d14SAndroid Build Coastguard Worker      *    conn-time:00:11:27
5157*cfb92d14SAndroid Build Coastguard Worker      * Done
5158*cfb92d14SAndroid Build Coastguard Worker      * @endcode
5159*cfb92d14SAndroid Build Coastguard Worker      * @par
5160*cfb92d14SAndroid Build Coastguard Worker      * Start a query for router neighbor table of a router with a given RLOC16.
5161*cfb92d14SAndroid Build Coastguard Worker      * Output lists all router neighbor entries. Information per entry:
5162*cfb92d14SAndroid Build Coastguard Worker      *  - RLOC16
5163*cfb92d14SAndroid Build Coastguard Worker      *  - Extended MAC address
5164*cfb92d14SAndroid Build Coastguard Worker      *  - Thread Version
5165*cfb92d14SAndroid Build Coastguard Worker      *  - RSS (average and last) and link margin
5166*cfb92d14SAndroid Build Coastguard Worker      *  - Error rates, frame tx (at MAC layer), IPv6 message tx (above MAC)
5167*cfb92d14SAndroid Build Coastguard Worker      *  - Connection time (seconds since link establishment `{dd}d.{hh}:{mm}:{ss}` format)
5168*cfb92d14SAndroid Build Coastguard Worker      * @cparam meshdiag routerneighbortable @ca{router-rloc16}
5169*cfb92d14SAndroid Build Coastguard Worker      * @sa otMeshDiagQueryRouterNeighborTable
5170*cfb92d14SAndroid Build Coastguard Worker      */
5171*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "routerneighbortable")
5172*cfb92d14SAndroid Build Coastguard Worker     {
5173*cfb92d14SAndroid Build Coastguard Worker         uint16_t routerRloc16;
5174*cfb92d14SAndroid Build Coastguard Worker 
5175*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[1].ParseAsUint16(routerRloc16));
5176*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(aArgs[2].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
5177*cfb92d14SAndroid Build Coastguard Worker 
5178*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otMeshDiagQueryRouterNeighborTable(GetInstancePtr(), routerRloc16,
5179*cfb92d14SAndroid Build Coastguard Worker                                                                  HandleMeshDiagQueryRouterNeighborTableResult, this));
5180*cfb92d14SAndroid Build Coastguard Worker 
5181*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_PENDING;
5182*cfb92d14SAndroid Build Coastguard Worker     }
5183*cfb92d14SAndroid Build Coastguard Worker     else
5184*cfb92d14SAndroid Build Coastguard Worker     {
5185*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_COMMAND;
5186*cfb92d14SAndroid Build Coastguard Worker     }
5187*cfb92d14SAndroid Build Coastguard Worker 
5188*cfb92d14SAndroid Build Coastguard Worker exit:
5189*cfb92d14SAndroid Build Coastguard Worker     return error;
5190*cfb92d14SAndroid Build Coastguard Worker }
5191*cfb92d14SAndroid Build Coastguard Worker 
HandleMeshDiagDiscoverDone(otError aError,otMeshDiagRouterInfo * aRouterInfo,void * aContext)5192*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleMeshDiagDiscoverDone(otError aError, otMeshDiagRouterInfo *aRouterInfo, void *aContext)
5193*cfb92d14SAndroid Build Coastguard Worker {
5194*cfb92d14SAndroid Build Coastguard Worker     reinterpret_cast<Interpreter *>(aContext)->HandleMeshDiagDiscoverDone(aError, aRouterInfo);
5195*cfb92d14SAndroid Build Coastguard Worker }
5196*cfb92d14SAndroid Build Coastguard Worker 
HandleMeshDiagDiscoverDone(otError aError,otMeshDiagRouterInfo * aRouterInfo)5197*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleMeshDiagDiscoverDone(otError aError, otMeshDiagRouterInfo *aRouterInfo)
5198*cfb92d14SAndroid Build Coastguard Worker {
5199*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(aRouterInfo != nullptr);
5200*cfb92d14SAndroid Build Coastguard Worker 
5201*cfb92d14SAndroid Build Coastguard Worker     OutputFormat("id:%02u rloc16:0x%04x ext-addr:", aRouterInfo->mRouterId, aRouterInfo->mRloc16);
5202*cfb92d14SAndroid Build Coastguard Worker     OutputExtAddress(aRouterInfo->mExtAddress);
5203*cfb92d14SAndroid Build Coastguard Worker 
5204*cfb92d14SAndroid Build Coastguard Worker     if (aRouterInfo->mVersion != OT_MESH_DIAG_VERSION_UNKNOWN)
5205*cfb92d14SAndroid Build Coastguard Worker     {
5206*cfb92d14SAndroid Build Coastguard Worker         OutputFormat(" ver:%u", aRouterInfo->mVersion);
5207*cfb92d14SAndroid Build Coastguard Worker     }
5208*cfb92d14SAndroid Build Coastguard Worker 
5209*cfb92d14SAndroid Build Coastguard Worker     if (aRouterInfo->mIsThisDevice)
5210*cfb92d14SAndroid Build Coastguard Worker     {
5211*cfb92d14SAndroid Build Coastguard Worker         OutputFormat(" - me");
5212*cfb92d14SAndroid Build Coastguard Worker     }
5213*cfb92d14SAndroid Build Coastguard Worker 
5214*cfb92d14SAndroid Build Coastguard Worker     if (aRouterInfo->mIsThisDeviceParent)
5215*cfb92d14SAndroid Build Coastguard Worker     {
5216*cfb92d14SAndroid Build Coastguard Worker         OutputFormat(" - parent");
5217*cfb92d14SAndroid Build Coastguard Worker     }
5218*cfb92d14SAndroid Build Coastguard Worker 
5219*cfb92d14SAndroid Build Coastguard Worker     if (aRouterInfo->mIsLeader)
5220*cfb92d14SAndroid Build Coastguard Worker     {
5221*cfb92d14SAndroid Build Coastguard Worker         OutputFormat(" - leader");
5222*cfb92d14SAndroid Build Coastguard Worker     }
5223*cfb92d14SAndroid Build Coastguard Worker 
5224*cfb92d14SAndroid Build Coastguard Worker     if (aRouterInfo->mIsBorderRouter)
5225*cfb92d14SAndroid Build Coastguard Worker     {
5226*cfb92d14SAndroid Build Coastguard Worker         OutputFormat(" - br");
5227*cfb92d14SAndroid Build Coastguard Worker     }
5228*cfb92d14SAndroid Build Coastguard Worker 
5229*cfb92d14SAndroid Build Coastguard Worker     OutputNewLine();
5230*cfb92d14SAndroid Build Coastguard Worker 
5231*cfb92d14SAndroid Build Coastguard Worker     for (uint8_t linkQuality = 3; linkQuality > 0; linkQuality--)
5232*cfb92d14SAndroid Build Coastguard Worker     {
5233*cfb92d14SAndroid Build Coastguard Worker         bool hasLinkQuality = false;
5234*cfb92d14SAndroid Build Coastguard Worker 
5235*cfb92d14SAndroid Build Coastguard Worker         for (uint8_t entryQuality : aRouterInfo->mLinkQualities)
5236*cfb92d14SAndroid Build Coastguard Worker         {
5237*cfb92d14SAndroid Build Coastguard Worker             if (entryQuality == linkQuality)
5238*cfb92d14SAndroid Build Coastguard Worker             {
5239*cfb92d14SAndroid Build Coastguard Worker                 hasLinkQuality = true;
5240*cfb92d14SAndroid Build Coastguard Worker                 break;
5241*cfb92d14SAndroid Build Coastguard Worker             }
5242*cfb92d14SAndroid Build Coastguard Worker         }
5243*cfb92d14SAndroid Build Coastguard Worker 
5244*cfb92d14SAndroid Build Coastguard Worker         if (hasLinkQuality)
5245*cfb92d14SAndroid Build Coastguard Worker         {
5246*cfb92d14SAndroid Build Coastguard Worker             OutputFormat(kIndentSize, "%u-links:{ ", linkQuality);
5247*cfb92d14SAndroid Build Coastguard Worker 
5248*cfb92d14SAndroid Build Coastguard Worker             for (uint8_t id = 0; id < static_cast<uint8_t>(OT_ARRAY_LENGTH(aRouterInfo->mLinkQualities)); id++)
5249*cfb92d14SAndroid Build Coastguard Worker             {
5250*cfb92d14SAndroid Build Coastguard Worker                 if (aRouterInfo->mLinkQualities[id] == linkQuality)
5251*cfb92d14SAndroid Build Coastguard Worker                 {
5252*cfb92d14SAndroid Build Coastguard Worker                     OutputFormat("%02u ", id);
5253*cfb92d14SAndroid Build Coastguard Worker                 }
5254*cfb92d14SAndroid Build Coastguard Worker             }
5255*cfb92d14SAndroid Build Coastguard Worker 
5256*cfb92d14SAndroid Build Coastguard Worker             OutputLine("}");
5257*cfb92d14SAndroid Build Coastguard Worker         }
5258*cfb92d14SAndroid Build Coastguard Worker     }
5259*cfb92d14SAndroid Build Coastguard Worker 
5260*cfb92d14SAndroid Build Coastguard Worker     if (aRouterInfo->mIp6AddrIterator != nullptr)
5261*cfb92d14SAndroid Build Coastguard Worker     {
5262*cfb92d14SAndroid Build Coastguard Worker         otIp6Address ip6Address;
5263*cfb92d14SAndroid Build Coastguard Worker 
5264*cfb92d14SAndroid Build Coastguard Worker         OutputLine(kIndentSize, "ip6-addrs:");
5265*cfb92d14SAndroid Build Coastguard Worker 
5266*cfb92d14SAndroid Build Coastguard Worker         while (otMeshDiagGetNextIp6Address(aRouterInfo->mIp6AddrIterator, &ip6Address) == OT_ERROR_NONE)
5267*cfb92d14SAndroid Build Coastguard Worker         {
5268*cfb92d14SAndroid Build Coastguard Worker             OutputSpaces(kIndentSize * 2);
5269*cfb92d14SAndroid Build Coastguard Worker             OutputIp6AddressLine(ip6Address);
5270*cfb92d14SAndroid Build Coastguard Worker         }
5271*cfb92d14SAndroid Build Coastguard Worker     }
5272*cfb92d14SAndroid Build Coastguard Worker 
5273*cfb92d14SAndroid Build Coastguard Worker     if (aRouterInfo->mChildIterator != nullptr)
5274*cfb92d14SAndroid Build Coastguard Worker     {
5275*cfb92d14SAndroid Build Coastguard Worker         otMeshDiagChildInfo childInfo;
5276*cfb92d14SAndroid Build Coastguard Worker         char                linkModeString[kLinkModeStringSize];
5277*cfb92d14SAndroid Build Coastguard Worker         bool                isFirst = true;
5278*cfb92d14SAndroid Build Coastguard Worker 
5279*cfb92d14SAndroid Build Coastguard Worker         while (otMeshDiagGetNextChildInfo(aRouterInfo->mChildIterator, &childInfo) == OT_ERROR_NONE)
5280*cfb92d14SAndroid Build Coastguard Worker         {
5281*cfb92d14SAndroid Build Coastguard Worker             if (isFirst)
5282*cfb92d14SAndroid Build Coastguard Worker             {
5283*cfb92d14SAndroid Build Coastguard Worker                 OutputLine(kIndentSize, "children:");
5284*cfb92d14SAndroid Build Coastguard Worker                 isFirst = false;
5285*cfb92d14SAndroid Build Coastguard Worker             }
5286*cfb92d14SAndroid Build Coastguard Worker 
5287*cfb92d14SAndroid Build Coastguard Worker             OutputFormat(kIndentSize * 2, "rloc16:0x%04x lq:%u, mode:%s", childInfo.mRloc16, childInfo.mLinkQuality,
5288*cfb92d14SAndroid Build Coastguard Worker                          LinkModeToString(childInfo.mMode, linkModeString));
5289*cfb92d14SAndroid Build Coastguard Worker 
5290*cfb92d14SAndroid Build Coastguard Worker             if (childInfo.mIsThisDevice)
5291*cfb92d14SAndroid Build Coastguard Worker             {
5292*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat(" - me");
5293*cfb92d14SAndroid Build Coastguard Worker             }
5294*cfb92d14SAndroid Build Coastguard Worker 
5295*cfb92d14SAndroid Build Coastguard Worker             if (childInfo.mIsBorderRouter)
5296*cfb92d14SAndroid Build Coastguard Worker             {
5297*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat(" - br");
5298*cfb92d14SAndroid Build Coastguard Worker             }
5299*cfb92d14SAndroid Build Coastguard Worker 
5300*cfb92d14SAndroid Build Coastguard Worker             OutputNewLine();
5301*cfb92d14SAndroid Build Coastguard Worker         }
5302*cfb92d14SAndroid Build Coastguard Worker 
5303*cfb92d14SAndroid Build Coastguard Worker         if (isFirst)
5304*cfb92d14SAndroid Build Coastguard Worker         {
5305*cfb92d14SAndroid Build Coastguard Worker             OutputLine(kIndentSize, "children: none");
5306*cfb92d14SAndroid Build Coastguard Worker         }
5307*cfb92d14SAndroid Build Coastguard Worker     }
5308*cfb92d14SAndroid Build Coastguard Worker 
5309*cfb92d14SAndroid Build Coastguard Worker exit:
5310*cfb92d14SAndroid Build Coastguard Worker     OutputResult(aError);
5311*cfb92d14SAndroid Build Coastguard Worker }
5312*cfb92d14SAndroid Build Coastguard Worker 
HandleMeshDiagQueryChildTableResult(otError aError,const otMeshDiagChildEntry * aChildEntry,void * aContext)5313*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleMeshDiagQueryChildTableResult(otError                     aError,
5314*cfb92d14SAndroid Build Coastguard Worker                                                       const otMeshDiagChildEntry *aChildEntry,
5315*cfb92d14SAndroid Build Coastguard Worker                                                       void                       *aContext)
5316*cfb92d14SAndroid Build Coastguard Worker {
5317*cfb92d14SAndroid Build Coastguard Worker     reinterpret_cast<Interpreter *>(aContext)->HandleMeshDiagQueryChildTableResult(aError, aChildEntry);
5318*cfb92d14SAndroid Build Coastguard Worker }
5319*cfb92d14SAndroid Build Coastguard Worker 
HandleMeshDiagQueryChildTableResult(otError aError,const otMeshDiagChildEntry * aChildEntry)5320*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleMeshDiagQueryChildTableResult(otError aError, const otMeshDiagChildEntry *aChildEntry)
5321*cfb92d14SAndroid Build Coastguard Worker {
5322*cfb92d14SAndroid Build Coastguard Worker     PercentageStringBuffer stringBuffer;
5323*cfb92d14SAndroid Build Coastguard Worker     char                   string[OT_DURATION_STRING_SIZE];
5324*cfb92d14SAndroid Build Coastguard Worker 
5325*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(aChildEntry != nullptr);
5326*cfb92d14SAndroid Build Coastguard Worker 
5327*cfb92d14SAndroid Build Coastguard Worker     OutputFormat("rloc16:0x%04x ext-addr:", aChildEntry->mRloc16);
5328*cfb92d14SAndroid Build Coastguard Worker     OutputExtAddress(aChildEntry->mExtAddress);
5329*cfb92d14SAndroid Build Coastguard Worker     OutputLine(" ver:%u", aChildEntry->mVersion);
5330*cfb92d14SAndroid Build Coastguard Worker 
5331*cfb92d14SAndroid Build Coastguard Worker     OutputLine(kIndentSize, "timeout:%lu age:%lu supvn:%u q-msg:%u", ToUlong(aChildEntry->mTimeout),
5332*cfb92d14SAndroid Build Coastguard Worker                ToUlong(aChildEntry->mAge), aChildEntry->mSupervisionInterval, aChildEntry->mQueuedMessageCount);
5333*cfb92d14SAndroid Build Coastguard Worker 
5334*cfb92d14SAndroid Build Coastguard Worker     OutputLine(kIndentSize, "rx-on:%s type:%s full-net:%s", aChildEntry->mRxOnWhenIdle ? "yes" : "no",
5335*cfb92d14SAndroid Build Coastguard Worker                aChildEntry->mDeviceTypeFtd ? "ftd" : "mtd", aChildEntry->mFullNetData ? "yes" : "no");
5336*cfb92d14SAndroid Build Coastguard Worker 
5337*cfb92d14SAndroid Build Coastguard Worker     OutputLine(kIndentSize, "rss - ave:%d last:%d margin:%d", aChildEntry->mAverageRssi, aChildEntry->mLastRssi,
5338*cfb92d14SAndroid Build Coastguard Worker                aChildEntry->mLinkMargin);
5339*cfb92d14SAndroid Build Coastguard Worker 
5340*cfb92d14SAndroid Build Coastguard Worker     if (aChildEntry->mSupportsErrRate)
5341*cfb92d14SAndroid Build Coastguard Worker     {
5342*cfb92d14SAndroid Build Coastguard Worker         OutputFormat(kIndentSize, "err-rate - frame:%s%% ",
5343*cfb92d14SAndroid Build Coastguard Worker                      PercentageToString(aChildEntry->mFrameErrorRate, stringBuffer));
5344*cfb92d14SAndroid Build Coastguard Worker         OutputLine("msg:%s%% ", PercentageToString(aChildEntry->mMessageErrorRate, stringBuffer));
5345*cfb92d14SAndroid Build Coastguard Worker     }
5346*cfb92d14SAndroid Build Coastguard Worker 
5347*cfb92d14SAndroid Build Coastguard Worker     otConvertDurationInSecondsToString(aChildEntry->mConnectionTime, string, sizeof(string));
5348*cfb92d14SAndroid Build Coastguard Worker     OutputLine(kIndentSize, "conn-time:%s", string);
5349*cfb92d14SAndroid Build Coastguard Worker 
5350*cfb92d14SAndroid Build Coastguard Worker     OutputLine(kIndentSize, "csl - sync:%s period:%u timeout:%lu channel:%u",
5351*cfb92d14SAndroid Build Coastguard Worker                aChildEntry->mCslSynchronized ? "yes" : "no", aChildEntry->mCslPeriod, ToUlong(aChildEntry->mCslTimeout),
5352*cfb92d14SAndroid Build Coastguard Worker                aChildEntry->mCslChannel);
5353*cfb92d14SAndroid Build Coastguard Worker 
5354*cfb92d14SAndroid Build Coastguard Worker exit:
5355*cfb92d14SAndroid Build Coastguard Worker     OutputResult(aError);
5356*cfb92d14SAndroid Build Coastguard Worker }
5357*cfb92d14SAndroid Build Coastguard Worker 
HandleMeshDiagQueryRouterNeighborTableResult(otError aError,const otMeshDiagRouterNeighborEntry * aNeighborEntry,void * aContext)5358*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleMeshDiagQueryRouterNeighborTableResult(otError                              aError,
5359*cfb92d14SAndroid Build Coastguard Worker                                                                const otMeshDiagRouterNeighborEntry *aNeighborEntry,
5360*cfb92d14SAndroid Build Coastguard Worker                                                                void                                *aContext)
5361*cfb92d14SAndroid Build Coastguard Worker {
5362*cfb92d14SAndroid Build Coastguard Worker     reinterpret_cast<Interpreter *>(aContext)->HandleMeshDiagQueryRouterNeighborTableResult(aError, aNeighborEntry);
5363*cfb92d14SAndroid Build Coastguard Worker }
5364*cfb92d14SAndroid Build Coastguard Worker 
HandleMeshDiagQueryRouterNeighborTableResult(otError aError,const otMeshDiagRouterNeighborEntry * aNeighborEntry)5365*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleMeshDiagQueryRouterNeighborTableResult(otError                              aError,
5366*cfb92d14SAndroid Build Coastguard Worker                                                                const otMeshDiagRouterNeighborEntry *aNeighborEntry)
5367*cfb92d14SAndroid Build Coastguard Worker {
5368*cfb92d14SAndroid Build Coastguard Worker     PercentageStringBuffer stringBuffer;
5369*cfb92d14SAndroid Build Coastguard Worker     char                   string[OT_DURATION_STRING_SIZE];
5370*cfb92d14SAndroid Build Coastguard Worker 
5371*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(aNeighborEntry != nullptr);
5372*cfb92d14SAndroid Build Coastguard Worker 
5373*cfb92d14SAndroid Build Coastguard Worker     OutputFormat("rloc16:0x%04x ext-addr:", aNeighborEntry->mRloc16);
5374*cfb92d14SAndroid Build Coastguard Worker     OutputExtAddress(aNeighborEntry->mExtAddress);
5375*cfb92d14SAndroid Build Coastguard Worker     OutputLine(" ver:%u", aNeighborEntry->mVersion);
5376*cfb92d14SAndroid Build Coastguard Worker 
5377*cfb92d14SAndroid Build Coastguard Worker     OutputLine(kIndentSize, "rss - ave:%d last:%d margin:%d", aNeighborEntry->mAverageRssi, aNeighborEntry->mLastRssi,
5378*cfb92d14SAndroid Build Coastguard Worker                aNeighborEntry->mLinkMargin);
5379*cfb92d14SAndroid Build Coastguard Worker 
5380*cfb92d14SAndroid Build Coastguard Worker     if (aNeighborEntry->mSupportsErrRate)
5381*cfb92d14SAndroid Build Coastguard Worker     {
5382*cfb92d14SAndroid Build Coastguard Worker         OutputFormat(kIndentSize, "err-rate - frame:%s%% ",
5383*cfb92d14SAndroid Build Coastguard Worker                      PercentageToString(aNeighborEntry->mFrameErrorRate, stringBuffer));
5384*cfb92d14SAndroid Build Coastguard Worker         OutputLine("msg:%s%% ", PercentageToString(aNeighborEntry->mMessageErrorRate, stringBuffer));
5385*cfb92d14SAndroid Build Coastguard Worker     }
5386*cfb92d14SAndroid Build Coastguard Worker 
5387*cfb92d14SAndroid Build Coastguard Worker     otConvertDurationInSecondsToString(aNeighborEntry->mConnectionTime, string, sizeof(string));
5388*cfb92d14SAndroid Build Coastguard Worker     OutputLine(kIndentSize, "conn-time:%s", string);
5389*cfb92d14SAndroid Build Coastguard Worker 
5390*cfb92d14SAndroid Build Coastguard Worker exit:
5391*cfb92d14SAndroid Build Coastguard Worker     OutputResult(aError);
5392*cfb92d14SAndroid Build Coastguard Worker }
5393*cfb92d14SAndroid Build Coastguard Worker 
HandleMeshDiagQueryChildIp6Addrs(otError aError,uint16_t aChildRloc16,otMeshDiagIp6AddrIterator * aIp6AddrIterator,void * aContext)5394*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleMeshDiagQueryChildIp6Addrs(otError                    aError,
5395*cfb92d14SAndroid Build Coastguard Worker                                                    uint16_t                   aChildRloc16,
5396*cfb92d14SAndroid Build Coastguard Worker                                                    otMeshDiagIp6AddrIterator *aIp6AddrIterator,
5397*cfb92d14SAndroid Build Coastguard Worker                                                    void                      *aContext)
5398*cfb92d14SAndroid Build Coastguard Worker {
5399*cfb92d14SAndroid Build Coastguard Worker     reinterpret_cast<Interpreter *>(aContext)->HandleMeshDiagQueryChildIp6Addrs(aError, aChildRloc16, aIp6AddrIterator);
5400*cfb92d14SAndroid Build Coastguard Worker }
5401*cfb92d14SAndroid Build Coastguard Worker 
HandleMeshDiagQueryChildIp6Addrs(otError aError,uint16_t aChildRloc16,otMeshDiagIp6AddrIterator * aIp6AddrIterator)5402*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleMeshDiagQueryChildIp6Addrs(otError                    aError,
5403*cfb92d14SAndroid Build Coastguard Worker                                                    uint16_t                   aChildRloc16,
5404*cfb92d14SAndroid Build Coastguard Worker                                                    otMeshDiagIp6AddrIterator *aIp6AddrIterator)
5405*cfb92d14SAndroid Build Coastguard Worker {
5406*cfb92d14SAndroid Build Coastguard Worker     otIp6Address ip6Address;
5407*cfb92d14SAndroid Build Coastguard Worker 
5408*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(aError == OT_ERROR_NONE || aError == OT_ERROR_PENDING);
5409*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(aIp6AddrIterator != nullptr);
5410*cfb92d14SAndroid Build Coastguard Worker 
5411*cfb92d14SAndroid Build Coastguard Worker     OutputLine("child-rloc16: 0x%04x", aChildRloc16);
5412*cfb92d14SAndroid Build Coastguard Worker 
5413*cfb92d14SAndroid Build Coastguard Worker     while (otMeshDiagGetNextIp6Address(aIp6AddrIterator, &ip6Address) == OT_ERROR_NONE)
5414*cfb92d14SAndroid Build Coastguard Worker     {
5415*cfb92d14SAndroid Build Coastguard Worker         OutputSpaces(kIndentSize);
5416*cfb92d14SAndroid Build Coastguard Worker         OutputIp6AddressLine(ip6Address);
5417*cfb92d14SAndroid Build Coastguard Worker     }
5418*cfb92d14SAndroid Build Coastguard Worker 
5419*cfb92d14SAndroid Build Coastguard Worker exit:
5420*cfb92d14SAndroid Build Coastguard Worker     OutputResult(aError);
5421*cfb92d14SAndroid Build Coastguard Worker }
5422*cfb92d14SAndroid Build Coastguard Worker 
5423*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_MESH_DIAG_ENABLE
5424*cfb92d14SAndroid Build Coastguard Worker 
5425*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_FTD
5426*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])5427*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("panid")>(Arg aArgs[])
5428*cfb92d14SAndroid Build Coastguard Worker {
5429*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
5430*cfb92d14SAndroid Build Coastguard Worker     /**
5431*cfb92d14SAndroid Build Coastguard Worker      * @cli panid
5432*cfb92d14SAndroid Build Coastguard Worker      * @code
5433*cfb92d14SAndroid Build Coastguard Worker      * panid
5434*cfb92d14SAndroid Build Coastguard Worker      * 0xdead
5435*cfb92d14SAndroid Build Coastguard Worker      * Done
5436*cfb92d14SAndroid Build Coastguard Worker      * @endcode
5437*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
5438*cfb92d14SAndroid Build Coastguard Worker      * #otLinkGetPanId
5439*cfb92d14SAndroid Build Coastguard Worker      */
5440*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
5441*cfb92d14SAndroid Build Coastguard Worker     {
5442*cfb92d14SAndroid Build Coastguard Worker         OutputLine("0x%04x", otLinkGetPanId(GetInstancePtr()));
5443*cfb92d14SAndroid Build Coastguard Worker     }
5444*cfb92d14SAndroid Build Coastguard Worker     /**
5445*cfb92d14SAndroid Build Coastguard Worker      * @cli panid (panid)
5446*cfb92d14SAndroid Build Coastguard Worker      * @code
5447*cfb92d14SAndroid Build Coastguard Worker      * panid 0xdead
5448*cfb92d14SAndroid Build Coastguard Worker      * Done
5449*cfb92d14SAndroid Build Coastguard Worker      * @endcode
5450*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
5451*cfb92d14SAndroid Build Coastguard Worker      * #otLinkSetPanId
5452*cfb92d14SAndroid Build Coastguard Worker      * @cparam panid @ca{panid}
5453*cfb92d14SAndroid Build Coastguard Worker      */
5454*cfb92d14SAndroid Build Coastguard Worker     else
5455*cfb92d14SAndroid Build Coastguard Worker     {
5456*cfb92d14SAndroid Build Coastguard Worker         error = ProcessSet(aArgs, otLinkSetPanId);
5457*cfb92d14SAndroid Build Coastguard Worker     }
5458*cfb92d14SAndroid Build Coastguard Worker 
5459*cfb92d14SAndroid Build Coastguard Worker     return error;
5460*cfb92d14SAndroid Build Coastguard Worker }
5461*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])5462*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("parent")>(Arg aArgs[])
5463*cfb92d14SAndroid Build Coastguard Worker {
5464*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
5465*cfb92d14SAndroid Build Coastguard Worker     /**
5466*cfb92d14SAndroid Build Coastguard Worker      * @cli parent
5467*cfb92d14SAndroid Build Coastguard Worker      * @code
5468*cfb92d14SAndroid Build Coastguard Worker      * parent
5469*cfb92d14SAndroid Build Coastguard Worker      * Ext Addr: be1857c6c21dce55
5470*cfb92d14SAndroid Build Coastguard Worker      * Rloc: 5c00
5471*cfb92d14SAndroid Build Coastguard Worker      * Link Quality In: 3
5472*cfb92d14SAndroid Build Coastguard Worker      * Link Quality Out: 3
5473*cfb92d14SAndroid Build Coastguard Worker      * Age: 20
5474*cfb92d14SAndroid Build Coastguard Worker      * Version: 4
5475*cfb92d14SAndroid Build Coastguard Worker      * Done
5476*cfb92d14SAndroid Build Coastguard Worker      * @endcode
5477*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadGetParentInfo
5478*cfb92d14SAndroid Build Coastguard Worker      * @par
5479*cfb92d14SAndroid Build Coastguard Worker      * Get the diagnostic information for a Thread Router as parent.
5480*cfb92d14SAndroid Build Coastguard Worker      * @par
5481*cfb92d14SAndroid Build Coastguard Worker      * When operating as a Thread Router when OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE is enabled, this command
5482*cfb92d14SAndroid Build Coastguard Worker      * will return the cached information from when the device was previously attached as a Thread Child. Returning
5483*cfb92d14SAndroid Build Coastguard Worker      * cached information is necessary to support the Thread Test Harness - Test Scenario 8.2.x requests the former
5484*cfb92d14SAndroid Build Coastguard Worker      * parent (i.e. %Joiner Router's) MAC address even if the device has already promoted to a router.
5485*cfb92d14SAndroid Build Coastguard Worker      * @par
5486*cfb92d14SAndroid Build Coastguard Worker      * Note: When OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE is enabled, this command will return two extra lines with
5487*cfb92d14SAndroid Build Coastguard Worker      * information relevant for CSL Receiver operation.
5488*cfb92d14SAndroid Build Coastguard Worker      */
5489*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
5490*cfb92d14SAndroid Build Coastguard Worker     {
5491*cfb92d14SAndroid Build Coastguard Worker         otRouterInfo parentInfo;
5492*cfb92d14SAndroid Build Coastguard Worker 
5493*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otThreadGetParentInfo(GetInstancePtr(), &parentInfo));
5494*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("Ext Addr: ");
5495*cfb92d14SAndroid Build Coastguard Worker         OutputExtAddressLine(parentInfo.mExtAddress);
5496*cfb92d14SAndroid Build Coastguard Worker         OutputLine("Rloc: %x", parentInfo.mRloc16);
5497*cfb92d14SAndroid Build Coastguard Worker         OutputLine("Link Quality In: %u", parentInfo.mLinkQualityIn);
5498*cfb92d14SAndroid Build Coastguard Worker         OutputLine("Link Quality Out: %u", parentInfo.mLinkQualityOut);
5499*cfb92d14SAndroid Build Coastguard Worker         OutputLine("Age: %lu", ToUlong(parentInfo.mAge));
5500*cfb92d14SAndroid Build Coastguard Worker         OutputLine("Version: %u", parentInfo.mVersion);
5501*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
5502*cfb92d14SAndroid Build Coastguard Worker         OutputLine("CSL clock accuracy: %u", parentInfo.mCslClockAccuracy);
5503*cfb92d14SAndroid Build Coastguard Worker         OutputLine("CSL uncertainty: %u", parentInfo.mCslUncertainty);
5504*cfb92d14SAndroid Build Coastguard Worker #endif
5505*cfb92d14SAndroid Build Coastguard Worker     }
5506*cfb92d14SAndroid Build Coastguard Worker     /**
5507*cfb92d14SAndroid Build Coastguard Worker      * @cli parent search
5508*cfb92d14SAndroid Build Coastguard Worker      * @code
5509*cfb92d14SAndroid Build Coastguard Worker      * parent search
5510*cfb92d14SAndroid Build Coastguard Worker      * Done
5511*cfb92d14SAndroid Build Coastguard Worker      * @endcode
5512*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
5513*cfb92d14SAndroid Build Coastguard Worker      * #otThreadSearchForBetterParent
5514*cfb92d14SAndroid Build Coastguard Worker      */
5515*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "search")
5516*cfb92d14SAndroid Build Coastguard Worker     {
5517*cfb92d14SAndroid Build Coastguard Worker         error = otThreadSearchForBetterParent(GetInstancePtr());
5518*cfb92d14SAndroid Build Coastguard Worker     }
5519*cfb92d14SAndroid Build Coastguard Worker     else
5520*cfb92d14SAndroid Build Coastguard Worker     {
5521*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
5522*cfb92d14SAndroid Build Coastguard Worker     }
5523*cfb92d14SAndroid Build Coastguard Worker 
5524*cfb92d14SAndroid Build Coastguard Worker exit:
5525*cfb92d14SAndroid Build Coastguard Worker     return error;
5526*cfb92d14SAndroid Build Coastguard Worker }
5527*cfb92d14SAndroid Build Coastguard Worker 
5528*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
5529*cfb92d14SAndroid Build Coastguard Worker /**
5530*cfb92d14SAndroid Build Coastguard Worker  * @cli parentpriority (get,set)
5531*cfb92d14SAndroid Build Coastguard Worker  * @code
5532*cfb92d14SAndroid Build Coastguard Worker  * parentpriority
5533*cfb92d14SAndroid Build Coastguard Worker  * 1
5534*cfb92d14SAndroid Build Coastguard Worker  * Done
5535*cfb92d14SAndroid Build Coastguard Worker  * @endcode
5536*cfb92d14SAndroid Build Coastguard Worker  * @code
5537*cfb92d14SAndroid Build Coastguard Worker  * parentpriority 1
5538*cfb92d14SAndroid Build Coastguard Worker  * Done
5539*cfb92d14SAndroid Build Coastguard Worker  * @endcode
5540*cfb92d14SAndroid Build Coastguard Worker  * @cparam parentpriority [@ca{parentpriority}]
5541*cfb92d14SAndroid Build Coastguard Worker  * @par
5542*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets the assigned parent priority value: 1, 0, -1 or -2. -2 means not assigned.
5543*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadGetParentPriority
5544*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadSetParentPriority
5545*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])5546*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("parentpriority")>(Arg aArgs[])
5547*cfb92d14SAndroid Build Coastguard Worker {
5548*cfb92d14SAndroid Build Coastguard Worker     return ProcessGetSet(aArgs, otThreadGetParentPriority, otThreadSetParentPriority);
5549*cfb92d14SAndroid Build Coastguard Worker }
5550*cfb92d14SAndroid Build Coastguard Worker #endif
5551*cfb92d14SAndroid Build Coastguard Worker 
5552*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
Process(Arg * aArgs)5553*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("routeridrange")>(Arg *aArgs)
5554*cfb92d14SAndroid Build Coastguard Worker {
5555*cfb92d14SAndroid Build Coastguard Worker     uint8_t minRouterId;
5556*cfb92d14SAndroid Build Coastguard Worker     uint8_t maxRouterId;
5557*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
5558*cfb92d14SAndroid Build Coastguard Worker 
5559*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
5560*cfb92d14SAndroid Build Coastguard Worker     {
5561*cfb92d14SAndroid Build Coastguard Worker         otThreadGetRouterIdRange(GetInstancePtr(), &minRouterId, &maxRouterId);
5562*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%u %u", minRouterId, maxRouterId);
5563*cfb92d14SAndroid Build Coastguard Worker     }
5564*cfb92d14SAndroid Build Coastguard Worker     else
5565*cfb92d14SAndroid Build Coastguard Worker     {
5566*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[0].ParseAsUint8(minRouterId));
5567*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[1].ParseAsUint8(maxRouterId));
5568*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(aArgs[2].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
5569*cfb92d14SAndroid Build Coastguard Worker         error = otThreadSetRouterIdRange(GetInstancePtr(), minRouterId, maxRouterId);
5570*cfb92d14SAndroid Build Coastguard Worker     }
5571*cfb92d14SAndroid Build Coastguard Worker 
5572*cfb92d14SAndroid Build Coastguard Worker exit:
5573*cfb92d14SAndroid Build Coastguard Worker     return error;
5574*cfb92d14SAndroid Build Coastguard Worker }
5575*cfb92d14SAndroid Build Coastguard Worker #endif
5576*cfb92d14SAndroid Build Coastguard Worker 
5577*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PING_SENDER_ENABLE
5578*cfb92d14SAndroid Build Coastguard Worker /**
5579*cfb92d14SAndroid Build Coastguard Worker  * @cli ping
5580*cfb92d14SAndroid Build Coastguard Worker  * @code
5581*cfb92d14SAndroid Build Coastguard Worker  * ping fd00:db8:0:0:76b:6a05:3ae9:a61a
5582*cfb92d14SAndroid Build Coastguard Worker  * 16 bytes from fd00:db8:0:0:76b:6a05:3ae9:a61a: icmp_seq=5 hlim=64 time=0ms
5583*cfb92d14SAndroid Build Coastguard Worker  * 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 0/0.0/0 ms.
5584*cfb92d14SAndroid Build Coastguard Worker  * Done
5585*cfb92d14SAndroid Build Coastguard Worker  * @endcode
5586*cfb92d14SAndroid Build Coastguard Worker  * @code
5587*cfb92d14SAndroid Build Coastguard Worker  * ping -I fd00:db8:0:0:76b:6a05:3ae9:a61a ff02::1 100 1 1 1
5588*cfb92d14SAndroid Build Coastguard Worker  * 108 bytes from fd00:db8:0:0:f605:fb4b:d429:d59a: icmp_seq=4 hlim=64 time=7ms
5589*cfb92d14SAndroid Build Coastguard Worker  * 1 packets transmitted, 1 packets received. Round-trip min/avg/max = 7/7.0/7 ms.
5590*cfb92d14SAndroid Build Coastguard Worker  * Done
5591*cfb92d14SAndroid Build Coastguard Worker  * @endcode
5592*cfb92d14SAndroid Build Coastguard Worker  * @code
5593*cfb92d14SAndroid Build Coastguard Worker  * ping 172.17.0.1
5594*cfb92d14SAndroid Build Coastguard Worker  * Pinging synthesized IPv6 address: fdde:ad00:beef:2:0:0:ac11:1
5595*cfb92d14SAndroid Build Coastguard Worker  * 16 bytes from fdde:ad00:beef:2:0:0:ac11:1: icmp_seq=5 hlim=64 time=0ms
5596*cfb92d14SAndroid Build Coastguard Worker  * 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 0/0.0/0 ms.
5597*cfb92d14SAndroid Build Coastguard Worker  * Done
5598*cfb92d14SAndroid Build Coastguard Worker  * @endcode
5599*cfb92d14SAndroid Build Coastguard Worker  * @cparam ping [@ca{async}] [@ca{-I source}] [@ca{-m}] @ca{ipaddrc} [@ca{size}] [@ca{count}] <!--
5600*cfb92d14SAndroid Build Coastguard Worker  * -->          [@ca{interval}] [@ca{hoplimit}] [@ca{timeout}]
5601*cfb92d14SAndroid Build Coastguard Worker  * @par
5602*cfb92d14SAndroid Build Coastguard Worker  * Send an ICMPv6 Echo Request.
5603*cfb92d14SAndroid Build Coastguard Worker  * @par
5604*cfb92d14SAndroid Build Coastguard Worker  * The address can be an IPv4 address, which will be synthesized to an IPv6 address using the preferred NAT64 prefix
5605*cfb92d14SAndroid Build Coastguard Worker  * from the network data.
5606*cfb92d14SAndroid Build Coastguard Worker  * @par
5607*cfb92d14SAndroid Build Coastguard Worker  * The optional `-m` flag sets the multicast loop flag, which allows looping back pings to multicast addresses that the
5608*cfb92d14SAndroid Build Coastguard Worker  * device itself is subscribed to.
5609*cfb92d14SAndroid Build Coastguard Worker  * @par
5610*cfb92d14SAndroid Build Coastguard Worker  * Note: The command will return InvalidState when the preferred NAT64 prefix is unavailable.
5611*cfb92d14SAndroid Build Coastguard Worker  * @sa otPingSenderPing
5612*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])5613*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("ping")>(Arg aArgs[]) { return mPing.Process(aArgs); }
5614*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_PING_SENDER_ENABLE
5615*cfb92d14SAndroid Build Coastguard Worker 
5616*cfb92d14SAndroid Build Coastguard Worker /**
5617*cfb92d14SAndroid Build Coastguard Worker  * @cli platform
5618*cfb92d14SAndroid Build Coastguard Worker  * @code
5619*cfb92d14SAndroid Build Coastguard Worker  * platform
5620*cfb92d14SAndroid Build Coastguard Worker  * NRF52840
5621*cfb92d14SAndroid Build Coastguard Worker  * Done
5622*cfb92d14SAndroid Build Coastguard Worker  * @endcode
5623*cfb92d14SAndroid Build Coastguard Worker  * @par
5624*cfb92d14SAndroid Build Coastguard Worker  * Print the current platform
5625*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])5626*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("platform")>(Arg aArgs[])
5627*cfb92d14SAndroid Build Coastguard Worker {
5628*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aArgs);
5629*cfb92d14SAndroid Build Coastguard Worker     OutputLine("%s", OPENTHREAD_CONFIG_PLATFORM_INFO);
5630*cfb92d14SAndroid Build Coastguard Worker     return OT_ERROR_NONE;
5631*cfb92d14SAndroid Build Coastguard Worker }
5632*cfb92d14SAndroid Build Coastguard Worker 
5633*cfb92d14SAndroid Build Coastguard Worker /**
5634*cfb92d14SAndroid Build Coastguard Worker  * @cli pollperiod (get,set)
5635*cfb92d14SAndroid Build Coastguard Worker  * @code
5636*cfb92d14SAndroid Build Coastguard Worker  * pollperiod
5637*cfb92d14SAndroid Build Coastguard Worker  * 0
5638*cfb92d14SAndroid Build Coastguard Worker  * Done
5639*cfb92d14SAndroid Build Coastguard Worker  * @endcode
5640*cfb92d14SAndroid Build Coastguard Worker  * @code
5641*cfb92d14SAndroid Build Coastguard Worker  * pollperiod 10
5642*cfb92d14SAndroid Build Coastguard Worker  * Done
5643*cfb92d14SAndroid Build Coastguard Worker  * @endcode
5644*cfb92d14SAndroid Build Coastguard Worker  * @sa otLinkGetPollPeriod
5645*cfb92d14SAndroid Build Coastguard Worker  * @sa otLinkSetPollPeriod
5646*cfb92d14SAndroid Build Coastguard Worker  * @par
5647*cfb92d14SAndroid Build Coastguard Worker  * Get or set the customized data poll period of sleepy end device (milliseconds). Only for certification test.
5648*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])5649*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("pollperiod")>(Arg aArgs[])
5650*cfb92d14SAndroid Build Coastguard Worker {
5651*cfb92d14SAndroid Build Coastguard Worker     return ProcessGetSet(aArgs, otLinkGetPollPeriod, otLinkSetPollPeriod);
5652*cfb92d14SAndroid Build Coastguard Worker }
5653*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])5654*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("promiscuous")>(Arg aArgs[])
5655*cfb92d14SAndroid Build Coastguard Worker {
5656*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
5657*cfb92d14SAndroid Build Coastguard Worker 
5658*cfb92d14SAndroid Build Coastguard Worker     /**
5659*cfb92d14SAndroid Build Coastguard Worker      * @cli promiscuous
5660*cfb92d14SAndroid Build Coastguard Worker      * @code
5661*cfb92d14SAndroid Build Coastguard Worker      * promiscuous
5662*cfb92d14SAndroid Build Coastguard Worker      * Disabled
5663*cfb92d14SAndroid Build Coastguard Worker      * Done
5664*cfb92d14SAndroid Build Coastguard Worker      * @endcode
5665*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
5666*cfb92d14SAndroid Build Coastguard Worker      * #otLinkIsPromiscuous
5667*cfb92d14SAndroid Build Coastguard Worker      * @sa otPlatRadioGetPromiscuous
5668*cfb92d14SAndroid Build Coastguard Worker      */
5669*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
5670*cfb92d14SAndroid Build Coastguard Worker     {
5671*cfb92d14SAndroid Build Coastguard Worker         OutputEnabledDisabledStatus(otLinkIsPromiscuous(GetInstancePtr()) &&
5672*cfb92d14SAndroid Build Coastguard Worker                                     otPlatRadioGetPromiscuous(GetInstancePtr()));
5673*cfb92d14SAndroid Build Coastguard Worker     }
5674*cfb92d14SAndroid Build Coastguard Worker     else
5675*cfb92d14SAndroid Build Coastguard Worker     {
5676*cfb92d14SAndroid Build Coastguard Worker         bool enable;
5677*cfb92d14SAndroid Build Coastguard Worker 
5678*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = ParseEnableOrDisable(aArgs[0], enable));
5679*cfb92d14SAndroid Build Coastguard Worker 
5680*cfb92d14SAndroid Build Coastguard Worker         /**
5681*cfb92d14SAndroid Build Coastguard Worker          * @cli promiscuous (enable,disable)
5682*cfb92d14SAndroid Build Coastguard Worker          * @code
5683*cfb92d14SAndroid Build Coastguard Worker          * promiscuous enable
5684*cfb92d14SAndroid Build Coastguard Worker          * Done
5685*cfb92d14SAndroid Build Coastguard Worker          * @endcode
5686*cfb92d14SAndroid Build Coastguard Worker          * @code
5687*cfb92d14SAndroid Build Coastguard Worker          * promiscuous disable
5688*cfb92d14SAndroid Build Coastguard Worker          * Done
5689*cfb92d14SAndroid Build Coastguard Worker          * @endcode
5690*cfb92d14SAndroid Build Coastguard Worker          * @cparam promiscuous @ca{enable|disable}
5691*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
5692*cfb92d14SAndroid Build Coastguard Worker          * #otLinkSetPromiscuous
5693*cfb92d14SAndroid Build Coastguard Worker          */
5694*cfb92d14SAndroid Build Coastguard Worker         if (!enable)
5695*cfb92d14SAndroid Build Coastguard Worker         {
5696*cfb92d14SAndroid Build Coastguard Worker             otLinkSetPcapCallback(GetInstancePtr(), nullptr, nullptr);
5697*cfb92d14SAndroid Build Coastguard Worker         }
5698*cfb92d14SAndroid Build Coastguard Worker 
5699*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otLinkSetPromiscuous(GetInstancePtr(), enable));
5700*cfb92d14SAndroid Build Coastguard Worker 
5701*cfb92d14SAndroid Build Coastguard Worker         if (enable)
5702*cfb92d14SAndroid Build Coastguard Worker         {
5703*cfb92d14SAndroid Build Coastguard Worker             otLinkSetPcapCallback(GetInstancePtr(), &HandleLinkPcapReceive, this);
5704*cfb92d14SAndroid Build Coastguard Worker         }
5705*cfb92d14SAndroid Build Coastguard Worker     }
5706*cfb92d14SAndroid Build Coastguard Worker 
5707*cfb92d14SAndroid Build Coastguard Worker exit:
5708*cfb92d14SAndroid Build Coastguard Worker     return error;
5709*cfb92d14SAndroid Build Coastguard Worker }
5710*cfb92d14SAndroid Build Coastguard Worker 
HandleLinkPcapReceive(const otRadioFrame * aFrame,bool aIsTx,void * aContext)5711*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleLinkPcapReceive(const otRadioFrame *aFrame, bool aIsTx, void *aContext)
5712*cfb92d14SAndroid Build Coastguard Worker {
5713*cfb92d14SAndroid Build Coastguard Worker     static_cast<Interpreter *>(aContext)->HandleLinkPcapReceive(aFrame, aIsTx);
5714*cfb92d14SAndroid Build Coastguard Worker }
5715*cfb92d14SAndroid Build Coastguard Worker 
HandleLinkPcapReceive(const otRadioFrame * aFrame,bool aIsTx)5716*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleLinkPcapReceive(const otRadioFrame *aFrame, bool aIsTx)
5717*cfb92d14SAndroid Build Coastguard Worker {
5718*cfb92d14SAndroid Build Coastguard Worker     otLogHexDumpInfo info;
5719*cfb92d14SAndroid Build Coastguard Worker 
5720*cfb92d14SAndroid Build Coastguard Worker     info.mDataBytes  = aFrame->mPsdu;
5721*cfb92d14SAndroid Build Coastguard Worker     info.mDataLength = aFrame->mLength;
5722*cfb92d14SAndroid Build Coastguard Worker     info.mTitle      = (aIsTx) ? "TX" : "RX";
5723*cfb92d14SAndroid Build Coastguard Worker     info.mIterator   = 0;
5724*cfb92d14SAndroid Build Coastguard Worker 
5725*cfb92d14SAndroid Build Coastguard Worker     OutputNewLine();
5726*cfb92d14SAndroid Build Coastguard Worker 
5727*cfb92d14SAndroid Build Coastguard Worker     while (otLogGenerateNextHexDumpLine(&info) == OT_ERROR_NONE)
5728*cfb92d14SAndroid Build Coastguard Worker     {
5729*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%s", info.mLine);
5730*cfb92d14SAndroid Build Coastguard Worker     }
5731*cfb92d14SAndroid Build Coastguard Worker }
5732*cfb92d14SAndroid Build Coastguard Worker 
5733*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE
Process(Arg aArgs[])5734*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("prefix")>(Arg aArgs[])
5735*cfb92d14SAndroid Build Coastguard Worker {
5736*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
5737*cfb92d14SAndroid Build Coastguard Worker 
5738*cfb92d14SAndroid Build Coastguard Worker     /**
5739*cfb92d14SAndroid Build Coastguard Worker      * @cli prefix
5740*cfb92d14SAndroid Build Coastguard Worker      * @code
5741*cfb92d14SAndroid Build Coastguard Worker      * prefix
5742*cfb92d14SAndroid Build Coastguard Worker      * 2001:dead:beef:cafe::/64 paros med
5743*cfb92d14SAndroid Build Coastguard Worker      * - fd00:7d03:7d03:7d03::/64 prosD med
5744*cfb92d14SAndroid Build Coastguard Worker      * Done
5745*cfb92d14SAndroid Build Coastguard Worker      * @endcode
5746*cfb92d14SAndroid Build Coastguard Worker      * @par
5747*cfb92d14SAndroid Build Coastguard Worker      * Get the prefix list in the local Network Data.
5748*cfb92d14SAndroid Build Coastguard Worker      * @note For the Thread 1.2 border router with backbone capability, the local Domain Prefix
5749*cfb92d14SAndroid Build Coastguard Worker      * is listed as well and includes the `D` flag. If backbone functionality is disabled, a dash
5750*cfb92d14SAndroid Build Coastguard Worker      * `-` is printed before the local Domain Prefix.
5751*cfb92d14SAndroid Build Coastguard Worker      * @par
5752*cfb92d14SAndroid Build Coastguard Worker      * For more information about #otBorderRouterConfig flags, refer to @overview.
5753*cfb92d14SAndroid Build Coastguard Worker      * @sa otBorderRouterGetNextOnMeshPrefix
5754*cfb92d14SAndroid Build Coastguard Worker      */
5755*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
5756*cfb92d14SAndroid Build Coastguard Worker     {
5757*cfb92d14SAndroid Build Coastguard Worker         otNetworkDataIterator iterator = OT_NETWORK_DATA_ITERATOR_INIT;
5758*cfb92d14SAndroid Build Coastguard Worker         otBorderRouterConfig  config;
5759*cfb92d14SAndroid Build Coastguard Worker 
5760*cfb92d14SAndroid Build Coastguard Worker         while (otBorderRouterGetNextOnMeshPrefix(GetInstancePtr(), &iterator, &config) == OT_ERROR_NONE)
5761*cfb92d14SAndroid Build Coastguard Worker         {
5762*cfb92d14SAndroid Build Coastguard Worker             mNetworkData.OutputPrefix(config);
5763*cfb92d14SAndroid Build Coastguard Worker         }
5764*cfb92d14SAndroid Build Coastguard Worker 
5765*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE
5766*cfb92d14SAndroid Build Coastguard Worker         if (otBackboneRouterGetState(GetInstancePtr()) == OT_BACKBONE_ROUTER_STATE_DISABLED)
5767*cfb92d14SAndroid Build Coastguard Worker         {
5768*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(otBackboneRouterGetDomainPrefix(GetInstancePtr(), &config));
5769*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("- ");
5770*cfb92d14SAndroid Build Coastguard Worker             mNetworkData.OutputPrefix(config);
5771*cfb92d14SAndroid Build Coastguard Worker         }
5772*cfb92d14SAndroid Build Coastguard Worker #endif
5773*cfb92d14SAndroid Build Coastguard Worker     }
5774*cfb92d14SAndroid Build Coastguard Worker     /**
5775*cfb92d14SAndroid Build Coastguard Worker      * @cli prefix add
5776*cfb92d14SAndroid Build Coastguard Worker      * @code
5777*cfb92d14SAndroid Build Coastguard Worker      * prefix add 2001:dead:beef:cafe::/64 paros med
5778*cfb92d14SAndroid Build Coastguard Worker      * Done
5779*cfb92d14SAndroid Build Coastguard Worker      * @endcode
5780*cfb92d14SAndroid Build Coastguard Worker      * @code
5781*cfb92d14SAndroid Build Coastguard Worker      * prefix add fd00:7d03:7d03:7d03::/64 prosD low
5782*cfb92d14SAndroid Build Coastguard Worker      * Done
5783*cfb92d14SAndroid Build Coastguard Worker      * @endcode
5784*cfb92d14SAndroid Build Coastguard Worker      * @cparam prefix add @ca{prefix} [@ca{padcrosnD}] [@ca{high}|@ca{med}|@ca{low}]
5785*cfb92d14SAndroid Build Coastguard Worker      * OT CLI uses mapped arguments to configure #otBorderRouterConfig values. @moreinfo{the @overview}.
5786*cfb92d14SAndroid Build Coastguard Worker      * @par
5787*cfb92d14SAndroid Build Coastguard Worker      * Adds a valid prefix to the Network Data.
5788*cfb92d14SAndroid Build Coastguard Worker      * @sa otBorderRouterAddOnMeshPrefix
5789*cfb92d14SAndroid Build Coastguard Worker      */
5790*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "add")
5791*cfb92d14SAndroid Build Coastguard Worker     {
5792*cfb92d14SAndroid Build Coastguard Worker         otBorderRouterConfig config;
5793*cfb92d14SAndroid Build Coastguard Worker 
5794*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = ParsePrefix(aArgs + 1, config));
5795*cfb92d14SAndroid Build Coastguard Worker         error = otBorderRouterAddOnMeshPrefix(GetInstancePtr(), &config);
5796*cfb92d14SAndroid Build Coastguard Worker     }
5797*cfb92d14SAndroid Build Coastguard Worker     /**
5798*cfb92d14SAndroid Build Coastguard Worker      * @cli prefix remove
5799*cfb92d14SAndroid Build Coastguard Worker      * @code
5800*cfb92d14SAndroid Build Coastguard Worker      * prefix remove 2001:dead:beef:cafe::/64
5801*cfb92d14SAndroid Build Coastguard Worker      * Done
5802*cfb92d14SAndroid Build Coastguard Worker      * @endcode
5803*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
5804*cfb92d14SAndroid Build Coastguard Worker      * #otBorderRouterRemoveOnMeshPrefix
5805*cfb92d14SAndroid Build Coastguard Worker      */
5806*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "remove")
5807*cfb92d14SAndroid Build Coastguard Worker     {
5808*cfb92d14SAndroid Build Coastguard Worker         otIp6Prefix prefix;
5809*cfb92d14SAndroid Build Coastguard Worker 
5810*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[1].ParseAsIp6Prefix(prefix));
5811*cfb92d14SAndroid Build Coastguard Worker         error = otBorderRouterRemoveOnMeshPrefix(GetInstancePtr(), &prefix);
5812*cfb92d14SAndroid Build Coastguard Worker     }
5813*cfb92d14SAndroid Build Coastguard Worker     /**
5814*cfb92d14SAndroid Build Coastguard Worker      * @cli prefix meshlocal
5815*cfb92d14SAndroid Build Coastguard Worker      * @code
5816*cfb92d14SAndroid Build Coastguard Worker      * prefix meshlocal
5817*cfb92d14SAndroid Build Coastguard Worker      * fdde:ad00:beef:0::/64
5818*cfb92d14SAndroid Build Coastguard Worker      * Done
5819*cfb92d14SAndroid Build Coastguard Worker      * @endcode
5820*cfb92d14SAndroid Build Coastguard Worker      * @par
5821*cfb92d14SAndroid Build Coastguard Worker      * Get the mesh local prefix.
5822*cfb92d14SAndroid Build Coastguard Worker      */
5823*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "meshlocal")
5824*cfb92d14SAndroid Build Coastguard Worker     {
5825*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1].IsEmpty())
5826*cfb92d14SAndroid Build Coastguard Worker         {
5827*cfb92d14SAndroid Build Coastguard Worker             OutputIp6PrefixLine(*otThreadGetMeshLocalPrefix(GetInstancePtr()));
5828*cfb92d14SAndroid Build Coastguard Worker         }
5829*cfb92d14SAndroid Build Coastguard Worker         else
5830*cfb92d14SAndroid Build Coastguard Worker         {
5831*cfb92d14SAndroid Build Coastguard Worker             otIp6Prefix prefix;
5832*cfb92d14SAndroid Build Coastguard Worker 
5833*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = aArgs[1].ParseAsIp6Prefix(prefix));
5834*cfb92d14SAndroid Build Coastguard Worker             VerifyOrExit(prefix.mLength == OT_IP6_PREFIX_BITSIZE, error = OT_ERROR_INVALID_ARGS);
5835*cfb92d14SAndroid Build Coastguard Worker             error =
5836*cfb92d14SAndroid Build Coastguard Worker                 otThreadSetMeshLocalPrefix(GetInstancePtr(), reinterpret_cast<otMeshLocalPrefix *>(&prefix.mPrefix));
5837*cfb92d14SAndroid Build Coastguard Worker         }
5838*cfb92d14SAndroid Build Coastguard Worker     }
5839*cfb92d14SAndroid Build Coastguard Worker     else
5840*cfb92d14SAndroid Build Coastguard Worker     {
5841*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_COMMAND;
5842*cfb92d14SAndroid Build Coastguard Worker     }
5843*cfb92d14SAndroid Build Coastguard Worker 
5844*cfb92d14SAndroid Build Coastguard Worker exit:
5845*cfb92d14SAndroid Build Coastguard Worker     return error;
5846*cfb92d14SAndroid Build Coastguard Worker }
5847*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE
5848*cfb92d14SAndroid Build Coastguard Worker 
5849*cfb92d14SAndroid Build Coastguard Worker /**
5850*cfb92d14SAndroid Build Coastguard Worker  * @cli preferrouterid
5851*cfb92d14SAndroid Build Coastguard Worker  * @code
5852*cfb92d14SAndroid Build Coastguard Worker  * preferrouterid 16
5853*cfb92d14SAndroid Build Coastguard Worker  * Done
5854*cfb92d14SAndroid Build Coastguard Worker  * @endcode
5855*cfb92d14SAndroid Build Coastguard Worker  * @cparam preferrouterid @ca{routerid}
5856*cfb92d14SAndroid Build Coastguard Worker  * @par
5857*cfb92d14SAndroid Build Coastguard Worker  * Specifies the preferred router ID that the leader should provide when solicited.
5858*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadSetPreferredRouterId
5859*cfb92d14SAndroid Build Coastguard Worker  */
5860*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
Process(Arg aArgs[])5861*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("preferrouterid")>(Arg aArgs[])
5862*cfb92d14SAndroid Build Coastguard Worker {
5863*cfb92d14SAndroid Build Coastguard Worker     return ProcessSet(aArgs, otThreadSetPreferredRouterId);
5864*cfb92d14SAndroid Build Coastguard Worker }
5865*cfb92d14SAndroid Build Coastguard Worker #endif
5866*cfb92d14SAndroid Build Coastguard Worker 
5867*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MAC_FILTER_ENABLE && OPENTHREAD_CONFIG_RADIO_LINK_IEEE_802_15_4_ENABLE
Process(Arg aArgs[])5868*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("radiofilter")>(Arg aArgs[])
5869*cfb92d14SAndroid Build Coastguard Worker {
5870*cfb92d14SAndroid Build Coastguard Worker     return ProcessEnableDisable(aArgs, otLinkIsRadioFilterEnabled, otLinkSetRadioFilterEnabled);
5871*cfb92d14SAndroid Build Coastguard Worker }
5872*cfb92d14SAndroid Build Coastguard Worker #endif
5873*cfb92d14SAndroid Build Coastguard Worker 
5874*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_RADIO_STATS_ENABLE
UsToSInt(uint64_t aUs)5875*cfb92d14SAndroid Build Coastguard Worker inline unsigned long UsToSInt(uint64_t aUs) { return ToUlong(static_cast<uint32_t>(aUs / 1000000)); }
UsToSDec(uint64_t aUs)5876*cfb92d14SAndroid Build Coastguard Worker inline unsigned long UsToSDec(uint64_t aUs) { return ToUlong(static_cast<uint32_t>(aUs % 1000000)); }
5877*cfb92d14SAndroid Build Coastguard Worker 
OutputRadioStatsTime(const char * aTimeName,uint64_t aTimeUs,uint64_t aTotalTimeUs)5878*cfb92d14SAndroid Build Coastguard Worker void Interpreter::OutputRadioStatsTime(const char *aTimeName, uint64_t aTimeUs, uint64_t aTotalTimeUs)
5879*cfb92d14SAndroid Build Coastguard Worker {
5880*cfb92d14SAndroid Build Coastguard Worker     uint32_t timePercentInt = static_cast<uint32_t>(aTimeUs * 100 / aTotalTimeUs);
5881*cfb92d14SAndroid Build Coastguard Worker     uint32_t timePercentDec = static_cast<uint32_t>((aTimeUs * 100 % aTotalTimeUs) * 100 / aTotalTimeUs);
5882*cfb92d14SAndroid Build Coastguard Worker 
5883*cfb92d14SAndroid Build Coastguard Worker     OutputLine("%s Time: %lu.%06lus (%lu.%02lu%%)", aTimeName, UsToSInt(aTimeUs), UsToSDec(aTimeUs),
5884*cfb92d14SAndroid Build Coastguard Worker                ToUlong(timePercentInt), ToUlong(timePercentDec));
5885*cfb92d14SAndroid Build Coastguard Worker }
5886*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_RADIO_STATS_ENABLE
5887*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])5888*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("radio")>(Arg aArgs[])
5889*cfb92d14SAndroid Build Coastguard Worker {
5890*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
5891*cfb92d14SAndroid Build Coastguard Worker 
5892*cfb92d14SAndroid Build Coastguard Worker     /**
5893*cfb92d14SAndroid Build Coastguard Worker      * @cli radio (enable,disable)
5894*cfb92d14SAndroid Build Coastguard Worker      * @code
5895*cfb92d14SAndroid Build Coastguard Worker      * radio enable
5896*cfb92d14SAndroid Build Coastguard Worker      * Done
5897*cfb92d14SAndroid Build Coastguard Worker      * @endcode
5898*cfb92d14SAndroid Build Coastguard Worker      * @code
5899*cfb92d14SAndroid Build Coastguard Worker      * radio disable
5900*cfb92d14SAndroid Build Coastguard Worker      * Done
5901*cfb92d14SAndroid Build Coastguard Worker      * @endcode
5902*cfb92d14SAndroid Build Coastguard Worker      * @cparam radio @ca{enable|disable}
5903*cfb92d14SAndroid Build Coastguard Worker      * @sa otLinkSetEnabled
5904*cfb92d14SAndroid Build Coastguard Worker      * @par
5905*cfb92d14SAndroid Build Coastguard Worker      * Enables or disables the radio.
5906*cfb92d14SAndroid Build Coastguard Worker      */
5907*cfb92d14SAndroid Build Coastguard Worker     if (ProcessEnableDisable(aArgs, otLinkSetEnabled) == OT_ERROR_NONE)
5908*cfb92d14SAndroid Build Coastguard Worker     {
5909*cfb92d14SAndroid Build Coastguard Worker     }
5910*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_RADIO_STATS_ENABLE
5911*cfb92d14SAndroid Build Coastguard Worker     /**
5912*cfb92d14SAndroid Build Coastguard Worker      * @cli radio stats
5913*cfb92d14SAndroid Build Coastguard Worker      * @code
5914*cfb92d14SAndroid Build Coastguard Worker      * radio stats
5915*cfb92d14SAndroid Build Coastguard Worker      * Radio Statistics:
5916*cfb92d14SAndroid Build Coastguard Worker      * Total Time: 67.756s
5917*cfb92d14SAndroid Build Coastguard Worker      * Tx Time: 0.022944s (0.03%)
5918*cfb92d14SAndroid Build Coastguard Worker      * Rx Time: 1.482353s (2.18%)
5919*cfb92d14SAndroid Build Coastguard Worker      * Sleep Time: 66.251128s (97.77%)
5920*cfb92d14SAndroid Build Coastguard Worker      * Disabled Time: 0.000080s (0.00%)
5921*cfb92d14SAndroid Build Coastguard Worker      * Done
5922*cfb92d14SAndroid Build Coastguard Worker      * @endcode
5923*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
5924*cfb92d14SAndroid Build Coastguard Worker      * #otRadioTimeStatsGet
5925*cfb92d14SAndroid Build Coastguard Worker      */
5926*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "stats")
5927*cfb92d14SAndroid Build Coastguard Worker     {
5928*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1].IsEmpty())
5929*cfb92d14SAndroid Build Coastguard Worker         {
5930*cfb92d14SAndroid Build Coastguard Worker             const otRadioTimeStats *radioStats = nullptr;
5931*cfb92d14SAndroid Build Coastguard Worker             uint64_t                totalTimeUs;
5932*cfb92d14SAndroid Build Coastguard Worker 
5933*cfb92d14SAndroid Build Coastguard Worker             radioStats = otRadioTimeStatsGet(GetInstancePtr());
5934*cfb92d14SAndroid Build Coastguard Worker 
5935*cfb92d14SAndroid Build Coastguard Worker             totalTimeUs =
5936*cfb92d14SAndroid Build Coastguard Worker                 radioStats->mSleepTime + radioStats->mTxTime + radioStats->mRxTime + radioStats->mDisabledTime;
5937*cfb92d14SAndroid Build Coastguard Worker             if (totalTimeUs == 0)
5938*cfb92d14SAndroid Build Coastguard Worker             {
5939*cfb92d14SAndroid Build Coastguard Worker                 OutputLine("Total Time is 0!");
5940*cfb92d14SAndroid Build Coastguard Worker             }
5941*cfb92d14SAndroid Build Coastguard Worker             else
5942*cfb92d14SAndroid Build Coastguard Worker             {
5943*cfb92d14SAndroid Build Coastguard Worker                 OutputLine("Radio Statistics:");
5944*cfb92d14SAndroid Build Coastguard Worker                 OutputLine("Total Time: %lu.%03lus", ToUlong(static_cast<uint32_t>(totalTimeUs / 1000000)),
5945*cfb92d14SAndroid Build Coastguard Worker                            ToUlong((totalTimeUs % 1000000) / 1000));
5946*cfb92d14SAndroid Build Coastguard Worker                 OutputRadioStatsTime("Tx", radioStats->mTxTime, totalTimeUs);
5947*cfb92d14SAndroid Build Coastguard Worker                 OutputRadioStatsTime("Rx", radioStats->mRxTime, totalTimeUs);
5948*cfb92d14SAndroid Build Coastguard Worker                 OutputRadioStatsTime("Sleep", radioStats->mSleepTime, totalTimeUs);
5949*cfb92d14SAndroid Build Coastguard Worker                 OutputRadioStatsTime("Disabled", radioStats->mDisabledTime, totalTimeUs);
5950*cfb92d14SAndroid Build Coastguard Worker             }
5951*cfb92d14SAndroid Build Coastguard Worker         }
5952*cfb92d14SAndroid Build Coastguard Worker         /**
5953*cfb92d14SAndroid Build Coastguard Worker          * @cli radio stats clear
5954*cfb92d14SAndroid Build Coastguard Worker          * @code
5955*cfb92d14SAndroid Build Coastguard Worker          * radio stats clear
5956*cfb92d14SAndroid Build Coastguard Worker          * Done
5957*cfb92d14SAndroid Build Coastguard Worker          * @endcode
5958*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
5959*cfb92d14SAndroid Build Coastguard Worker          * #otRadioTimeStatsReset
5960*cfb92d14SAndroid Build Coastguard Worker          */
5961*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "clear")
5962*cfb92d14SAndroid Build Coastguard Worker         {
5963*cfb92d14SAndroid Build Coastguard Worker             otRadioTimeStatsReset(GetInstancePtr());
5964*cfb92d14SAndroid Build Coastguard Worker         }
5965*cfb92d14SAndroid Build Coastguard Worker     }
5966*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_RADIO_STATS_ENABLE
5967*cfb92d14SAndroid Build Coastguard Worker     else
5968*cfb92d14SAndroid Build Coastguard Worker     {
5969*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_COMMAND;
5970*cfb92d14SAndroid Build Coastguard Worker     }
5971*cfb92d14SAndroid Build Coastguard Worker 
5972*cfb92d14SAndroid Build Coastguard Worker     return error;
5973*cfb92d14SAndroid Build Coastguard Worker }
5974*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])5975*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("rcp")>(Arg aArgs[])
5976*cfb92d14SAndroid Build Coastguard Worker {
5977*cfb92d14SAndroid Build Coastguard Worker     otError     error   = OT_ERROR_NONE;
5978*cfb92d14SAndroid Build Coastguard Worker     const char *version = otPlatRadioGetVersionString(GetInstancePtr());
5979*cfb92d14SAndroid Build Coastguard Worker 
5980*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(version != otGetVersionString(), error = OT_ERROR_NOT_IMPLEMENTED);
5981*cfb92d14SAndroid Build Coastguard Worker     /**
5982*cfb92d14SAndroid Build Coastguard Worker      * @cli rcp version
5983*cfb92d14SAndroid Build Coastguard Worker      * @code
5984*cfb92d14SAndroid Build Coastguard Worker      * rcp version
5985*cfb92d14SAndroid Build Coastguard Worker      * OPENTHREAD/20191113-00825-g82053cc9d-dirty; SIMULATION; Jun  4 2020 17:53:16
5986*cfb92d14SAndroid Build Coastguard Worker      * Done
5987*cfb92d14SAndroid Build Coastguard Worker      * @endcode
5988*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
5989*cfb92d14SAndroid Build Coastguard Worker      * #otPlatRadioGetVersionString
5990*cfb92d14SAndroid Build Coastguard Worker      */
5991*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "version")
5992*cfb92d14SAndroid Build Coastguard Worker     {
5993*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%s", version);
5994*cfb92d14SAndroid Build Coastguard Worker     }
5995*cfb92d14SAndroid Build Coastguard Worker 
5996*cfb92d14SAndroid Build Coastguard Worker     else
5997*cfb92d14SAndroid Build Coastguard Worker     {
5998*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
5999*cfb92d14SAndroid Build Coastguard Worker     }
6000*cfb92d14SAndroid Build Coastguard Worker 
6001*cfb92d14SAndroid Build Coastguard Worker exit:
6002*cfb92d14SAndroid Build Coastguard Worker     return error;
6003*cfb92d14SAndroid Build Coastguard Worker }
6004*cfb92d14SAndroid Build Coastguard Worker /**
6005*cfb92d14SAndroid Build Coastguard Worker  * @cli region
6006*cfb92d14SAndroid Build Coastguard Worker  * @code
6007*cfb92d14SAndroid Build Coastguard Worker  * region
6008*cfb92d14SAndroid Build Coastguard Worker  * US
6009*cfb92d14SAndroid Build Coastguard Worker  * Done
6010*cfb92d14SAndroid Build Coastguard Worker  * @endcode
6011*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
6012*cfb92d14SAndroid Build Coastguard Worker  * #otLinkGetRegion
6013*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])6014*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("region")>(Arg aArgs[])
6015*cfb92d14SAndroid Build Coastguard Worker {
6016*cfb92d14SAndroid Build Coastguard Worker     otError  error = OT_ERROR_NONE;
6017*cfb92d14SAndroid Build Coastguard Worker     uint16_t regionCode;
6018*cfb92d14SAndroid Build Coastguard Worker 
6019*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
6020*cfb92d14SAndroid Build Coastguard Worker     {
6021*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otLinkGetRegion(GetInstancePtr(), &regionCode));
6022*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%c%c", regionCode >> 8, regionCode & 0xff);
6023*cfb92d14SAndroid Build Coastguard Worker     }
6024*cfb92d14SAndroid Build Coastguard Worker     /**
6025*cfb92d14SAndroid Build Coastguard Worker      * @cli region (set)
6026*cfb92d14SAndroid Build Coastguard Worker      * @code
6027*cfb92d14SAndroid Build Coastguard Worker      * region US
6028*cfb92d14SAndroid Build Coastguard Worker      * Done
6029*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6030*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
6031*cfb92d14SAndroid Build Coastguard Worker      * #otLinkSetRegion
6032*cfb92d14SAndroid Build Coastguard Worker      * @par
6033*cfb92d14SAndroid Build Coastguard Worker      * Changing this can affect the transmit power limit.
6034*cfb92d14SAndroid Build Coastguard Worker      */
6035*cfb92d14SAndroid Build Coastguard Worker     else
6036*cfb92d14SAndroid Build Coastguard Worker 
6037*cfb92d14SAndroid Build Coastguard Worker     {
6038*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(aArgs[0].GetLength() == 2, error = OT_ERROR_INVALID_ARGS);
6039*cfb92d14SAndroid Build Coastguard Worker 
6040*cfb92d14SAndroid Build Coastguard Worker         regionCode = static_cast<uint16_t>(static_cast<uint16_t>(aArgs[0].GetCString()[0]) << 8) +
6041*cfb92d14SAndroid Build Coastguard Worker                      static_cast<uint16_t>(aArgs[0].GetCString()[1]);
6042*cfb92d14SAndroid Build Coastguard Worker         error = otLinkSetRegion(GetInstancePtr(), regionCode);
6043*cfb92d14SAndroid Build Coastguard Worker     }
6044*cfb92d14SAndroid Build Coastguard Worker 
6045*cfb92d14SAndroid Build Coastguard Worker exit:
6046*cfb92d14SAndroid Build Coastguard Worker     return error;
6047*cfb92d14SAndroid Build Coastguard Worker }
6048*cfb92d14SAndroid Build Coastguard Worker 
6049*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
6050*cfb92d14SAndroid Build Coastguard Worker /**
6051*cfb92d14SAndroid Build Coastguard Worker  * @cli releaserouterid (routerid)
6052*cfb92d14SAndroid Build Coastguard Worker  * @code
6053*cfb92d14SAndroid Build Coastguard Worker  * releaserouterid 16
6054*cfb92d14SAndroid Build Coastguard Worker  * Done
6055*cfb92d14SAndroid Build Coastguard Worker  * @endcode
6056*cfb92d14SAndroid Build Coastguard Worker  * @cparam releaserouterid [@ca{routerid}]
6057*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
6058*cfb92d14SAndroid Build Coastguard Worker  * #otThreadReleaseRouterId
6059*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])6060*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("releaserouterid")>(Arg aArgs[])
6061*cfb92d14SAndroid Build Coastguard Worker 
6062*cfb92d14SAndroid Build Coastguard Worker {
6063*cfb92d14SAndroid Build Coastguard Worker     return ProcessSet(aArgs, otThreadReleaseRouterId);
6064*cfb92d14SAndroid Build Coastguard Worker }
6065*cfb92d14SAndroid Build Coastguard Worker #endif
6066*cfb92d14SAndroid Build Coastguard Worker /**
6067*cfb92d14SAndroid Build Coastguard Worker  * @cli rloc16
6068*cfb92d14SAndroid Build Coastguard Worker  * @code
6069*cfb92d14SAndroid Build Coastguard Worker  * rloc16
6070*cfb92d14SAndroid Build Coastguard Worker  * 0xdead
6071*cfb92d14SAndroid Build Coastguard Worker  * Done
6072*cfb92d14SAndroid Build Coastguard Worker  * @endcode
6073*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
6074*cfb92d14SAndroid Build Coastguard Worker  * #otThreadGetRloc16
6075*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])6076*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("rloc16")>(Arg aArgs[])
6077*cfb92d14SAndroid Build Coastguard Worker 
6078*cfb92d14SAndroid Build Coastguard Worker {
6079*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aArgs);
6080*cfb92d14SAndroid Build Coastguard Worker 
6081*cfb92d14SAndroid Build Coastguard Worker     OutputLine("%04x", otThreadGetRloc16(GetInstancePtr()));
6082*cfb92d14SAndroid Build Coastguard Worker 
6083*cfb92d14SAndroid Build Coastguard Worker     return OT_ERROR_NONE;
6084*cfb92d14SAndroid Build Coastguard Worker }
6085*cfb92d14SAndroid Build Coastguard Worker 
6086*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE
Process(Arg aArgs[])6087*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("route")>(Arg aArgs[])
6088*cfb92d14SAndroid Build Coastguard Worker {
6089*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
6090*cfb92d14SAndroid Build Coastguard Worker     /**
6091*cfb92d14SAndroid Build Coastguard Worker      * @cli route
6092*cfb92d14SAndroid Build Coastguard Worker      * @code
6093*cfb92d14SAndroid Build Coastguard Worker      * route
6094*cfb92d14SAndroid Build Coastguard Worker      * 2001:dead:beef:cafe::/64 s med
6095*cfb92d14SAndroid Build Coastguard Worker      * Done
6096*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6097*cfb92d14SAndroid Build Coastguard Worker      * @sa otBorderRouterGetNextRoute
6098*cfb92d14SAndroid Build Coastguard Worker      * @par
6099*cfb92d14SAndroid Build Coastguard Worker      * Get the external route list in the local Network Data.
6100*cfb92d14SAndroid Build Coastguard Worker      */
6101*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
6102*cfb92d14SAndroid Build Coastguard Worker     {
6103*cfb92d14SAndroid Build Coastguard Worker         otNetworkDataIterator iterator = OT_NETWORK_DATA_ITERATOR_INIT;
6104*cfb92d14SAndroid Build Coastguard Worker         otExternalRouteConfig config;
6105*cfb92d14SAndroid Build Coastguard Worker 
6106*cfb92d14SAndroid Build Coastguard Worker         while (otBorderRouterGetNextRoute(GetInstancePtr(), &iterator, &config) == OT_ERROR_NONE)
6107*cfb92d14SAndroid Build Coastguard Worker         {
6108*cfb92d14SAndroid Build Coastguard Worker             mNetworkData.OutputRoute(config);
6109*cfb92d14SAndroid Build Coastguard Worker         }
6110*cfb92d14SAndroid Build Coastguard Worker     }
6111*cfb92d14SAndroid Build Coastguard Worker     /**
6112*cfb92d14SAndroid Build Coastguard Worker      * @cli route add
6113*cfb92d14SAndroid Build Coastguard Worker      * @code
6114*cfb92d14SAndroid Build Coastguard Worker      * route add 2001:dead:beef:cafe::/64 s med
6115*cfb92d14SAndroid Build Coastguard Worker      * Done
6116*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6117*cfb92d14SAndroid Build Coastguard Worker      * @par
6118*cfb92d14SAndroid Build Coastguard Worker      * For parameters, use:
6119*cfb92d14SAndroid Build Coastguard Worker      * *    s: Stable flag
6120*cfb92d14SAndroid Build Coastguard Worker      * *    n: NAT64 flag
6121*cfb92d14SAndroid Build Coastguard Worker      * *    prf: Default Router Preference, [high, med, low].
6122*cfb92d14SAndroid Build Coastguard Worker      * @cparam route add @ca{prefix} [@ca{sn}] [@ca{high}|@ca{med}|@ca{low}]
6123*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
6124*cfb92d14SAndroid Build Coastguard Worker      * #otExternalRouteConfig
6125*cfb92d14SAndroid Build Coastguard Worker      * @par
6126*cfb92d14SAndroid Build Coastguard Worker      * Add a valid external route to the Network Data.
6127*cfb92d14SAndroid Build Coastguard Worker      */
6128*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "add")
6129*cfb92d14SAndroid Build Coastguard Worker     {
6130*cfb92d14SAndroid Build Coastguard Worker         otExternalRouteConfig config;
6131*cfb92d14SAndroid Build Coastguard Worker 
6132*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = ParseRoute(aArgs + 1, config));
6133*cfb92d14SAndroid Build Coastguard Worker         error = otBorderRouterAddRoute(GetInstancePtr(), &config);
6134*cfb92d14SAndroid Build Coastguard Worker     }
6135*cfb92d14SAndroid Build Coastguard Worker     /**
6136*cfb92d14SAndroid Build Coastguard Worker      * @cli route remove
6137*cfb92d14SAndroid Build Coastguard Worker      * @code
6138*cfb92d14SAndroid Build Coastguard Worker      * route remove 2001:dead:beef:cafe::/64
6139*cfb92d14SAndroid Build Coastguard Worker      * Done
6140*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6141*cfb92d14SAndroid Build Coastguard Worker      * @cparam route remove [@ca{prefix}]
6142*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
6143*cfb92d14SAndroid Build Coastguard Worker      * #otBorderRouterRemoveRoute
6144*cfb92d14SAndroid Build Coastguard Worker      */
6145*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "remove")
6146*cfb92d14SAndroid Build Coastguard Worker     {
6147*cfb92d14SAndroid Build Coastguard Worker         otIp6Prefix prefix;
6148*cfb92d14SAndroid Build Coastguard Worker 
6149*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[1].ParseAsIp6Prefix(prefix));
6150*cfb92d14SAndroid Build Coastguard Worker         error = otBorderRouterRemoveRoute(GetInstancePtr(), &prefix);
6151*cfb92d14SAndroid Build Coastguard Worker     }
6152*cfb92d14SAndroid Build Coastguard Worker     else
6153*cfb92d14SAndroid Build Coastguard Worker     {
6154*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_COMMAND;
6155*cfb92d14SAndroid Build Coastguard Worker     }
6156*cfb92d14SAndroid Build Coastguard Worker 
6157*cfb92d14SAndroid Build Coastguard Worker exit:
6158*cfb92d14SAndroid Build Coastguard Worker     return error;
6159*cfb92d14SAndroid Build Coastguard Worker }
6160*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE
6161*cfb92d14SAndroid Build Coastguard Worker 
6162*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
Process(Arg aArgs[])6163*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("router")>(Arg aArgs[])
6164*cfb92d14SAndroid Build Coastguard Worker {
6165*cfb92d14SAndroid Build Coastguard Worker     otError      error = OT_ERROR_NONE;
6166*cfb92d14SAndroid Build Coastguard Worker     otRouterInfo routerInfo;
6167*cfb92d14SAndroid Build Coastguard Worker     uint16_t     routerId;
6168*cfb92d14SAndroid Build Coastguard Worker     bool         isTable;
6169*cfb92d14SAndroid Build Coastguard Worker     /**
6170*cfb92d14SAndroid Build Coastguard Worker      * @cli router table
6171*cfb92d14SAndroid Build Coastguard Worker      * @code
6172*cfb92d14SAndroid Build Coastguard Worker      * router table
6173*cfb92d14SAndroid Build Coastguard Worker      * | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     | Link |
6174*cfb92d14SAndroid Build Coastguard Worker      * +----+--------+----------+-----------+-------+--------+-----+------------------+------+
6175*cfb92d14SAndroid Build Coastguard Worker      * | 22 | 0x5800 |       63 |         0 |     0 |      0 |   0 | 0aeb8196c9f61658 |    0 |
6176*cfb92d14SAndroid Build Coastguard Worker      * | 49 | 0xc400 |       63 |         0 |     3 |      3 |   0 | faa1c03908e2dbf2 |    1 |
6177*cfb92d14SAndroid Build Coastguard Worker      * Done
6178*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6179*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadGetRouterInfo
6180*cfb92d14SAndroid Build Coastguard Worker      * @par
6181*cfb92d14SAndroid Build Coastguard Worker      * Prints a list of routers in a table format.
6182*cfb92d14SAndroid Build Coastguard Worker      */
6183*cfb92d14SAndroid Build Coastguard Worker     isTable = (aArgs[0] == "table");
6184*cfb92d14SAndroid Build Coastguard Worker     /**
6185*cfb92d14SAndroid Build Coastguard Worker      * @cli router list
6186*cfb92d14SAndroid Build Coastguard Worker      * @code
6187*cfb92d14SAndroid Build Coastguard Worker      * router list
6188*cfb92d14SAndroid Build Coastguard Worker      * 8 24 50
6189*cfb92d14SAndroid Build Coastguard Worker      * Done
6190*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6191*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadGetRouterInfo
6192*cfb92d14SAndroid Build Coastguard Worker      * @par
6193*cfb92d14SAndroid Build Coastguard Worker      * List allocated Router IDs.
6194*cfb92d14SAndroid Build Coastguard Worker      */
6195*cfb92d14SAndroid Build Coastguard Worker     if (isTable || (aArgs[0] == "list"))
6196*cfb92d14SAndroid Build Coastguard Worker     {
6197*cfb92d14SAndroid Build Coastguard Worker         uint8_t maxRouterId;
6198*cfb92d14SAndroid Build Coastguard Worker 
6199*cfb92d14SAndroid Build Coastguard Worker         if (isTable)
6200*cfb92d14SAndroid Build Coastguard Worker         {
6201*cfb92d14SAndroid Build Coastguard Worker             static const char *const kRouterTableTitles[] = {
6202*cfb92d14SAndroid Build Coastguard Worker                 "ID", "RLOC16", "Next Hop", "Path Cost", "LQ In", "LQ Out", "Age", "Extended MAC", "Link",
6203*cfb92d14SAndroid Build Coastguard Worker             };
6204*cfb92d14SAndroid Build Coastguard Worker 
6205*cfb92d14SAndroid Build Coastguard Worker             static const uint8_t kRouterTableColumnWidths[] = {
6206*cfb92d14SAndroid Build Coastguard Worker                 4, 8, 10, 11, 7, 8, 5, 18, 6,
6207*cfb92d14SAndroid Build Coastguard Worker             };
6208*cfb92d14SAndroid Build Coastguard Worker 
6209*cfb92d14SAndroid Build Coastguard Worker             OutputTableHeader(kRouterTableTitles, kRouterTableColumnWidths);
6210*cfb92d14SAndroid Build Coastguard Worker         }
6211*cfb92d14SAndroid Build Coastguard Worker 
6212*cfb92d14SAndroid Build Coastguard Worker         maxRouterId = otThreadGetMaxRouterId(GetInstancePtr());
6213*cfb92d14SAndroid Build Coastguard Worker 
6214*cfb92d14SAndroid Build Coastguard Worker         for (uint8_t i = 0; i <= maxRouterId; i++)
6215*cfb92d14SAndroid Build Coastguard Worker         {
6216*cfb92d14SAndroid Build Coastguard Worker             if (otThreadGetRouterInfo(GetInstancePtr(), i, &routerInfo) != OT_ERROR_NONE)
6217*cfb92d14SAndroid Build Coastguard Worker             {
6218*cfb92d14SAndroid Build Coastguard Worker                 continue;
6219*cfb92d14SAndroid Build Coastguard Worker             }
6220*cfb92d14SAndroid Build Coastguard Worker 
6221*cfb92d14SAndroid Build Coastguard Worker             if (isTable)
6222*cfb92d14SAndroid Build Coastguard Worker             {
6223*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %2u ", routerInfo.mRouterId);
6224*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| 0x%04x ", routerInfo.mRloc16);
6225*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %8u ", routerInfo.mNextHop);
6226*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %9u ", routerInfo.mPathCost);
6227*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %5u ", routerInfo.mLinkQualityIn);
6228*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %6u ", routerInfo.mLinkQualityOut);
6229*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %3u ", routerInfo.mAge);
6230*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| ");
6231*cfb92d14SAndroid Build Coastguard Worker                 OutputExtAddress(routerInfo.mExtAddress);
6232*cfb92d14SAndroid Build Coastguard Worker                 OutputLine(" | %4d |", routerInfo.mLinkEstablished);
6233*cfb92d14SAndroid Build Coastguard Worker             }
6234*cfb92d14SAndroid Build Coastguard Worker             else
6235*cfb92d14SAndroid Build Coastguard Worker             {
6236*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("%u ", i);
6237*cfb92d14SAndroid Build Coastguard Worker             }
6238*cfb92d14SAndroid Build Coastguard Worker         }
6239*cfb92d14SAndroid Build Coastguard Worker 
6240*cfb92d14SAndroid Build Coastguard Worker         OutputNewLine();
6241*cfb92d14SAndroid Build Coastguard Worker         ExitNow();
6242*cfb92d14SAndroid Build Coastguard Worker     }
6243*cfb92d14SAndroid Build Coastguard Worker     /**
6244*cfb92d14SAndroid Build Coastguard Worker      * @cli router (id)
6245*cfb92d14SAndroid Build Coastguard Worker      * @code
6246*cfb92d14SAndroid Build Coastguard Worker      * router 50
6247*cfb92d14SAndroid Build Coastguard Worker      * Alloc: 1
6248*cfb92d14SAndroid Build Coastguard Worker      * Router ID: 50
6249*cfb92d14SAndroid Build Coastguard Worker      * Rloc: c800
6250*cfb92d14SAndroid Build Coastguard Worker      * Next Hop: c800
6251*cfb92d14SAndroid Build Coastguard Worker      * Link: 1
6252*cfb92d14SAndroid Build Coastguard Worker      * Ext Addr: e2b3540590b0fd87
6253*cfb92d14SAndroid Build Coastguard Worker      * Cost: 0
6254*cfb92d14SAndroid Build Coastguard Worker      * Link Quality In: 3
6255*cfb92d14SAndroid Build Coastguard Worker      * Link Quality Out: 3
6256*cfb92d14SAndroid Build Coastguard Worker      * Age: 3
6257*cfb92d14SAndroid Build Coastguard Worker      * Done
6258*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6259*cfb92d14SAndroid Build Coastguard Worker      * @code
6260*cfb92d14SAndroid Build Coastguard Worker      * router 0xc800
6261*cfb92d14SAndroid Build Coastguard Worker      * Alloc: 1
6262*cfb92d14SAndroid Build Coastguard Worker      * Router ID: 50
6263*cfb92d14SAndroid Build Coastguard Worker      * Rloc: c800
6264*cfb92d14SAndroid Build Coastguard Worker      * Next Hop: c800
6265*cfb92d14SAndroid Build Coastguard Worker      * Link: 1
6266*cfb92d14SAndroid Build Coastguard Worker      * Ext Addr: e2b3540590b0fd87
6267*cfb92d14SAndroid Build Coastguard Worker      * Cost: 0
6268*cfb92d14SAndroid Build Coastguard Worker      * Link Quality In: 3
6269*cfb92d14SAndroid Build Coastguard Worker      * Link Quality Out: 3
6270*cfb92d14SAndroid Build Coastguard Worker      * Age: 7
6271*cfb92d14SAndroid Build Coastguard Worker      * Done
6272*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6273*cfb92d14SAndroid Build Coastguard Worker      * @cparam router [@ca{id}]
6274*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
6275*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetRouterInfo
6276*cfb92d14SAndroid Build Coastguard Worker      * @par
6277*cfb92d14SAndroid Build Coastguard Worker      * Print diagnostic information for a Thread Router. The id may be a Router ID or
6278*cfb92d14SAndroid Build Coastguard Worker      * an RLOC16.
6279*cfb92d14SAndroid Build Coastguard Worker      */
6280*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = aArgs[0].ParseAsUint16(routerId));
6281*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = otThreadGetRouterInfo(GetInstancePtr(), routerId, &routerInfo));
6282*cfb92d14SAndroid Build Coastguard Worker 
6283*cfb92d14SAndroid Build Coastguard Worker     OutputLine("Alloc: %d", routerInfo.mAllocated);
6284*cfb92d14SAndroid Build Coastguard Worker 
6285*cfb92d14SAndroid Build Coastguard Worker     if (routerInfo.mAllocated)
6286*cfb92d14SAndroid Build Coastguard Worker     {
6287*cfb92d14SAndroid Build Coastguard Worker         OutputLine("Router ID: %u", routerInfo.mRouterId);
6288*cfb92d14SAndroid Build Coastguard Worker         OutputLine("Rloc: %04x", routerInfo.mRloc16);
6289*cfb92d14SAndroid Build Coastguard Worker         OutputLine("Next Hop: %04x", static_cast<uint16_t>(routerInfo.mNextHop) << 10);
6290*cfb92d14SAndroid Build Coastguard Worker         OutputLine("Link: %d", routerInfo.mLinkEstablished);
6291*cfb92d14SAndroid Build Coastguard Worker 
6292*cfb92d14SAndroid Build Coastguard Worker         if (routerInfo.mLinkEstablished)
6293*cfb92d14SAndroid Build Coastguard Worker         {
6294*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("Ext Addr: ");
6295*cfb92d14SAndroid Build Coastguard Worker             OutputExtAddressLine(routerInfo.mExtAddress);
6296*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Cost: %u", routerInfo.mPathCost);
6297*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Link Quality In: %u", routerInfo.mLinkQualityIn);
6298*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Link Quality Out: %u", routerInfo.mLinkQualityOut);
6299*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Age: %u", routerInfo.mAge);
6300*cfb92d14SAndroid Build Coastguard Worker         }
6301*cfb92d14SAndroid Build Coastguard Worker     }
6302*cfb92d14SAndroid Build Coastguard Worker 
6303*cfb92d14SAndroid Build Coastguard Worker exit:
6304*cfb92d14SAndroid Build Coastguard Worker     return error;
6305*cfb92d14SAndroid Build Coastguard Worker }
6306*cfb92d14SAndroid Build Coastguard Worker /**
6307*cfb92d14SAndroid Build Coastguard Worker  * @cli routerdowngradethreshold (get,set)
6308*cfb92d14SAndroid Build Coastguard Worker  * @code routerdowngradethreshold
6309*cfb92d14SAndroid Build Coastguard Worker  * 23
6310*cfb92d14SAndroid Build Coastguard Worker  * Done
6311*cfb92d14SAndroid Build Coastguard Worker  * @endcode
6312*cfb92d14SAndroid Build Coastguard Worker  * @code routerdowngradethreshold 23
6313*cfb92d14SAndroid Build Coastguard Worker  * Done
6314*cfb92d14SAndroid Build Coastguard Worker  * @endcode
6315*cfb92d14SAndroid Build Coastguard Worker  * @cparam routerdowngradethreshold [@ca{threshold}]
6316*cfb92d14SAndroid Build Coastguard Worker  * @par
6317*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets the ROUTER_DOWNGRADE_THRESHOLD value.
6318*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadGetRouterDowngradeThreshold
6319*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadSetRouterDowngradeThreshold
6320*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])6321*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("routerdowngradethreshold")>(Arg aArgs[])
6322*cfb92d14SAndroid Build Coastguard Worker {
6323*cfb92d14SAndroid Build Coastguard Worker     return ProcessGetSet(aArgs, otThreadGetRouterDowngradeThreshold, otThreadSetRouterDowngradeThreshold);
6324*cfb92d14SAndroid Build Coastguard Worker }
6325*cfb92d14SAndroid Build Coastguard Worker 
6326*cfb92d14SAndroid Build Coastguard Worker /**
6327*cfb92d14SAndroid Build Coastguard Worker  * @cli routereligible
6328*cfb92d14SAndroid Build Coastguard Worker  * @code
6329*cfb92d14SAndroid Build Coastguard Worker  * routereligible
6330*cfb92d14SAndroid Build Coastguard Worker  * Enabled
6331*cfb92d14SAndroid Build Coastguard Worker  * Done
6332*cfb92d14SAndroid Build Coastguard Worker  * @endcode
6333*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadIsRouterEligible
6334*cfb92d14SAndroid Build Coastguard Worker  * @par
6335*cfb92d14SAndroid Build Coastguard Worker  * Indicates whether the router role is enabled or disabled.
6336*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])6337*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("routereligible")>(Arg aArgs[])
6338*cfb92d14SAndroid Build Coastguard Worker {
6339*cfb92d14SAndroid Build Coastguard Worker     /**
6340*cfb92d14SAndroid Build Coastguard Worker      * @cli routereligible (enable,disable)
6341*cfb92d14SAndroid Build Coastguard Worker      * @code
6342*cfb92d14SAndroid Build Coastguard Worker      * routereligible enable
6343*cfb92d14SAndroid Build Coastguard Worker      * Done
6344*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6345*cfb92d14SAndroid Build Coastguard Worker      * @code
6346*cfb92d14SAndroid Build Coastguard Worker      * routereligible disable
6347*cfb92d14SAndroid Build Coastguard Worker      * Done
6348*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6349*cfb92d14SAndroid Build Coastguard Worker      * @cparam routereligible [@ca{enable|disable}]
6350*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadSetRouterEligible
6351*cfb92d14SAndroid Build Coastguard Worker      * @par
6352*cfb92d14SAndroid Build Coastguard Worker      * Enables or disables the router role.
6353*cfb92d14SAndroid Build Coastguard Worker      */
6354*cfb92d14SAndroid Build Coastguard Worker     return ProcessEnableDisable(aArgs, otThreadIsRouterEligible, otThreadSetRouterEligible);
6355*cfb92d14SAndroid Build Coastguard Worker }
6356*cfb92d14SAndroid Build Coastguard Worker 
6357*cfb92d14SAndroid Build Coastguard Worker /**
6358*cfb92d14SAndroid Build Coastguard Worker  * @cli routerselectionjitter
6359*cfb92d14SAndroid Build Coastguard Worker  * @code
6360*cfb92d14SAndroid Build Coastguard Worker  * routerselectionjitter
6361*cfb92d14SAndroid Build Coastguard Worker  * 120
6362*cfb92d14SAndroid Build Coastguard Worker  * Done
6363*cfb92d14SAndroid Build Coastguard Worker  * @endcode
6364*cfb92d14SAndroid Build Coastguard Worker  * @code
6365*cfb92d14SAndroid Build Coastguard Worker  * routerselectionjitter 120
6366*cfb92d14SAndroid Build Coastguard Worker  * Done
6367*cfb92d14SAndroid Build Coastguard Worker  * @endcode
6368*cfb92d14SAndroid Build Coastguard Worker  * @cparam routerselectionjitter [@ca{jitter}]
6369*cfb92d14SAndroid Build Coastguard Worker  * @par
6370*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets the ROUTER_SELECTION_JITTER value.
6371*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadGetRouterSelectionJitter
6372*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadSetRouterSelectionJitter
6373*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])6374*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("routerselectionjitter")>(Arg aArgs[])
6375*cfb92d14SAndroid Build Coastguard Worker {
6376*cfb92d14SAndroid Build Coastguard Worker     return ProcessGetSet(aArgs, otThreadGetRouterSelectionJitter, otThreadSetRouterSelectionJitter);
6377*cfb92d14SAndroid Build Coastguard Worker }
6378*cfb92d14SAndroid Build Coastguard Worker /**
6379*cfb92d14SAndroid Build Coastguard Worker  * @cli routerupgradethreshold (get,set)
6380*cfb92d14SAndroid Build Coastguard Worker  * @code
6381*cfb92d14SAndroid Build Coastguard Worker  * routerupgradethreshold
6382*cfb92d14SAndroid Build Coastguard Worker  * 16
6383*cfb92d14SAndroid Build Coastguard Worker  * Done
6384*cfb92d14SAndroid Build Coastguard Worker  * @endcode
6385*cfb92d14SAndroid Build Coastguard Worker  * @code
6386*cfb92d14SAndroid Build Coastguard Worker  * routerupgradethreshold 16
6387*cfb92d14SAndroid Build Coastguard Worker  * Done
6388*cfb92d14SAndroid Build Coastguard Worker  * @endcode
6389*cfb92d14SAndroid Build Coastguard Worker  * @cparam routerupgradethreshold [@ca{threshold}]
6390*cfb92d14SAndroid Build Coastguard Worker  * @par
6391*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets the ROUTER_UPGRADE_THRESHOLD value.
6392*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadGetRouterUpgradeThreshold
6393*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadSetRouterUpgradeThreshold
6394*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])6395*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("routerupgradethreshold")>(Arg aArgs[])
6396*cfb92d14SAndroid Build Coastguard Worker {
6397*cfb92d14SAndroid Build Coastguard Worker     return ProcessGetSet(aArgs, otThreadGetRouterUpgradeThreshold, otThreadSetRouterUpgradeThreshold);
6398*cfb92d14SAndroid Build Coastguard Worker }
6399*cfb92d14SAndroid Build Coastguard Worker /**
6400*cfb92d14SAndroid Build Coastguard Worker  * @cli childrouterlinks (get,set)
6401*cfb92d14SAndroid Build Coastguard Worker  * @code
6402*cfb92d14SAndroid Build Coastguard Worker  * childrouterlinks
6403*cfb92d14SAndroid Build Coastguard Worker  * 16
6404*cfb92d14SAndroid Build Coastguard Worker  * Done
6405*cfb92d14SAndroid Build Coastguard Worker  * @endcode
6406*cfb92d14SAndroid Build Coastguard Worker  * @code
6407*cfb92d14SAndroid Build Coastguard Worker  * childrouterlinks 16
6408*cfb92d14SAndroid Build Coastguard Worker  * Done
6409*cfb92d14SAndroid Build Coastguard Worker  * @endcode
6410*cfb92d14SAndroid Build Coastguard Worker  * @cparam childrouterlinks [@ca{links}]
6411*cfb92d14SAndroid Build Coastguard Worker  * @par
6412*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets the MLE_CHILD_ROUTER_LINKS value.
6413*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadGetChildRouterLinks
6414*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadSetChildRouterLinks
6415*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])6416*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("childrouterlinks")>(Arg aArgs[])
6417*cfb92d14SAndroid Build Coastguard Worker {
6418*cfb92d14SAndroid Build Coastguard Worker     return ProcessGetSet(aArgs, otThreadGetChildRouterLinks, otThreadSetChildRouterLinks);
6419*cfb92d14SAndroid Build Coastguard Worker }
6420*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_FTD
6421*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])6422*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("scan")>(Arg aArgs[])
6423*cfb92d14SAndroid Build Coastguard Worker {
6424*cfb92d14SAndroid Build Coastguard Worker     otError  error        = OT_ERROR_NONE;
6425*cfb92d14SAndroid Build Coastguard Worker     uint32_t scanChannels = 0;
6426*cfb92d14SAndroid Build Coastguard Worker     uint16_t scanDuration = 0;
6427*cfb92d14SAndroid Build Coastguard Worker     bool     energyScan   = false;
6428*cfb92d14SAndroid Build Coastguard Worker 
6429*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "energy")
6430*cfb92d14SAndroid Build Coastguard Worker     {
6431*cfb92d14SAndroid Build Coastguard Worker         energyScan = true;
6432*cfb92d14SAndroid Build Coastguard Worker         aArgs++;
6433*cfb92d14SAndroid Build Coastguard Worker 
6434*cfb92d14SAndroid Build Coastguard Worker         if (!aArgs->IsEmpty())
6435*cfb92d14SAndroid Build Coastguard Worker         {
6436*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = aArgs->ParseAsUint16(scanDuration));
6437*cfb92d14SAndroid Build Coastguard Worker             aArgs++;
6438*cfb92d14SAndroid Build Coastguard Worker         }
6439*cfb92d14SAndroid Build Coastguard Worker     }
6440*cfb92d14SAndroid Build Coastguard Worker 
6441*cfb92d14SAndroid Build Coastguard Worker     if (!aArgs->IsEmpty())
6442*cfb92d14SAndroid Build Coastguard Worker     {
6443*cfb92d14SAndroid Build Coastguard Worker         uint8_t channel;
6444*cfb92d14SAndroid Build Coastguard Worker 
6445*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs->ParseAsUint8(channel));
6446*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(channel < BitSizeOf(scanChannels), error = OT_ERROR_INVALID_ARGS);
6447*cfb92d14SAndroid Build Coastguard Worker         scanChannels = 1 << channel;
6448*cfb92d14SAndroid Build Coastguard Worker     }
6449*cfb92d14SAndroid Build Coastguard Worker 
6450*cfb92d14SAndroid Build Coastguard Worker     /**
6451*cfb92d14SAndroid Build Coastguard Worker      * @cli scan energy
6452*cfb92d14SAndroid Build Coastguard Worker      * @code
6453*cfb92d14SAndroid Build Coastguard Worker      * scan energy 10
6454*cfb92d14SAndroid Build Coastguard Worker      * | Ch | RSSI |
6455*cfb92d14SAndroid Build Coastguard Worker      * +----+------+
6456*cfb92d14SAndroid Build Coastguard Worker      * | 11 |  -59 |
6457*cfb92d14SAndroid Build Coastguard Worker      * | 12 |  -62 |
6458*cfb92d14SAndroid Build Coastguard Worker      * | 13 |  -67 |
6459*cfb92d14SAndroid Build Coastguard Worker      * | 14 |  -61 |
6460*cfb92d14SAndroid Build Coastguard Worker      * | 15 |  -87 |
6461*cfb92d14SAndroid Build Coastguard Worker      * | 16 |  -86 |
6462*cfb92d14SAndroid Build Coastguard Worker      * | 17 |  -86 |
6463*cfb92d14SAndroid Build Coastguard Worker      * | 18 |  -52 |
6464*cfb92d14SAndroid Build Coastguard Worker      * | 19 |  -58 |
6465*cfb92d14SAndroid Build Coastguard Worker      * | 20 |  -82 |
6466*cfb92d14SAndroid Build Coastguard Worker      * | 21 |  -76 |
6467*cfb92d14SAndroid Build Coastguard Worker      * | 22 |  -82 |
6468*cfb92d14SAndroid Build Coastguard Worker      * | 23 |  -74 |
6469*cfb92d14SAndroid Build Coastguard Worker      * | 24 |  -81 |
6470*cfb92d14SAndroid Build Coastguard Worker      * | 25 |  -88 |
6471*cfb92d14SAndroid Build Coastguard Worker      * | 26 |  -71 |
6472*cfb92d14SAndroid Build Coastguard Worker      * Done
6473*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6474*cfb92d14SAndroid Build Coastguard Worker      * @code
6475*cfb92d14SAndroid Build Coastguard Worker      * scan energy 10 20
6476*cfb92d14SAndroid Build Coastguard Worker      * | Ch | RSSI |
6477*cfb92d14SAndroid Build Coastguard Worker      * +----+------+
6478*cfb92d14SAndroid Build Coastguard Worker      * | 20 |  -82 |
6479*cfb92d14SAndroid Build Coastguard Worker      * Done
6480*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6481*cfb92d14SAndroid Build Coastguard Worker      * @cparam scan energy [@ca{duration}] [@ca{channel}]
6482*cfb92d14SAndroid Build Coastguard Worker      * @par
6483*cfb92d14SAndroid Build Coastguard Worker      * Performs an IEEE 802.15.4 energy scan, and displays the time in milliseconds
6484*cfb92d14SAndroid Build Coastguard Worker      * to use for scanning each channel. All channels are shown unless you specify a certain channel
6485*cfb92d14SAndroid Build Coastguard Worker      * by using the channel option.
6486*cfb92d14SAndroid Build Coastguard Worker      * @sa otLinkEnergyScan
6487*cfb92d14SAndroid Build Coastguard Worker      */
6488*cfb92d14SAndroid Build Coastguard Worker     if (energyScan)
6489*cfb92d14SAndroid Build Coastguard Worker     {
6490*cfb92d14SAndroid Build Coastguard Worker         static const char *const kEnergyScanTableTitles[]       = {"Ch", "RSSI"};
6491*cfb92d14SAndroid Build Coastguard Worker         static const uint8_t     kEnergyScanTableColumnWidths[] = {4, 6};
6492*cfb92d14SAndroid Build Coastguard Worker 
6493*cfb92d14SAndroid Build Coastguard Worker         OutputTableHeader(kEnergyScanTableTitles, kEnergyScanTableColumnWidths);
6494*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otLinkEnergyScan(GetInstancePtr(), scanChannels, scanDuration,
6495*cfb92d14SAndroid Build Coastguard Worker                                                &Interpreter::HandleEnergyScanResult, this));
6496*cfb92d14SAndroid Build Coastguard Worker     }
6497*cfb92d14SAndroid Build Coastguard Worker     /**
6498*cfb92d14SAndroid Build Coastguard Worker      * @cli scan
6499*cfb92d14SAndroid Build Coastguard Worker      * @code
6500*cfb92d14SAndroid Build Coastguard Worker      * scan
6501*cfb92d14SAndroid Build Coastguard Worker      * | PAN  | MAC Address      | Ch | dBm | LQI |
6502*cfb92d14SAndroid Build Coastguard Worker      * +------+------------------+----+-----+-----+
6503*cfb92d14SAndroid Build Coastguard Worker      * | ffff | f1d92a82c8d8fe43 | 11 | -20 |   0 |
6504*cfb92d14SAndroid Build Coastguard Worker      * Done
6505*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6506*cfb92d14SAndroid Build Coastguard Worker      * @cparam scan [@ca{channel}]
6507*cfb92d14SAndroid Build Coastguard Worker      * @par
6508*cfb92d14SAndroid Build Coastguard Worker      * Performs an active IEEE 802.15.4 scan. The scan covers all channels if no channel is specified; otherwise the
6509*cfb92d14SAndroid Build Coastguard Worker      * span covers only the channel specified.
6510*cfb92d14SAndroid Build Coastguard Worker      * @sa otLinkActiveScan
6511*cfb92d14SAndroid Build Coastguard Worker      */
6512*cfb92d14SAndroid Build Coastguard Worker     else
6513*cfb92d14SAndroid Build Coastguard Worker     {
6514*cfb92d14SAndroid Build Coastguard Worker         static const char *const kScanTableTitles[]       = {"PAN", "MAC Address", "Ch", "dBm", "LQI"};
6515*cfb92d14SAndroid Build Coastguard Worker         static const uint8_t     kScanTableColumnWidths[] = {6, 18, 4, 5, 5};
6516*cfb92d14SAndroid Build Coastguard Worker 
6517*cfb92d14SAndroid Build Coastguard Worker         OutputTableHeader(kScanTableTitles, kScanTableColumnWidths);
6518*cfb92d14SAndroid Build Coastguard Worker 
6519*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otLinkActiveScan(GetInstancePtr(), scanChannels, scanDuration,
6520*cfb92d14SAndroid Build Coastguard Worker                                                &Interpreter::HandleActiveScanResult, this));
6521*cfb92d14SAndroid Build Coastguard Worker     }
6522*cfb92d14SAndroid Build Coastguard Worker 
6523*cfb92d14SAndroid Build Coastguard Worker     error = OT_ERROR_PENDING;
6524*cfb92d14SAndroid Build Coastguard Worker 
6525*cfb92d14SAndroid Build Coastguard Worker exit:
6526*cfb92d14SAndroid Build Coastguard Worker     return error;
6527*cfb92d14SAndroid Build Coastguard Worker }
6528*cfb92d14SAndroid Build Coastguard Worker 
HandleActiveScanResult(otActiveScanResult * aResult,void * aContext)6529*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleActiveScanResult(otActiveScanResult *aResult, void *aContext)
6530*cfb92d14SAndroid Build Coastguard Worker {
6531*cfb92d14SAndroid Build Coastguard Worker     static_cast<Interpreter *>(aContext)->HandleActiveScanResult(aResult);
6532*cfb92d14SAndroid Build Coastguard Worker }
6533*cfb92d14SAndroid Build Coastguard Worker 
HandleActiveScanResult(otActiveScanResult * aResult)6534*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleActiveScanResult(otActiveScanResult *aResult)
6535*cfb92d14SAndroid Build Coastguard Worker {
6536*cfb92d14SAndroid Build Coastguard Worker     if (aResult == nullptr)
6537*cfb92d14SAndroid Build Coastguard Worker     {
6538*cfb92d14SAndroid Build Coastguard Worker         OutputResult(OT_ERROR_NONE);
6539*cfb92d14SAndroid Build Coastguard Worker         ExitNow();
6540*cfb92d14SAndroid Build Coastguard Worker     }
6541*cfb92d14SAndroid Build Coastguard Worker 
6542*cfb92d14SAndroid Build Coastguard Worker     if (aResult->mDiscover)
6543*cfb92d14SAndroid Build Coastguard Worker     {
6544*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("| %-16s ", aResult->mNetworkName.m8);
6545*cfb92d14SAndroid Build Coastguard Worker 
6546*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("| ");
6547*cfb92d14SAndroid Build Coastguard Worker         OutputBytes(aResult->mExtendedPanId.m8);
6548*cfb92d14SAndroid Build Coastguard Worker         OutputFormat(" ");
6549*cfb92d14SAndroid Build Coastguard Worker     }
6550*cfb92d14SAndroid Build Coastguard Worker 
6551*cfb92d14SAndroid Build Coastguard Worker     OutputFormat("| %04x | ", aResult->mPanId);
6552*cfb92d14SAndroid Build Coastguard Worker     OutputExtAddress(aResult->mExtAddress);
6553*cfb92d14SAndroid Build Coastguard Worker     OutputFormat(" | %2u ", aResult->mChannel);
6554*cfb92d14SAndroid Build Coastguard Worker     OutputFormat("| %3d ", aResult->mRssi);
6555*cfb92d14SAndroid Build Coastguard Worker     OutputLine("| %3u |", aResult->mLqi);
6556*cfb92d14SAndroid Build Coastguard Worker 
6557*cfb92d14SAndroid Build Coastguard Worker exit:
6558*cfb92d14SAndroid Build Coastguard Worker     return;
6559*cfb92d14SAndroid Build Coastguard Worker }
6560*cfb92d14SAndroid Build Coastguard Worker 
HandleEnergyScanResult(otEnergyScanResult * aResult,void * aContext)6561*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleEnergyScanResult(otEnergyScanResult *aResult, void *aContext)
6562*cfb92d14SAndroid Build Coastguard Worker {
6563*cfb92d14SAndroid Build Coastguard Worker     static_cast<Interpreter *>(aContext)->HandleEnergyScanResult(aResult);
6564*cfb92d14SAndroid Build Coastguard Worker }
6565*cfb92d14SAndroid Build Coastguard Worker 
HandleEnergyScanResult(otEnergyScanResult * aResult)6566*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleEnergyScanResult(otEnergyScanResult *aResult)
6567*cfb92d14SAndroid Build Coastguard Worker {
6568*cfb92d14SAndroid Build Coastguard Worker     if (aResult == nullptr)
6569*cfb92d14SAndroid Build Coastguard Worker     {
6570*cfb92d14SAndroid Build Coastguard Worker         OutputResult(OT_ERROR_NONE);
6571*cfb92d14SAndroid Build Coastguard Worker         ExitNow();
6572*cfb92d14SAndroid Build Coastguard Worker     }
6573*cfb92d14SAndroid Build Coastguard Worker 
6574*cfb92d14SAndroid Build Coastguard Worker     OutputLine("| %2u | %4d |", aResult->mChannel, aResult->mMaxRssi);
6575*cfb92d14SAndroid Build Coastguard Worker 
6576*cfb92d14SAndroid Build Coastguard Worker exit:
6577*cfb92d14SAndroid Build Coastguard Worker     return;
6578*cfb92d14SAndroid Build Coastguard Worker }
6579*cfb92d14SAndroid Build Coastguard Worker 
6580*cfb92d14SAndroid Build Coastguard Worker /**
6581*cfb92d14SAndroid Build Coastguard Worker  * @cli singleton
6582*cfb92d14SAndroid Build Coastguard Worker  * @code
6583*cfb92d14SAndroid Build Coastguard Worker  * singleton
6584*cfb92d14SAndroid Build Coastguard Worker  * true
6585*cfb92d14SAndroid Build Coastguard Worker  * Done
6586*cfb92d14SAndroid Build Coastguard Worker  * @endcode
6587*cfb92d14SAndroid Build Coastguard Worker  * @par
6588*cfb92d14SAndroid Build Coastguard Worker  * Indicates whether a node is the only router on the network.
6589*cfb92d14SAndroid Build Coastguard Worker  * Returns either `true` or `false`.
6590*cfb92d14SAndroid Build Coastguard Worker  * @sa otThreadIsSingleton
6591*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])6592*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("singleton")>(Arg aArgs[])
6593*cfb92d14SAndroid Build Coastguard Worker {
6594*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aArgs);
6595*cfb92d14SAndroid Build Coastguard Worker 
6596*cfb92d14SAndroid Build Coastguard Worker     OutputLine(otThreadIsSingleton(GetInstancePtr()) ? "true" : "false");
6597*cfb92d14SAndroid Build Coastguard Worker 
6598*cfb92d14SAndroid Build Coastguard Worker     return OT_ERROR_NONE;
6599*cfb92d14SAndroid Build Coastguard Worker }
6600*cfb92d14SAndroid Build Coastguard Worker 
6601*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_SNTP_CLIENT_ENABLE
Process(Arg aArgs[])6602*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("sntp")>(Arg aArgs[])
6603*cfb92d14SAndroid Build Coastguard Worker {
6604*cfb92d14SAndroid Build Coastguard Worker     otError          error = OT_ERROR_NONE;
6605*cfb92d14SAndroid Build Coastguard Worker     uint16_t         port  = OT_SNTP_DEFAULT_SERVER_PORT;
6606*cfb92d14SAndroid Build Coastguard Worker     Ip6::MessageInfo messageInfo;
6607*cfb92d14SAndroid Build Coastguard Worker     otSntpQuery      query;
6608*cfb92d14SAndroid Build Coastguard Worker 
6609*cfb92d14SAndroid Build Coastguard Worker     /**
6610*cfb92d14SAndroid Build Coastguard Worker      * @cli sntp query
6611*cfb92d14SAndroid Build Coastguard Worker      * @code
6612*cfb92d14SAndroid Build Coastguard Worker      * sntp query
6613*cfb92d14SAndroid Build Coastguard Worker      * SNTP response - Unix time: 1540894725 (era: 0)
6614*cfb92d14SAndroid Build Coastguard Worker      * Done
6615*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6616*cfb92d14SAndroid Build Coastguard Worker      * @code
6617*cfb92d14SAndroid Build Coastguard Worker      * sntp query 64:ff9b::d8ef:2308
6618*cfb92d14SAndroid Build Coastguard Worker      * SNTP response - Unix time: 1540898611 (era: 0)
6619*cfb92d14SAndroid Build Coastguard Worker      * Done
6620*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6621*cfb92d14SAndroid Build Coastguard Worker      * @cparam sntp query [@ca{SNTP server IP}] [@ca{SNTP server port}]
6622*cfb92d14SAndroid Build Coastguard Worker      * @par
6623*cfb92d14SAndroid Build Coastguard Worker      * Sends an SNTP query to obtain the current unix epoch time (from January 1, 1970).
6624*cfb92d14SAndroid Build Coastguard Worker      * - SNTP server default IP address: `2001:4860:4806:8::` (Google IPv6 NTP Server)
6625*cfb92d14SAndroid Build Coastguard Worker      * - SNTP server default port: `123`
6626*cfb92d14SAndroid Build Coastguard Worker      * @note This command is available only if OPENTHREAD_CONFIG_SNTP_CLIENT_ENABLE is enabled.
6627*cfb92d14SAndroid Build Coastguard Worker      * @sa #otSntpClientQuery
6628*cfb92d14SAndroid Build Coastguard Worker      */
6629*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "query")
6630*cfb92d14SAndroid Build Coastguard Worker     {
6631*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(!mSntpQueryingInProgress, error = OT_ERROR_BUSY);
6632*cfb92d14SAndroid Build Coastguard Worker 
6633*cfb92d14SAndroid Build Coastguard Worker         if (!aArgs[1].IsEmpty())
6634*cfb92d14SAndroid Build Coastguard Worker         {
6635*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = aArgs[1].ParseAsIp6Address(messageInfo.GetPeerAddr()));
6636*cfb92d14SAndroid Build Coastguard Worker         }
6637*cfb92d14SAndroid Build Coastguard Worker         else
6638*cfb92d14SAndroid Build Coastguard Worker         {
6639*cfb92d14SAndroid Build Coastguard Worker             // Use IPv6 address of default SNTP server.
6640*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = messageInfo.GetPeerAddr().FromString(OT_SNTP_DEFAULT_SERVER_IP));
6641*cfb92d14SAndroid Build Coastguard Worker         }
6642*cfb92d14SAndroid Build Coastguard Worker 
6643*cfb92d14SAndroid Build Coastguard Worker         if (!aArgs[2].IsEmpty())
6644*cfb92d14SAndroid Build Coastguard Worker         {
6645*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = aArgs[2].ParseAsUint16(port));
6646*cfb92d14SAndroid Build Coastguard Worker         }
6647*cfb92d14SAndroid Build Coastguard Worker 
6648*cfb92d14SAndroid Build Coastguard Worker         messageInfo.SetPeerPort(port);
6649*cfb92d14SAndroid Build Coastguard Worker 
6650*cfb92d14SAndroid Build Coastguard Worker         query.mMessageInfo = static_cast<const otMessageInfo *>(&messageInfo);
6651*cfb92d14SAndroid Build Coastguard Worker 
6652*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otSntpClientQuery(GetInstancePtr(), &query, &Interpreter::HandleSntpResponse, this));
6653*cfb92d14SAndroid Build Coastguard Worker 
6654*cfb92d14SAndroid Build Coastguard Worker         mSntpQueryingInProgress = true;
6655*cfb92d14SAndroid Build Coastguard Worker         error                   = OT_ERROR_PENDING;
6656*cfb92d14SAndroid Build Coastguard Worker     }
6657*cfb92d14SAndroid Build Coastguard Worker     else
6658*cfb92d14SAndroid Build Coastguard Worker     {
6659*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_COMMAND;
6660*cfb92d14SAndroid Build Coastguard Worker     }
6661*cfb92d14SAndroid Build Coastguard Worker 
6662*cfb92d14SAndroid Build Coastguard Worker exit:
6663*cfb92d14SAndroid Build Coastguard Worker     return error;
6664*cfb92d14SAndroid Build Coastguard Worker }
6665*cfb92d14SAndroid Build Coastguard Worker 
HandleSntpResponse(void * aContext,uint64_t aTime,otError aResult)6666*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleSntpResponse(void *aContext, uint64_t aTime, otError aResult)
6667*cfb92d14SAndroid Build Coastguard Worker {
6668*cfb92d14SAndroid Build Coastguard Worker     static_cast<Interpreter *>(aContext)->HandleSntpResponse(aTime, aResult);
6669*cfb92d14SAndroid Build Coastguard Worker }
6670*cfb92d14SAndroid Build Coastguard Worker 
HandleSntpResponse(uint64_t aTime,otError aResult)6671*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleSntpResponse(uint64_t aTime, otError aResult)
6672*cfb92d14SAndroid Build Coastguard Worker {
6673*cfb92d14SAndroid Build Coastguard Worker     if (aResult == OT_ERROR_NONE)
6674*cfb92d14SAndroid Build Coastguard Worker     {
6675*cfb92d14SAndroid Build Coastguard Worker         // Some Embedded C libraries do not support printing of 64-bit unsigned integers.
6676*cfb92d14SAndroid Build Coastguard Worker         // To simplify, unix epoch time and era number are printed separately.
6677*cfb92d14SAndroid Build Coastguard Worker         OutputLine("SNTP response - Unix time: %lu (era: %lu)", ToUlong(static_cast<uint32_t>(aTime)),
6678*cfb92d14SAndroid Build Coastguard Worker                    ToUlong(static_cast<uint32_t>(aTime >> 32)));
6679*cfb92d14SAndroid Build Coastguard Worker     }
6680*cfb92d14SAndroid Build Coastguard Worker     else
6681*cfb92d14SAndroid Build Coastguard Worker     {
6682*cfb92d14SAndroid Build Coastguard Worker         OutputLine("SNTP error - %s", otThreadErrorToString(aResult));
6683*cfb92d14SAndroid Build Coastguard Worker     }
6684*cfb92d14SAndroid Build Coastguard Worker 
6685*cfb92d14SAndroid Build Coastguard Worker     mSntpQueryingInProgress = false;
6686*cfb92d14SAndroid Build Coastguard Worker 
6687*cfb92d14SAndroid Build Coastguard Worker     OutputResult(OT_ERROR_NONE);
6688*cfb92d14SAndroid Build Coastguard Worker }
6689*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_SNTP_CLIENT_ENABLE
6690*cfb92d14SAndroid Build Coastguard Worker 
6691*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_SRP_CLIENT_ENABLE || OPENTHREAD_CONFIG_SRP_SERVER_ENABLE
Process(Arg aArgs[])6692*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("srp")>(Arg aArgs[])
6693*cfb92d14SAndroid Build Coastguard Worker {
6694*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
6695*cfb92d14SAndroid Build Coastguard Worker 
6696*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
6697*cfb92d14SAndroid Build Coastguard Worker     {
6698*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_SRP_CLIENT_ENABLE
6699*cfb92d14SAndroid Build Coastguard Worker         OutputLine("client");
6700*cfb92d14SAndroid Build Coastguard Worker #endif
6701*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_SRP_SERVER_ENABLE
6702*cfb92d14SAndroid Build Coastguard Worker         OutputLine("server");
6703*cfb92d14SAndroid Build Coastguard Worker #endif
6704*cfb92d14SAndroid Build Coastguard Worker         ExitNow();
6705*cfb92d14SAndroid Build Coastguard Worker     }
6706*cfb92d14SAndroid Build Coastguard Worker 
6707*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_SRP_CLIENT_ENABLE
6708*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "client")
6709*cfb92d14SAndroid Build Coastguard Worker     {
6710*cfb92d14SAndroid Build Coastguard Worker         ExitNow(error = mSrpClient.Process(aArgs + 1));
6711*cfb92d14SAndroid Build Coastguard Worker     }
6712*cfb92d14SAndroid Build Coastguard Worker #endif
6713*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_SRP_SERVER_ENABLE
6714*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "server")
6715*cfb92d14SAndroid Build Coastguard Worker     {
6716*cfb92d14SAndroid Build Coastguard Worker         ExitNow(error = mSrpServer.Process(aArgs + 1));
6717*cfb92d14SAndroid Build Coastguard Worker     }
6718*cfb92d14SAndroid Build Coastguard Worker #endif
6719*cfb92d14SAndroid Build Coastguard Worker 
6720*cfb92d14SAndroid Build Coastguard Worker     error = OT_ERROR_INVALID_COMMAND;
6721*cfb92d14SAndroid Build Coastguard Worker 
6722*cfb92d14SAndroid Build Coastguard Worker exit:
6723*cfb92d14SAndroid Build Coastguard Worker     return error;
6724*cfb92d14SAndroid Build Coastguard Worker }
6725*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_SRP_CLIENT_ENABLE || OPENTHREAD_CONFIG_SRP_SERVER_ENABLE
6726*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])6727*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("state")>(Arg aArgs[])
6728*cfb92d14SAndroid Build Coastguard Worker {
6729*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
6730*cfb92d14SAndroid Build Coastguard Worker 
6731*cfb92d14SAndroid Build Coastguard Worker     /**
6732*cfb92d14SAndroid Build Coastguard Worker      * @cli state
6733*cfb92d14SAndroid Build Coastguard Worker      * @code
6734*cfb92d14SAndroid Build Coastguard Worker      * state
6735*cfb92d14SAndroid Build Coastguard Worker      * child
6736*cfb92d14SAndroid Build Coastguard Worker      * Done
6737*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6738*cfb92d14SAndroid Build Coastguard Worker      * @code
6739*cfb92d14SAndroid Build Coastguard Worker      * state leader
6740*cfb92d14SAndroid Build Coastguard Worker      * Done
6741*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6742*cfb92d14SAndroid Build Coastguard Worker      * @cparam state [@ca{child}|@ca{router}|@ca{leader}|@ca{detached}]
6743*cfb92d14SAndroid Build Coastguard Worker      * @par
6744*cfb92d14SAndroid Build Coastguard Worker      * Returns the current role of the Thread device, or changes the role as specified with one of the options.
6745*cfb92d14SAndroid Build Coastguard Worker      * Possible values returned when inquiring about the device role:
6746*cfb92d14SAndroid Build Coastguard Worker      * - `child`: The device is currently operating as a Thread child.
6747*cfb92d14SAndroid Build Coastguard Worker      * - `router`: The device is currently operating as a Thread router.
6748*cfb92d14SAndroid Build Coastguard Worker      * - `leader`: The device is currently operating as a Thread leader.
6749*cfb92d14SAndroid Build Coastguard Worker      * - `detached`: The device is not currently participating in a Thread network/partition.
6750*cfb92d14SAndroid Build Coastguard Worker      * - `disabled`: The Thread stack is currently disabled.
6751*cfb92d14SAndroid Build Coastguard Worker      * @par
6752*cfb92d14SAndroid Build Coastguard Worker      * Using one of the options allows you to change the current role of a device, with the exclusion of
6753*cfb92d14SAndroid Build Coastguard Worker      * changing to or from a `disabled` state.
6754*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadGetDeviceRole
6755*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadBecomeChild
6756*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadBecomeRouter
6757*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadBecomeLeader
6758*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadBecomeDetached
6759*cfb92d14SAndroid Build Coastguard Worker      */
6760*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
6761*cfb92d14SAndroid Build Coastguard Worker     {
6762*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%s", otThreadDeviceRoleToString(otThreadGetDeviceRole(GetInstancePtr())));
6763*cfb92d14SAndroid Build Coastguard Worker     }
6764*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "detached")
6765*cfb92d14SAndroid Build Coastguard Worker     {
6766*cfb92d14SAndroid Build Coastguard Worker         error = otThreadBecomeDetached(GetInstancePtr());
6767*cfb92d14SAndroid Build Coastguard Worker     }
6768*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "child")
6769*cfb92d14SAndroid Build Coastguard Worker     {
6770*cfb92d14SAndroid Build Coastguard Worker         error = otThreadBecomeChild(GetInstancePtr());
6771*cfb92d14SAndroid Build Coastguard Worker     }
6772*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
6773*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "router")
6774*cfb92d14SAndroid Build Coastguard Worker     {
6775*cfb92d14SAndroid Build Coastguard Worker         error = otThreadBecomeRouter(GetInstancePtr());
6776*cfb92d14SAndroid Build Coastguard Worker     }
6777*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "leader")
6778*cfb92d14SAndroid Build Coastguard Worker     {
6779*cfb92d14SAndroid Build Coastguard Worker         error = otThreadBecomeLeader(GetInstancePtr());
6780*cfb92d14SAndroid Build Coastguard Worker     }
6781*cfb92d14SAndroid Build Coastguard Worker #endif
6782*cfb92d14SAndroid Build Coastguard Worker     else
6783*cfb92d14SAndroid Build Coastguard Worker     {
6784*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
6785*cfb92d14SAndroid Build Coastguard Worker     }
6786*cfb92d14SAndroid Build Coastguard Worker 
6787*cfb92d14SAndroid Build Coastguard Worker     return error;
6788*cfb92d14SAndroid Build Coastguard Worker }
6789*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])6790*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("thread")>(Arg aArgs[])
6791*cfb92d14SAndroid Build Coastguard Worker {
6792*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
6793*cfb92d14SAndroid Build Coastguard Worker 
6794*cfb92d14SAndroid Build Coastguard Worker     /**
6795*cfb92d14SAndroid Build Coastguard Worker      * @cli thread start
6796*cfb92d14SAndroid Build Coastguard Worker      * @code
6797*cfb92d14SAndroid Build Coastguard Worker      * thread start
6798*cfb92d14SAndroid Build Coastguard Worker      * Done
6799*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6800*cfb92d14SAndroid Build Coastguard Worker      * @par
6801*cfb92d14SAndroid Build Coastguard Worker      * Starts the Thread protocol operation.
6802*cfb92d14SAndroid Build Coastguard Worker      * @note The interface must be up when running this command.
6803*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadSetEnabled
6804*cfb92d14SAndroid Build Coastguard Worker      */
6805*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "start")
6806*cfb92d14SAndroid Build Coastguard Worker     {
6807*cfb92d14SAndroid Build Coastguard Worker         error = otThreadSetEnabled(GetInstancePtr(), true);
6808*cfb92d14SAndroid Build Coastguard Worker     }
6809*cfb92d14SAndroid Build Coastguard Worker     /**
6810*cfb92d14SAndroid Build Coastguard Worker      * @cli thread stop
6811*cfb92d14SAndroid Build Coastguard Worker      * @code
6812*cfb92d14SAndroid Build Coastguard Worker      * thread stop
6813*cfb92d14SAndroid Build Coastguard Worker      * Done
6814*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6815*cfb92d14SAndroid Build Coastguard Worker      * @par
6816*cfb92d14SAndroid Build Coastguard Worker      * Stops the Thread protocol operation.
6817*cfb92d14SAndroid Build Coastguard Worker      */
6818*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "stop")
6819*cfb92d14SAndroid Build Coastguard Worker     {
6820*cfb92d14SAndroid Build Coastguard Worker         error = otThreadSetEnabled(GetInstancePtr(), false);
6821*cfb92d14SAndroid Build Coastguard Worker     }
6822*cfb92d14SAndroid Build Coastguard Worker     /**
6823*cfb92d14SAndroid Build Coastguard Worker      * @cli thread version
6824*cfb92d14SAndroid Build Coastguard Worker      * @code thread version
6825*cfb92d14SAndroid Build Coastguard Worker      * 2
6826*cfb92d14SAndroid Build Coastguard Worker      * Done
6827*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6828*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
6829*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetVersion
6830*cfb92d14SAndroid Build Coastguard Worker      */
6831*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "version")
6832*cfb92d14SAndroid Build Coastguard Worker     {
6833*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%u", otThreadGetVersion());
6834*cfb92d14SAndroid Build Coastguard Worker     }
6835*cfb92d14SAndroid Build Coastguard Worker     else
6836*cfb92d14SAndroid Build Coastguard Worker     {
6837*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_COMMAND;
6838*cfb92d14SAndroid Build Coastguard Worker     }
6839*cfb92d14SAndroid Build Coastguard Worker 
6840*cfb92d14SAndroid Build Coastguard Worker     return error;
6841*cfb92d14SAndroid Build Coastguard Worker }
6842*cfb92d14SAndroid Build Coastguard Worker 
6843*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_TX_QUEUE_STATISTICS_ENABLE
Process(Arg aArgs[])6844*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("timeinqueue")>(Arg aArgs[])
6845*cfb92d14SAndroid Build Coastguard Worker {
6846*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
6847*cfb92d14SAndroid Build Coastguard Worker 
6848*cfb92d14SAndroid Build Coastguard Worker     /**
6849*cfb92d14SAndroid Build Coastguard Worker      * @cli timeinqueue
6850*cfb92d14SAndroid Build Coastguard Worker      * @code
6851*cfb92d14SAndroid Build Coastguard Worker      * timeinqueue
6852*cfb92d14SAndroid Build Coastguard Worker      * | Min  | Max  |Msg Count|
6853*cfb92d14SAndroid Build Coastguard Worker      * +------+------+---------+
6854*cfb92d14SAndroid Build Coastguard Worker      * |    0 |    9 |    1537 |
6855*cfb92d14SAndroid Build Coastguard Worker      * |   10 |   19 |     156 |
6856*cfb92d14SAndroid Build Coastguard Worker      * |   20 |   29 |      57 |
6857*cfb92d14SAndroid Build Coastguard Worker      * |   30 |   39 |     108 |
6858*cfb92d14SAndroid Build Coastguard Worker      * |   40 |   49 |      60 |
6859*cfb92d14SAndroid Build Coastguard Worker      * |   50 |   59 |      76 |
6860*cfb92d14SAndroid Build Coastguard Worker      * |   60 |   69 |      88 |
6861*cfb92d14SAndroid Build Coastguard Worker      * |   70 |   79 |      51 |
6862*cfb92d14SAndroid Build Coastguard Worker      * |   80 |   89 |      86 |
6863*cfb92d14SAndroid Build Coastguard Worker      * |   90 |   99 |      45 |
6864*cfb92d14SAndroid Build Coastguard Worker      * |  100 |  109 |      43 |
6865*cfb92d14SAndroid Build Coastguard Worker      * |  110 |  119 |      44 |
6866*cfb92d14SAndroid Build Coastguard Worker      * |  120 |  129 |      38 |
6867*cfb92d14SAndroid Build Coastguard Worker      * |  130 |  139 |      44 |
6868*cfb92d14SAndroid Build Coastguard Worker      * |  140 |  149 |      35 |
6869*cfb92d14SAndroid Build Coastguard Worker      * |  150 |  159 |      41 |
6870*cfb92d14SAndroid Build Coastguard Worker      * |  160 |  169 |      34 |
6871*cfb92d14SAndroid Build Coastguard Worker      * |  170 |  179 |      13 |
6872*cfb92d14SAndroid Build Coastguard Worker      * |  180 |  189 |      24 |
6873*cfb92d14SAndroid Build Coastguard Worker      * |  190 |  199 |       3 |
6874*cfb92d14SAndroid Build Coastguard Worker      * |  200 |  209 |       0 |
6875*cfb92d14SAndroid Build Coastguard Worker      * |  210 |  219 |       0 |
6876*cfb92d14SAndroid Build Coastguard Worker      * |  220 |  229 |       2 |
6877*cfb92d14SAndroid Build Coastguard Worker      * |  230 |  239 |       0 |
6878*cfb92d14SAndroid Build Coastguard Worker      * |  240 |  249 |       0 |
6879*cfb92d14SAndroid Build Coastguard Worker      * |  250 |  259 |       0 |
6880*cfb92d14SAndroid Build Coastguard Worker      * |  260 |  269 |       0 |
6881*cfb92d14SAndroid Build Coastguard Worker      * |  270 |  279 |       0 |
6882*cfb92d14SAndroid Build Coastguard Worker      * |  280 |  289 |       0 |
6883*cfb92d14SAndroid Build Coastguard Worker      * |  290 |  299 |       1 |
6884*cfb92d14SAndroid Build Coastguard Worker      * |  300 |  309 |       0 |
6885*cfb92d14SAndroid Build Coastguard Worker      * |  310 |  319 |       0 |
6886*cfb92d14SAndroid Build Coastguard Worker      * |  320 |  329 |       0 |
6887*cfb92d14SAndroid Build Coastguard Worker      * |  330 |  339 |       0 |
6888*cfb92d14SAndroid Build Coastguard Worker      * |  340 |  349 |       0 |
6889*cfb92d14SAndroid Build Coastguard Worker      * |  350 |  359 |       0 |
6890*cfb92d14SAndroid Build Coastguard Worker      * |  360 |  369 |       0 |
6891*cfb92d14SAndroid Build Coastguard Worker      * |  370 |  379 |       0 |
6892*cfb92d14SAndroid Build Coastguard Worker      * |  380 |  389 |       0 |
6893*cfb92d14SAndroid Build Coastguard Worker      * |  390 |  399 |       0 |
6894*cfb92d14SAndroid Build Coastguard Worker      * |  400 |  409 |       0 |
6895*cfb92d14SAndroid Build Coastguard Worker      * |  410 |  419 |       0 |
6896*cfb92d14SAndroid Build Coastguard Worker      * |  420 |  429 |       0 |
6897*cfb92d14SAndroid Build Coastguard Worker      * |  430 |  439 |       0 |
6898*cfb92d14SAndroid Build Coastguard Worker      * |  440 |  449 |       0 |
6899*cfb92d14SAndroid Build Coastguard Worker      * |  450 |  459 |       0 |
6900*cfb92d14SAndroid Build Coastguard Worker      * |  460 |  469 |       0 |
6901*cfb92d14SAndroid Build Coastguard Worker      * |  470 |  479 |       0 |
6902*cfb92d14SAndroid Build Coastguard Worker      * |  480 |  489 |       0 |
6903*cfb92d14SAndroid Build Coastguard Worker      * |  490 |  inf |       0 |
6904*cfb92d14SAndroid Build Coastguard Worker      * Done
6905*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6906*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
6907*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetTimeInQueueHistogram
6908*cfb92d14SAndroid Build Coastguard Worker      * @csa{timeinqueue reset}
6909*cfb92d14SAndroid Build Coastguard Worker      */
6910*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
6911*cfb92d14SAndroid Build Coastguard Worker     {
6912*cfb92d14SAndroid Build Coastguard Worker         static const char *const kTimeInQueueTableTitles[]       = {"Min", "Max", "Msg Count"};
6913*cfb92d14SAndroid Build Coastguard Worker         static const uint8_t     kTimeInQueueTableColumnWidths[] = {6, 6, 9};
6914*cfb92d14SAndroid Build Coastguard Worker 
6915*cfb92d14SAndroid Build Coastguard Worker         uint16_t        numBins;
6916*cfb92d14SAndroid Build Coastguard Worker         uint32_t        binInterval;
6917*cfb92d14SAndroid Build Coastguard Worker         const uint32_t *histogram;
6918*cfb92d14SAndroid Build Coastguard Worker 
6919*cfb92d14SAndroid Build Coastguard Worker         OutputTableHeader(kTimeInQueueTableTitles, kTimeInQueueTableColumnWidths);
6920*cfb92d14SAndroid Build Coastguard Worker 
6921*cfb92d14SAndroid Build Coastguard Worker         histogram = otThreadGetTimeInQueueHistogram(GetInstancePtr(), &numBins, &binInterval);
6922*cfb92d14SAndroid Build Coastguard Worker 
6923*cfb92d14SAndroid Build Coastguard Worker         for (uint16_t index = 0; index < numBins; index++)
6924*cfb92d14SAndroid Build Coastguard Worker         {
6925*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("| %4lu | ", ToUlong(index * binInterval));
6926*cfb92d14SAndroid Build Coastguard Worker 
6927*cfb92d14SAndroid Build Coastguard Worker             if (index < numBins - 1)
6928*cfb92d14SAndroid Build Coastguard Worker             {
6929*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("%4lu", ToUlong((index + 1) * binInterval - 1));
6930*cfb92d14SAndroid Build Coastguard Worker             }
6931*cfb92d14SAndroid Build Coastguard Worker             else
6932*cfb92d14SAndroid Build Coastguard Worker             {
6933*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("%4s", "inf");
6934*cfb92d14SAndroid Build Coastguard Worker             }
6935*cfb92d14SAndroid Build Coastguard Worker 
6936*cfb92d14SAndroid Build Coastguard Worker             OutputLine(" | %7lu |", ToUlong(histogram[index]));
6937*cfb92d14SAndroid Build Coastguard Worker         }
6938*cfb92d14SAndroid Build Coastguard Worker     }
6939*cfb92d14SAndroid Build Coastguard Worker     /**
6940*cfb92d14SAndroid Build Coastguard Worker      * @cli timeinqueue max
6941*cfb92d14SAndroid Build Coastguard Worker      * @code
6942*cfb92d14SAndroid Build Coastguard Worker      * timeinqueue max
6943*cfb92d14SAndroid Build Coastguard Worker      * 281
6944*cfb92d14SAndroid Build Coastguard Worker      * Done
6945*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6946*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
6947*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetMaxTimeInQueue
6948*cfb92d14SAndroid Build Coastguard Worker      * @csa{timeinqueue reset}
6949*cfb92d14SAndroid Build Coastguard Worker      */
6950*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "max")
6951*cfb92d14SAndroid Build Coastguard Worker     {
6952*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%lu", ToUlong(otThreadGetMaxTimeInQueue(GetInstancePtr())));
6953*cfb92d14SAndroid Build Coastguard Worker     }
6954*cfb92d14SAndroid Build Coastguard Worker     /**
6955*cfb92d14SAndroid Build Coastguard Worker      * @cli timeinqueue reset
6956*cfb92d14SAndroid Build Coastguard Worker      * @code
6957*cfb92d14SAndroid Build Coastguard Worker      * timeinqueue reset
6958*cfb92d14SAndroid Build Coastguard Worker      * Done
6959*cfb92d14SAndroid Build Coastguard Worker      * @endcode
6960*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
6961*cfb92d14SAndroid Build Coastguard Worker      * #otThreadResetTimeInQueueStat
6962*cfb92d14SAndroid Build Coastguard Worker      */
6963*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "reset")
6964*cfb92d14SAndroid Build Coastguard Worker     {
6965*cfb92d14SAndroid Build Coastguard Worker         otThreadResetTimeInQueueStat(GetInstancePtr());
6966*cfb92d14SAndroid Build Coastguard Worker     }
6967*cfb92d14SAndroid Build Coastguard Worker     else
6968*cfb92d14SAndroid Build Coastguard Worker     {
6969*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
6970*cfb92d14SAndroid Build Coastguard Worker     }
6971*cfb92d14SAndroid Build Coastguard Worker 
6972*cfb92d14SAndroid Build Coastguard Worker     return error;
6973*cfb92d14SAndroid Build Coastguard Worker }
6974*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_TX_QUEUE_STATISTICS_ENABLE
6975*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])6976*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("dataset")>(Arg aArgs[]) { return mDataset.Process(aArgs); }
6977*cfb92d14SAndroid Build Coastguard Worker 
6978*cfb92d14SAndroid Build Coastguard Worker /**
6979*cfb92d14SAndroid Build Coastguard Worker  * @cli txpower (get,set)
6980*cfb92d14SAndroid Build Coastguard Worker  * @code
6981*cfb92d14SAndroid Build Coastguard Worker  * txpower -10
6982*cfb92d14SAndroid Build Coastguard Worker  * Done
6983*cfb92d14SAndroid Build Coastguard Worker  * @endcode
6984*cfb92d14SAndroid Build Coastguard Worker  * @code
6985*cfb92d14SAndroid Build Coastguard Worker  * txpower
6986*cfb92d14SAndroid Build Coastguard Worker  * -10 dBm
6987*cfb92d14SAndroid Build Coastguard Worker  * Done
6988*cfb92d14SAndroid Build Coastguard Worker  * @endcode
6989*cfb92d14SAndroid Build Coastguard Worker  * @cparam txpower [@ca{txpower}]
6990*cfb92d14SAndroid Build Coastguard Worker  * @par
6991*cfb92d14SAndroid Build Coastguard Worker  * Gets (or sets with the use of the optional `txpower` argument) the transmit power in dBm.
6992*cfb92d14SAndroid Build Coastguard Worker  * @sa otPlatRadioGetTransmitPower
6993*cfb92d14SAndroid Build Coastguard Worker  * @sa otPlatRadioSetTransmitPower
6994*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])6995*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("txpower")>(Arg aArgs[])
6996*cfb92d14SAndroid Build Coastguard Worker {
6997*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
6998*cfb92d14SAndroid Build Coastguard Worker     int8_t  power;
6999*cfb92d14SAndroid Build Coastguard Worker 
7000*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
7001*cfb92d14SAndroid Build Coastguard Worker     {
7002*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otPlatRadioGetTransmitPower(GetInstancePtr(), &power));
7003*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%d dBm", power);
7004*cfb92d14SAndroid Build Coastguard Worker     }
7005*cfb92d14SAndroid Build Coastguard Worker     else
7006*cfb92d14SAndroid Build Coastguard Worker     {
7007*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = aArgs[0].ParseAsInt8(power));
7008*cfb92d14SAndroid Build Coastguard Worker         error = otPlatRadioSetTransmitPower(GetInstancePtr(), power);
7009*cfb92d14SAndroid Build Coastguard Worker     }
7010*cfb92d14SAndroid Build Coastguard Worker 
7011*cfb92d14SAndroid Build Coastguard Worker exit:
7012*cfb92d14SAndroid Build Coastguard Worker     return error;
7013*cfb92d14SAndroid Build Coastguard Worker }
7014*cfb92d14SAndroid Build Coastguard Worker 
7015*cfb92d14SAndroid Build Coastguard Worker /**
7016*cfb92d14SAndroid Build Coastguard Worker  * @cli debug
7017*cfb92d14SAndroid Build Coastguard Worker  * @par
7018*cfb92d14SAndroid Build Coastguard Worker  * Executes a series of CLI commands to gather information about the device and thread network. This is intended for
7019*cfb92d14SAndroid Build Coastguard Worker  * debugging.
7020*cfb92d14SAndroid Build Coastguard Worker  * The output will display each executed CLI command preceded by `$`, followed by the corresponding command's
7021*cfb92d14SAndroid Build Coastguard Worker  * generated output.
7022*cfb92d14SAndroid Build Coastguard Worker  * The generated output encompasses the following information:
7023*cfb92d14SAndroid Build Coastguard Worker  * - Version
7024*cfb92d14SAndroid Build Coastguard Worker  * - Current state
7025*cfb92d14SAndroid Build Coastguard Worker  * - RLOC16, extended MAC address
7026*cfb92d14SAndroid Build Coastguard Worker  * - Unicast and multicast IPv6 address list
7027*cfb92d14SAndroid Build Coastguard Worker  * - Channel
7028*cfb92d14SAndroid Build Coastguard Worker  * - PAN ID and extended PAN ID
7029*cfb92d14SAndroid Build Coastguard Worker  * - Network Data
7030*cfb92d14SAndroid Build Coastguard Worker  * - Partition ID
7031*cfb92d14SAndroid Build Coastguard Worker  * - Leader Data
7032*cfb92d14SAndroid Build Coastguard Worker  * @par
7033*cfb92d14SAndroid Build Coastguard Worker  * If the device is operating as FTD:
7034*cfb92d14SAndroid Build Coastguard Worker  * - Child and neighbor table
7035*cfb92d14SAndroid Build Coastguard Worker  * - Router table and next hop info
7036*cfb92d14SAndroid Build Coastguard Worker  * - Address cache table
7037*cfb92d14SAndroid Build Coastguard Worker  * - Registered MTD child IPv6 address
7038*cfb92d14SAndroid Build Coastguard Worker  * - Device properties
7039*cfb92d14SAndroid Build Coastguard Worker  * @par
7040*cfb92d14SAndroid Build Coastguard Worker  * If the device supports and acts as an SRP client:
7041*cfb92d14SAndroid Build Coastguard Worker  * - SRP client state
7042*cfb92d14SAndroid Build Coastguard Worker  * - SRP client services and host info
7043*cfb92d14SAndroid Build Coastguard Worker  * @par
7044*cfb92d14SAndroid Build Coastguard Worker  * If the device supports and acts as an SRP sever:
7045*cfb92d14SAndroid Build Coastguard Worker  * - SRP server state and address mode
7046*cfb92d14SAndroid Build Coastguard Worker  * - SRP server registered hosts and services
7047*cfb92d14SAndroid Build Coastguard Worker  * @par
7048*cfb92d14SAndroid Build Coastguard Worker  * If the device supports TREL:
7049*cfb92d14SAndroid Build Coastguard Worker  * - TREL status and peer table
7050*cfb92d14SAndroid Build Coastguard Worker  * @par
7051*cfb92d14SAndroid Build Coastguard Worker  * If the device supports and acts as a border router:
7052*cfb92d14SAndroid Build Coastguard Worker  * - BR state
7053*cfb92d14SAndroid Build Coastguard Worker  * - BR prefixes (OMR, on-link, NAT64)
7054*cfb92d14SAndroid Build Coastguard Worker  * - Discovered prefix table
7055*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])7056*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("debug")>(Arg aArgs[])
7057*cfb92d14SAndroid Build Coastguard Worker {
7058*cfb92d14SAndroid Build Coastguard Worker     static constexpr uint16_t kMaxDebugCommandSize = 30;
7059*cfb92d14SAndroid Build Coastguard Worker 
7060*cfb92d14SAndroid Build Coastguard Worker     static const char *const kDebugCommands[] = {
7061*cfb92d14SAndroid Build Coastguard Worker         "version",
7062*cfb92d14SAndroid Build Coastguard Worker         "state",
7063*cfb92d14SAndroid Build Coastguard Worker         "rloc16",
7064*cfb92d14SAndroid Build Coastguard Worker         "extaddr",
7065*cfb92d14SAndroid Build Coastguard Worker         "ipaddr",
7066*cfb92d14SAndroid Build Coastguard Worker         "ipmaddr",
7067*cfb92d14SAndroid Build Coastguard Worker         "channel",
7068*cfb92d14SAndroid Build Coastguard Worker         "panid",
7069*cfb92d14SAndroid Build Coastguard Worker         "extpanid",
7070*cfb92d14SAndroid Build Coastguard Worker         "netdata show",
7071*cfb92d14SAndroid Build Coastguard Worker         "netdata show -x",
7072*cfb92d14SAndroid Build Coastguard Worker         "partitionid",
7073*cfb92d14SAndroid Build Coastguard Worker         "leaderdata",
7074*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
7075*cfb92d14SAndroid Build Coastguard Worker         "child table",
7076*cfb92d14SAndroid Build Coastguard Worker         "childip",
7077*cfb92d14SAndroid Build Coastguard Worker         "neighbor table",
7078*cfb92d14SAndroid Build Coastguard Worker         "router table",
7079*cfb92d14SAndroid Build Coastguard Worker         "nexthop",
7080*cfb92d14SAndroid Build Coastguard Worker         "eidcache",
7081*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MLE_DEVICE_PROPERTY_LEADER_WEIGHT_ENABLE
7082*cfb92d14SAndroid Build Coastguard Worker         "deviceprops",
7083*cfb92d14SAndroid Build Coastguard Worker #endif
7084*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_FTD
7085*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_SRP_CLIENT_ENABLE
7086*cfb92d14SAndroid Build Coastguard Worker         "srp client state",
7087*cfb92d14SAndroid Build Coastguard Worker         "srp client host",
7088*cfb92d14SAndroid Build Coastguard Worker         "srp client service",
7089*cfb92d14SAndroid Build Coastguard Worker         "srp client server",
7090*cfb92d14SAndroid Build Coastguard Worker #endif
7091*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_SRP_SERVER_ENABLE
7092*cfb92d14SAndroid Build Coastguard Worker         "srp server state",
7093*cfb92d14SAndroid Build Coastguard Worker         "srp server addrmode",
7094*cfb92d14SAndroid Build Coastguard Worker         "srp server host",
7095*cfb92d14SAndroid Build Coastguard Worker         "srp server service",
7096*cfb92d14SAndroid Build Coastguard Worker #endif
7097*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE
7098*cfb92d14SAndroid Build Coastguard Worker         "trel",
7099*cfb92d14SAndroid Build Coastguard Worker         "trel peers",
7100*cfb92d14SAndroid Build Coastguard Worker #endif
7101*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE
7102*cfb92d14SAndroid Build Coastguard Worker         "br state",
7103*cfb92d14SAndroid Build Coastguard Worker         "br omrprefix",
7104*cfb92d14SAndroid Build Coastguard Worker         "br onlinkprefix",
7105*cfb92d14SAndroid Build Coastguard Worker         "br prefixtable",
7106*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_NAT64_BORDER_ROUTING_ENABLE
7107*cfb92d14SAndroid Build Coastguard Worker         "br nat64prefix",
7108*cfb92d14SAndroid Build Coastguard Worker #endif
7109*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_ROUTING_DHCP6_PD_ENABLE
7110*cfb92d14SAndroid Build Coastguard Worker         "br pd state",
7111*cfb92d14SAndroid Build Coastguard Worker         "br pd omrprefix",
7112*cfb92d14SAndroid Build Coastguard Worker #endif
7113*cfb92d14SAndroid Build Coastguard Worker #endif
7114*cfb92d14SAndroid Build Coastguard Worker         "bufferinfo",
7115*cfb92d14SAndroid Build Coastguard Worker     };
7116*cfb92d14SAndroid Build Coastguard Worker 
7117*cfb92d14SAndroid Build Coastguard Worker     char commandString[kMaxDebugCommandSize];
7118*cfb92d14SAndroid Build Coastguard Worker 
7119*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aArgs);
7120*cfb92d14SAndroid Build Coastguard Worker 
7121*cfb92d14SAndroid Build Coastguard Worker     mInternalDebugCommand = true;
7122*cfb92d14SAndroid Build Coastguard Worker 
7123*cfb92d14SAndroid Build Coastguard Worker     for (const char *debugCommand : kDebugCommands)
7124*cfb92d14SAndroid Build Coastguard Worker     {
7125*cfb92d14SAndroid Build Coastguard Worker         strncpy(commandString, debugCommand, sizeof(commandString) - 1);
7126*cfb92d14SAndroid Build Coastguard Worker         commandString[sizeof(commandString) - 1] = '\0';
7127*cfb92d14SAndroid Build Coastguard Worker 
7128*cfb92d14SAndroid Build Coastguard Worker         OutputLine("$ %s", commandString);
7129*cfb92d14SAndroid Build Coastguard Worker         ProcessLine(commandString);
7130*cfb92d14SAndroid Build Coastguard Worker     }
7131*cfb92d14SAndroid Build Coastguard Worker 
7132*cfb92d14SAndroid Build Coastguard Worker     mInternalDebugCommand = false;
7133*cfb92d14SAndroid Build Coastguard Worker 
7134*cfb92d14SAndroid Build Coastguard Worker     return OT_ERROR_NONE;
7135*cfb92d14SAndroid Build Coastguard Worker }
7136*cfb92d14SAndroid Build Coastguard Worker 
7137*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BLE_TCAT_ENABLE && OPENTHREAD_CONFIG_CLI_BLE_SECURE_ENABLE
Process(Arg aArgs[])7138*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("tcat")>(Arg aArgs[]) { return mTcat.Process(aArgs); }
7139*cfb92d14SAndroid Build Coastguard Worker #endif
7140*cfb92d14SAndroid Build Coastguard Worker 
7141*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_TCP_ENABLE && OPENTHREAD_CONFIG_CLI_TCP_ENABLE
Process(Arg aArgs[])7142*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("tcp")>(Arg aArgs[]) { return mTcp.Process(aArgs); }
7143*cfb92d14SAndroid Build Coastguard Worker #endif
7144*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])7145*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("udp")>(Arg aArgs[]) { return mUdp.Process(aArgs); }
7146*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])7147*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("unsecureport")>(Arg aArgs[])
7148*cfb92d14SAndroid Build Coastguard Worker {
7149*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
7150*cfb92d14SAndroid Build Coastguard Worker 
7151*cfb92d14SAndroid Build Coastguard Worker     /**
7152*cfb92d14SAndroid Build Coastguard Worker      * @cli unsecureport add
7153*cfb92d14SAndroid Build Coastguard Worker      * @code
7154*cfb92d14SAndroid Build Coastguard Worker      * unsecureport add 1234
7155*cfb92d14SAndroid Build Coastguard Worker      * Done
7156*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7157*cfb92d14SAndroid Build Coastguard Worker      * @cparam unsecureport add @ca{port}
7158*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
7159*cfb92d14SAndroid Build Coastguard Worker      * #otIp6AddUnsecurePort
7160*cfb92d14SAndroid Build Coastguard Worker      */
7161*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "add")
7162*cfb92d14SAndroid Build Coastguard Worker     {
7163*cfb92d14SAndroid Build Coastguard Worker         error = ProcessSet(aArgs + 1, otIp6AddUnsecurePort);
7164*cfb92d14SAndroid Build Coastguard Worker     }
7165*cfb92d14SAndroid Build Coastguard Worker     /**
7166*cfb92d14SAndroid Build Coastguard Worker      * @cli unsecureport remove
7167*cfb92d14SAndroid Build Coastguard Worker      * @code
7168*cfb92d14SAndroid Build Coastguard Worker      * unsecureport remove 1234
7169*cfb92d14SAndroid Build Coastguard Worker      * Done
7170*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7171*cfb92d14SAndroid Build Coastguard Worker      * @code
7172*cfb92d14SAndroid Build Coastguard Worker      * unsecureport remove all
7173*cfb92d14SAndroid Build Coastguard Worker      * Done
7174*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7175*cfb92d14SAndroid Build Coastguard Worker      * @cparam unsecureport remove @ca{port}|all
7176*cfb92d14SAndroid Build Coastguard Worker      * @par
7177*cfb92d14SAndroid Build Coastguard Worker      * Removes a specified port or all ports from the allowed unsecured port list.
7178*cfb92d14SAndroid Build Coastguard Worker      * @sa otIp6AddUnsecurePort
7179*cfb92d14SAndroid Build Coastguard Worker      * @sa otIp6RemoveAllUnsecurePorts
7180*cfb92d14SAndroid Build Coastguard Worker      */
7181*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "remove")
7182*cfb92d14SAndroid Build Coastguard Worker     {
7183*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1] == "all")
7184*cfb92d14SAndroid Build Coastguard Worker         {
7185*cfb92d14SAndroid Build Coastguard Worker             otIp6RemoveAllUnsecurePorts(GetInstancePtr());
7186*cfb92d14SAndroid Build Coastguard Worker         }
7187*cfb92d14SAndroid Build Coastguard Worker         else
7188*cfb92d14SAndroid Build Coastguard Worker         {
7189*cfb92d14SAndroid Build Coastguard Worker             error = ProcessSet(aArgs + 1, otIp6RemoveUnsecurePort);
7190*cfb92d14SAndroid Build Coastguard Worker         }
7191*cfb92d14SAndroid Build Coastguard Worker     }
7192*cfb92d14SAndroid Build Coastguard Worker     /**
7193*cfb92d14SAndroid Build Coastguard Worker      * @cli unsecure get
7194*cfb92d14SAndroid Build Coastguard Worker      * @code
7195*cfb92d14SAndroid Build Coastguard Worker      * unsecure get
7196*cfb92d14SAndroid Build Coastguard Worker      * 1234
7197*cfb92d14SAndroid Build Coastguard Worker      * Done
7198*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7199*cfb92d14SAndroid Build Coastguard Worker      * @par
7200*cfb92d14SAndroid Build Coastguard Worker      * Lists all ports from the allowed unsecured port list.
7201*cfb92d14SAndroid Build Coastguard Worker      * @sa otIp6GetUnsecurePorts
7202*cfb92d14SAndroid Build Coastguard Worker      */
7203*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "get")
7204*cfb92d14SAndroid Build Coastguard Worker     {
7205*cfb92d14SAndroid Build Coastguard Worker         const uint16_t *ports;
7206*cfb92d14SAndroid Build Coastguard Worker         uint8_t         numPorts;
7207*cfb92d14SAndroid Build Coastguard Worker 
7208*cfb92d14SAndroid Build Coastguard Worker         ports = otIp6GetUnsecurePorts(GetInstancePtr(), &numPorts);
7209*cfb92d14SAndroid Build Coastguard Worker 
7210*cfb92d14SAndroid Build Coastguard Worker         if (ports != nullptr)
7211*cfb92d14SAndroid Build Coastguard Worker         {
7212*cfb92d14SAndroid Build Coastguard Worker             for (uint8_t i = 0; i < numPorts; i++)
7213*cfb92d14SAndroid Build Coastguard Worker             {
7214*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("%u ", ports[i]);
7215*cfb92d14SAndroid Build Coastguard Worker             }
7216*cfb92d14SAndroid Build Coastguard Worker         }
7217*cfb92d14SAndroid Build Coastguard Worker 
7218*cfb92d14SAndroid Build Coastguard Worker         OutputNewLine();
7219*cfb92d14SAndroid Build Coastguard Worker     }
7220*cfb92d14SAndroid Build Coastguard Worker     else
7221*cfb92d14SAndroid Build Coastguard Worker     {
7222*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_COMMAND;
7223*cfb92d14SAndroid Build Coastguard Worker     }
7224*cfb92d14SAndroid Build Coastguard Worker 
7225*cfb92d14SAndroid Build Coastguard Worker     return error;
7226*cfb92d14SAndroid Build Coastguard Worker }
7227*cfb92d14SAndroid Build Coastguard Worker 
7228*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_UPTIME_ENABLE
Process(Arg aArgs[])7229*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("uptime")>(Arg aArgs[])
7230*cfb92d14SAndroid Build Coastguard Worker {
7231*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
7232*cfb92d14SAndroid Build Coastguard Worker 
7233*cfb92d14SAndroid Build Coastguard Worker     /**
7234*cfb92d14SAndroid Build Coastguard Worker      * @cli uptime
7235*cfb92d14SAndroid Build Coastguard Worker      * @code
7236*cfb92d14SAndroid Build Coastguard Worker      * uptime
7237*cfb92d14SAndroid Build Coastguard Worker      * 12:46:35.469
7238*cfb92d14SAndroid Build Coastguard Worker      * Done
7239*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7240*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
7241*cfb92d14SAndroid Build Coastguard Worker      * #otInstanceGetUptimeAsString
7242*cfb92d14SAndroid Build Coastguard Worker      */
7243*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
7244*cfb92d14SAndroid Build Coastguard Worker     {
7245*cfb92d14SAndroid Build Coastguard Worker         char string[OT_UPTIME_STRING_SIZE];
7246*cfb92d14SAndroid Build Coastguard Worker 
7247*cfb92d14SAndroid Build Coastguard Worker         otInstanceGetUptimeAsString(GetInstancePtr(), string, sizeof(string));
7248*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%s", string);
7249*cfb92d14SAndroid Build Coastguard Worker     }
7250*cfb92d14SAndroid Build Coastguard Worker 
7251*cfb92d14SAndroid Build Coastguard Worker     /**
7252*cfb92d14SAndroid Build Coastguard Worker      * @cli uptime ms
7253*cfb92d14SAndroid Build Coastguard Worker      * @code
7254*cfb92d14SAndroid Build Coastguard Worker      * uptime ms
7255*cfb92d14SAndroid Build Coastguard Worker      * 426238
7256*cfb92d14SAndroid Build Coastguard Worker      * Done
7257*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7258*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
7259*cfb92d14SAndroid Build Coastguard Worker      * #otInstanceGetUptime
7260*cfb92d14SAndroid Build Coastguard Worker      */
7261*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "ms")
7262*cfb92d14SAndroid Build Coastguard Worker     {
7263*cfb92d14SAndroid Build Coastguard Worker         OutputUint64Line(otInstanceGetUptime(GetInstancePtr()));
7264*cfb92d14SAndroid Build Coastguard Worker     }
7265*cfb92d14SAndroid Build Coastguard Worker     else
7266*cfb92d14SAndroid Build Coastguard Worker     {
7267*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
7268*cfb92d14SAndroid Build Coastguard Worker     }
7269*cfb92d14SAndroid Build Coastguard Worker 
7270*cfb92d14SAndroid Build Coastguard Worker     return error;
7271*cfb92d14SAndroid Build Coastguard Worker }
7272*cfb92d14SAndroid Build Coastguard Worker #endif
7273*cfb92d14SAndroid Build Coastguard Worker 
7274*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE && OPENTHREAD_FTD
Process(Arg aArgs[])7275*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("commissioner")>(Arg aArgs[]) { return mCommissioner.Process(aArgs); }
7276*cfb92d14SAndroid Build Coastguard Worker #endif
7277*cfb92d14SAndroid Build Coastguard Worker 
7278*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_JOINER_ENABLE
Process(Arg aArgs[])7279*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("joiner")>(Arg aArgs[]) { return mJoiner.Process(aArgs); }
7280*cfb92d14SAndroid Build Coastguard Worker #endif
7281*cfb92d14SAndroid Build Coastguard Worker 
7282*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
7283*cfb92d14SAndroid Build Coastguard Worker /**
7284*cfb92d14SAndroid Build Coastguard Worker  * @cli joinerport
7285*cfb92d14SAndroid Build Coastguard Worker  * @code
7286*cfb92d14SAndroid Build Coastguard Worker  * joinerport
7287*cfb92d14SAndroid Build Coastguard Worker  * 1000
7288*cfb92d14SAndroid Build Coastguard Worker  * Done
7289*cfb92d14SAndroid Build Coastguard Worker  * @endcode
7290*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
7291*cfb92d14SAndroid Build Coastguard Worker  * #otThreadGetJoinerUdpPort
7292*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])7293*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("joinerport")>(Arg aArgs[])
7294*cfb92d14SAndroid Build Coastguard Worker {
7295*cfb92d14SAndroid Build Coastguard Worker     /**
7296*cfb92d14SAndroid Build Coastguard Worker      * @cli joinerport (set)
7297*cfb92d14SAndroid Build Coastguard Worker      * @code
7298*cfb92d14SAndroid Build Coastguard Worker      * joinerport 1000
7299*cfb92d14SAndroid Build Coastguard Worker      * Done
7300*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7301*cfb92d14SAndroid Build Coastguard Worker      * @cparam joinerport @ca{udp-port}
7302*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
7303*cfb92d14SAndroid Build Coastguard Worker      * #otThreadSetJoinerUdpPort
7304*cfb92d14SAndroid Build Coastguard Worker      */
7305*cfb92d14SAndroid Build Coastguard Worker     return ProcessGetSet(aArgs, otThreadGetJoinerUdpPort, otThreadSetJoinerUdpPort);
7306*cfb92d14SAndroid Build Coastguard Worker }
7307*cfb92d14SAndroid Build Coastguard Worker #endif
7308*cfb92d14SAndroid Build Coastguard Worker 
7309*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MAC_FILTER_ENABLE
Process(Arg aArgs[])7310*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("macfilter")>(Arg aArgs[]) { return mMacFilter.Process(aArgs); }
7311*cfb92d14SAndroid Build Coastguard Worker #endif
7312*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])7313*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("mac")>(Arg aArgs[])
7314*cfb92d14SAndroid Build Coastguard Worker {
7315*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
7316*cfb92d14SAndroid Build Coastguard Worker 
7317*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "retries")
7318*cfb92d14SAndroid Build Coastguard Worker     {
7319*cfb92d14SAndroid Build Coastguard Worker         /**
7320*cfb92d14SAndroid Build Coastguard Worker          * @cli mac retries direct (get,set)
7321*cfb92d14SAndroid Build Coastguard Worker          * @code
7322*cfb92d14SAndroid Build Coastguard Worker          * mac retries direct
7323*cfb92d14SAndroid Build Coastguard Worker          * 3
7324*cfb92d14SAndroid Build Coastguard Worker          * Done
7325*cfb92d14SAndroid Build Coastguard Worker          * @endcode
7326*cfb92d14SAndroid Build Coastguard Worker          * @code
7327*cfb92d14SAndroid Build Coastguard Worker          * mac retries direct 5
7328*cfb92d14SAndroid Build Coastguard Worker          * Done
7329*cfb92d14SAndroid Build Coastguard Worker          * @endcode
7330*cfb92d14SAndroid Build Coastguard Worker          * @cparam mac retries direct [@ca{number}]
7331*cfb92d14SAndroid Build Coastguard Worker          * Use the optional `number` argument to set the number of direct TX retries.
7332*cfb92d14SAndroid Build Coastguard Worker          * @par
7333*cfb92d14SAndroid Build Coastguard Worker          * Gets or sets the number of direct TX retries on the MAC layer.
7334*cfb92d14SAndroid Build Coastguard Worker          * @sa otLinkGetMaxFrameRetriesDirect
7335*cfb92d14SAndroid Build Coastguard Worker          * @sa otLinkSetMaxFrameRetriesDirect
7336*cfb92d14SAndroid Build Coastguard Worker          */
7337*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1] == "direct")
7338*cfb92d14SAndroid Build Coastguard Worker         {
7339*cfb92d14SAndroid Build Coastguard Worker             error = ProcessGetSet(aArgs + 2, otLinkGetMaxFrameRetriesDirect, otLinkSetMaxFrameRetriesDirect);
7340*cfb92d14SAndroid Build Coastguard Worker         }
7341*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
7342*cfb92d14SAndroid Build Coastguard Worker         /**
7343*cfb92d14SAndroid Build Coastguard Worker          * @cli mac retries indirect (get,set)
7344*cfb92d14SAndroid Build Coastguard Worker          * @code
7345*cfb92d14SAndroid Build Coastguard Worker          * mac retries indirect
7346*cfb92d14SAndroid Build Coastguard Worker          * 3
7347*cfb92d14SAndroid Build Coastguard Worker          * Done
7348*cfb92d14SAndroid Build Coastguard Worker          * @endcode
7349*cfb92d14SAndroid Build Coastguard Worker          * @code max retries indirect 5
7350*cfb92d14SAndroid Build Coastguard Worker          * Done
7351*cfb92d14SAndroid Build Coastguard Worker          * @endcode
7352*cfb92d14SAndroid Build Coastguard Worker          * @cparam mac retries indirect [@ca{number}]
7353*cfb92d14SAndroid Build Coastguard Worker          * Use the optional `number` argument to set the number of indirect Tx retries.
7354*cfb92d14SAndroid Build Coastguard Worker          * @par
7355*cfb92d14SAndroid Build Coastguard Worker          * Gets or sets the number of indirect TX retries on the MAC layer.
7356*cfb92d14SAndroid Build Coastguard Worker          * @sa otLinkGetMaxFrameRetriesIndirect
7357*cfb92d14SAndroid Build Coastguard Worker          * @sa otLinkSetMaxFrameRetriesIndirect
7358*cfb92d14SAndroid Build Coastguard Worker          */
7359*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "indirect")
7360*cfb92d14SAndroid Build Coastguard Worker         {
7361*cfb92d14SAndroid Build Coastguard Worker             error = ProcessGetSet(aArgs + 2, otLinkGetMaxFrameRetriesIndirect, otLinkSetMaxFrameRetriesIndirect);
7362*cfb92d14SAndroid Build Coastguard Worker         }
7363*cfb92d14SAndroid Build Coastguard Worker #endif
7364*cfb92d14SAndroid Build Coastguard Worker         else
7365*cfb92d14SAndroid Build Coastguard Worker         {
7366*cfb92d14SAndroid Build Coastguard Worker             error = OT_ERROR_INVALID_ARGS;
7367*cfb92d14SAndroid Build Coastguard Worker         }
7368*cfb92d14SAndroid Build Coastguard Worker     }
7369*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
7370*cfb92d14SAndroid Build Coastguard Worker     /**
7371*cfb92d14SAndroid Build Coastguard Worker      * @cli mac send
7372*cfb92d14SAndroid Build Coastguard Worker      * @code
7373*cfb92d14SAndroid Build Coastguard Worker      * mac send datarequest
7374*cfb92d14SAndroid Build Coastguard Worker      * Done
7375*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7376*cfb92d14SAndroid Build Coastguard Worker      * @code
7377*cfb92d14SAndroid Build Coastguard Worker      * mac send emptydata
7378*cfb92d14SAndroid Build Coastguard Worker      * Done
7379*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7380*cfb92d14SAndroid Build Coastguard Worker      * @cparam mac send @ca{datarequest} | @ca{emptydata}
7381*cfb92d14SAndroid Build Coastguard Worker      * You must choose one of the following two arguments:
7382*cfb92d14SAndroid Build Coastguard Worker      * - `datarequest`: Enqueues an IEEE 802.15.4 Data Request message for transmission.
7383*cfb92d14SAndroid Build Coastguard Worker      * - `emptydata`: Instructs the device to send an empty IEEE 802.15.4 data frame.
7384*cfb92d14SAndroid Build Coastguard Worker      * @par
7385*cfb92d14SAndroid Build Coastguard Worker      * Instructs an `Rx-Off-When-Idle` device to send a MAC frame to its parent.
7386*cfb92d14SAndroid Build Coastguard Worker      * This command is for certification, and can only be used when `OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE` is
7387*cfb92d14SAndroid Build Coastguard Worker      * enabled.
7388*cfb92d14SAndroid Build Coastguard Worker      * @sa otLinkSendDataRequest
7389*cfb92d14SAndroid Build Coastguard Worker      * @sa otLinkSendEmptyData
7390*cfb92d14SAndroid Build Coastguard Worker      */
7391*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "send")
7392*cfb92d14SAndroid Build Coastguard Worker     {
7393*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(aArgs[2].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
7394*cfb92d14SAndroid Build Coastguard Worker 
7395*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1] == "datarequest")
7396*cfb92d14SAndroid Build Coastguard Worker         {
7397*cfb92d14SAndroid Build Coastguard Worker             error = otLinkSendDataRequest(GetInstancePtr());
7398*cfb92d14SAndroid Build Coastguard Worker         }
7399*cfb92d14SAndroid Build Coastguard Worker         else if (aArgs[1] == "emptydata")
7400*cfb92d14SAndroid Build Coastguard Worker         {
7401*cfb92d14SAndroid Build Coastguard Worker             error = otLinkSendEmptyData(GetInstancePtr());
7402*cfb92d14SAndroid Build Coastguard Worker         }
7403*cfb92d14SAndroid Build Coastguard Worker         else
7404*cfb92d14SAndroid Build Coastguard Worker         {
7405*cfb92d14SAndroid Build Coastguard Worker             error = OT_ERROR_INVALID_ARGS;
7406*cfb92d14SAndroid Build Coastguard Worker         }
7407*cfb92d14SAndroid Build Coastguard Worker     }
7408*cfb92d14SAndroid Build Coastguard Worker #endif
7409*cfb92d14SAndroid Build Coastguard Worker     else
7410*cfb92d14SAndroid Build Coastguard Worker     {
7411*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_COMMAND;
7412*cfb92d14SAndroid Build Coastguard Worker         ExitNow(); // To silence unused `exit` label warning when `REFERENCE_DEVICE_ENABLE` is not enabled.
7413*cfb92d14SAndroid Build Coastguard Worker     }
7414*cfb92d14SAndroid Build Coastguard Worker 
7415*cfb92d14SAndroid Build Coastguard Worker exit:
7416*cfb92d14SAndroid Build Coastguard Worker     return error;
7417*cfb92d14SAndroid Build Coastguard Worker }
7418*cfb92d14SAndroid Build Coastguard Worker 
7419*cfb92d14SAndroid Build Coastguard Worker /**
7420*cfb92d14SAndroid Build Coastguard Worker  * @cli trel
7421*cfb92d14SAndroid Build Coastguard Worker  * @code
7422*cfb92d14SAndroid Build Coastguard Worker  * trel
7423*cfb92d14SAndroid Build Coastguard Worker  * Enabled
7424*cfb92d14SAndroid Build Coastguard Worker  * Done
7425*cfb92d14SAndroid Build Coastguard Worker  * @endcode
7426*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
7427*cfb92d14SAndroid Build Coastguard Worker  * #otTrelIsEnabled
7428*cfb92d14SAndroid Build Coastguard Worker  * @note `OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE` is required for all `trel` sub-commands.
7429*cfb92d14SAndroid Build Coastguard Worker  */
7430*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE
Process(Arg aArgs[])7431*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("trel")>(Arg aArgs[])
7432*cfb92d14SAndroid Build Coastguard Worker {
7433*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
7434*cfb92d14SAndroid Build Coastguard Worker 
7435*cfb92d14SAndroid Build Coastguard Worker     /**
7436*cfb92d14SAndroid Build Coastguard Worker      * @cli trel (enable,disable)
7437*cfb92d14SAndroid Build Coastguard Worker      * @code
7438*cfb92d14SAndroid Build Coastguard Worker      * trel enable
7439*cfb92d14SAndroid Build Coastguard Worker      * Done
7440*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7441*cfb92d14SAndroid Build Coastguard Worker      * @code
7442*cfb92d14SAndroid Build Coastguard Worker      * trel disable
7443*cfb92d14SAndroid Build Coastguard Worker      * Done
7444*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7445*cfb92d14SAndroid Build Coastguard Worker      * @cparam trel @ca{enable}|@ca{disable}
7446*cfb92d14SAndroid Build Coastguard Worker      * @par
7447*cfb92d14SAndroid Build Coastguard Worker      * Enables or disables the TREL radio operation.
7448*cfb92d14SAndroid Build Coastguard Worker      * @sa otTrelSetEnabled
7449*cfb92d14SAndroid Build Coastguard Worker      */
7450*cfb92d14SAndroid Build Coastguard Worker     if (ProcessEnableDisable(aArgs, otTrelIsEnabled, otTrelSetEnabled) == OT_ERROR_NONE)
7451*cfb92d14SAndroid Build Coastguard Worker     {
7452*cfb92d14SAndroid Build Coastguard Worker     }
7453*cfb92d14SAndroid Build Coastguard Worker     /**
7454*cfb92d14SAndroid Build Coastguard Worker      * @cli trel filter
7455*cfb92d14SAndroid Build Coastguard Worker      * @code
7456*cfb92d14SAndroid Build Coastguard Worker      * trel filter
7457*cfb92d14SAndroid Build Coastguard Worker      * Disabled
7458*cfb92d14SAndroid Build Coastguard Worker      * Done
7459*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7460*cfb92d14SAndroid Build Coastguard Worker      * @par
7461*cfb92d14SAndroid Build Coastguard Worker      * Indicates whether TREL filter mode is enabled.
7462*cfb92d14SAndroid Build Coastguard Worker      * @par
7463*cfb92d14SAndroid Build Coastguard Worker      * When filter mode is enabled, all Rx and Tx traffic sent through the TREL interface gets silently dropped.
7464*cfb92d14SAndroid Build Coastguard Worker      * @note This mode is used mostly for testing.
7465*cfb92d14SAndroid Build Coastguard Worker      * @sa otTrelIsFilterEnabled
7466*cfb92d14SAndroid Build Coastguard Worker      */
7467*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "filter")
7468*cfb92d14SAndroid Build Coastguard Worker     /**
7469*cfb92d14SAndroid Build Coastguard Worker      * @cli trel filter (enable,disable)
7470*cfb92d14SAndroid Build Coastguard Worker      * @code
7471*cfb92d14SAndroid Build Coastguard Worker      * trel filter enable
7472*cfb92d14SAndroid Build Coastguard Worker      * Done
7473*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7474*cfb92d14SAndroid Build Coastguard Worker      * @code
7475*cfb92d14SAndroid Build Coastguard Worker      * trel filter disable
7476*cfb92d14SAndroid Build Coastguard Worker      * Done
7477*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7478*cfb92d14SAndroid Build Coastguard Worker      * @cparam trel filter @ca{enable}|@ca{disable}
7479*cfb92d14SAndroid Build Coastguard Worker      * @par
7480*cfb92d14SAndroid Build Coastguard Worker      * Enables or disables TREL filter mode.
7481*cfb92d14SAndroid Build Coastguard Worker      * @sa otTrelSetFilterEnabled
7482*cfb92d14SAndroid Build Coastguard Worker      */
7483*cfb92d14SAndroid Build Coastguard Worker     {
7484*cfb92d14SAndroid Build Coastguard Worker         error = ProcessEnableDisable(aArgs + 1, otTrelIsFilterEnabled, otTrelSetFilterEnabled);
7485*cfb92d14SAndroid Build Coastguard Worker     }
7486*cfb92d14SAndroid Build Coastguard Worker     /**
7487*cfb92d14SAndroid Build Coastguard Worker      * @cli trel peers
7488*cfb92d14SAndroid Build Coastguard Worker      * @code
7489*cfb92d14SAndroid Build Coastguard Worker      * trel peers
7490*cfb92d14SAndroid Build Coastguard Worker      * | No  | Ext MAC Address  | Ext PAN Id       | IPv6 Socket Address                              |
7491*cfb92d14SAndroid Build Coastguard Worker      * +-----+------------------+------------------+--------------------------------------------------+
7492*cfb92d14SAndroid Build Coastguard Worker      * |   1 | 5e5785ba3a63adb9 | f0d9c001f00d2e43 | [fe80:0:0:0:cc79:2a29:d311:1aea]:9202            |
7493*cfb92d14SAndroid Build Coastguard Worker      * |   2 | ce792a29d3111aea | dead00beef00cafe | [fe80:0:0:0:5c57:85ba:3a63:adb9]:9203            |
7494*cfb92d14SAndroid Build Coastguard Worker      * Done
7495*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7496*cfb92d14SAndroid Build Coastguard Worker      * @code
7497*cfb92d14SAndroid Build Coastguard Worker      * trel peers list
7498*cfb92d14SAndroid Build Coastguard Worker      * 001 ExtAddr:5e5785ba3a63adb9 ExtPanId:f0d9c001f00d2e43 SockAddr:[fe80:0:0:0:cc79:2a29:d311:1aea]:9202
7499*cfb92d14SAndroid Build Coastguard Worker      * 002 ExtAddr:ce792a29d3111aea ExtPanId:dead00beef00cafe SockAddr:[fe80:0:0:0:5c57:85ba:3a63:adb9]:9203
7500*cfb92d14SAndroid Build Coastguard Worker      * Done
7501*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7502*cfb92d14SAndroid Build Coastguard Worker      * @cparam trel peers [@ca{list}]
7503*cfb92d14SAndroid Build Coastguard Worker      * @par
7504*cfb92d14SAndroid Build Coastguard Worker      * Gets the TREL peer table in table or list format.
7505*cfb92d14SAndroid Build Coastguard Worker      * @sa otTrelGetNextPeer
7506*cfb92d14SAndroid Build Coastguard Worker      */
7507*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "peers")
7508*cfb92d14SAndroid Build Coastguard Worker     {
7509*cfb92d14SAndroid Build Coastguard Worker         uint16_t           index = 0;
7510*cfb92d14SAndroid Build Coastguard Worker         otTrelPeerIterator iterator;
7511*cfb92d14SAndroid Build Coastguard Worker         const otTrelPeer  *peer;
7512*cfb92d14SAndroid Build Coastguard Worker         bool               isTable = true;
7513*cfb92d14SAndroid Build Coastguard Worker 
7514*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1] == "list")
7515*cfb92d14SAndroid Build Coastguard Worker         {
7516*cfb92d14SAndroid Build Coastguard Worker             isTable = false;
7517*cfb92d14SAndroid Build Coastguard Worker         }
7518*cfb92d14SAndroid Build Coastguard Worker         else
7519*cfb92d14SAndroid Build Coastguard Worker         {
7520*cfb92d14SAndroid Build Coastguard Worker             VerifyOrExit(aArgs[1].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
7521*cfb92d14SAndroid Build Coastguard Worker         }
7522*cfb92d14SAndroid Build Coastguard Worker 
7523*cfb92d14SAndroid Build Coastguard Worker         if (isTable)
7524*cfb92d14SAndroid Build Coastguard Worker         {
7525*cfb92d14SAndroid Build Coastguard Worker             static const char *const kTrelPeerTableTitles[] = {"No", "Ext MAC Address", "Ext PAN Id",
7526*cfb92d14SAndroid Build Coastguard Worker                                                                "IPv6 Socket Address"};
7527*cfb92d14SAndroid Build Coastguard Worker 
7528*cfb92d14SAndroid Build Coastguard Worker             static const uint8_t kTrelPeerTableColumnWidths[] = {5, 18, 18, 50};
7529*cfb92d14SAndroid Build Coastguard Worker 
7530*cfb92d14SAndroid Build Coastguard Worker             OutputTableHeader(kTrelPeerTableTitles, kTrelPeerTableColumnWidths);
7531*cfb92d14SAndroid Build Coastguard Worker         }
7532*cfb92d14SAndroid Build Coastguard Worker 
7533*cfb92d14SAndroid Build Coastguard Worker         otTrelInitPeerIterator(GetInstancePtr(), &iterator);
7534*cfb92d14SAndroid Build Coastguard Worker 
7535*cfb92d14SAndroid Build Coastguard Worker         while ((peer = otTrelGetNextPeer(GetInstancePtr(), &iterator)) != nullptr)
7536*cfb92d14SAndroid Build Coastguard Worker         {
7537*cfb92d14SAndroid Build Coastguard Worker             if (!isTable)
7538*cfb92d14SAndroid Build Coastguard Worker             {
7539*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("%03u ExtAddr:", ++index);
7540*cfb92d14SAndroid Build Coastguard Worker                 OutputExtAddress(peer->mExtAddress);
7541*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat(" ExtPanId:");
7542*cfb92d14SAndroid Build Coastguard Worker                 OutputBytes(peer->mExtPanId.m8);
7543*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat(" SockAddr:");
7544*cfb92d14SAndroid Build Coastguard Worker                 OutputSockAddrLine(peer->mSockAddr);
7545*cfb92d14SAndroid Build Coastguard Worker             }
7546*cfb92d14SAndroid Build Coastguard Worker             else
7547*cfb92d14SAndroid Build Coastguard Worker             {
7548*cfb92d14SAndroid Build Coastguard Worker                 char string[OT_IP6_SOCK_ADDR_STRING_SIZE];
7549*cfb92d14SAndroid Build Coastguard Worker 
7550*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat("| %3u | ", ++index);
7551*cfb92d14SAndroid Build Coastguard Worker                 OutputExtAddress(peer->mExtAddress);
7552*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat(" | ");
7553*cfb92d14SAndroid Build Coastguard Worker                 OutputBytes(peer->mExtPanId.m8);
7554*cfb92d14SAndroid Build Coastguard Worker                 otIp6SockAddrToString(&peer->mSockAddr, string, sizeof(string));
7555*cfb92d14SAndroid Build Coastguard Worker                 OutputLine(" | %-48s |", string);
7556*cfb92d14SAndroid Build Coastguard Worker             }
7557*cfb92d14SAndroid Build Coastguard Worker         }
7558*cfb92d14SAndroid Build Coastguard Worker     }
7559*cfb92d14SAndroid Build Coastguard Worker     /**
7560*cfb92d14SAndroid Build Coastguard Worker      * @cli trel counters
7561*cfb92d14SAndroid Build Coastguard Worker      * @code
7562*cfb92d14SAndroid Build Coastguard Worker      * trel counters
7563*cfb92d14SAndroid Build Coastguard Worker      * Inbound:  Packets 32 Bytes 4000
7564*cfb92d14SAndroid Build Coastguard Worker      * Outbound: Packets 4 Bytes 320 Failures 1
7565*cfb92d14SAndroid Build Coastguard Worker      * Done
7566*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7567*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
7568*cfb92d14SAndroid Build Coastguard Worker      * #otTrelGetCounters
7569*cfb92d14SAndroid Build Coastguard Worker      */
7570*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "counters")
7571*cfb92d14SAndroid Build Coastguard Worker     {
7572*cfb92d14SAndroid Build Coastguard Worker         if (aArgs[1].IsEmpty())
7573*cfb92d14SAndroid Build Coastguard Worker         {
7574*cfb92d14SAndroid Build Coastguard Worker             OutputTrelCounters(*otTrelGetCounters(GetInstancePtr()));
7575*cfb92d14SAndroid Build Coastguard Worker         }
7576*cfb92d14SAndroid Build Coastguard Worker         /**
7577*cfb92d14SAndroid Build Coastguard Worker          * @cli trel counters reset
7578*cfb92d14SAndroid Build Coastguard Worker          * @code
7579*cfb92d14SAndroid Build Coastguard Worker          * trel counters reset
7580*cfb92d14SAndroid Build Coastguard Worker          * Done
7581*cfb92d14SAndroid Build Coastguard Worker          * @endcode
7582*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
7583*cfb92d14SAndroid Build Coastguard Worker          * #otTrelResetCounters
7584*cfb92d14SAndroid Build Coastguard Worker          */
7585*cfb92d14SAndroid Build Coastguard Worker         else if ((aArgs[1] == "reset") && aArgs[2].IsEmpty())
7586*cfb92d14SAndroid Build Coastguard Worker         {
7587*cfb92d14SAndroid Build Coastguard Worker             otTrelResetCounters(GetInstancePtr());
7588*cfb92d14SAndroid Build Coastguard Worker         }
7589*cfb92d14SAndroid Build Coastguard Worker         else
7590*cfb92d14SAndroid Build Coastguard Worker         {
7591*cfb92d14SAndroid Build Coastguard Worker             error = OT_ERROR_INVALID_ARGS;
7592*cfb92d14SAndroid Build Coastguard Worker         }
7593*cfb92d14SAndroid Build Coastguard Worker     }
7594*cfb92d14SAndroid Build Coastguard Worker     /**
7595*cfb92d14SAndroid Build Coastguard Worker      * @cli trel port
7596*cfb92d14SAndroid Build Coastguard Worker      * @code
7597*cfb92d14SAndroid Build Coastguard Worker      * trel port
7598*cfb92d14SAndroid Build Coastguard Worker      * 49153
7599*cfb92d14SAndroid Build Coastguard Worker      * Done
7600*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7601*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
7602*cfb92d14SAndroid Build Coastguard Worker      * #otTrelGetUdpPort
7603*cfb92d14SAndroid Build Coastguard Worker      */
7604*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "port")
7605*cfb92d14SAndroid Build Coastguard Worker     {
7606*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%hu", otTrelGetUdpPort(GetInstancePtr()));
7607*cfb92d14SAndroid Build Coastguard Worker     }
7608*cfb92d14SAndroid Build Coastguard Worker     else
7609*cfb92d14SAndroid Build Coastguard Worker     {
7610*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
7611*cfb92d14SAndroid Build Coastguard Worker     }
7612*cfb92d14SAndroid Build Coastguard Worker 
7613*cfb92d14SAndroid Build Coastguard Worker exit:
7614*cfb92d14SAndroid Build Coastguard Worker     return error;
7615*cfb92d14SAndroid Build Coastguard Worker }
7616*cfb92d14SAndroid Build Coastguard Worker 
OutputTrelCounters(const otTrelCounters & aCounters)7617*cfb92d14SAndroid Build Coastguard Worker void Interpreter::OutputTrelCounters(const otTrelCounters &aCounters)
7618*cfb92d14SAndroid Build Coastguard Worker {
7619*cfb92d14SAndroid Build Coastguard Worker     Uint64StringBuffer u64StringBuffer;
7620*cfb92d14SAndroid Build Coastguard Worker 
7621*cfb92d14SAndroid Build Coastguard Worker     OutputFormat("Inbound: Packets %s ", Uint64ToString(aCounters.mRxPackets, u64StringBuffer));
7622*cfb92d14SAndroid Build Coastguard Worker     OutputLine("Bytes %s", Uint64ToString(aCounters.mRxBytes, u64StringBuffer));
7623*cfb92d14SAndroid Build Coastguard Worker 
7624*cfb92d14SAndroid Build Coastguard Worker     OutputFormat("Outbound: Packets %s ", Uint64ToString(aCounters.mTxPackets, u64StringBuffer));
7625*cfb92d14SAndroid Build Coastguard Worker     OutputFormat("Bytes %s ", Uint64ToString(aCounters.mTxBytes, u64StringBuffer));
7626*cfb92d14SAndroid Build Coastguard Worker     OutputLine("Failures %s", Uint64ToString(aCounters.mTxFailure, u64StringBuffer));
7627*cfb92d14SAndroid Build Coastguard Worker }
7628*cfb92d14SAndroid Build Coastguard Worker 
7629*cfb92d14SAndroid Build Coastguard Worker #endif
7630*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])7631*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("vendor")>(Arg aArgs[])
7632*cfb92d14SAndroid Build Coastguard Worker {
7633*cfb92d14SAndroid Build Coastguard Worker     Error error = OT_ERROR_INVALID_ARGS;
7634*cfb92d14SAndroid Build Coastguard Worker 
7635*cfb92d14SAndroid Build Coastguard Worker     /**
7636*cfb92d14SAndroid Build Coastguard Worker      * @cli vendor name
7637*cfb92d14SAndroid Build Coastguard Worker      * @code
7638*cfb92d14SAndroid Build Coastguard Worker      * vendor name
7639*cfb92d14SAndroid Build Coastguard Worker      * nest
7640*cfb92d14SAndroid Build Coastguard Worker      * Done
7641*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7642*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
7643*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetVendorName
7644*cfb92d14SAndroid Build Coastguard Worker      */
7645*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "name")
7646*cfb92d14SAndroid Build Coastguard Worker     {
7647*cfb92d14SAndroid Build Coastguard Worker         aArgs++;
7648*cfb92d14SAndroid Build Coastguard Worker 
7649*cfb92d14SAndroid Build Coastguard Worker #if !OPENTHREAD_CONFIG_NET_DIAG_VENDOR_INFO_SET_API_ENABLE
7650*cfb92d14SAndroid Build Coastguard Worker         error = ProcessGet(aArgs, otThreadGetVendorName);
7651*cfb92d14SAndroid Build Coastguard Worker #else
7652*cfb92d14SAndroid Build Coastguard Worker         /**
7653*cfb92d14SAndroid Build Coastguard Worker          * @cli vendor name (set)
7654*cfb92d14SAndroid Build Coastguard Worker          * @code
7655*cfb92d14SAndroid Build Coastguard Worker          * vendor name nest
7656*cfb92d14SAndroid Build Coastguard Worker          * Done
7657*cfb92d14SAndroid Build Coastguard Worker          * @endcode
7658*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
7659*cfb92d14SAndroid Build Coastguard Worker          * #otThreadSetVendorName
7660*cfb92d14SAndroid Build Coastguard Worker          * @cparam vendor name @ca{name}
7661*cfb92d14SAndroid Build Coastguard Worker          */
7662*cfb92d14SAndroid Build Coastguard Worker         error = ProcessGetSet(aArgs, otThreadGetVendorName, otThreadSetVendorName);
7663*cfb92d14SAndroid Build Coastguard Worker #endif
7664*cfb92d14SAndroid Build Coastguard Worker     }
7665*cfb92d14SAndroid Build Coastguard Worker     /**
7666*cfb92d14SAndroid Build Coastguard Worker      * @cli vendor model
7667*cfb92d14SAndroid Build Coastguard Worker      * @code
7668*cfb92d14SAndroid Build Coastguard Worker      * vendor model
7669*cfb92d14SAndroid Build Coastguard Worker      * Hub Max
7670*cfb92d14SAndroid Build Coastguard Worker      * Done
7671*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7672*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
7673*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetVendorModel
7674*cfb92d14SAndroid Build Coastguard Worker      */
7675*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "model")
7676*cfb92d14SAndroid Build Coastguard Worker     {
7677*cfb92d14SAndroid Build Coastguard Worker         aArgs++;
7678*cfb92d14SAndroid Build Coastguard Worker 
7679*cfb92d14SAndroid Build Coastguard Worker #if !OPENTHREAD_CONFIG_NET_DIAG_VENDOR_INFO_SET_API_ENABLE
7680*cfb92d14SAndroid Build Coastguard Worker         error = ProcessGet(aArgs, otThreadGetVendorModel);
7681*cfb92d14SAndroid Build Coastguard Worker #else
7682*cfb92d14SAndroid Build Coastguard Worker         /**
7683*cfb92d14SAndroid Build Coastguard Worker          * @cli vendor model (set)
7684*cfb92d14SAndroid Build Coastguard Worker          * @code
7685*cfb92d14SAndroid Build Coastguard Worker          * vendor model Hub\ Max
7686*cfb92d14SAndroid Build Coastguard Worker          * Done
7687*cfb92d14SAndroid Build Coastguard Worker          * @endcode
7688*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
7689*cfb92d14SAndroid Build Coastguard Worker          * #otThreadSetVendorModel
7690*cfb92d14SAndroid Build Coastguard Worker          * @cparam vendor model @ca{name}
7691*cfb92d14SAndroid Build Coastguard Worker          */
7692*cfb92d14SAndroid Build Coastguard Worker         error = ProcessGetSet(aArgs, otThreadGetVendorModel, otThreadSetVendorModel);
7693*cfb92d14SAndroid Build Coastguard Worker #endif
7694*cfb92d14SAndroid Build Coastguard Worker     }
7695*cfb92d14SAndroid Build Coastguard Worker     /**
7696*cfb92d14SAndroid Build Coastguard Worker      * @cli vendor swversion
7697*cfb92d14SAndroid Build Coastguard Worker      * @code
7698*cfb92d14SAndroid Build Coastguard Worker      * vendor swversion
7699*cfb92d14SAndroid Build Coastguard Worker      * Marble3.5.1
7700*cfb92d14SAndroid Build Coastguard Worker      * Done
7701*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7702*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
7703*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetVendorSwVersion
7704*cfb92d14SAndroid Build Coastguard Worker      */
7705*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "swversion")
7706*cfb92d14SAndroid Build Coastguard Worker     {
7707*cfb92d14SAndroid Build Coastguard Worker         aArgs++;
7708*cfb92d14SAndroid Build Coastguard Worker 
7709*cfb92d14SAndroid Build Coastguard Worker #if !OPENTHREAD_CONFIG_NET_DIAG_VENDOR_INFO_SET_API_ENABLE
7710*cfb92d14SAndroid Build Coastguard Worker         error = ProcessGet(aArgs, otThreadGetVendorSwVersion);
7711*cfb92d14SAndroid Build Coastguard Worker #else
7712*cfb92d14SAndroid Build Coastguard Worker         /**
7713*cfb92d14SAndroid Build Coastguard Worker          * @cli vendor swversion (set)
7714*cfb92d14SAndroid Build Coastguard Worker          * @code
7715*cfb92d14SAndroid Build Coastguard Worker          * vendor swversion Marble3.5.1
7716*cfb92d14SAndroid Build Coastguard Worker          * Done
7717*cfb92d14SAndroid Build Coastguard Worker          * @endcode
7718*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
7719*cfb92d14SAndroid Build Coastguard Worker          * #otThreadSetVendorSwVersion
7720*cfb92d14SAndroid Build Coastguard Worker          * @cparam vendor swversion @ca{version}
7721*cfb92d14SAndroid Build Coastguard Worker          */
7722*cfb92d14SAndroid Build Coastguard Worker         error = ProcessGetSet(aArgs, otThreadGetVendorSwVersion, otThreadSetVendorSwVersion);
7723*cfb92d14SAndroid Build Coastguard Worker #endif
7724*cfb92d14SAndroid Build Coastguard Worker     }
7725*cfb92d14SAndroid Build Coastguard Worker     /**
7726*cfb92d14SAndroid Build Coastguard Worker      * @cli vendor appurl
7727*cfb92d14SAndroid Build Coastguard Worker      * @code
7728*cfb92d14SAndroid Build Coastguard Worker      * vendor appurl
7729*cfb92d14SAndroid Build Coastguard Worker      * http://www.example.com
7730*cfb92d14SAndroid Build Coastguard Worker      * Done
7731*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7732*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
7733*cfb92d14SAndroid Build Coastguard Worker      * #otThreadGetVendorAppUrl
7734*cfb92d14SAndroid Build Coastguard Worker      */
7735*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "appurl")
7736*cfb92d14SAndroid Build Coastguard Worker     {
7737*cfb92d14SAndroid Build Coastguard Worker         aArgs++;
7738*cfb92d14SAndroid Build Coastguard Worker 
7739*cfb92d14SAndroid Build Coastguard Worker #if !OPENTHREAD_CONFIG_NET_DIAG_VENDOR_INFO_SET_API_ENABLE
7740*cfb92d14SAndroid Build Coastguard Worker         error = ProcessGet(aArgs, otThreadGetVendorAppUrl);
7741*cfb92d14SAndroid Build Coastguard Worker #else
7742*cfb92d14SAndroid Build Coastguard Worker         /**
7743*cfb92d14SAndroid Build Coastguard Worker          * @cli vendor appurl (set)
7744*cfb92d14SAndroid Build Coastguard Worker          * @code
7745*cfb92d14SAndroid Build Coastguard Worker          * vendor appurl http://www.example.com
7746*cfb92d14SAndroid Build Coastguard Worker          * Done
7747*cfb92d14SAndroid Build Coastguard Worker          * @endcode
7748*cfb92d14SAndroid Build Coastguard Worker          * @par api_copy
7749*cfb92d14SAndroid Build Coastguard Worker          * #otThreadSetVendorAppUrl
7750*cfb92d14SAndroid Build Coastguard Worker          * @cparam vendor appurl @ca{url}
7751*cfb92d14SAndroid Build Coastguard Worker          */
7752*cfb92d14SAndroid Build Coastguard Worker         error = ProcessGetSet(aArgs, otThreadGetVendorAppUrl, otThreadSetVendorAppUrl);
7753*cfb92d14SAndroid Build Coastguard Worker #endif
7754*cfb92d14SAndroid Build Coastguard Worker     }
7755*cfb92d14SAndroid Build Coastguard Worker 
7756*cfb92d14SAndroid Build Coastguard Worker     return error;
7757*cfb92d14SAndroid Build Coastguard Worker }
7758*cfb92d14SAndroid Build Coastguard Worker 
7759*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_TMF_NETDIAG_CLIENT_ENABLE
7760*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])7761*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("networkdiagnostic")>(Arg aArgs[])
7762*cfb92d14SAndroid Build Coastguard Worker {
7763*cfb92d14SAndroid Build Coastguard Worker     static constexpr uint16_t kMaxTlvs = 35;
7764*cfb92d14SAndroid Build Coastguard Worker 
7765*cfb92d14SAndroid Build Coastguard Worker     otError      error = OT_ERROR_NONE;
7766*cfb92d14SAndroid Build Coastguard Worker     otIp6Address address;
7767*cfb92d14SAndroid Build Coastguard Worker     uint8_t      tlvTypes[kMaxTlvs];
7768*cfb92d14SAndroid Build Coastguard Worker     uint8_t      count = 0;
7769*cfb92d14SAndroid Build Coastguard Worker 
7770*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = aArgs[1].ParseAsIp6Address(address));
7771*cfb92d14SAndroid Build Coastguard Worker 
7772*cfb92d14SAndroid Build Coastguard Worker     for (Arg *arg = &aArgs[2]; !arg->IsEmpty(); arg++)
7773*cfb92d14SAndroid Build Coastguard Worker     {
7774*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(count < sizeof(tlvTypes), error = OT_ERROR_INVALID_ARGS);
7775*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = arg->ParseAsUint8(tlvTypes[count++]));
7776*cfb92d14SAndroid Build Coastguard Worker     }
7777*cfb92d14SAndroid Build Coastguard Worker 
7778*cfb92d14SAndroid Build Coastguard Worker     /**
7779*cfb92d14SAndroid Build Coastguard Worker      * @cli networkdiagnostic get
7780*cfb92d14SAndroid Build Coastguard Worker      * @code
7781*cfb92d14SAndroid Build Coastguard Worker      * networkdiagnostic get fdde:ad00:beef:0:0:ff:fe00:fc00 0 1 6 23
7782*cfb92d14SAndroid Build Coastguard Worker      * DIAG_GET.rsp/ans: 00080e336e1c41494e1c01020c000608640b0f674074c503
7783*cfb92d14SAndroid Build Coastguard Worker      * Ext Address: 0e336e1c41494e1c
7784*cfb92d14SAndroid Build Coastguard Worker      * Rloc16: 0x0c00
7785*cfb92d14SAndroid Build Coastguard Worker      * Leader Data:
7786*cfb92d14SAndroid Build Coastguard Worker      *     PartitionId: 0x640b0f67
7787*cfb92d14SAndroid Build Coastguard Worker      *     Weighting: 64
7788*cfb92d14SAndroid Build Coastguard Worker      *     DataVersion: 116
7789*cfb92d14SAndroid Build Coastguard Worker      *     StableDataVersion: 197
7790*cfb92d14SAndroid Build Coastguard Worker      *     LeaderRouterId: 0x03
7791*cfb92d14SAndroid Build Coastguard Worker      * EUI64: 18b4300000000004
7792*cfb92d14SAndroid Build Coastguard Worker      * Done
7793*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7794*cfb92d14SAndroid Build Coastguard Worker      * @code
7795*cfb92d14SAndroid Build Coastguard Worker      * networkdiagnostic get ff02::1 0 1
7796*cfb92d14SAndroid Build Coastguard Worker      * DIAG_GET.rsp/ans: 00080e336e1c41494e1c01020c00
7797*cfb92d14SAndroid Build Coastguard Worker      * Ext Address: '0e336e1c41494e1c'
7798*cfb92d14SAndroid Build Coastguard Worker      * Rloc16: 0x0c00
7799*cfb92d14SAndroid Build Coastguard Worker      * Done
7800*cfb92d14SAndroid Build Coastguard Worker      * DIAG_GET.rsp/ans: 00083efcdb7e3f9eb0f201021800
7801*cfb92d14SAndroid Build Coastguard Worker      * Ext Address: 3efcdb7e3f9eb0f2
7802*cfb92d14SAndroid Build Coastguard Worker      * Rloc16: 0x1800
7803*cfb92d14SAndroid Build Coastguard Worker      * Done
7804*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7805*cfb92d14SAndroid Build Coastguard Worker      * @cparam networkdiagnostic get @ca{addr} @ca{type(s)}
7806*cfb92d14SAndroid Build Coastguard Worker      * For `addr`, a unicast address triggers a `Diagnostic Get`.
7807*cfb92d14SAndroid Build Coastguard Worker      * A multicast address triggers a `Diagnostic Query`.
7808*cfb92d14SAndroid Build Coastguard Worker      * TLV values you can specify (separated by a space if you specify more than one TLV):
7809*cfb92d14SAndroid Build Coastguard Worker      * - `0`: MAC Extended Address TLV
7810*cfb92d14SAndroid Build Coastguard Worker      * - `1`: Address16 TLV
7811*cfb92d14SAndroid Build Coastguard Worker      * - `2`: Mode TLV
7812*cfb92d14SAndroid Build Coastguard Worker      * - `3`: Timeout TLV (the maximum polling time period for SEDs)
7813*cfb92d14SAndroid Build Coastguard Worker      * - `4`: Connectivity TLV
7814*cfb92d14SAndroid Build Coastguard Worker      * - `5`: Route64 TLV
7815*cfb92d14SAndroid Build Coastguard Worker      * - `6`: Leader Data TLV
7816*cfb92d14SAndroid Build Coastguard Worker      * - `7`: Network Data TLV
7817*cfb92d14SAndroid Build Coastguard Worker      * - `8`: IPv6 Address List TLV
7818*cfb92d14SAndroid Build Coastguard Worker      * - `9`: MAC Counters TLV
7819*cfb92d14SAndroid Build Coastguard Worker      * - `14`: Battery Level TLV
7820*cfb92d14SAndroid Build Coastguard Worker      * - `15`: Supply Voltage TLV
7821*cfb92d14SAndroid Build Coastguard Worker      * - `16`: Child Table TLV
7822*cfb92d14SAndroid Build Coastguard Worker      * - `17`: Channel Pages TLV
7823*cfb92d14SAndroid Build Coastguard Worker      * - `19`: Max Child Timeout TLV
7824*cfb92d14SAndroid Build Coastguard Worker      * - `23`: EUI64 TLV
7825*cfb92d14SAndroid Build Coastguard Worker      * - `24`: Version TLV (version number for the protocols and features)
7826*cfb92d14SAndroid Build Coastguard Worker      * - `25`: Vendor Name TLV
7827*cfb92d14SAndroid Build Coastguard Worker      * - `26`: Vendor Model TLV
7828*cfb92d14SAndroid Build Coastguard Worker      * - `27`: Vendor SW Version TLV
7829*cfb92d14SAndroid Build Coastguard Worker      * - `28`: Thread Stack Version TLV (version identifier as UTF-8 string for Thread stack codebase/commit/version)
7830*cfb92d14SAndroid Build Coastguard Worker      * - `29`: Child TLV
7831*cfb92d14SAndroid Build Coastguard Worker      * - `34`: MLE Counters TLV
7832*cfb92d14SAndroid Build Coastguard Worker      * - `35`: Vendor App URL TLV
7833*cfb92d14SAndroid Build Coastguard Worker      * @par
7834*cfb92d14SAndroid Build Coastguard Worker      * Sends a network diagnostic request to retrieve specified Type Length Values (TLVs)
7835*cfb92d14SAndroid Build Coastguard Worker      * for the specified addresses(es).
7836*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadSendDiagnosticGet
7837*cfb92d14SAndroid Build Coastguard Worker      */
7838*cfb92d14SAndroid Build Coastguard Worker 
7839*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "get")
7840*cfb92d14SAndroid Build Coastguard Worker     {
7841*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otThreadSendDiagnosticGet(GetInstancePtr(), &address, tlvTypes, count,
7842*cfb92d14SAndroid Build Coastguard Worker                                                         &Interpreter::HandleDiagnosticGetResponse, this));
7843*cfb92d14SAndroid Build Coastguard Worker         SetCommandTimeout(kNetworkDiagnosticTimeoutMsecs);
7844*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_PENDING;
7845*cfb92d14SAndroid Build Coastguard Worker     }
7846*cfb92d14SAndroid Build Coastguard Worker     /**
7847*cfb92d14SAndroid Build Coastguard Worker      * @cli networkdiagnostic reset
7848*cfb92d14SAndroid Build Coastguard Worker      * @code
7849*cfb92d14SAndroid Build Coastguard Worker      * networkdiagnostic reset fd00:db8::ff:fe00:0 9
7850*cfb92d14SAndroid Build Coastguard Worker      * Done
7851*cfb92d14SAndroid Build Coastguard Worker      * @endcode
7852*cfb92d14SAndroid Build Coastguard Worker      * @cparam networkdiagnostic reset @ca{addr} @ca{type(s)}
7853*cfb92d14SAndroid Build Coastguard Worker      * @par
7854*cfb92d14SAndroid Build Coastguard Worker      * Sends a network diagnostic request to reset the specified Type Length Values (TLVs)
7855*cfb92d14SAndroid Build Coastguard Worker      * on the specified address(es). This command only supports the
7856*cfb92d14SAndroid Build Coastguard Worker      * following TLV values: `9` (MAC Counters TLV) or `34` (MLE
7857*cfb92d14SAndroid Build Coastguard Worker      * Counters TLV)
7858*cfb92d14SAndroid Build Coastguard Worker      * @sa otThreadSendDiagnosticReset
7859*cfb92d14SAndroid Build Coastguard Worker      */
7860*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "reset")
7861*cfb92d14SAndroid Build Coastguard Worker     {
7862*cfb92d14SAndroid Build Coastguard Worker         IgnoreError(otThreadSendDiagnosticReset(GetInstancePtr(), &address, tlvTypes, count));
7863*cfb92d14SAndroid Build Coastguard Worker     }
7864*cfb92d14SAndroid Build Coastguard Worker     else
7865*cfb92d14SAndroid Build Coastguard Worker     {
7866*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_COMMAND;
7867*cfb92d14SAndroid Build Coastguard Worker     }
7868*cfb92d14SAndroid Build Coastguard Worker 
7869*cfb92d14SAndroid Build Coastguard Worker exit:
7870*cfb92d14SAndroid Build Coastguard Worker     return error;
7871*cfb92d14SAndroid Build Coastguard Worker }
7872*cfb92d14SAndroid Build Coastguard Worker 
HandleDiagnosticGetResponse(otError aError,otMessage * aMessage,const otMessageInfo * aMessageInfo,void * aContext)7873*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleDiagnosticGetResponse(otError              aError,
7874*cfb92d14SAndroid Build Coastguard Worker                                               otMessage           *aMessage,
7875*cfb92d14SAndroid Build Coastguard Worker                                               const otMessageInfo *aMessageInfo,
7876*cfb92d14SAndroid Build Coastguard Worker                                               void                *aContext)
7877*cfb92d14SAndroid Build Coastguard Worker {
7878*cfb92d14SAndroid Build Coastguard Worker     static_cast<Interpreter *>(aContext)->HandleDiagnosticGetResponse(
7879*cfb92d14SAndroid Build Coastguard Worker         aError, aMessage, static_cast<const Ip6::MessageInfo *>(aMessageInfo));
7880*cfb92d14SAndroid Build Coastguard Worker }
7881*cfb92d14SAndroid Build Coastguard Worker 
HandleDiagnosticGetResponse(otError aError,const otMessage * aMessage,const Ip6::MessageInfo * aMessageInfo)7882*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleDiagnosticGetResponse(otError                 aError,
7883*cfb92d14SAndroid Build Coastguard Worker                                               const otMessage        *aMessage,
7884*cfb92d14SAndroid Build Coastguard Worker                                               const Ip6::MessageInfo *aMessageInfo)
7885*cfb92d14SAndroid Build Coastguard Worker {
7886*cfb92d14SAndroid Build Coastguard Worker     uint8_t               buf[16];
7887*cfb92d14SAndroid Build Coastguard Worker     uint16_t              bytesToPrint;
7888*cfb92d14SAndroid Build Coastguard Worker     uint16_t              bytesPrinted = 0;
7889*cfb92d14SAndroid Build Coastguard Worker     uint16_t              length;
7890*cfb92d14SAndroid Build Coastguard Worker     otNetworkDiagTlv      diagTlv;
7891*cfb92d14SAndroid Build Coastguard Worker     otNetworkDiagIterator iterator = OT_NETWORK_DIAGNOSTIC_ITERATOR_INIT;
7892*cfb92d14SAndroid Build Coastguard Worker 
7893*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(aError);
7894*cfb92d14SAndroid Build Coastguard Worker 
7895*cfb92d14SAndroid Build Coastguard Worker     OutputFormat("DIAG_GET.rsp/ans from ");
7896*cfb92d14SAndroid Build Coastguard Worker     OutputIp6Address(aMessageInfo->mPeerAddr);
7897*cfb92d14SAndroid Build Coastguard Worker     OutputFormat(": ");
7898*cfb92d14SAndroid Build Coastguard Worker 
7899*cfb92d14SAndroid Build Coastguard Worker     length = otMessageGetLength(aMessage) - otMessageGetOffset(aMessage);
7900*cfb92d14SAndroid Build Coastguard Worker 
7901*cfb92d14SAndroid Build Coastguard Worker     while (length > 0)
7902*cfb92d14SAndroid Build Coastguard Worker     {
7903*cfb92d14SAndroid Build Coastguard Worker         bytesToPrint = Min(length, static_cast<uint16_t>(sizeof(buf)));
7904*cfb92d14SAndroid Build Coastguard Worker         otMessageRead(aMessage, otMessageGetOffset(aMessage) + bytesPrinted, buf, bytesToPrint);
7905*cfb92d14SAndroid Build Coastguard Worker 
7906*cfb92d14SAndroid Build Coastguard Worker         OutputBytes(buf, static_cast<uint8_t>(bytesToPrint));
7907*cfb92d14SAndroid Build Coastguard Worker 
7908*cfb92d14SAndroid Build Coastguard Worker         length -= bytesToPrint;
7909*cfb92d14SAndroid Build Coastguard Worker         bytesPrinted += bytesToPrint;
7910*cfb92d14SAndroid Build Coastguard Worker     }
7911*cfb92d14SAndroid Build Coastguard Worker 
7912*cfb92d14SAndroid Build Coastguard Worker     OutputNewLine();
7913*cfb92d14SAndroid Build Coastguard Worker 
7914*cfb92d14SAndroid Build Coastguard Worker     // Output Network Diagnostic TLV values in standard YAML format.
7915*cfb92d14SAndroid Build Coastguard Worker     while (otThreadGetNextDiagnosticTlv(aMessage, &iterator, &diagTlv) == OT_ERROR_NONE)
7916*cfb92d14SAndroid Build Coastguard Worker     {
7917*cfb92d14SAndroid Build Coastguard Worker         switch (diagTlv.mType)
7918*cfb92d14SAndroid Build Coastguard Worker         {
7919*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_EXT_ADDRESS:
7920*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("Ext Address: ");
7921*cfb92d14SAndroid Build Coastguard Worker             OutputExtAddressLine(diagTlv.mData.mExtAddress);
7922*cfb92d14SAndroid Build Coastguard Worker             break;
7923*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_SHORT_ADDRESS:
7924*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Rloc16: 0x%04x", diagTlv.mData.mAddr16);
7925*cfb92d14SAndroid Build Coastguard Worker             break;
7926*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_MODE:
7927*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Mode:");
7928*cfb92d14SAndroid Build Coastguard Worker             OutputMode(kIndentSize, diagTlv.mData.mMode);
7929*cfb92d14SAndroid Build Coastguard Worker             break;
7930*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_TIMEOUT:
7931*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Timeout: %lu", ToUlong(diagTlv.mData.mTimeout));
7932*cfb92d14SAndroid Build Coastguard Worker             break;
7933*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_CONNECTIVITY:
7934*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Connectivity:");
7935*cfb92d14SAndroid Build Coastguard Worker             OutputConnectivity(kIndentSize, diagTlv.mData.mConnectivity);
7936*cfb92d14SAndroid Build Coastguard Worker             break;
7937*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_ROUTE:
7938*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Route:");
7939*cfb92d14SAndroid Build Coastguard Worker             OutputRoute(kIndentSize, diagTlv.mData.mRoute);
7940*cfb92d14SAndroid Build Coastguard Worker             break;
7941*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_LEADER_DATA:
7942*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Leader Data:");
7943*cfb92d14SAndroid Build Coastguard Worker             OutputLeaderData(kIndentSize, diagTlv.mData.mLeaderData);
7944*cfb92d14SAndroid Build Coastguard Worker             break;
7945*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_NETWORK_DATA:
7946*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("Network Data: ");
7947*cfb92d14SAndroid Build Coastguard Worker             OutputBytesLine(diagTlv.mData.mNetworkData.m8, diagTlv.mData.mNetworkData.mCount);
7948*cfb92d14SAndroid Build Coastguard Worker             break;
7949*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_IP6_ADDR_LIST:
7950*cfb92d14SAndroid Build Coastguard Worker             OutputLine("IP6 Address List:");
7951*cfb92d14SAndroid Build Coastguard Worker             for (uint16_t i = 0; i < diagTlv.mData.mIp6AddrList.mCount; ++i)
7952*cfb92d14SAndroid Build Coastguard Worker             {
7953*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat(kIndentSize, "- ");
7954*cfb92d14SAndroid Build Coastguard Worker                 OutputIp6AddressLine(diagTlv.mData.mIp6AddrList.mList[i]);
7955*cfb92d14SAndroid Build Coastguard Worker             }
7956*cfb92d14SAndroid Build Coastguard Worker             break;
7957*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_MAC_COUNTERS:
7958*cfb92d14SAndroid Build Coastguard Worker             OutputLine("MAC Counters:");
7959*cfb92d14SAndroid Build Coastguard Worker             OutputNetworkDiagMacCounters(kIndentSize, diagTlv.mData.mMacCounters);
7960*cfb92d14SAndroid Build Coastguard Worker             break;
7961*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_MLE_COUNTERS:
7962*cfb92d14SAndroid Build Coastguard Worker             OutputLine("MLE Counters:");
7963*cfb92d14SAndroid Build Coastguard Worker             OutputNetworkDiagMleCounters(kIndentSize, diagTlv.mData.mMleCounters);
7964*cfb92d14SAndroid Build Coastguard Worker             break;
7965*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_BATTERY_LEVEL:
7966*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Battery Level: %u%%", diagTlv.mData.mBatteryLevel);
7967*cfb92d14SAndroid Build Coastguard Worker             break;
7968*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_SUPPLY_VOLTAGE:
7969*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Supply Voltage: %umV", diagTlv.mData.mSupplyVoltage);
7970*cfb92d14SAndroid Build Coastguard Worker             break;
7971*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_CHILD_TABLE:
7972*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Child Table:");
7973*cfb92d14SAndroid Build Coastguard Worker             for (uint16_t i = 0; i < diagTlv.mData.mChildTable.mCount; ++i)
7974*cfb92d14SAndroid Build Coastguard Worker             {
7975*cfb92d14SAndroid Build Coastguard Worker                 OutputFormat(kIndentSize, "- ");
7976*cfb92d14SAndroid Build Coastguard Worker                 OutputChildTableEntry(kIndentSize + 2, diagTlv.mData.mChildTable.mTable[i]);
7977*cfb92d14SAndroid Build Coastguard Worker             }
7978*cfb92d14SAndroid Build Coastguard Worker             break;
7979*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_CHANNEL_PAGES:
7980*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("Channel Pages: '");
7981*cfb92d14SAndroid Build Coastguard Worker             OutputBytes(diagTlv.mData.mChannelPages.m8, diagTlv.mData.mChannelPages.mCount);
7982*cfb92d14SAndroid Build Coastguard Worker             OutputLine("'");
7983*cfb92d14SAndroid Build Coastguard Worker             break;
7984*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_MAX_CHILD_TIMEOUT:
7985*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Max Child Timeout: %lu", ToUlong(diagTlv.mData.mMaxChildTimeout));
7986*cfb92d14SAndroid Build Coastguard Worker             break;
7987*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_EUI64:
7988*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("EUI64: ");
7989*cfb92d14SAndroid Build Coastguard Worker             OutputExtAddressLine(diagTlv.mData.mEui64);
7990*cfb92d14SAndroid Build Coastguard Worker             break;
7991*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_VENDOR_NAME:
7992*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Vendor Name: %s", diagTlv.mData.mVendorName);
7993*cfb92d14SAndroid Build Coastguard Worker             break;
7994*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_VENDOR_MODEL:
7995*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Vendor Model: %s", diagTlv.mData.mVendorModel);
7996*cfb92d14SAndroid Build Coastguard Worker             break;
7997*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_VENDOR_SW_VERSION:
7998*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Vendor SW Version: %s", diagTlv.mData.mVendorSwVersion);
7999*cfb92d14SAndroid Build Coastguard Worker             break;
8000*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_VENDOR_APP_URL:
8001*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Vendor App URL: %s", diagTlv.mData.mVendorAppUrl);
8002*cfb92d14SAndroid Build Coastguard Worker             break;
8003*cfb92d14SAndroid Build Coastguard Worker         case OT_NETWORK_DIAGNOSTIC_TLV_THREAD_STACK_VERSION:
8004*cfb92d14SAndroid Build Coastguard Worker             OutputLine("Thread Stack Version: %s", diagTlv.mData.mThreadStackVersion);
8005*cfb92d14SAndroid Build Coastguard Worker             break;
8006*cfb92d14SAndroid Build Coastguard Worker         default:
8007*cfb92d14SAndroid Build Coastguard Worker             break;
8008*cfb92d14SAndroid Build Coastguard Worker         }
8009*cfb92d14SAndroid Build Coastguard Worker     }
8010*cfb92d14SAndroid Build Coastguard Worker 
8011*cfb92d14SAndroid Build Coastguard Worker exit:
8012*cfb92d14SAndroid Build Coastguard Worker     return;
8013*cfb92d14SAndroid Build Coastguard Worker }
8014*cfb92d14SAndroid Build Coastguard Worker 
OutputMode(uint8_t aIndentSize,const otLinkModeConfig & aMode)8015*cfb92d14SAndroid Build Coastguard Worker void Interpreter::OutputMode(uint8_t aIndentSize, const otLinkModeConfig &aMode)
8016*cfb92d14SAndroid Build Coastguard Worker {
8017*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "RxOnWhenIdle: %d", aMode.mRxOnWhenIdle);
8018*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "DeviceType: %d", aMode.mDeviceType);
8019*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "NetworkData: %d", aMode.mNetworkData);
8020*cfb92d14SAndroid Build Coastguard Worker }
8021*cfb92d14SAndroid Build Coastguard Worker 
OutputConnectivity(uint8_t aIndentSize,const otNetworkDiagConnectivity & aConnectivity)8022*cfb92d14SAndroid Build Coastguard Worker void Interpreter::OutputConnectivity(uint8_t aIndentSize, const otNetworkDiagConnectivity &aConnectivity)
8023*cfb92d14SAndroid Build Coastguard Worker {
8024*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "ParentPriority: %d", aConnectivity.mParentPriority);
8025*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "LinkQuality3: %u", aConnectivity.mLinkQuality3);
8026*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "LinkQuality2: %u", aConnectivity.mLinkQuality2);
8027*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "LinkQuality1: %u", aConnectivity.mLinkQuality1);
8028*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "LeaderCost: %u", aConnectivity.mLeaderCost);
8029*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "IdSequence: %u", aConnectivity.mIdSequence);
8030*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "ActiveRouters: %u", aConnectivity.mActiveRouters);
8031*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "SedBufferSize: %u", aConnectivity.mSedBufferSize);
8032*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "SedDatagramCount: %u", aConnectivity.mSedDatagramCount);
8033*cfb92d14SAndroid Build Coastguard Worker }
OutputRoute(uint8_t aIndentSize,const otNetworkDiagRoute & aRoute)8034*cfb92d14SAndroid Build Coastguard Worker void Interpreter::OutputRoute(uint8_t aIndentSize, const otNetworkDiagRoute &aRoute)
8035*cfb92d14SAndroid Build Coastguard Worker {
8036*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "IdSequence: %u", aRoute.mIdSequence);
8037*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "RouteData:");
8038*cfb92d14SAndroid Build Coastguard Worker 
8039*cfb92d14SAndroid Build Coastguard Worker     aIndentSize += kIndentSize;
8040*cfb92d14SAndroid Build Coastguard Worker     for (uint16_t i = 0; i < aRoute.mRouteCount; ++i)
8041*cfb92d14SAndroid Build Coastguard Worker     {
8042*cfb92d14SAndroid Build Coastguard Worker         OutputFormat(aIndentSize, "- ");
8043*cfb92d14SAndroid Build Coastguard Worker         OutputRouteData(aIndentSize + 2, aRoute.mRouteData[i]);
8044*cfb92d14SAndroid Build Coastguard Worker     }
8045*cfb92d14SAndroid Build Coastguard Worker }
8046*cfb92d14SAndroid Build Coastguard Worker 
OutputRouteData(uint8_t aIndentSize,const otNetworkDiagRouteData & aRouteData)8047*cfb92d14SAndroid Build Coastguard Worker void Interpreter::OutputRouteData(uint8_t aIndentSize, const otNetworkDiagRouteData &aRouteData)
8048*cfb92d14SAndroid Build Coastguard Worker {
8049*cfb92d14SAndroid Build Coastguard Worker     OutputLine("RouteId: 0x%02x", aRouteData.mRouterId);
8050*cfb92d14SAndroid Build Coastguard Worker 
8051*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "LinkQualityOut: %u", aRouteData.mLinkQualityOut);
8052*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "LinkQualityIn: %u", aRouteData.mLinkQualityIn);
8053*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "RouteCost: %u", aRouteData.mRouteCost);
8054*cfb92d14SAndroid Build Coastguard Worker }
8055*cfb92d14SAndroid Build Coastguard Worker 
OutputLeaderData(uint8_t aIndentSize,const otLeaderData & aLeaderData)8056*cfb92d14SAndroid Build Coastguard Worker void Interpreter::OutputLeaderData(uint8_t aIndentSize, const otLeaderData &aLeaderData)
8057*cfb92d14SAndroid Build Coastguard Worker {
8058*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "PartitionId: 0x%08lx", ToUlong(aLeaderData.mPartitionId));
8059*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "Weighting: %u", aLeaderData.mWeighting);
8060*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "DataVersion: %u", aLeaderData.mDataVersion);
8061*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "StableDataVersion: %u", aLeaderData.mStableDataVersion);
8062*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "LeaderRouterId: 0x%02x", aLeaderData.mLeaderRouterId);
8063*cfb92d14SAndroid Build Coastguard Worker }
8064*cfb92d14SAndroid Build Coastguard Worker 
OutputNetworkDiagMacCounters(uint8_t aIndentSize,const otNetworkDiagMacCounters & aMacCounters)8065*cfb92d14SAndroid Build Coastguard Worker void Interpreter::OutputNetworkDiagMacCounters(uint8_t aIndentSize, const otNetworkDiagMacCounters &aMacCounters)
8066*cfb92d14SAndroid Build Coastguard Worker {
8067*cfb92d14SAndroid Build Coastguard Worker     struct CounterName
8068*cfb92d14SAndroid Build Coastguard Worker     {
8069*cfb92d14SAndroid Build Coastguard Worker         const uint32_t otNetworkDiagMacCounters::*mValuePtr;
8070*cfb92d14SAndroid Build Coastguard Worker         const char                               *mName;
8071*cfb92d14SAndroid Build Coastguard Worker     };
8072*cfb92d14SAndroid Build Coastguard Worker 
8073*cfb92d14SAndroid Build Coastguard Worker     static const CounterName kCounterNames[] = {
8074*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMacCounters::mIfInUnknownProtos, "IfInUnknownProtos"},
8075*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMacCounters::mIfInErrors, "IfInErrors"},
8076*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMacCounters::mIfOutErrors, "IfOutErrors"},
8077*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMacCounters::mIfInUcastPkts, "IfInUcastPkts"},
8078*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMacCounters::mIfInBroadcastPkts, "IfInBroadcastPkts"},
8079*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMacCounters::mIfInDiscards, "IfInDiscards"},
8080*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMacCounters::mIfOutUcastPkts, "IfOutUcastPkts"},
8081*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMacCounters::mIfOutBroadcastPkts, "IfOutBroadcastPkts"},
8082*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMacCounters::mIfOutDiscards, "IfOutDiscards"},
8083*cfb92d14SAndroid Build Coastguard Worker     };
8084*cfb92d14SAndroid Build Coastguard Worker 
8085*cfb92d14SAndroid Build Coastguard Worker     for (const CounterName &counter : kCounterNames)
8086*cfb92d14SAndroid Build Coastguard Worker     {
8087*cfb92d14SAndroid Build Coastguard Worker         OutputLine(aIndentSize, "%s: %lu", counter.mName, ToUlong(aMacCounters.*counter.mValuePtr));
8088*cfb92d14SAndroid Build Coastguard Worker     }
8089*cfb92d14SAndroid Build Coastguard Worker }
8090*cfb92d14SAndroid Build Coastguard Worker 
OutputNetworkDiagMleCounters(uint8_t aIndentSize,const otNetworkDiagMleCounters & aMleCounters)8091*cfb92d14SAndroid Build Coastguard Worker void Interpreter::OutputNetworkDiagMleCounters(uint8_t aIndentSize, const otNetworkDiagMleCounters &aMleCounters)
8092*cfb92d14SAndroid Build Coastguard Worker {
8093*cfb92d14SAndroid Build Coastguard Worker     struct CounterName
8094*cfb92d14SAndroid Build Coastguard Worker     {
8095*cfb92d14SAndroid Build Coastguard Worker         const uint16_t otNetworkDiagMleCounters::*mValuePtr;
8096*cfb92d14SAndroid Build Coastguard Worker         const char                               *mName;
8097*cfb92d14SAndroid Build Coastguard Worker     };
8098*cfb92d14SAndroid Build Coastguard Worker 
8099*cfb92d14SAndroid Build Coastguard Worker     struct TimeCounterName
8100*cfb92d14SAndroid Build Coastguard Worker     {
8101*cfb92d14SAndroid Build Coastguard Worker         const uint64_t otNetworkDiagMleCounters::*mValuePtr;
8102*cfb92d14SAndroid Build Coastguard Worker         const char                               *mName;
8103*cfb92d14SAndroid Build Coastguard Worker     };
8104*cfb92d14SAndroid Build Coastguard Worker 
8105*cfb92d14SAndroid Build Coastguard Worker     static const CounterName kCounterNames[] = {
8106*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMleCounters::mDisabledRole, "DisabledRole"},
8107*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMleCounters::mDetachedRole, "DetachedRole"},
8108*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMleCounters::mChildRole, "ChildRole"},
8109*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMleCounters::mRouterRole, "RouterRole"},
8110*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMleCounters::mLeaderRole, "LeaderRole"},
8111*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMleCounters::mAttachAttempts, "AttachAttempts"},
8112*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMleCounters::mPartitionIdChanges, "PartitionIdChanges"},
8113*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMleCounters::mBetterPartitionAttachAttempts, "BetterPartitionAttachAttempts"},
8114*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMleCounters::mParentChanges, "ParentChanges"},
8115*cfb92d14SAndroid Build Coastguard Worker     };
8116*cfb92d14SAndroid Build Coastguard Worker 
8117*cfb92d14SAndroid Build Coastguard Worker     static const TimeCounterName kTimeCounterNames[] = {
8118*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMleCounters::mTrackedTime, "TrackedTime"},
8119*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMleCounters::mDisabledTime, "DisabledTime"},
8120*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMleCounters::mDetachedTime, "DetachedTime"},
8121*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMleCounters::mChildTime, "ChildTime"},
8122*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMleCounters::mRouterTime, "RouterTime"},
8123*cfb92d14SAndroid Build Coastguard Worker         {&otNetworkDiagMleCounters::mLeaderTime, "LeaderTime"},
8124*cfb92d14SAndroid Build Coastguard Worker     };
8125*cfb92d14SAndroid Build Coastguard Worker 
8126*cfb92d14SAndroid Build Coastguard Worker     for (const CounterName &counter : kCounterNames)
8127*cfb92d14SAndroid Build Coastguard Worker     {
8128*cfb92d14SAndroid Build Coastguard Worker         OutputLine(aIndentSize, "%s: %u", counter.mName, aMleCounters.*counter.mValuePtr);
8129*cfb92d14SAndroid Build Coastguard Worker     }
8130*cfb92d14SAndroid Build Coastguard Worker 
8131*cfb92d14SAndroid Build Coastguard Worker     for (const TimeCounterName &counter : kTimeCounterNames)
8132*cfb92d14SAndroid Build Coastguard Worker     {
8133*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("%s: ", counter.mName);
8134*cfb92d14SAndroid Build Coastguard Worker         OutputUint64Line(aMleCounters.*counter.mValuePtr);
8135*cfb92d14SAndroid Build Coastguard Worker     }
8136*cfb92d14SAndroid Build Coastguard Worker }
8137*cfb92d14SAndroid Build Coastguard Worker 
OutputChildTableEntry(uint8_t aIndentSize,const otNetworkDiagChildEntry & aChildEntry)8138*cfb92d14SAndroid Build Coastguard Worker void Interpreter::OutputChildTableEntry(uint8_t aIndentSize, const otNetworkDiagChildEntry &aChildEntry)
8139*cfb92d14SAndroid Build Coastguard Worker {
8140*cfb92d14SAndroid Build Coastguard Worker     OutputLine("ChildId: 0x%04x", aChildEntry.mChildId);
8141*cfb92d14SAndroid Build Coastguard Worker 
8142*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "Timeout: %u", aChildEntry.mTimeout);
8143*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "Link Quality: %u", aChildEntry.mLinkQuality);
8144*cfb92d14SAndroid Build Coastguard Worker     OutputLine(aIndentSize, "Mode:");
8145*cfb92d14SAndroid Build Coastguard Worker     OutputMode(aIndentSize + kIndentSize, aChildEntry.mMode);
8146*cfb92d14SAndroid Build Coastguard Worker }
8147*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_TMF_NETDIAG_CLIENT_ENABLE
8148*cfb92d14SAndroid Build Coastguard Worker 
8149*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
HandleDiscoveryRequest(const otThreadDiscoveryRequestInfo * aInfo,void * aContext)8150*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleDiscoveryRequest(const otThreadDiscoveryRequestInfo *aInfo, void *aContext)
8151*cfb92d14SAndroid Build Coastguard Worker {
8152*cfb92d14SAndroid Build Coastguard Worker     static_cast<Interpreter *>(aContext)->HandleDiscoveryRequest(*aInfo);
8153*cfb92d14SAndroid Build Coastguard Worker }
8154*cfb92d14SAndroid Build Coastguard Worker 
HandleDiscoveryRequest(const otThreadDiscoveryRequestInfo & aInfo)8155*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleDiscoveryRequest(const otThreadDiscoveryRequestInfo &aInfo)
8156*cfb92d14SAndroid Build Coastguard Worker {
8157*cfb92d14SAndroid Build Coastguard Worker     OutputFormat("~ Discovery Request from ");
8158*cfb92d14SAndroid Build Coastguard Worker     OutputExtAddress(aInfo.mExtAddress);
8159*cfb92d14SAndroid Build Coastguard Worker     OutputLine(": version=%u,joiner=%d", aInfo.mVersion, aInfo.mIsJoiner);
8160*cfb92d14SAndroid Build Coastguard Worker }
8161*cfb92d14SAndroid Build Coastguard Worker #endif
8162*cfb92d14SAndroid Build Coastguard Worker 
8163*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_CLI_REGISTER_IP6_RECV_CALLBACK
HandleIp6Receive(otMessage * aMessage,void * aContext)8164*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleIp6Receive(otMessage *aMessage, void *aContext)
8165*cfb92d14SAndroid Build Coastguard Worker {
8166*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aContext);
8167*cfb92d14SAndroid Build Coastguard Worker 
8168*cfb92d14SAndroid Build Coastguard Worker     otMessageFree(aMessage);
8169*cfb92d14SAndroid Build Coastguard Worker }
8170*cfb92d14SAndroid Build Coastguard Worker #endif
8171*cfb92d14SAndroid Build Coastguard Worker 
8172*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_VERHOEFF_CHECKSUM_ENABLE
8173*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])8174*cfb92d14SAndroid Build Coastguard Worker template <> otError Interpreter::Process<Cmd("verhoeff")>(Arg aArgs[])
8175*cfb92d14SAndroid Build Coastguard Worker {
8176*cfb92d14SAndroid Build Coastguard Worker     otError error;
8177*cfb92d14SAndroid Build Coastguard Worker 
8178*cfb92d14SAndroid Build Coastguard Worker     /**
8179*cfb92d14SAndroid Build Coastguard Worker      * @cli verhoeff calculate
8180*cfb92d14SAndroid Build Coastguard Worker      * @code
8181*cfb92d14SAndroid Build Coastguard Worker      * verhoeff calculate 30731842
8182*cfb92d14SAndroid Build Coastguard Worker      * 1
8183*cfb92d14SAndroid Build Coastguard Worker      * Done
8184*cfb92d14SAndroid Build Coastguard Worker      * @endcode
8185*cfb92d14SAndroid Build Coastguard Worker      * @cparam verhoeff calculate @ca{decimalstring}
8186*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
8187*cfb92d14SAndroid Build Coastguard Worker      * #otVerhoeffChecksumCalculate
8188*cfb92d14SAndroid Build Coastguard Worker      */
8189*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "calculate")
8190*cfb92d14SAndroid Build Coastguard Worker     {
8191*cfb92d14SAndroid Build Coastguard Worker         char checksum;
8192*cfb92d14SAndroid Build Coastguard Worker 
8193*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(!aArgs[1].IsEmpty() && aArgs[2].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
8194*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otVerhoeffChecksumCalculate(aArgs[1].GetCString(), &checksum));
8195*cfb92d14SAndroid Build Coastguard Worker         OutputLine("%c", checksum);
8196*cfb92d14SAndroid Build Coastguard Worker     }
8197*cfb92d14SAndroid Build Coastguard Worker     /**
8198*cfb92d14SAndroid Build Coastguard Worker      * @cli verhoeff validate
8199*cfb92d14SAndroid Build Coastguard Worker      * @code
8200*cfb92d14SAndroid Build Coastguard Worker      * verhoeff validate 307318421
8201*cfb92d14SAndroid Build Coastguard Worker      * Done
8202*cfb92d14SAndroid Build Coastguard Worker      * @endcode
8203*cfb92d14SAndroid Build Coastguard Worker      * @cparam verhoeff validate @ca{decimalstring}
8204*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
8205*cfb92d14SAndroid Build Coastguard Worker      * #otVerhoeffChecksumValidate
8206*cfb92d14SAndroid Build Coastguard Worker      */
8207*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "validate")
8208*cfb92d14SAndroid Build Coastguard Worker     {
8209*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(!aArgs[1].IsEmpty() && aArgs[2].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
8210*cfb92d14SAndroid Build Coastguard Worker         error = otVerhoeffChecksumValidate(aArgs[1].GetCString());
8211*cfb92d14SAndroid Build Coastguard Worker     }
8212*cfb92d14SAndroid Build Coastguard Worker     else
8213*cfb92d14SAndroid Build Coastguard Worker     {
8214*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_COMMAND;
8215*cfb92d14SAndroid Build Coastguard Worker     }
8216*cfb92d14SAndroid Build Coastguard Worker 
8217*cfb92d14SAndroid Build Coastguard Worker exit:
8218*cfb92d14SAndroid Build Coastguard Worker     return error;
8219*cfb92d14SAndroid Build Coastguard Worker }
8220*cfb92d14SAndroid Build Coastguard Worker 
8221*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_VERHOEFF_CHECKSUM_ENABLE
8222*cfb92d14SAndroid Build Coastguard Worker 
8223*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_FTD || OPENTHREAD_MTD
8224*cfb92d14SAndroid Build Coastguard Worker 
Initialize(otInstance * aInstance,otCliOutputCallback aCallback,void * aContext)8225*cfb92d14SAndroid Build Coastguard Worker void Interpreter::Initialize(otInstance *aInstance, otCliOutputCallback aCallback, void *aContext)
8226*cfb92d14SAndroid Build Coastguard Worker {
8227*cfb92d14SAndroid Build Coastguard Worker     Instance *instance = static_cast<Instance *>(aInstance);
8228*cfb92d14SAndroid Build Coastguard Worker 
8229*cfb92d14SAndroid Build Coastguard Worker     Interpreter::sInterpreter = new (&sInterpreterRaw) Interpreter(instance, aCallback, aContext);
8230*cfb92d14SAndroid Build Coastguard Worker }
8231*cfb92d14SAndroid Build Coastguard Worker 
OutputPrompt(void)8232*cfb92d14SAndroid Build Coastguard Worker void Interpreter::OutputPrompt(void)
8233*cfb92d14SAndroid Build Coastguard Worker {
8234*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_CLI_PROMPT_ENABLE
8235*cfb92d14SAndroid Build Coastguard Worker     static const char sPrompt[] = "> ";
8236*cfb92d14SAndroid Build Coastguard Worker 
8237*cfb92d14SAndroid Build Coastguard Worker     // The `OutputFormat()` below is adding the prompt which is not
8238*cfb92d14SAndroid Build Coastguard Worker     // part of any command output, so we set the `EmittingCommandOutput`
8239*cfb92d14SAndroid Build Coastguard Worker     // flag to false to avoid it being included in the command output
8240*cfb92d14SAndroid Build Coastguard Worker     // log (under `OPENTHREAD_CONFIG_CLI_LOG_INPUT_OUTPUT_ENABLE`).
8241*cfb92d14SAndroid Build Coastguard Worker 
8242*cfb92d14SAndroid Build Coastguard Worker     SetEmittingCommandOutput(false);
8243*cfb92d14SAndroid Build Coastguard Worker     OutputFormat("%s", sPrompt);
8244*cfb92d14SAndroid Build Coastguard Worker     SetEmittingCommandOutput(true);
8245*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_CLI_PROMPT_ENABLE
8246*cfb92d14SAndroid Build Coastguard Worker }
8247*cfb92d14SAndroid Build Coastguard Worker 
HandleTimer(Timer & aTimer)8248*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleTimer(Timer &aTimer)
8249*cfb92d14SAndroid Build Coastguard Worker {
8250*cfb92d14SAndroid Build Coastguard Worker     static_cast<Interpreter *>(static_cast<TimerMilliContext &>(aTimer).GetContext())->HandleTimer();
8251*cfb92d14SAndroid Build Coastguard Worker }
8252*cfb92d14SAndroid Build Coastguard Worker 
HandleTimer(void)8253*cfb92d14SAndroid Build Coastguard Worker void Interpreter::HandleTimer(void)
8254*cfb92d14SAndroid Build Coastguard Worker {
8255*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_TMF_ANYCAST_LOCATOR_ENABLE
8256*cfb92d14SAndroid Build Coastguard Worker     if (mLocateInProgress)
8257*cfb92d14SAndroid Build Coastguard Worker     {
8258*cfb92d14SAndroid Build Coastguard Worker         mLocateInProgress = false;
8259*cfb92d14SAndroid Build Coastguard Worker         OutputResult(OT_ERROR_RESPONSE_TIMEOUT);
8260*cfb92d14SAndroid Build Coastguard Worker     }
8261*cfb92d14SAndroid Build Coastguard Worker     else
8262*cfb92d14SAndroid Build Coastguard Worker #endif
8263*cfb92d14SAndroid Build Coastguard Worker     {
8264*cfb92d14SAndroid Build Coastguard Worker         OutputResult(OT_ERROR_NONE);
8265*cfb92d14SAndroid Build Coastguard Worker     }
8266*cfb92d14SAndroid Build Coastguard Worker }
8267*cfb92d14SAndroid Build Coastguard Worker 
SetCommandTimeout(uint32_t aTimeoutMilli)8268*cfb92d14SAndroid Build Coastguard Worker void Interpreter::SetCommandTimeout(uint32_t aTimeoutMilli)
8269*cfb92d14SAndroid Build Coastguard Worker {
8270*cfb92d14SAndroid Build Coastguard Worker     OT_ASSERT(mCommandIsPending);
8271*cfb92d14SAndroid Build Coastguard Worker     mTimer.Start(aTimeoutMilli);
8272*cfb92d14SAndroid Build Coastguard Worker }
8273*cfb92d14SAndroid Build Coastguard Worker 
ProcessCommand(Arg aArgs[])8274*cfb92d14SAndroid Build Coastguard Worker otError Interpreter::ProcessCommand(Arg aArgs[])
8275*cfb92d14SAndroid Build Coastguard Worker {
8276*cfb92d14SAndroid Build Coastguard Worker #define CmdEntry(aCommandString)                                   \
8277*cfb92d14SAndroid Build Coastguard Worker     {                                                              \
8278*cfb92d14SAndroid Build Coastguard Worker         aCommandString, &Interpreter::Process<Cmd(aCommandString)> \
8279*cfb92d14SAndroid Build Coastguard Worker     }
8280*cfb92d14SAndroid Build Coastguard Worker 
8281*cfb92d14SAndroid Build Coastguard Worker     static constexpr Command kCommands[] = {
8282*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD || OPENTHREAD_MTD
8283*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_AGENT_ENABLE
8284*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("ba"),
8285*cfb92d14SAndroid Build Coastguard Worker #endif
8286*cfb92d14SAndroid Build Coastguard Worker #if (OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2)
8287*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("bbr"),
8288*cfb92d14SAndroid Build Coastguard Worker #endif
8289*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE
8290*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("br"),
8291*cfb92d14SAndroid Build Coastguard Worker #endif
8292*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("bufferinfo"),
8293*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("ccathreshold"),
8294*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
8295*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("ccm"),
8296*cfb92d14SAndroid Build Coastguard Worker #endif
8297*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("channel"),
8298*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
8299*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("child"),
8300*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("childip"),
8301*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("childmax"),
8302*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("childrouterlinks"),
8303*cfb92d14SAndroid Build Coastguard Worker #endif
8304*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("childsupervision"),
8305*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("childtimeout"),
8306*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_API_ENABLE
8307*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("coap"),
8308*cfb92d14SAndroid Build Coastguard Worker #endif
8309*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_SECURE_API_ENABLE
8310*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("coaps"),
8311*cfb92d14SAndroid Build Coastguard Worker #endif
8312*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_RADIO_COEX_ENABLE
8313*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("coex"),
8314*cfb92d14SAndroid Build Coastguard Worker #endif
8315*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE && OPENTHREAD_FTD
8316*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("commissioner"),
8317*cfb92d14SAndroid Build Coastguard Worker #endif
8318*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
8319*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("contextreusedelay"),
8320*cfb92d14SAndroid Build Coastguard Worker #endif
8321*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("counters"),
8322*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
8323*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("csl"),
8324*cfb92d14SAndroid Build Coastguard Worker #endif
8325*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("dataset"),
8326*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("debug"),
8327*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
8328*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("delaytimermin"),
8329*cfb92d14SAndroid Build Coastguard Worker #endif
8330*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("detach"),
8331*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_FTD || OPENTHREAD_MTD
8332*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_MLE_DEVICE_PROPERTY_LEADER_WEIGHT_ENABLE
8333*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("deviceprops"),
8334*cfb92d14SAndroid Build Coastguard Worker #endif
8335*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DIAG_ENABLE
8336*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("diag"),
8337*cfb92d14SAndroid Build Coastguard Worker #endif
8338*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD || OPENTHREAD_MTD
8339*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("discover"),
8340*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DNS_CLIENT_ENABLE || OPENTHREAD_CONFIG_DNSSD_SERVER_ENABLE || \
8341*cfb92d14SAndroid Build Coastguard Worker     OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
8342*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("dns"),
8343*cfb92d14SAndroid Build Coastguard Worker #endif
8344*cfb92d14SAndroid Build Coastguard Worker #if (OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2)
8345*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("domainname"),
8346*cfb92d14SAndroid Build Coastguard Worker #endif
8347*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DUA_ENABLE
8348*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("dua"),
8349*cfb92d14SAndroid Build Coastguard Worker #endif
8350*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
8351*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("eidcache"),
8352*cfb92d14SAndroid Build Coastguard Worker #endif
8353*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("eui64"),
8354*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("extaddr"),
8355*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("extpanid"),
8356*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("factoryreset"),
8357*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
8358*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("fake"),
8359*cfb92d14SAndroid Build Coastguard Worker #endif
8360*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("fem"),
8361*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_FTD || OPENTHREAD_MTD
8362*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD || OPENTHREAD_MTD
8363*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_HISTORY_TRACKER_ENABLE
8364*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("history"),
8365*cfb92d14SAndroid Build Coastguard Worker #endif
8366*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("ifconfig"),
8367*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("instanceid"),
8368*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("ipaddr"),
8369*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("ipmaddr"),
8370*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_JOINER_ENABLE
8371*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("joiner"),
8372*cfb92d14SAndroid Build Coastguard Worker #endif
8373*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
8374*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("joinerport"),
8375*cfb92d14SAndroid Build Coastguard Worker #endif
8376*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("keysequence"),
8377*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("leaderdata"),
8378*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
8379*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("leaderweight"),
8380*cfb92d14SAndroid Build Coastguard Worker #endif
8381*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE
8382*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("linkmetrics"),
8383*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_LINK_METRICS_MANAGER_ENABLE
8384*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("linkmetricsmgr"),
8385*cfb92d14SAndroid Build Coastguard Worker #endif
8386*cfb92d14SAndroid Build Coastguard Worker #endif
8387*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_TMF_ANYCAST_LOCATOR_ENABLE
8388*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("locate"),
8389*cfb92d14SAndroid Build Coastguard Worker #endif
8390*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("log"),
8391*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("mac"),
8392*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MAC_FILTER_ENABLE
8393*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("macfilter"),
8394*cfb92d14SAndroid Build Coastguard Worker #endif
8395*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MULTICAST_DNS_ENABLE && OPENTHREAD_CONFIG_MULTICAST_DNS_PUBLIC_API_ENABLE
8396*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("mdns"),
8397*cfb92d14SAndroid Build Coastguard Worker #endif
8398*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MESH_DIAG_ENABLE && OPENTHREAD_FTD
8399*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("meshdiag"),
8400*cfb92d14SAndroid Build Coastguard Worker #endif
8401*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
8402*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("mleadvimax"),
8403*cfb92d14SAndroid Build Coastguard Worker #endif
8404*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
8405*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("mliid"),
8406*cfb92d14SAndroid Build Coastguard Worker #endif
8407*cfb92d14SAndroid Build Coastguard Worker #if (OPENTHREAD_FTD && OPENTHREAD_CONFIG_TMF_PROXY_MLR_ENABLE) && OPENTHREAD_CONFIG_COMMISSIONER_ENABLE
8408*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("mlr"),
8409*cfb92d14SAndroid Build Coastguard Worker #endif
8410*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("mode"),
8411*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("multiradio"),
8412*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_NAT64_TRANSLATOR_ENABLE || OPENTHREAD_CONFIG_NAT64_BORDER_ROUTING_ENABLE
8413*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("nat64"),
8414*cfb92d14SAndroid Build Coastguard Worker #endif
8415*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
8416*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("neighbor"),
8417*cfb92d14SAndroid Build Coastguard Worker #endif
8418*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("netdata"),
8419*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("netstat"),
8420*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_TMF_NETDIAG_CLIENT_ENABLE
8421*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("networkdiagnostic"),
8422*cfb92d14SAndroid Build Coastguard Worker #endif
8423*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
8424*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("networkidtimeout"),
8425*cfb92d14SAndroid Build Coastguard Worker #endif
8426*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("networkkey"),
8427*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_KEY_REFERENCES_ENABLE
8428*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("networkkeyref"),
8429*cfb92d14SAndroid Build Coastguard Worker #endif
8430*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("networkname"),
8431*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
8432*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("networktime"),
8433*cfb92d14SAndroid Build Coastguard Worker #endif
8434*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
8435*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("nexthop"),
8436*cfb92d14SAndroid Build Coastguard Worker #endif
8437*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("panid"),
8438*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("parent"),
8439*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
8440*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("parentpriority"),
8441*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("partitionid"),
8442*cfb92d14SAndroid Build Coastguard Worker #endif
8443*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PING_SENDER_ENABLE
8444*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("ping"),
8445*cfb92d14SAndroid Build Coastguard Worker #endif
8446*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("platform"),
8447*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("pollperiod"),
8448*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
8449*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("preferrouterid"),
8450*cfb92d14SAndroid Build Coastguard Worker #endif
8451*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE
8452*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("prefix"),
8453*cfb92d14SAndroid Build Coastguard Worker #endif
8454*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("promiscuous"),
8455*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
8456*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("pskc"),
8457*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_KEY_REFERENCES_ENABLE
8458*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("pskcref"),
8459*cfb92d14SAndroid Build Coastguard Worker #endif
8460*cfb92d14SAndroid Build Coastguard Worker #endif
8461*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_RADIO_STATS_ENABLE
8462*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("radio"),
8463*cfb92d14SAndroid Build Coastguard Worker #endif
8464*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MAC_FILTER_ENABLE && OPENTHREAD_CONFIG_RADIO_LINK_IEEE_802_15_4_ENABLE
8465*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("radiofilter"),
8466*cfb92d14SAndroid Build Coastguard Worker #endif
8467*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("rcp"),
8468*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("region"),
8469*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
8470*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("releaserouterid"),
8471*cfb92d14SAndroid Build Coastguard Worker #endif
8472*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_FTD || OPENTHREAD_MTD
8473*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("reset"),
8474*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD || OPENTHREAD_MTD
8475*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("rloc16"),
8476*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE
8477*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("route"),
8478*cfb92d14SAndroid Build Coastguard Worker #endif
8479*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
8480*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("router"),
8481*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("routerdowngradethreshold"),
8482*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("routereligible"),
8483*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
8484*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("routeridrange"),
8485*cfb92d14SAndroid Build Coastguard Worker #endif
8486*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("routerselectionjitter"),
8487*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("routerupgradethreshold"),
8488*cfb92d14SAndroid Build Coastguard Worker #endif
8489*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("scan"),
8490*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_TMF_NETDATA_SERVICE_ENABLE
8491*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("service"),
8492*cfb92d14SAndroid Build Coastguard Worker #endif
8493*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("singleton"),
8494*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_SNTP_CLIENT_ENABLE
8495*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("sntp"),
8496*cfb92d14SAndroid Build Coastguard Worker #endif
8497*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_SRP_CLIENT_ENABLE || OPENTHREAD_CONFIG_SRP_SERVER_ENABLE
8498*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("srp"),
8499*cfb92d14SAndroid Build Coastguard Worker #endif
8500*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("state"),
8501*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BLE_TCAT_ENABLE && OPENTHREAD_CONFIG_CLI_BLE_SECURE_ENABLE
8502*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("tcat"),
8503*cfb92d14SAndroid Build Coastguard Worker #endif
8504*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_TCP_ENABLE && OPENTHREAD_CONFIG_CLI_TCP_ENABLE
8505*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("tcp"),
8506*cfb92d14SAndroid Build Coastguard Worker #endif
8507*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
8508*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("test"),
8509*cfb92d14SAndroid Build Coastguard Worker #endif
8510*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("thread"),
8511*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_TX_QUEUE_STATISTICS_ENABLE
8512*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("timeinqueue"),
8513*cfb92d14SAndroid Build Coastguard Worker #endif
8514*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE
8515*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("trel"),
8516*cfb92d14SAndroid Build Coastguard Worker #endif
8517*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
8518*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("tvcheck"),
8519*cfb92d14SAndroid Build Coastguard Worker #endif
8520*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("txpower"),
8521*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("udp"),
8522*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("unsecureport"),
8523*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_UPTIME_ENABLE
8524*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("uptime"),
8525*cfb92d14SAndroid Build Coastguard Worker #endif
8526*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("vendor"),
8527*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_VERHOEFF_CHECKSUM_ENABLE
8528*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("verhoeff"),
8529*cfb92d14SAndroid Build Coastguard Worker #endif
8530*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_FTD || OPENTHREAD_MTD
8531*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("version"),
8532*cfb92d14SAndroid Build Coastguard Worker     };
8533*cfb92d14SAndroid Build Coastguard Worker 
8534*cfb92d14SAndroid Build Coastguard Worker #undef CmdEntry
8535*cfb92d14SAndroid Build Coastguard Worker 
8536*cfb92d14SAndroid Build Coastguard Worker     static_assert(BinarySearch::IsSorted(kCommands), "Command Table is not sorted");
8537*cfb92d14SAndroid Build Coastguard Worker 
8538*cfb92d14SAndroid Build Coastguard Worker     otError        error   = OT_ERROR_NONE;
8539*cfb92d14SAndroid Build Coastguard Worker     const Command *command = BinarySearch::Find(aArgs[0].GetCString(), kCommands);
8540*cfb92d14SAndroid Build Coastguard Worker 
8541*cfb92d14SAndroid Build Coastguard Worker     if (command != nullptr)
8542*cfb92d14SAndroid Build Coastguard Worker     {
8543*cfb92d14SAndroid Build Coastguard Worker         error = (this->*command->mHandler)(aArgs + 1);
8544*cfb92d14SAndroid Build Coastguard Worker     }
8545*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "help")
8546*cfb92d14SAndroid Build Coastguard Worker     {
8547*cfb92d14SAndroid Build Coastguard Worker         OutputCommandTable(kCommands);
8548*cfb92d14SAndroid Build Coastguard Worker 
8549*cfb92d14SAndroid Build Coastguard Worker         for (const UserCommandsEntry &entry : mUserCommands)
8550*cfb92d14SAndroid Build Coastguard Worker         {
8551*cfb92d14SAndroid Build Coastguard Worker             for (uint8_t i = 0; i < entry.mLength; i++)
8552*cfb92d14SAndroid Build Coastguard Worker             {
8553*cfb92d14SAndroid Build Coastguard Worker                 OutputLine("%s", entry.mCommands[i].mName);
8554*cfb92d14SAndroid Build Coastguard Worker             }
8555*cfb92d14SAndroid Build Coastguard Worker         }
8556*cfb92d14SAndroid Build Coastguard Worker     }
8557*cfb92d14SAndroid Build Coastguard Worker     else
8558*cfb92d14SAndroid Build Coastguard Worker     {
8559*cfb92d14SAndroid Build Coastguard Worker         error = ProcessUserCommands(aArgs);
8560*cfb92d14SAndroid Build Coastguard Worker     }
8561*cfb92d14SAndroid Build Coastguard Worker 
8562*cfb92d14SAndroid Build Coastguard Worker     return error;
8563*cfb92d14SAndroid Build Coastguard Worker }
8564*cfb92d14SAndroid Build Coastguard Worker 
otCliInit(otInstance * aInstance,otCliOutputCallback aCallback,void * aContext)8565*cfb92d14SAndroid Build Coastguard Worker extern "C" void otCliInit(otInstance *aInstance, otCliOutputCallback aCallback, void *aContext)
8566*cfb92d14SAndroid Build Coastguard Worker {
8567*cfb92d14SAndroid Build Coastguard Worker     Interpreter::Initialize(aInstance, aCallback, aContext);
8568*cfb92d14SAndroid Build Coastguard Worker 
8569*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_CLI_VENDOR_COMMANDS_ENABLE && OPENTHREAD_CONFIG_CLI_MAX_USER_CMD_ENTRIES > 1
8570*cfb92d14SAndroid Build Coastguard Worker     otCliVendorSetUserCommands();
8571*cfb92d14SAndroid Build Coastguard Worker #endif
8572*cfb92d14SAndroid Build Coastguard Worker }
8573*cfb92d14SAndroid Build Coastguard Worker 
otCliInputLine(char * aBuf)8574*cfb92d14SAndroid Build Coastguard Worker extern "C" void otCliInputLine(char *aBuf) { Interpreter::GetInterpreter().ProcessLine(aBuf); }
8575*cfb92d14SAndroid Build Coastguard Worker 
otCliSetUserCommands(const otCliCommand * aUserCommands,uint8_t aLength,void * aContext)8576*cfb92d14SAndroid Build Coastguard Worker extern "C" otError otCliSetUserCommands(const otCliCommand *aUserCommands, uint8_t aLength, void *aContext)
8577*cfb92d14SAndroid Build Coastguard Worker {
8578*cfb92d14SAndroid Build Coastguard Worker     return Interpreter::GetInterpreter().SetUserCommands(aUserCommands, aLength, aContext);
8579*cfb92d14SAndroid Build Coastguard Worker }
8580*cfb92d14SAndroid Build Coastguard Worker 
otCliOutputBytes(const uint8_t * aBytes,uint8_t aLength)8581*cfb92d14SAndroid Build Coastguard Worker extern "C" void otCliOutputBytes(const uint8_t *aBytes, uint8_t aLength)
8582*cfb92d14SAndroid Build Coastguard Worker {
8583*cfb92d14SAndroid Build Coastguard Worker     Interpreter::GetInterpreter().OutputBytes(aBytes, aLength);
8584*cfb92d14SAndroid Build Coastguard Worker }
8585*cfb92d14SAndroid Build Coastguard Worker 
otCliOutputFormat(const char * aFmt,...)8586*cfb92d14SAndroid Build Coastguard Worker extern "C" void otCliOutputFormat(const char *aFmt, ...)
8587*cfb92d14SAndroid Build Coastguard Worker {
8588*cfb92d14SAndroid Build Coastguard Worker     va_list aAp;
8589*cfb92d14SAndroid Build Coastguard Worker     va_start(aAp, aFmt);
8590*cfb92d14SAndroid Build Coastguard Worker     Interpreter::GetInterpreter().OutputFormatV(aFmt, aAp);
8591*cfb92d14SAndroid Build Coastguard Worker     va_end(aAp);
8592*cfb92d14SAndroid Build Coastguard Worker }
8593*cfb92d14SAndroid Build Coastguard Worker 
otCliAppendResult(otError aError)8594*cfb92d14SAndroid Build Coastguard Worker extern "C" void otCliAppendResult(otError aError) { Interpreter::GetInterpreter().OutputResult(aError); }
8595*cfb92d14SAndroid Build Coastguard Worker 
otCliPlatLogv(otLogLevel aLogLevel,otLogRegion aLogRegion,const char * aFormat,va_list aArgs)8596*cfb92d14SAndroid Build Coastguard Worker extern "C" void otCliPlatLogv(otLogLevel aLogLevel, otLogRegion aLogRegion, const char *aFormat, va_list aArgs)
8597*cfb92d14SAndroid Build Coastguard Worker {
8598*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aLogLevel);
8599*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aLogRegion);
8600*cfb92d14SAndroid Build Coastguard Worker 
8601*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(Interpreter::IsInitialized());
8602*cfb92d14SAndroid Build Coastguard Worker 
8603*cfb92d14SAndroid Build Coastguard Worker     // CLI output is being used for logging, so we set the flag
8604*cfb92d14SAndroid Build Coastguard Worker     // `EmittingCommandOutput` to false indicate this.
8605*cfb92d14SAndroid Build Coastguard Worker     Interpreter::GetInterpreter().SetEmittingCommandOutput(false);
8606*cfb92d14SAndroid Build Coastguard Worker     Interpreter::GetInterpreter().OutputFormatV(aFormat, aArgs);
8607*cfb92d14SAndroid Build Coastguard Worker     Interpreter::GetInterpreter().OutputNewLine();
8608*cfb92d14SAndroid Build Coastguard Worker     Interpreter::GetInterpreter().SetEmittingCommandOutput(true);
8609*cfb92d14SAndroid Build Coastguard Worker 
8610*cfb92d14SAndroid Build Coastguard Worker exit:
8611*cfb92d14SAndroid Build Coastguard Worker     return;
8612*cfb92d14SAndroid Build Coastguard Worker }
8613*cfb92d14SAndroid Build Coastguard Worker 
8614*cfb92d14SAndroid Build Coastguard Worker } // namespace Cli
8615*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
8616