xref: /aosp_15_r20/external/openthread/src/cli/cli_dataset.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_dataset.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 
39*cfb92d14SAndroid Build Coastguard Worker #include <openthread/dataset.h>
40*cfb92d14SAndroid Build Coastguard Worker #include <openthread/dataset_ftd.h>
41*cfb92d14SAndroid Build Coastguard Worker #include <openthread/dataset_updater.h>
42*cfb92d14SAndroid Build Coastguard Worker 
43*cfb92d14SAndroid Build Coastguard Worker #include "cli/cli.hpp"
44*cfb92d14SAndroid Build Coastguard Worker 
45*cfb92d14SAndroid Build Coastguard Worker namespace ot {
46*cfb92d14SAndroid Build Coastguard Worker namespace Cli {
47*cfb92d14SAndroid Build Coastguard Worker 
48*cfb92d14SAndroid Build Coastguard Worker otOperationalDatasetTlvs Dataset::sDatasetTlvs;
49*cfb92d14SAndroid Build Coastguard Worker 
LookupMapper(const char * aName) const50*cfb92d14SAndroid Build Coastguard Worker const Dataset::ComponentMapper *Dataset::LookupMapper(const char *aName) const
51*cfb92d14SAndroid Build Coastguard Worker {
52*cfb92d14SAndroid Build Coastguard Worker     static constexpr ComponentMapper kMappers[] = {
53*cfb92d14SAndroid Build Coastguard Worker         {
54*cfb92d14SAndroid Build Coastguard Worker             "activetimestamp",
55*cfb92d14SAndroid Build Coastguard Worker             &Components::mIsActiveTimestampPresent,
56*cfb92d14SAndroid Build Coastguard Worker             &Dataset::OutputActiveTimestamp,
57*cfb92d14SAndroid Build Coastguard Worker             &Dataset::ParseActiveTimestamp,
58*cfb92d14SAndroid Build Coastguard Worker         },
59*cfb92d14SAndroid Build Coastguard Worker         {
60*cfb92d14SAndroid Build Coastguard Worker             "channel",
61*cfb92d14SAndroid Build Coastguard Worker             &Components::mIsChannelPresent,
62*cfb92d14SAndroid Build Coastguard Worker             &Dataset::OutputChannel,
63*cfb92d14SAndroid Build Coastguard Worker             &Dataset::ParseChannel,
64*cfb92d14SAndroid Build Coastguard Worker         },
65*cfb92d14SAndroid Build Coastguard Worker         {
66*cfb92d14SAndroid Build Coastguard Worker             "channelmask",
67*cfb92d14SAndroid Build Coastguard Worker             &Components::mIsChannelMaskPresent,
68*cfb92d14SAndroid Build Coastguard Worker             &Dataset::OutputChannelMask,
69*cfb92d14SAndroid Build Coastguard Worker             &Dataset::ParseChannelMask,
70*cfb92d14SAndroid Build Coastguard Worker         },
71*cfb92d14SAndroid Build Coastguard Worker         {
72*cfb92d14SAndroid Build Coastguard Worker             "delay",
73*cfb92d14SAndroid Build Coastguard Worker             &Components::mIsDelayPresent,
74*cfb92d14SAndroid Build Coastguard Worker             &Dataset::OutputDelay,
75*cfb92d14SAndroid Build Coastguard Worker             &Dataset::ParseDelay,
76*cfb92d14SAndroid Build Coastguard Worker         },
77*cfb92d14SAndroid Build Coastguard Worker         {
78*cfb92d14SAndroid Build Coastguard Worker             "delaytimer", // Alias for "delay "to ensure backward compatibility for "mgmtsetcommand" command
79*cfb92d14SAndroid Build Coastguard Worker             &Components::mIsDelayPresent,
80*cfb92d14SAndroid Build Coastguard Worker             &Dataset::OutputDelay,
81*cfb92d14SAndroid Build Coastguard Worker             &Dataset::ParseDelay,
82*cfb92d14SAndroid Build Coastguard Worker         },
83*cfb92d14SAndroid Build Coastguard Worker         {
84*cfb92d14SAndroid Build Coastguard Worker             "extpanid",
85*cfb92d14SAndroid Build Coastguard Worker             &Components::mIsExtendedPanIdPresent,
86*cfb92d14SAndroid Build Coastguard Worker             &Dataset::OutputExtendedPanId,
87*cfb92d14SAndroid Build Coastguard Worker             &Dataset::ParseExtendedPanId,
88*cfb92d14SAndroid Build Coastguard Worker         },
89*cfb92d14SAndroid Build Coastguard Worker         {
90*cfb92d14SAndroid Build Coastguard Worker             "localprefix", // Alias for "meshlocalprefix" to ensure backward compatibility in "mgmtsetcommand" command
91*cfb92d14SAndroid Build Coastguard Worker             &Components::mIsMeshLocalPrefixPresent,
92*cfb92d14SAndroid Build Coastguard Worker             &Dataset::OutputMeshLocalPrefix,
93*cfb92d14SAndroid Build Coastguard Worker             &Dataset::ParseMeshLocalPrefix,
94*cfb92d14SAndroid Build Coastguard Worker         },
95*cfb92d14SAndroid Build Coastguard Worker         {
96*cfb92d14SAndroid Build Coastguard Worker             "meshlocalprefix",
97*cfb92d14SAndroid Build Coastguard Worker             &Components::mIsMeshLocalPrefixPresent,
98*cfb92d14SAndroid Build Coastguard Worker             &Dataset::OutputMeshLocalPrefix,
99*cfb92d14SAndroid Build Coastguard Worker             &Dataset::ParseMeshLocalPrefix,
100*cfb92d14SAndroid Build Coastguard Worker         },
101*cfb92d14SAndroid Build Coastguard Worker         {
102*cfb92d14SAndroid Build Coastguard Worker             "networkkey",
103*cfb92d14SAndroid Build Coastguard Worker             &Components::mIsNetworkKeyPresent,
104*cfb92d14SAndroid Build Coastguard Worker             &Dataset::OutputNetworkKey,
105*cfb92d14SAndroid Build Coastguard Worker             &Dataset::ParseNetworkKey,
106*cfb92d14SAndroid Build Coastguard Worker         },
107*cfb92d14SAndroid Build Coastguard Worker         {
108*cfb92d14SAndroid Build Coastguard Worker             "networkname",
109*cfb92d14SAndroid Build Coastguard Worker             &Components::mIsNetworkNamePresent,
110*cfb92d14SAndroid Build Coastguard Worker             &Dataset::OutputNetworkName,
111*cfb92d14SAndroid Build Coastguard Worker             &Dataset::ParseNetworkName,
112*cfb92d14SAndroid Build Coastguard Worker         },
113*cfb92d14SAndroid Build Coastguard Worker         {
114*cfb92d14SAndroid Build Coastguard Worker             "panid",
115*cfb92d14SAndroid Build Coastguard Worker             &Components::mIsPanIdPresent,
116*cfb92d14SAndroid Build Coastguard Worker             &Dataset::OutputPanId,
117*cfb92d14SAndroid Build Coastguard Worker             &Dataset::ParsePanId,
118*cfb92d14SAndroid Build Coastguard Worker         },
119*cfb92d14SAndroid Build Coastguard Worker         {
120*cfb92d14SAndroid Build Coastguard Worker             "pendingtimestamp",
121*cfb92d14SAndroid Build Coastguard Worker             &Components::mIsPendingTimestampPresent,
122*cfb92d14SAndroid Build Coastguard Worker             &Dataset::OutputPendingTimestamp,
123*cfb92d14SAndroid Build Coastguard Worker             &Dataset::ParsePendingTimestamp,
124*cfb92d14SAndroid Build Coastguard Worker         },
125*cfb92d14SAndroid Build Coastguard Worker         {
126*cfb92d14SAndroid Build Coastguard Worker             "pskc",
127*cfb92d14SAndroid Build Coastguard Worker             &Components::mIsPskcPresent,
128*cfb92d14SAndroid Build Coastguard Worker             &Dataset::OutputPskc,
129*cfb92d14SAndroid Build Coastguard Worker             &Dataset::ParsePskc,
130*cfb92d14SAndroid Build Coastguard Worker         },
131*cfb92d14SAndroid Build Coastguard Worker         {
132*cfb92d14SAndroid Build Coastguard Worker             "securitypolicy",
133*cfb92d14SAndroid Build Coastguard Worker             &Components::mIsSecurityPolicyPresent,
134*cfb92d14SAndroid Build Coastguard Worker             &Dataset::OutputSecurityPolicy,
135*cfb92d14SAndroid Build Coastguard Worker             &Dataset::ParseSecurityPolicy,
136*cfb92d14SAndroid Build Coastguard Worker         },
137*cfb92d14SAndroid Build Coastguard Worker     };
138*cfb92d14SAndroid Build Coastguard Worker 
139*cfb92d14SAndroid Build Coastguard Worker     static_assert(BinarySearch::IsSorted(kMappers), "kMappers is not sorted");
140*cfb92d14SAndroid Build Coastguard Worker 
141*cfb92d14SAndroid Build Coastguard Worker     return BinarySearch::Find(aName, kMappers);
142*cfb92d14SAndroid Build Coastguard Worker }
143*cfb92d14SAndroid Build Coastguard Worker 
144*cfb92d14SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------
145*cfb92d14SAndroid Build Coastguard Worker 
146*cfb92d14SAndroid Build Coastguard Worker /**
147*cfb92d14SAndroid Build Coastguard Worker  * @cli dataset activetimestamp (get, set)
148*cfb92d14SAndroid Build Coastguard Worker  * @code
149*cfb92d14SAndroid Build Coastguard Worker  * dataset activetimestamp
150*cfb92d14SAndroid Build Coastguard Worker  * 123456789
151*cfb92d14SAndroid Build Coastguard Worker  * Done
152*cfb92d14SAndroid Build Coastguard Worker  * @endcode
153*cfb92d14SAndroid Build Coastguard Worker  * @code
154*cfb92d14SAndroid Build Coastguard Worker  * dataset activetimestamp 123456789
155*cfb92d14SAndroid Build Coastguard Worker  * Done
156*cfb92d14SAndroid Build Coastguard Worker  * @endcode
157*cfb92d14SAndroid Build Coastguard Worker  * @cparam dataset activetimestamp [@ca{timestamp}]
158*cfb92d14SAndroid Build Coastguard Worker  * Pass the optional `timestamp` argument to set the active timestamp.
159*cfb92d14SAndroid Build Coastguard Worker  * @par
160*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets #otOperationalDataset::mActiveTimestamp.
161*cfb92d14SAndroid Build Coastguard Worker  */
OutputActiveTimestamp(const otOperationalDataset & aDataset)162*cfb92d14SAndroid Build Coastguard Worker void Dataset::OutputActiveTimestamp(const otOperationalDataset &aDataset)
163*cfb92d14SAndroid Build Coastguard Worker {
164*cfb92d14SAndroid Build Coastguard Worker     OutputUint64Line(aDataset.mActiveTimestamp.mSeconds);
165*cfb92d14SAndroid Build Coastguard Worker }
166*cfb92d14SAndroid Build Coastguard Worker 
167*cfb92d14SAndroid Build Coastguard Worker /**
168*cfb92d14SAndroid Build Coastguard Worker  * @cli dataset channel (get,set)
169*cfb92d14SAndroid Build Coastguard Worker  * @code
170*cfb92d14SAndroid Build Coastguard Worker  * dataset channel
171*cfb92d14SAndroid Build Coastguard Worker  * 12
172*cfb92d14SAndroid Build Coastguard Worker  * Done
173*cfb92d14SAndroid Build Coastguard Worker  * @endcode
174*cfb92d14SAndroid Build Coastguard Worker  * @code
175*cfb92d14SAndroid Build Coastguard Worker  * dataset channel 12
176*cfb92d14SAndroid Build Coastguard Worker  * Done
177*cfb92d14SAndroid Build Coastguard Worker  * @endcode
178*cfb92d14SAndroid Build Coastguard Worker  * @cparam dataset channel [@ca{channel-num}]
179*cfb92d14SAndroid Build Coastguard Worker  * Use the optional `channel-num` argument to set the channel.
180*cfb92d14SAndroid Build Coastguard Worker  * @par
181*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets #otOperationalDataset::mChannel.
182*cfb92d14SAndroid Build Coastguard Worker  */
OutputChannel(const otOperationalDataset & aDataset)183*cfb92d14SAndroid Build Coastguard Worker void Dataset::OutputChannel(const otOperationalDataset &aDataset) { OutputLine("%u", aDataset.mChannel); }
184*cfb92d14SAndroid Build Coastguard Worker 
185*cfb92d14SAndroid Build Coastguard Worker /**
186*cfb92d14SAndroid Build Coastguard Worker  * @cli dataset channelmask (get,set)
187*cfb92d14SAndroid Build Coastguard Worker  * @code
188*cfb92d14SAndroid Build Coastguard Worker  * dataset channelmask
189*cfb92d14SAndroid Build Coastguard Worker  * 0x07fff800
190*cfb92d14SAndroid Build Coastguard Worker  * Done
191*cfb92d14SAndroid Build Coastguard Worker  * @endcode
192*cfb92d14SAndroid Build Coastguard Worker  * @code
193*cfb92d14SAndroid Build Coastguard Worker  * dataset channelmask 0x07fff800
194*cfb92d14SAndroid Build Coastguard Worker  * Done
195*cfb92d14SAndroid Build Coastguard Worker  * @endcode
196*cfb92d14SAndroid Build Coastguard Worker  * @cparam dataset channelmask [@ca{channel-mask}]
197*cfb92d14SAndroid Build Coastguard Worker  * Use the optional `channel-mask` argument to set the channel mask.
198*cfb92d14SAndroid Build Coastguard Worker  * @par
199*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets #otOperationalDataset::mChannelMask
200*cfb92d14SAndroid Build Coastguard Worker  */
OutputChannelMask(const otOperationalDataset & aDataset)201*cfb92d14SAndroid Build Coastguard Worker void Dataset::OutputChannelMask(const otOperationalDataset &aDataset)
202*cfb92d14SAndroid Build Coastguard Worker {
203*cfb92d14SAndroid Build Coastguard Worker     OutputLine("0x%08lx", ToUlong(aDataset.mChannelMask));
204*cfb92d14SAndroid Build Coastguard Worker }
205*cfb92d14SAndroid Build Coastguard Worker 
206*cfb92d14SAndroid Build Coastguard Worker /**
207*cfb92d14SAndroid Build Coastguard Worker  * @cli dataset delay (get,set)
208*cfb92d14SAndroid Build Coastguard Worker  * @code
209*cfb92d14SAndroid Build Coastguard Worker  * dataset delay
210*cfb92d14SAndroid Build Coastguard Worker  * 1000
211*cfb92d14SAndroid Build Coastguard Worker  * Done
212*cfb92d14SAndroid Build Coastguard Worker  * @endcode
213*cfb92d14SAndroid Build Coastguard Worker  * @code
214*cfb92d14SAndroid Build Coastguard Worker  * dataset delay 1000
215*cfb92d14SAndroid Build Coastguard Worker  * Done
216*cfb92d14SAndroid Build Coastguard Worker  * @endcode
217*cfb92d14SAndroid Build Coastguard Worker  * @cparam dataset delay [@ca{delay}]
218*cfb92d14SAndroid Build Coastguard Worker  * Use the optional `delay` argument to set the delay timer value.
219*cfb92d14SAndroid Build Coastguard Worker  * @par
220*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets #otOperationalDataset::mDelay.
221*cfb92d14SAndroid Build Coastguard Worker  * @sa otDatasetSetDelayTimerMinimal
222*cfb92d14SAndroid Build Coastguard Worker  */
OutputDelay(const otOperationalDataset & aDataset)223*cfb92d14SAndroid Build Coastguard Worker void Dataset::OutputDelay(const otOperationalDataset &aDataset) { OutputLine("%lu", ToUlong(aDataset.mDelay)); }
224*cfb92d14SAndroid Build Coastguard Worker 
225*cfb92d14SAndroid Build Coastguard Worker /**
226*cfb92d14SAndroid Build Coastguard Worker  * @cli dataset extpanid (get,set)
227*cfb92d14SAndroid Build Coastguard Worker  * @code
228*cfb92d14SAndroid Build Coastguard Worker  * dataset extpanid
229*cfb92d14SAndroid Build Coastguard Worker  * 000db80123456789
230*cfb92d14SAndroid Build Coastguard Worker  * Done
231*cfb92d14SAndroid Build Coastguard Worker  * @endcode
232*cfb92d14SAndroid Build Coastguard Worker  * @code
233*cfb92d14SAndroid Build Coastguard Worker  * dataset extpanid 000db80123456789
234*cfb92d14SAndroid Build Coastguard Worker  * Done
235*cfb92d14SAndroid Build Coastguard Worker  * @endcode
236*cfb92d14SAndroid Build Coastguard Worker  * @cparam dataset extpanid [@ca{extpanid}]
237*cfb92d14SAndroid Build Coastguard Worker  * Use the optional `extpanid` argument to set the Extended Personal Area Network ID.
238*cfb92d14SAndroid Build Coastguard Worker  * @par
239*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets #otOperationalDataset::mExtendedPanId.
240*cfb92d14SAndroid Build Coastguard Worker  * @note The commissioning credential in the dataset buffer becomes stale after changing
241*cfb92d14SAndroid Build Coastguard Worker  * this value. Use `dataset pskc` to reset.
242*cfb92d14SAndroid Build Coastguard Worker  * @csa{dataset pskc (get,set)}
243*cfb92d14SAndroid Build Coastguard Worker  */
OutputExtendedPanId(const otOperationalDataset & aDataset)244*cfb92d14SAndroid Build Coastguard Worker void Dataset::OutputExtendedPanId(const otOperationalDataset &aDataset) { OutputBytesLine(aDataset.mExtendedPanId.m8); }
245*cfb92d14SAndroid Build Coastguard Worker 
246*cfb92d14SAndroid Build Coastguard Worker /**
247*cfb92d14SAndroid Build Coastguard Worker  * @cli dataset meshlocalprefix (get,set)
248*cfb92d14SAndroid Build Coastguard Worker  * @code
249*cfb92d14SAndroid Build Coastguard Worker  * dataset meshlocalprefix
250*cfb92d14SAndroid Build Coastguard Worker  * fd00:db8:0:0::/64
251*cfb92d14SAndroid Build Coastguard Worker  * Done
252*cfb92d14SAndroid Build Coastguard Worker  * @endcode
253*cfb92d14SAndroid Build Coastguard Worker  * @code
254*cfb92d14SAndroid Build Coastguard Worker  * dataset meshlocalprefix fd00:db8:0:0::
255*cfb92d14SAndroid Build Coastguard Worker  * Done
256*cfb92d14SAndroid Build Coastguard Worker  * @endcode
257*cfb92d14SAndroid Build Coastguard Worker  * @cparam dataset meshlocalprefix [@ca{meshlocalprefix}]
258*cfb92d14SAndroid Build Coastguard Worker  * Use the optional `meshlocalprefix` argument to set the Mesh-Local Prefix.
259*cfb92d14SAndroid Build Coastguard Worker  * @par
260*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets #otOperationalDataset::mMeshLocalPrefix.
261*cfb92d14SAndroid Build Coastguard Worker  */
OutputMeshLocalPrefix(const otOperationalDataset & aDataset)262*cfb92d14SAndroid Build Coastguard Worker void Dataset::OutputMeshLocalPrefix(const otOperationalDataset &aDataset)
263*cfb92d14SAndroid Build Coastguard Worker {
264*cfb92d14SAndroid Build Coastguard Worker     OutputIp6PrefixLine(aDataset.mMeshLocalPrefix);
265*cfb92d14SAndroid Build Coastguard Worker }
266*cfb92d14SAndroid Build Coastguard Worker 
267*cfb92d14SAndroid Build Coastguard Worker /**
268*cfb92d14SAndroid Build Coastguard Worker  * @cli dataset networkkey (get,set)
269*cfb92d14SAndroid Build Coastguard Worker  * @code
270*cfb92d14SAndroid Build Coastguard Worker  * dataset networkkey
271*cfb92d14SAndroid Build Coastguard Worker  * 00112233445566778899aabbccddeeff
272*cfb92d14SAndroid Build Coastguard Worker  * Done
273*cfb92d14SAndroid Build Coastguard Worker  * @endcode
274*cfb92d14SAndroid Build Coastguard Worker  * @code
275*cfb92d14SAndroid Build Coastguard Worker  * dataset networkkey 00112233445566778899aabbccddeeff
276*cfb92d14SAndroid Build Coastguard Worker  * Done
277*cfb92d14SAndroid Build Coastguard Worker  * @endcode
278*cfb92d14SAndroid Build Coastguard Worker  * @cparam dataset networkkey [@ca{key}]
279*cfb92d14SAndroid Build Coastguard Worker  * Use the optional `key` argument to set the Network Key.
280*cfb92d14SAndroid Build Coastguard Worker  * @par
281*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets #otOperationalDataset::mNetworkKey.
282*cfb92d14SAndroid Build Coastguard Worker  */
OutputNetworkKey(const otOperationalDataset & aDataset)283*cfb92d14SAndroid Build Coastguard Worker void Dataset::OutputNetworkKey(const otOperationalDataset &aDataset) { OutputBytesLine(aDataset.mNetworkKey.m8); }
284*cfb92d14SAndroid Build Coastguard Worker 
285*cfb92d14SAndroid Build Coastguard Worker /**
286*cfb92d14SAndroid Build Coastguard Worker  * @cli dataset networkname (get,set)
287*cfb92d14SAndroid Build Coastguard Worker  * @code
288*cfb92d14SAndroid Build Coastguard Worker  * dataset networkname
289*cfb92d14SAndroid Build Coastguard Worker  * OpenThread
290*cfb92d14SAndroid Build Coastguard Worker  * Done
291*cfb92d14SAndroid Build Coastguard Worker  * @endcode
292*cfb92d14SAndroid Build Coastguard Worker  * @code
293*cfb92d14SAndroid Build Coastguard Worker  * dataset networkname OpenThread
294*cfb92d14SAndroid Build Coastguard Worker  * Done
295*cfb92d14SAndroid Build Coastguard Worker  * @endcode
296*cfb92d14SAndroid Build Coastguard Worker  * @cparam dataset networkname [@ca{name}]
297*cfb92d14SAndroid Build Coastguard Worker  * Use the optional `name` argument to set the Network Name.
298*cfb92d14SAndroid Build Coastguard Worker  * @par
299*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets #otOperationalDataset::mNetworkName.
300*cfb92d14SAndroid Build Coastguard Worker  * @note The Commissioning Credential in the dataset buffer becomes stale after changing this value.
301*cfb92d14SAndroid Build Coastguard Worker  * Use `dataset pskc` to reset.
302*cfb92d14SAndroid Build Coastguard Worker  * @csa{dataset pskc (get,set)}
303*cfb92d14SAndroid Build Coastguard Worker  */
OutputNetworkName(const otOperationalDataset & aDataset)304*cfb92d14SAndroid Build Coastguard Worker void Dataset::OutputNetworkName(const otOperationalDataset &aDataset) { OutputLine("%s", aDataset.mNetworkName.m8); }
305*cfb92d14SAndroid Build Coastguard Worker 
306*cfb92d14SAndroid Build Coastguard Worker /**
307*cfb92d14SAndroid Build Coastguard Worker  * @cli dataset panid (get,set)
308*cfb92d14SAndroid Build Coastguard Worker  * @code
309*cfb92d14SAndroid Build Coastguard Worker  * dataset panid
310*cfb92d14SAndroid Build Coastguard Worker  * 0x1234
311*cfb92d14SAndroid Build Coastguard Worker  * Done
312*cfb92d14SAndroid Build Coastguard Worker  * @endcode
313*cfb92d14SAndroid Build Coastguard Worker  * @code
314*cfb92d14SAndroid Build Coastguard Worker  * dataset panid 0x1234
315*cfb92d14SAndroid Build Coastguard Worker  * Done
316*cfb92d14SAndroid Build Coastguard Worker  * @endcode
317*cfb92d14SAndroid Build Coastguard Worker  * @cparam dataset panid [@ca{panid}]
318*cfb92d14SAndroid Build Coastguard Worker  * Use the optional `panid` argument to set the PAN ID.
319*cfb92d14SAndroid Build Coastguard Worker  * @par
320*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets #otOperationalDataset::mPanId.
321*cfb92d14SAndroid Build Coastguard Worker  */
OutputPanId(const otOperationalDataset & aDataset)322*cfb92d14SAndroid Build Coastguard Worker void Dataset::OutputPanId(const otOperationalDataset &aDataset) { OutputLine("0x%04x", aDataset.mPanId); }
323*cfb92d14SAndroid Build Coastguard Worker 
324*cfb92d14SAndroid Build Coastguard Worker /**
325*cfb92d14SAndroid Build Coastguard Worker  * @cli dataset pendingtimestamp (get,set)
326*cfb92d14SAndroid Build Coastguard Worker  * @code
327*cfb92d14SAndroid Build Coastguard Worker  * dataset pendingtimestamp
328*cfb92d14SAndroid Build Coastguard Worker  * 123456789
329*cfb92d14SAndroid Build Coastguard Worker  * Done
330*cfb92d14SAndroid Build Coastguard Worker  * @endcode
331*cfb92d14SAndroid Build Coastguard Worker  * @code
332*cfb92d14SAndroid Build Coastguard Worker  * dataset pendingtimestamp 123456789
333*cfb92d14SAndroid Build Coastguard Worker  * Done
334*cfb92d14SAndroid Build Coastguard Worker  * @endcode
335*cfb92d14SAndroid Build Coastguard Worker  * @cparam dataset pendingtimestamp [@ca{timestamp}]
336*cfb92d14SAndroid Build Coastguard Worker  * Use the optional `timestamp` argument to set the pending timestamp seconds.
337*cfb92d14SAndroid Build Coastguard Worker  * @par
338*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets #otOperationalDataset::mPendingTimestamp.
339*cfb92d14SAndroid Build Coastguard Worker  */
OutputPendingTimestamp(const otOperationalDataset & aDataset)340*cfb92d14SAndroid Build Coastguard Worker void Dataset::OutputPendingTimestamp(const otOperationalDataset &aDataset)
341*cfb92d14SAndroid Build Coastguard Worker {
342*cfb92d14SAndroid Build Coastguard Worker     OutputUint64Line(aDataset.mPendingTimestamp.mSeconds);
343*cfb92d14SAndroid Build Coastguard Worker }
344*cfb92d14SAndroid Build Coastguard Worker 
345*cfb92d14SAndroid Build Coastguard Worker /**
346*cfb92d14SAndroid Build Coastguard Worker  * @cli dataset pskc (get,set)
347*cfb92d14SAndroid Build Coastguard Worker  * @code
348*cfb92d14SAndroid Build Coastguard Worker  * dataset pskc
349*cfb92d14SAndroid Build Coastguard Worker  * 67c0c203aa0b042bfb5381c47aef4d9e
350*cfb92d14SAndroid Build Coastguard Worker  * Done
351*cfb92d14SAndroid Build Coastguard Worker  * @endcode
352*cfb92d14SAndroid Build Coastguard Worker  * @code
353*cfb92d14SAndroid Build Coastguard Worker  * dataset pskc -p 123456
354*cfb92d14SAndroid Build Coastguard Worker  * Done
355*cfb92d14SAndroid Build Coastguard Worker  * @endcode
356*cfb92d14SAndroid Build Coastguard Worker  * @code
357*cfb92d14SAndroid Build Coastguard Worker  * dataset pskc 67c0c203aa0b042bfb5381c47aef4d9e
358*cfb92d14SAndroid Build Coastguard Worker  * Done
359*cfb92d14SAndroid Build Coastguard Worker  * @endcode
360*cfb92d14SAndroid Build Coastguard Worker  * @cparam dataset pskc [@ca{-p} @ca{passphrase}] | [@ca{key}]
361*cfb92d14SAndroid Build Coastguard Worker  * For FTD only, use `-p` with the `passphrase` argument. `-p` generates a pskc from
362*cfb92d14SAndroid Build Coastguard Worker  * the UTF-8 encoded `passphrase` that you provide, together with
363*cfb92d14SAndroid Build Coastguard Worker  * the network name and extended PAN ID. If set, `-p` uses the dataset buffer;
364*cfb92d14SAndroid Build Coastguard Worker  * otherwise, it uses the current stack.
365*cfb92d14SAndroid Build Coastguard Worker  * Alternatively, you can set pskc as `key` (hex format).
366*cfb92d14SAndroid Build Coastguard Worker  * @par
367*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets #otOperationalDataset::mPskc.
368*cfb92d14SAndroid Build Coastguard Worker  */
OutputPskc(const otOperationalDataset & aDataset)369*cfb92d14SAndroid Build Coastguard Worker void Dataset::OutputPskc(const otOperationalDataset &aDataset) { OutputBytesLine(aDataset.mPskc.m8); }
370*cfb92d14SAndroid Build Coastguard Worker 
371*cfb92d14SAndroid Build Coastguard Worker /**
372*cfb92d14SAndroid Build Coastguard Worker  * @cli dataset securitypolicy (get,set)
373*cfb92d14SAndroid Build Coastguard Worker  * @code
374*cfb92d14SAndroid Build Coastguard Worker  * dataset securitypolicy
375*cfb92d14SAndroid Build Coastguard Worker  * 672 onrc
376*cfb92d14SAndroid Build Coastguard Worker  * Done
377*cfb92d14SAndroid Build Coastguard Worker  * @endcode
378*cfb92d14SAndroid Build Coastguard Worker  * @code
379*cfb92d14SAndroid Build Coastguard Worker  * dataset securitypolicy 672 onrc
380*cfb92d14SAndroid Build Coastguard Worker  * Done
381*cfb92d14SAndroid Build Coastguard Worker  * @endcode
382*cfb92d14SAndroid Build Coastguard Worker  * @cparam dataset securitypolicy [@ca{rotationtime} [@ca{onrcCepR}]]
383*cfb92d14SAndroid Build Coastguard Worker  * *   Use `rotationtime` for `thrKeyRotation`, in units of hours.
384*cfb92d14SAndroid Build Coastguard Worker  * *   Security Policy commands use the `onrcCepR` argument mappings to get and set
385*cfb92d14SAndroid Build Coastguard Worker  * #otSecurityPolicy members, for example `o` represents
386*cfb92d14SAndroid Build Coastguard Worker  * #otSecurityPolicy::mObtainNetworkKeyEnabled.
387*cfb92d14SAndroid Build Coastguard Worker  * @moreinfo{@dataset}.
388*cfb92d14SAndroid Build Coastguard Worker  * @par
389*cfb92d14SAndroid Build Coastguard Worker  * Gets or sets the %Dataset security policy.
390*cfb92d14SAndroid Build Coastguard Worker  */
OutputSecurityPolicy(const otOperationalDataset & aDataset)391*cfb92d14SAndroid Build Coastguard Worker void Dataset::OutputSecurityPolicy(const otOperationalDataset &aDataset)
392*cfb92d14SAndroid Build Coastguard Worker {
393*cfb92d14SAndroid Build Coastguard Worker     OutputSecurityPolicy(aDataset.mSecurityPolicy);
394*cfb92d14SAndroid Build Coastguard Worker }
395*cfb92d14SAndroid Build Coastguard Worker 
396*cfb92d14SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------
397*cfb92d14SAndroid Build Coastguard Worker 
ParseActiveTimestamp(Arg * & aArgs,otOperationalDataset & aDataset)398*cfb92d14SAndroid Build Coastguard Worker otError Dataset::ParseActiveTimestamp(Arg *&aArgs, otOperationalDataset &aDataset)
399*cfb92d14SAndroid Build Coastguard Worker {
400*cfb92d14SAndroid Build Coastguard Worker     otError error;
401*cfb92d14SAndroid Build Coastguard Worker 
402*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = aArgs++->ParseAsUint64(aDataset.mActiveTimestamp.mSeconds));
403*cfb92d14SAndroid Build Coastguard Worker     aDataset.mActiveTimestamp.mTicks         = 0;
404*cfb92d14SAndroid Build Coastguard Worker     aDataset.mActiveTimestamp.mAuthoritative = false;
405*cfb92d14SAndroid Build Coastguard Worker 
406*cfb92d14SAndroid Build Coastguard Worker exit:
407*cfb92d14SAndroid Build Coastguard Worker     return error;
408*cfb92d14SAndroid Build Coastguard Worker }
409*cfb92d14SAndroid Build Coastguard Worker 
ParseChannel(Arg * & aArgs,otOperationalDataset & aDataset)410*cfb92d14SAndroid Build Coastguard Worker otError Dataset::ParseChannel(Arg *&aArgs, otOperationalDataset &aDataset)
411*cfb92d14SAndroid Build Coastguard Worker {
412*cfb92d14SAndroid Build Coastguard Worker     return aArgs++->ParseAsUint16(aDataset.mChannel);
413*cfb92d14SAndroid Build Coastguard Worker }
414*cfb92d14SAndroid Build Coastguard Worker 
ParseChannelMask(Arg * & aArgs,otOperationalDataset & aDataset)415*cfb92d14SAndroid Build Coastguard Worker otError Dataset::ParseChannelMask(Arg *&aArgs, otOperationalDataset &aDataset)
416*cfb92d14SAndroid Build Coastguard Worker {
417*cfb92d14SAndroid Build Coastguard Worker     return aArgs++->ParseAsUint32(aDataset.mChannelMask);
418*cfb92d14SAndroid Build Coastguard Worker }
419*cfb92d14SAndroid Build Coastguard Worker 
ParseDelay(Arg * & aArgs,otOperationalDataset & aDataset)420*cfb92d14SAndroid Build Coastguard Worker otError Dataset::ParseDelay(Arg *&aArgs, otOperationalDataset &aDataset)
421*cfb92d14SAndroid Build Coastguard Worker {
422*cfb92d14SAndroid Build Coastguard Worker     return aArgs++->ParseAsUint32(aDataset.mDelay);
423*cfb92d14SAndroid Build Coastguard Worker }
424*cfb92d14SAndroid Build Coastguard Worker 
ParseExtendedPanId(Arg * & aArgs,otOperationalDataset & aDataset)425*cfb92d14SAndroid Build Coastguard Worker otError Dataset::ParseExtendedPanId(Arg *&aArgs, otOperationalDataset &aDataset)
426*cfb92d14SAndroid Build Coastguard Worker {
427*cfb92d14SAndroid Build Coastguard Worker     return aArgs++->ParseAsHexString(aDataset.mExtendedPanId.m8);
428*cfb92d14SAndroid Build Coastguard Worker }
429*cfb92d14SAndroid Build Coastguard Worker 
ParseMeshLocalPrefix(Arg * & aArgs,otOperationalDataset & aDataset)430*cfb92d14SAndroid Build Coastguard Worker otError Dataset::ParseMeshLocalPrefix(Arg *&aArgs, otOperationalDataset &aDataset)
431*cfb92d14SAndroid Build Coastguard Worker {
432*cfb92d14SAndroid Build Coastguard Worker     otError      error;
433*cfb92d14SAndroid Build Coastguard Worker     otIp6Address prefix;
434*cfb92d14SAndroid Build Coastguard Worker 
435*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = aArgs++->ParseAsIp6Address(prefix));
436*cfb92d14SAndroid Build Coastguard Worker 
437*cfb92d14SAndroid Build Coastguard Worker     memcpy(aDataset.mMeshLocalPrefix.m8, prefix.mFields.m8, sizeof(aDataset.mMeshLocalPrefix.m8));
438*cfb92d14SAndroid Build Coastguard Worker 
439*cfb92d14SAndroid Build Coastguard Worker exit:
440*cfb92d14SAndroid Build Coastguard Worker     return error;
441*cfb92d14SAndroid Build Coastguard Worker }
442*cfb92d14SAndroid Build Coastguard Worker 
ParseNetworkKey(Arg * & aArgs,otOperationalDataset & aDataset)443*cfb92d14SAndroid Build Coastguard Worker otError Dataset::ParseNetworkKey(Arg *&aArgs, otOperationalDataset &aDataset)
444*cfb92d14SAndroid Build Coastguard Worker {
445*cfb92d14SAndroid Build Coastguard Worker     return aArgs++->ParseAsHexString(aDataset.mNetworkKey.m8);
446*cfb92d14SAndroid Build Coastguard Worker }
447*cfb92d14SAndroid Build Coastguard Worker 
ParseNetworkName(Arg * & aArgs,otOperationalDataset & aDataset)448*cfb92d14SAndroid Build Coastguard Worker otError Dataset::ParseNetworkName(Arg *&aArgs, otOperationalDataset &aDataset)
449*cfb92d14SAndroid Build Coastguard Worker {
450*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
451*cfb92d14SAndroid Build Coastguard Worker 
452*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(!aArgs->IsEmpty(), error = OT_ERROR_INVALID_ARGS);
453*cfb92d14SAndroid Build Coastguard Worker     error = otNetworkNameFromString(&aDataset.mNetworkName, aArgs++->GetCString());
454*cfb92d14SAndroid Build Coastguard Worker 
455*cfb92d14SAndroid Build Coastguard Worker exit:
456*cfb92d14SAndroid Build Coastguard Worker     return error;
457*cfb92d14SAndroid Build Coastguard Worker }
458*cfb92d14SAndroid Build Coastguard Worker 
ParsePanId(Arg * & aArgs,otOperationalDataset & aDataset)459*cfb92d14SAndroid Build Coastguard Worker otError Dataset::ParsePanId(Arg *&aArgs, otOperationalDataset &aDataset)
460*cfb92d14SAndroid Build Coastguard Worker {
461*cfb92d14SAndroid Build Coastguard Worker     return aArgs++->ParseAsUint16(aDataset.mPanId);
462*cfb92d14SAndroid Build Coastguard Worker }
463*cfb92d14SAndroid Build Coastguard Worker 
ParsePendingTimestamp(Arg * & aArgs,otOperationalDataset & aDataset)464*cfb92d14SAndroid Build Coastguard Worker otError Dataset::ParsePendingTimestamp(Arg *&aArgs, otOperationalDataset &aDataset)
465*cfb92d14SAndroid Build Coastguard Worker {
466*cfb92d14SAndroid Build Coastguard Worker     otError error;
467*cfb92d14SAndroid Build Coastguard Worker 
468*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = aArgs++->ParseAsUint64(aDataset.mPendingTimestamp.mSeconds));
469*cfb92d14SAndroid Build Coastguard Worker     aDataset.mPendingTimestamp.mTicks         = 0;
470*cfb92d14SAndroid Build Coastguard Worker     aDataset.mPendingTimestamp.mAuthoritative = false;
471*cfb92d14SAndroid Build Coastguard Worker 
472*cfb92d14SAndroid Build Coastguard Worker exit:
473*cfb92d14SAndroid Build Coastguard Worker     return error;
474*cfb92d14SAndroid Build Coastguard Worker }
475*cfb92d14SAndroid Build Coastguard Worker 
ParsePskc(Arg * & aArgs,otOperationalDataset & aDataset)476*cfb92d14SAndroid Build Coastguard Worker otError Dataset::ParsePskc(Arg *&aArgs, otOperationalDataset &aDataset)
477*cfb92d14SAndroid Build Coastguard Worker {
478*cfb92d14SAndroid Build Coastguard Worker     otError error;
479*cfb92d14SAndroid Build Coastguard Worker 
480*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
481*cfb92d14SAndroid Build Coastguard Worker     if (*aArgs == "-p")
482*cfb92d14SAndroid Build Coastguard Worker     {
483*cfb92d14SAndroid Build Coastguard Worker         aArgs++;
484*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(!aArgs->IsEmpty(), error = OT_ERROR_INVALID_ARGS);
485*cfb92d14SAndroid Build Coastguard Worker 
486*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otDatasetGeneratePskc(
487*cfb92d14SAndroid Build Coastguard Worker                           aArgs->GetCString(),
488*cfb92d14SAndroid Build Coastguard Worker                           (aDataset.mComponents.mIsNetworkNamePresent
489*cfb92d14SAndroid Build Coastguard Worker                                ? &aDataset.mNetworkName
490*cfb92d14SAndroid Build Coastguard Worker                                : reinterpret_cast<const otNetworkName *>(otThreadGetNetworkName(GetInstancePtr()))),
491*cfb92d14SAndroid Build Coastguard Worker                           (aDataset.mComponents.mIsExtendedPanIdPresent ? &aDataset.mExtendedPanId
492*cfb92d14SAndroid Build Coastguard Worker                                                                         : otThreadGetExtendedPanId(GetInstancePtr())),
493*cfb92d14SAndroid Build Coastguard Worker                           &aDataset.mPskc));
494*cfb92d14SAndroid Build Coastguard Worker         aArgs++;
495*cfb92d14SAndroid Build Coastguard Worker     }
496*cfb92d14SAndroid Build Coastguard Worker     else
497*cfb92d14SAndroid Build Coastguard Worker #endif
498*cfb92d14SAndroid Build Coastguard Worker     {
499*cfb92d14SAndroid Build Coastguard Worker         ExitNow(error = aArgs++->ParseAsHexString(aDataset.mPskc.m8));
500*cfb92d14SAndroid Build Coastguard Worker     }
501*cfb92d14SAndroid Build Coastguard Worker 
502*cfb92d14SAndroid Build Coastguard Worker exit:
503*cfb92d14SAndroid Build Coastguard Worker     return error;
504*cfb92d14SAndroid Build Coastguard Worker }
505*cfb92d14SAndroid Build Coastguard Worker 
ParseSecurityPolicy(Arg * & aArgs,otOperationalDataset & aDataset)506*cfb92d14SAndroid Build Coastguard Worker otError Dataset::ParseSecurityPolicy(Arg *&aArgs, otOperationalDataset &aDataset)
507*cfb92d14SAndroid Build Coastguard Worker {
508*cfb92d14SAndroid Build Coastguard Worker     return ParseSecurityPolicy(aDataset.mSecurityPolicy, aArgs);
509*cfb92d14SAndroid Build Coastguard Worker }
510*cfb92d14SAndroid Build Coastguard Worker 
ParseTlvs(Arg & aArg,otOperationalDatasetTlvs & aDatasetTlvs)511*cfb92d14SAndroid Build Coastguard Worker otError Dataset::ParseTlvs(Arg &aArg, otOperationalDatasetTlvs &aDatasetTlvs)
512*cfb92d14SAndroid Build Coastguard Worker {
513*cfb92d14SAndroid Build Coastguard Worker     otError  error;
514*cfb92d14SAndroid Build Coastguard Worker     uint16_t length;
515*cfb92d14SAndroid Build Coastguard Worker 
516*cfb92d14SAndroid Build Coastguard Worker     length = sizeof(aDatasetTlvs.mTlvs);
517*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = aArg.ParseAsHexString(length, aDatasetTlvs.mTlvs));
518*cfb92d14SAndroid Build Coastguard Worker     aDatasetTlvs.mLength = static_cast<uint8_t>(length);
519*cfb92d14SAndroid Build Coastguard Worker 
520*cfb92d14SAndroid Build Coastguard Worker exit:
521*cfb92d14SAndroid Build Coastguard Worker     return error;
522*cfb92d14SAndroid Build Coastguard Worker }
523*cfb92d14SAndroid Build Coastguard Worker 
524*cfb92d14SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------
525*cfb92d14SAndroid Build Coastguard Worker 
ProcessCommand(const ComponentMapper & aMapper,Arg aArgs[])526*cfb92d14SAndroid Build Coastguard Worker otError Dataset::ProcessCommand(const ComponentMapper &aMapper, Arg aArgs[])
527*cfb92d14SAndroid Build Coastguard Worker {
528*cfb92d14SAndroid Build Coastguard Worker     otError              error = OT_ERROR_NONE;
529*cfb92d14SAndroid Build Coastguard Worker     otOperationalDataset dataset;
530*cfb92d14SAndroid Build Coastguard Worker 
531*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
532*cfb92d14SAndroid Build Coastguard Worker     {
533*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otDatasetParseTlvs(&sDatasetTlvs, &dataset));
534*cfb92d14SAndroid Build Coastguard Worker 
535*cfb92d14SAndroid Build Coastguard Worker         if (dataset.mComponents.*aMapper.mIsPresentPtr)
536*cfb92d14SAndroid Build Coastguard Worker         {
537*cfb92d14SAndroid Build Coastguard Worker             (this->*aMapper.mOutput)(dataset);
538*cfb92d14SAndroid Build Coastguard Worker         }
539*cfb92d14SAndroid Build Coastguard Worker     }
540*cfb92d14SAndroid Build Coastguard Worker     else
541*cfb92d14SAndroid Build Coastguard Worker     {
542*cfb92d14SAndroid Build Coastguard Worker         ClearAllBytes(dataset);
543*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = (this->*aMapper.mParse)(aArgs, dataset));
544*cfb92d14SAndroid Build Coastguard Worker         dataset.mComponents.*aMapper.mIsPresentPtr = true;
545*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otDatasetUpdateTlvs(&dataset, &sDatasetTlvs));
546*cfb92d14SAndroid Build Coastguard Worker     }
547*cfb92d14SAndroid Build Coastguard Worker 
548*cfb92d14SAndroid Build Coastguard Worker exit:
549*cfb92d14SAndroid Build Coastguard Worker     return error;
550*cfb92d14SAndroid Build Coastguard Worker }
551*cfb92d14SAndroid Build Coastguard Worker 
Print(otOperationalDatasetTlvs & aDatasetTlvs)552*cfb92d14SAndroid Build Coastguard Worker otError Dataset::Print(otOperationalDatasetTlvs &aDatasetTlvs)
553*cfb92d14SAndroid Build Coastguard Worker {
554*cfb92d14SAndroid Build Coastguard Worker     struct ComponentTitle
555*cfb92d14SAndroid Build Coastguard Worker     {
556*cfb92d14SAndroid Build Coastguard Worker         const char *mTitle; // Title to output.
557*cfb92d14SAndroid Build Coastguard Worker         const char *mName;  // To use with `LookupMapper()`.
558*cfb92d14SAndroid Build Coastguard Worker     };
559*cfb92d14SAndroid Build Coastguard Worker 
560*cfb92d14SAndroid Build Coastguard Worker     static const ComponentTitle kTitles[] = {
561*cfb92d14SAndroid Build Coastguard Worker         {"Pending Timestamp", "pendingtimestamp"},
562*cfb92d14SAndroid Build Coastguard Worker         {"Active Timestamp", "activetimestamp"},
563*cfb92d14SAndroid Build Coastguard Worker         {"Channel", "channel"},
564*cfb92d14SAndroid Build Coastguard Worker         {"Channel Mask", "channelmask"},
565*cfb92d14SAndroid Build Coastguard Worker         {"Delay", "delay"},
566*cfb92d14SAndroid Build Coastguard Worker         {"Ext PAN ID", "extpanid"},
567*cfb92d14SAndroid Build Coastguard Worker         {"Mesh Local Prefix", "meshlocalprefix"},
568*cfb92d14SAndroid Build Coastguard Worker         {"Network Key", "networkkey"},
569*cfb92d14SAndroid Build Coastguard Worker         {"Network Name", "networkname"},
570*cfb92d14SAndroid Build Coastguard Worker         {"PAN ID", "panid"},
571*cfb92d14SAndroid Build Coastguard Worker         {"PSKc", "pskc"},
572*cfb92d14SAndroid Build Coastguard Worker         {"Security Policy", "securitypolicy"},
573*cfb92d14SAndroid Build Coastguard Worker     };
574*cfb92d14SAndroid Build Coastguard Worker 
575*cfb92d14SAndroid Build Coastguard Worker     otError              error;
576*cfb92d14SAndroid Build Coastguard Worker     otOperationalDataset dataset;
577*cfb92d14SAndroid Build Coastguard Worker 
578*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = otDatasetParseTlvs(&aDatasetTlvs, &dataset));
579*cfb92d14SAndroid Build Coastguard Worker 
580*cfb92d14SAndroid Build Coastguard Worker     for (const ComponentTitle &title : kTitles)
581*cfb92d14SAndroid Build Coastguard Worker     {
582*cfb92d14SAndroid Build Coastguard Worker         const ComponentMapper *mapper = LookupMapper(title.mName);
583*cfb92d14SAndroid Build Coastguard Worker 
584*cfb92d14SAndroid Build Coastguard Worker         if (dataset.mComponents.*mapper->mIsPresentPtr)
585*cfb92d14SAndroid Build Coastguard Worker         {
586*cfb92d14SAndroid Build Coastguard Worker             OutputFormat("%s: ", title.mTitle);
587*cfb92d14SAndroid Build Coastguard Worker             (this->*mapper->mOutput)(dataset);
588*cfb92d14SAndroid Build Coastguard Worker         }
589*cfb92d14SAndroid Build Coastguard Worker     }
590*cfb92d14SAndroid Build Coastguard Worker 
591*cfb92d14SAndroid Build Coastguard Worker exit:
592*cfb92d14SAndroid Build Coastguard Worker     return error;
593*cfb92d14SAndroid Build Coastguard Worker }
594*cfb92d14SAndroid Build Coastguard Worker 
595*cfb92d14SAndroid Build Coastguard Worker /**
596*cfb92d14SAndroid Build Coastguard Worker  * @cli dataset init (active,new,pending,tlvs)
597*cfb92d14SAndroid Build Coastguard Worker  * @code
598*cfb92d14SAndroid Build Coastguard Worker  * dataset init new
599*cfb92d14SAndroid Build Coastguard Worker  * Done
600*cfb92d14SAndroid Build Coastguard Worker  * @endcode
601*cfb92d14SAndroid Build Coastguard Worker  * @cparam dataset init {@ca{active}|@ca{new}|@ca{pending}|@ca{tlvs}} [@ca{hex-encoded-tlvs}]
602*cfb92d14SAndroid Build Coastguard Worker  * Use `new` to initialize a new dataset, then enter the command `dataset commit active`.
603*cfb92d14SAndroid Build Coastguard Worker  * Use `tlvs` for hex-encoded TLVs.
604*cfb92d14SAndroid Build Coastguard Worker  * @par
605*cfb92d14SAndroid Build Coastguard Worker  * OT CLI checks for `active`, `pending`, or `tlvs` and returns the corresponding values. Otherwise,
606*cfb92d14SAndroid Build Coastguard Worker  * OT CLI creates a new, random network and returns a new dataset.
607*cfb92d14SAndroid Build Coastguard Worker  * @csa{dataset commit active}
608*cfb92d14SAndroid Build Coastguard Worker  * @csa{dataset active}
609*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])610*cfb92d14SAndroid Build Coastguard Worker template <> otError Dataset::Process<Cmd("init")>(Arg aArgs[])
611*cfb92d14SAndroid Build Coastguard Worker {
612*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_INVALID_ARGS;
613*cfb92d14SAndroid Build Coastguard Worker 
614*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "active")
615*cfb92d14SAndroid Build Coastguard Worker     {
616*cfb92d14SAndroid Build Coastguard Worker         error = otDatasetGetActiveTlvs(GetInstancePtr(), &sDatasetTlvs);
617*cfb92d14SAndroid Build Coastguard Worker     }
618*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "pending")
619*cfb92d14SAndroid Build Coastguard Worker     {
620*cfb92d14SAndroid Build Coastguard Worker         error = otDatasetGetPendingTlvs(GetInstancePtr(), &sDatasetTlvs);
621*cfb92d14SAndroid Build Coastguard Worker     }
622*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
623*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "new")
624*cfb92d14SAndroid Build Coastguard Worker     {
625*cfb92d14SAndroid Build Coastguard Worker         otOperationalDataset dataset;
626*cfb92d14SAndroid Build Coastguard Worker 
627*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otDatasetCreateNewNetwork(GetInstancePtr(), &dataset));
628*cfb92d14SAndroid Build Coastguard Worker         otDatasetConvertToTlvs(&dataset, &sDatasetTlvs);
629*cfb92d14SAndroid Build Coastguard Worker     }
630*cfb92d14SAndroid Build Coastguard Worker #endif
631*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "tlvs")
632*cfb92d14SAndroid Build Coastguard Worker     {
633*cfb92d14SAndroid Build Coastguard Worker         ExitNow(error = ParseTlvs(aArgs[1], sDatasetTlvs));
634*cfb92d14SAndroid Build Coastguard Worker     }
635*cfb92d14SAndroid Build Coastguard Worker 
636*cfb92d14SAndroid Build Coastguard Worker exit:
637*cfb92d14SAndroid Build Coastguard Worker     return error;
638*cfb92d14SAndroid Build Coastguard Worker }
639*cfb92d14SAndroid Build Coastguard Worker 
640*cfb92d14SAndroid Build Coastguard Worker /**
641*cfb92d14SAndroid Build Coastguard Worker  * @cli dataset active
642*cfb92d14SAndroid Build Coastguard Worker  * @code
643*cfb92d14SAndroid Build Coastguard Worker  * dataset active
644*cfb92d14SAndroid Build Coastguard Worker  * Active Timestamp: 1
645*cfb92d14SAndroid Build Coastguard Worker  * Channel: 13
646*cfb92d14SAndroid Build Coastguard Worker  * Channel Mask: 0x07fff800
647*cfb92d14SAndroid Build Coastguard Worker  * Ext PAN ID: d63e8e3e495ebbc3
648*cfb92d14SAndroid Build Coastguard Worker  * Mesh Local Prefix: fd3d:b50b:f96d:722d::/64
649*cfb92d14SAndroid Build Coastguard Worker  * Network Key: dfd34f0f05cad978ec4e32b0413038ff
650*cfb92d14SAndroid Build Coastguard Worker  * Network Name: OpenThread-8f28
651*cfb92d14SAndroid Build Coastguard Worker  * PAN ID: 0x8f28
652*cfb92d14SAndroid Build Coastguard Worker  * PSKc: c23a76e98f1a6483639b1ac1271e2e27
653*cfb92d14SAndroid Build Coastguard Worker  * Security Policy: 0, onrcb
654*cfb92d14SAndroid Build Coastguard Worker  * Done
655*cfb92d14SAndroid Build Coastguard Worker  * @endcode
656*cfb92d14SAndroid Build Coastguard Worker  * @code
657*cfb92d14SAndroid Build Coastguard Worker  * dataset active -x
658*cfb92d14SAndroid Build Coastguard Worker  * 0e08000000000001000000030000103506000...3023d82c841eff0e68db86f35740c030000ff
659*cfb92d14SAndroid Build Coastguard Worker  * Done
660*cfb92d14SAndroid Build Coastguard Worker  * @endcode
661*cfb92d14SAndroid Build Coastguard Worker  * @cparam dataset active [-x]
662*cfb92d14SAndroid Build Coastguard Worker  * The optional `-x` argument prints the Active Operational %Dataset values as hex-encoded TLVs.
663*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
664*cfb92d14SAndroid Build Coastguard Worker  * #otDatasetGetActive
665*cfb92d14SAndroid Build Coastguard Worker  * @par
666*cfb92d14SAndroid Build Coastguard Worker  * OT CLI uses #otOperationalDataset members to return dataset values to the console.
667*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])668*cfb92d14SAndroid Build Coastguard Worker template <> otError Dataset::Process<Cmd("active")>(Arg aArgs[])
669*cfb92d14SAndroid Build Coastguard Worker {
670*cfb92d14SAndroid Build Coastguard Worker     otError                  error;
671*cfb92d14SAndroid Build Coastguard Worker     otOperationalDatasetTlvs dataset;
672*cfb92d14SAndroid Build Coastguard Worker 
673*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = otDatasetGetActiveTlvs(GetInstancePtr(), &dataset));
674*cfb92d14SAndroid Build Coastguard Worker 
675*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
676*cfb92d14SAndroid Build Coastguard Worker     {
677*cfb92d14SAndroid Build Coastguard Worker         error = Print(dataset);
678*cfb92d14SAndroid Build Coastguard Worker     }
679*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "-x")
680*cfb92d14SAndroid Build Coastguard Worker     {
681*cfb92d14SAndroid Build Coastguard Worker         OutputBytesLine(dataset.mTlvs, dataset.mLength);
682*cfb92d14SAndroid Build Coastguard Worker     }
683*cfb92d14SAndroid Build Coastguard Worker     else
684*cfb92d14SAndroid Build Coastguard Worker     {
685*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
686*cfb92d14SAndroid Build Coastguard Worker     }
687*cfb92d14SAndroid Build Coastguard Worker 
688*cfb92d14SAndroid Build Coastguard Worker exit:
689*cfb92d14SAndroid Build Coastguard Worker     return error;
690*cfb92d14SAndroid Build Coastguard Worker }
691*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])692*cfb92d14SAndroid Build Coastguard Worker template <> otError Dataset::Process<Cmd("pending")>(Arg aArgs[])
693*cfb92d14SAndroid Build Coastguard Worker {
694*cfb92d14SAndroid Build Coastguard Worker     otError                  error;
695*cfb92d14SAndroid Build Coastguard Worker     otOperationalDatasetTlvs datasetTlvs;
696*cfb92d14SAndroid Build Coastguard Worker 
697*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = otDatasetGetPendingTlvs(GetInstancePtr(), &datasetTlvs));
698*cfb92d14SAndroid Build Coastguard Worker 
699*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
700*cfb92d14SAndroid Build Coastguard Worker     {
701*cfb92d14SAndroid Build Coastguard Worker         error = Print(datasetTlvs);
702*cfb92d14SAndroid Build Coastguard Worker     }
703*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "-x")
704*cfb92d14SAndroid Build Coastguard Worker     {
705*cfb92d14SAndroid Build Coastguard Worker         OutputBytesLine(datasetTlvs.mTlvs, datasetTlvs.mLength);
706*cfb92d14SAndroid Build Coastguard Worker     }
707*cfb92d14SAndroid Build Coastguard Worker     else
708*cfb92d14SAndroid Build Coastguard Worker     {
709*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
710*cfb92d14SAndroid Build Coastguard Worker     }
711*cfb92d14SAndroid Build Coastguard Worker 
712*cfb92d14SAndroid Build Coastguard Worker exit:
713*cfb92d14SAndroid Build Coastguard Worker     return error;
714*cfb92d14SAndroid Build Coastguard Worker }
715*cfb92d14SAndroid Build Coastguard Worker 
716*cfb92d14SAndroid Build Coastguard Worker /**
717*cfb92d14SAndroid Build Coastguard Worker  * @cli dataset clear
718*cfb92d14SAndroid Build Coastguard Worker  * @code
719*cfb92d14SAndroid Build Coastguard Worker  * dataset clear
720*cfb92d14SAndroid Build Coastguard Worker  * Done
721*cfb92d14SAndroid Build Coastguard Worker  * @endcode
722*cfb92d14SAndroid Build Coastguard Worker  * @par
723*cfb92d14SAndroid Build Coastguard Worker  * Reset the Operational %Dataset buffer.
724*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])725*cfb92d14SAndroid Build Coastguard Worker template <> otError Dataset::Process<Cmd("clear")>(Arg aArgs[])
726*cfb92d14SAndroid Build Coastguard Worker {
727*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aArgs);
728*cfb92d14SAndroid Build Coastguard Worker 
729*cfb92d14SAndroid Build Coastguard Worker     ClearAllBytes(sDatasetTlvs);
730*cfb92d14SAndroid Build Coastguard Worker     return OT_ERROR_NONE;
731*cfb92d14SAndroid Build Coastguard Worker }
732*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])733*cfb92d14SAndroid Build Coastguard Worker template <> otError Dataset::Process<Cmd("commit")>(Arg aArgs[])
734*cfb92d14SAndroid Build Coastguard Worker {
735*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_INVALID_ARGS;
736*cfb92d14SAndroid Build Coastguard Worker 
737*cfb92d14SAndroid Build Coastguard Worker     /**
738*cfb92d14SAndroid Build Coastguard Worker      * @cli dataset commit active
739*cfb92d14SAndroid Build Coastguard Worker      * @code
740*cfb92d14SAndroid Build Coastguard Worker      * dataset commit active
741*cfb92d14SAndroid Build Coastguard Worker      * Done
742*cfb92d14SAndroid Build Coastguard Worker      * @endcode
743*cfb92d14SAndroid Build Coastguard Worker      * @par
744*cfb92d14SAndroid Build Coastguard Worker      * Commit the Operational %Dataset buffer to Active Operational %Dataset.
745*cfb92d14SAndroid Build Coastguard Worker      * @csa{dataset commit pending}
746*cfb92d14SAndroid Build Coastguard Worker      * @sa #otDatasetSetPending
747*cfb92d14SAndroid Build Coastguard Worker      */
748*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "active")
749*cfb92d14SAndroid Build Coastguard Worker     {
750*cfb92d14SAndroid Build Coastguard Worker         error = otDatasetSetActiveTlvs(GetInstancePtr(), &sDatasetTlvs);
751*cfb92d14SAndroid Build Coastguard Worker     }
752*cfb92d14SAndroid Build Coastguard Worker     /**
753*cfb92d14SAndroid Build Coastguard Worker      * @cli dataset commit pending
754*cfb92d14SAndroid Build Coastguard Worker      * @code
755*cfb92d14SAndroid Build Coastguard Worker      * dataset commit pending
756*cfb92d14SAndroid Build Coastguard Worker      * Done
757*cfb92d14SAndroid Build Coastguard Worker      * @endcode
758*cfb92d14SAndroid Build Coastguard Worker      * @par
759*cfb92d14SAndroid Build Coastguard Worker      * Commit the Operational %Dataset buffer to Pending Operational %Dataset.
760*cfb92d14SAndroid Build Coastguard Worker      * @csa{dataset commit active}
761*cfb92d14SAndroid Build Coastguard Worker      * @sa #otDatasetSetActive
762*cfb92d14SAndroid Build Coastguard Worker      */
763*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "pending")
764*cfb92d14SAndroid Build Coastguard Worker     {
765*cfb92d14SAndroid Build Coastguard Worker         error = otDatasetSetPendingTlvs(GetInstancePtr(), &sDatasetTlvs);
766*cfb92d14SAndroid Build Coastguard Worker     }
767*cfb92d14SAndroid Build Coastguard Worker 
768*cfb92d14SAndroid Build Coastguard Worker     return error;
769*cfb92d14SAndroid Build Coastguard Worker }
770*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])771*cfb92d14SAndroid Build Coastguard Worker template <> otError Dataset::Process<Cmd("mgmtsetcommand")>(Arg aArgs[])
772*cfb92d14SAndroid Build Coastguard Worker {
773*cfb92d14SAndroid Build Coastguard Worker     otError                  error = OT_ERROR_NONE;
774*cfb92d14SAndroid Build Coastguard Worker     otOperationalDataset     dataset;
775*cfb92d14SAndroid Build Coastguard Worker     otOperationalDatasetTlvs tlvs;
776*cfb92d14SAndroid Build Coastguard Worker 
777*cfb92d14SAndroid Build Coastguard Worker     ClearAllBytes(dataset);
778*cfb92d14SAndroid Build Coastguard Worker     ClearAllBytes(tlvs);
779*cfb92d14SAndroid Build Coastguard Worker 
780*cfb92d14SAndroid Build Coastguard Worker     for (Arg *arg = &aArgs[1]; !arg->IsEmpty();)
781*cfb92d14SAndroid Build Coastguard Worker     {
782*cfb92d14SAndroid Build Coastguard Worker         const ComponentMapper *mapper = LookupMapper(arg->GetCString());
783*cfb92d14SAndroid Build Coastguard Worker 
784*cfb92d14SAndroid Build Coastguard Worker         if (mapper != nullptr)
785*cfb92d14SAndroid Build Coastguard Worker         {
786*cfb92d14SAndroid Build Coastguard Worker             arg++;
787*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = (this->*mapper->mParse)(arg, dataset));
788*cfb92d14SAndroid Build Coastguard Worker             dataset.mComponents.*mapper->mIsPresentPtr = true;
789*cfb92d14SAndroid Build Coastguard Worker         }
790*cfb92d14SAndroid Build Coastguard Worker         else if (*arg == "-x")
791*cfb92d14SAndroid Build Coastguard Worker         {
792*cfb92d14SAndroid Build Coastguard Worker             arg++;
793*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = ParseTlvs(*arg, tlvs));
794*cfb92d14SAndroid Build Coastguard Worker             arg++;
795*cfb92d14SAndroid Build Coastguard Worker         }
796*cfb92d14SAndroid Build Coastguard Worker         else
797*cfb92d14SAndroid Build Coastguard Worker         {
798*cfb92d14SAndroid Build Coastguard Worker             ExitNow(error = OT_ERROR_INVALID_ARGS);
799*cfb92d14SAndroid Build Coastguard Worker         }
800*cfb92d14SAndroid Build Coastguard Worker     }
801*cfb92d14SAndroid Build Coastguard Worker 
802*cfb92d14SAndroid Build Coastguard Worker     /**
803*cfb92d14SAndroid Build Coastguard Worker      * @cli dataset mgmtsetcommand active
804*cfb92d14SAndroid Build Coastguard Worker      * @code
805*cfb92d14SAndroid Build Coastguard Worker      * dataset mgmtsetcommand active activetimestamp 123 securitypolicy 1 onrcb
806*cfb92d14SAndroid Build Coastguard Worker      * Done
807*cfb92d14SAndroid Build Coastguard Worker      * @endcode
808*cfb92d14SAndroid Build Coastguard Worker      * @cparam dataset mgmtsetcommand active [@ca{dataset-components}] [-x @ca{tlv-list}]
809*cfb92d14SAndroid Build Coastguard Worker      * To learn more about these parameters and argument mappings, refer to @dataset.
810*cfb92d14SAndroid Build Coastguard Worker      * @par
811*cfb92d14SAndroid Build Coastguard Worker      * @note This command is primarily used for testing only.
812*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
813*cfb92d14SAndroid Build Coastguard Worker      * #otDatasetSendMgmtActiveSet
814*cfb92d14SAndroid Build Coastguard Worker      * @csa{dataset mgmtgetcommand active}
815*cfb92d14SAndroid Build Coastguard Worker      * @csa{dataset mgmtgetcommand pending}
816*cfb92d14SAndroid Build Coastguard Worker      * @csa{dataset mgmtsetcommand pending}
817*cfb92d14SAndroid Build Coastguard Worker      */
818*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "active")
819*cfb92d14SAndroid Build Coastguard Worker     {
820*cfb92d14SAndroid Build Coastguard Worker         error =
821*cfb92d14SAndroid Build Coastguard Worker             otDatasetSendMgmtActiveSet(GetInstancePtr(), &dataset, tlvs.mTlvs, tlvs.mLength, /* aCallback */ nullptr,
822*cfb92d14SAndroid Build Coastguard Worker                                        /* aContext */ nullptr);
823*cfb92d14SAndroid Build Coastguard Worker     }
824*cfb92d14SAndroid Build Coastguard Worker     /**
825*cfb92d14SAndroid Build Coastguard Worker      * @cli dataset mgmtsetcommand pending
826*cfb92d14SAndroid Build Coastguard Worker      * @code
827*cfb92d14SAndroid Build Coastguard Worker      * dataset mgmtsetcommand pending activetimestamp 123 securitypolicy 1 onrcb
828*cfb92d14SAndroid Build Coastguard Worker      * Done
829*cfb92d14SAndroid Build Coastguard Worker      * @endcode
830*cfb92d14SAndroid Build Coastguard Worker      * @cparam dataset mgmtsetcommand pending [@ca{dataset-components}] [-x @ca{tlv-list}]
831*cfb92d14SAndroid Build Coastguard Worker      * To learn more about these parameters and argument mappings, refer to @dataset.
832*cfb92d14SAndroid Build Coastguard Worker      * @par
833*cfb92d14SAndroid Build Coastguard Worker      * @note This command is primarily used for testing only.
834*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
835*cfb92d14SAndroid Build Coastguard Worker      * #otDatasetSendMgmtPendingSet
836*cfb92d14SAndroid Build Coastguard Worker      * @csa{dataset mgmtgetcommand active}
837*cfb92d14SAndroid Build Coastguard Worker      * @csa{dataset mgmtgetcommand pending}
838*cfb92d14SAndroid Build Coastguard Worker      * @csa{dataset mgmtsetcommand active}
839*cfb92d14SAndroid Build Coastguard Worker      */
840*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "pending")
841*cfb92d14SAndroid Build Coastguard Worker     {
842*cfb92d14SAndroid Build Coastguard Worker         error =
843*cfb92d14SAndroid Build Coastguard Worker             otDatasetSendMgmtPendingSet(GetInstancePtr(), &dataset, tlvs.mTlvs, tlvs.mLength, /* aCallback */ nullptr,
844*cfb92d14SAndroid Build Coastguard Worker                                         /* aContext */ nullptr);
845*cfb92d14SAndroid Build Coastguard Worker     }
846*cfb92d14SAndroid Build Coastguard Worker     else
847*cfb92d14SAndroid Build Coastguard Worker     {
848*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
849*cfb92d14SAndroid Build Coastguard Worker     }
850*cfb92d14SAndroid Build Coastguard Worker 
851*cfb92d14SAndroid Build Coastguard Worker exit:
852*cfb92d14SAndroid Build Coastguard Worker     return error;
853*cfb92d14SAndroid Build Coastguard Worker }
854*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])855*cfb92d14SAndroid Build Coastguard Worker template <> otError Dataset::Process<Cmd("mgmtgetcommand")>(Arg aArgs[])
856*cfb92d14SAndroid Build Coastguard Worker {
857*cfb92d14SAndroid Build Coastguard Worker     otError                        error = OT_ERROR_NONE;
858*cfb92d14SAndroid Build Coastguard Worker     otOperationalDatasetComponents datasetComponents;
859*cfb92d14SAndroid Build Coastguard Worker     otOperationalDatasetTlvs       tlvs;
860*cfb92d14SAndroid Build Coastguard Worker     bool                           destAddrSpecified = false;
861*cfb92d14SAndroid Build Coastguard Worker     otIp6Address                   address;
862*cfb92d14SAndroid Build Coastguard Worker 
863*cfb92d14SAndroid Build Coastguard Worker     ClearAllBytes(datasetComponents);
864*cfb92d14SAndroid Build Coastguard Worker     ClearAllBytes(tlvs);
865*cfb92d14SAndroid Build Coastguard Worker 
866*cfb92d14SAndroid Build Coastguard Worker     for (Arg *arg = &aArgs[1]; !arg->IsEmpty(); arg++)
867*cfb92d14SAndroid Build Coastguard Worker     {
868*cfb92d14SAndroid Build Coastguard Worker         const ComponentMapper *mapper = LookupMapper(arg->GetCString());
869*cfb92d14SAndroid Build Coastguard Worker 
870*cfb92d14SAndroid Build Coastguard Worker         if (mapper != nullptr)
871*cfb92d14SAndroid Build Coastguard Worker         {
872*cfb92d14SAndroid Build Coastguard Worker             datasetComponents.*mapper->mIsPresentPtr = true;
873*cfb92d14SAndroid Build Coastguard Worker         }
874*cfb92d14SAndroid Build Coastguard Worker         else if (*arg == "-x")
875*cfb92d14SAndroid Build Coastguard Worker         {
876*cfb92d14SAndroid Build Coastguard Worker             arg++;
877*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = ParseTlvs(*arg, tlvs));
878*cfb92d14SAndroid Build Coastguard Worker         }
879*cfb92d14SAndroid Build Coastguard Worker         else if (*arg == "address")
880*cfb92d14SAndroid Build Coastguard Worker         {
881*cfb92d14SAndroid Build Coastguard Worker             arg++;
882*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = arg->ParseAsIp6Address(address));
883*cfb92d14SAndroid Build Coastguard Worker             destAddrSpecified = true;
884*cfb92d14SAndroid Build Coastguard Worker         }
885*cfb92d14SAndroid Build Coastguard Worker         else
886*cfb92d14SAndroid Build Coastguard Worker         {
887*cfb92d14SAndroid Build Coastguard Worker             ExitNow(error = OT_ERROR_INVALID_ARGS);
888*cfb92d14SAndroid Build Coastguard Worker         }
889*cfb92d14SAndroid Build Coastguard Worker     }
890*cfb92d14SAndroid Build Coastguard Worker 
891*cfb92d14SAndroid Build Coastguard Worker     /**
892*cfb92d14SAndroid Build Coastguard Worker      * @cli dataset mgmtgetcommand active
893*cfb92d14SAndroid Build Coastguard Worker      * @code
894*cfb92d14SAndroid Build Coastguard Worker      * dataset mgmtgetcommand active address fdde:ad00:beef:0:558:f56b:d688:799 activetimestamp securitypolicy
895*cfb92d14SAndroid Build Coastguard Worker      * Done
896*cfb92d14SAndroid Build Coastguard Worker      * @endcode
897*cfb92d14SAndroid Build Coastguard Worker      * @code
898*cfb92d14SAndroid Build Coastguard Worker      * dataset mgmtgetcommand active networkname
899*cfb92d14SAndroid Build Coastguard Worker      * Done
900*cfb92d14SAndroid Build Coastguard Worker      * @endcode
901*cfb92d14SAndroid Build Coastguard Worker      * @cparam dataset mgmtgetcommand active [address @ca{leader-address}] [@ca{dataset-components}] [-x @ca{tlv-list}]
902*cfb92d14SAndroid Build Coastguard Worker      * *    Use `address` to specify the IPv6 destination; otherwise, the Leader ALOC is used as default.
903*cfb92d14SAndroid Build Coastguard Worker      * *    For `dataset-components`, you can pass any combination of #otOperationalDatasetComponents, for
904*cfb92d14SAndroid Build Coastguard Worker      *      example `activetimestamp`, `pendingtimestamp`, or `networkkey`.
905*cfb92d14SAndroid Build Coastguard Worker      * *    The optional `-x` argument specifies raw TLVs to be requested.
906*cfb92d14SAndroid Build Coastguard Worker      * @par
907*cfb92d14SAndroid Build Coastguard Worker      * OT CLI sends a MGMT_ACTIVE_GET with the relevant arguments.
908*cfb92d14SAndroid Build Coastguard Worker      * To learn more about these parameters and argument mappings, refer to @dataset.
909*cfb92d14SAndroid Build Coastguard Worker      * @note This command is primarily used for testing only.
910*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
911*cfb92d14SAndroid Build Coastguard Worker      * #otDatasetSendMgmtActiveGet
912*cfb92d14SAndroid Build Coastguard Worker      * @csa{dataset mgmtgetcommand pending}
913*cfb92d14SAndroid Build Coastguard Worker      * @csa{dataset mgmtsetcommand active}
914*cfb92d14SAndroid Build Coastguard Worker      * @csa{dataset mgmtsetcommand pending}
915*cfb92d14SAndroid Build Coastguard Worker      */
916*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "active")
917*cfb92d14SAndroid Build Coastguard Worker     {
918*cfb92d14SAndroid Build Coastguard Worker         error = otDatasetSendMgmtActiveGet(GetInstancePtr(), &datasetComponents, tlvs.mTlvs, tlvs.mLength,
919*cfb92d14SAndroid Build Coastguard Worker                                            destAddrSpecified ? &address : nullptr);
920*cfb92d14SAndroid Build Coastguard Worker     }
921*cfb92d14SAndroid Build Coastguard Worker     /**
922*cfb92d14SAndroid Build Coastguard Worker      * @cli dataset mgmtgetcommand pending
923*cfb92d14SAndroid Build Coastguard Worker      * @code
924*cfb92d14SAndroid Build Coastguard Worker      * dataset mgmtgetcommand pending address fdde:ad00:beef:0:558:f56b:d688:799 activetimestamp securitypolicy
925*cfb92d14SAndroid Build Coastguard Worker      * Done
926*cfb92d14SAndroid Build Coastguard Worker      * @endcode
927*cfb92d14SAndroid Build Coastguard Worker      * @code
928*cfb92d14SAndroid Build Coastguard Worker      * dataset mgmtgetcommand pending networkname
929*cfb92d14SAndroid Build Coastguard Worker      * Done
930*cfb92d14SAndroid Build Coastguard Worker      * @endcode
931*cfb92d14SAndroid Build Coastguard Worker      * @cparam dataset mgmtgetcommand pending [address @ca{leader-address}] [@ca{dataset-components}] [-x @ca{tlv-list}]
932*cfb92d14SAndroid Build Coastguard Worker      * To learn more about these parameters and argument mappings, refer to @dataset.
933*cfb92d14SAndroid Build Coastguard Worker      * @par
934*cfb92d14SAndroid Build Coastguard Worker      * @note This command is primarily used for testing only.
935*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
936*cfb92d14SAndroid Build Coastguard Worker      * #otDatasetSendMgmtPendingGet
937*cfb92d14SAndroid Build Coastguard Worker      * @csa{dataset mgmtgetcommand active}
938*cfb92d14SAndroid Build Coastguard Worker      * @csa{dataset mgmtsetcommand active}
939*cfb92d14SAndroid Build Coastguard Worker      * @csa{dataset mgmtsetcommand pending}
940*cfb92d14SAndroid Build Coastguard Worker      */
941*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "pending")
942*cfb92d14SAndroid Build Coastguard Worker     {
943*cfb92d14SAndroid Build Coastguard Worker         error = otDatasetSendMgmtPendingGet(GetInstancePtr(), &datasetComponents, tlvs.mTlvs, tlvs.mLength,
944*cfb92d14SAndroid Build Coastguard Worker                                             destAddrSpecified ? &address : nullptr);
945*cfb92d14SAndroid Build Coastguard Worker     }
946*cfb92d14SAndroid Build Coastguard Worker     else
947*cfb92d14SAndroid Build Coastguard Worker     {
948*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
949*cfb92d14SAndroid Build Coastguard Worker     }
950*cfb92d14SAndroid Build Coastguard Worker 
951*cfb92d14SAndroid Build Coastguard Worker exit:
952*cfb92d14SAndroid Build Coastguard Worker     return error;
953*cfb92d14SAndroid Build Coastguard Worker }
954*cfb92d14SAndroid Build Coastguard Worker 
OutputSecurityPolicy(const otSecurityPolicy & aSecurityPolicy)955*cfb92d14SAndroid Build Coastguard Worker void Dataset::OutputSecurityPolicy(const otSecurityPolicy &aSecurityPolicy)
956*cfb92d14SAndroid Build Coastguard Worker {
957*cfb92d14SAndroid Build Coastguard Worker     OutputFormat("%u ", aSecurityPolicy.mRotationTime);
958*cfb92d14SAndroid Build Coastguard Worker 
959*cfb92d14SAndroid Build Coastguard Worker     if (aSecurityPolicy.mObtainNetworkKeyEnabled)
960*cfb92d14SAndroid Build Coastguard Worker     {
961*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("o");
962*cfb92d14SAndroid Build Coastguard Worker     }
963*cfb92d14SAndroid Build Coastguard Worker 
964*cfb92d14SAndroid Build Coastguard Worker     if (aSecurityPolicy.mNativeCommissioningEnabled)
965*cfb92d14SAndroid Build Coastguard Worker     {
966*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("n");
967*cfb92d14SAndroid Build Coastguard Worker     }
968*cfb92d14SAndroid Build Coastguard Worker 
969*cfb92d14SAndroid Build Coastguard Worker     if (aSecurityPolicy.mRoutersEnabled)
970*cfb92d14SAndroid Build Coastguard Worker     {
971*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("r");
972*cfb92d14SAndroid Build Coastguard Worker     }
973*cfb92d14SAndroid Build Coastguard Worker 
974*cfb92d14SAndroid Build Coastguard Worker     if (aSecurityPolicy.mExternalCommissioningEnabled)
975*cfb92d14SAndroid Build Coastguard Worker     {
976*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("c");
977*cfb92d14SAndroid Build Coastguard Worker     }
978*cfb92d14SAndroid Build Coastguard Worker 
979*cfb92d14SAndroid Build Coastguard Worker     if (aSecurityPolicy.mCommercialCommissioningEnabled)
980*cfb92d14SAndroid Build Coastguard Worker     {
981*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("C");
982*cfb92d14SAndroid Build Coastguard Worker     }
983*cfb92d14SAndroid Build Coastguard Worker 
984*cfb92d14SAndroid Build Coastguard Worker     if (aSecurityPolicy.mAutonomousEnrollmentEnabled)
985*cfb92d14SAndroid Build Coastguard Worker     {
986*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("e");
987*cfb92d14SAndroid Build Coastguard Worker     }
988*cfb92d14SAndroid Build Coastguard Worker 
989*cfb92d14SAndroid Build Coastguard Worker     if (aSecurityPolicy.mNetworkKeyProvisioningEnabled)
990*cfb92d14SAndroid Build Coastguard Worker     {
991*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("p");
992*cfb92d14SAndroid Build Coastguard Worker     }
993*cfb92d14SAndroid Build Coastguard Worker 
994*cfb92d14SAndroid Build Coastguard Worker     if (aSecurityPolicy.mNonCcmRoutersEnabled)
995*cfb92d14SAndroid Build Coastguard Worker     {
996*cfb92d14SAndroid Build Coastguard Worker         OutputFormat("R");
997*cfb92d14SAndroid Build Coastguard Worker     }
998*cfb92d14SAndroid Build Coastguard Worker 
999*cfb92d14SAndroid Build Coastguard Worker     OutputLine(" %u", aSecurityPolicy.mVersionThresholdForRouting);
1000*cfb92d14SAndroid Build Coastguard Worker }
1001*cfb92d14SAndroid Build Coastguard Worker 
ParseSecurityPolicy(otSecurityPolicy & aSecurityPolicy,Arg * & aArgs)1002*cfb92d14SAndroid Build Coastguard Worker otError Dataset::ParseSecurityPolicy(otSecurityPolicy &aSecurityPolicy, Arg *&aArgs)
1003*cfb92d14SAndroid Build Coastguard Worker {
1004*cfb92d14SAndroid Build Coastguard Worker     static constexpr uint8_t kMaxVersionThreshold = 7;
1005*cfb92d14SAndroid Build Coastguard Worker 
1006*cfb92d14SAndroid Build Coastguard Worker     otError          error;
1007*cfb92d14SAndroid Build Coastguard Worker     otSecurityPolicy policy;
1008*cfb92d14SAndroid Build Coastguard Worker     uint8_t          versionThreshold;
1009*cfb92d14SAndroid Build Coastguard Worker 
1010*cfb92d14SAndroid Build Coastguard Worker     ClearAllBytes(policy);
1011*cfb92d14SAndroid Build Coastguard Worker 
1012*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = aArgs->ParseAsUint16(policy.mRotationTime));
1013*cfb92d14SAndroid Build Coastguard Worker     aArgs++;
1014*cfb92d14SAndroid Build Coastguard Worker 
1015*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(!aArgs->IsEmpty());
1016*cfb92d14SAndroid Build Coastguard Worker 
1017*cfb92d14SAndroid Build Coastguard Worker     for (const char *flag = aArgs->GetCString(); *flag != '\0'; flag++)
1018*cfb92d14SAndroid Build Coastguard Worker     {
1019*cfb92d14SAndroid Build Coastguard Worker         switch (*flag)
1020*cfb92d14SAndroid Build Coastguard Worker         {
1021*cfb92d14SAndroid Build Coastguard Worker         case 'o':
1022*cfb92d14SAndroid Build Coastguard Worker             policy.mObtainNetworkKeyEnabled = true;
1023*cfb92d14SAndroid Build Coastguard Worker             break;
1024*cfb92d14SAndroid Build Coastguard Worker 
1025*cfb92d14SAndroid Build Coastguard Worker         case 'n':
1026*cfb92d14SAndroid Build Coastguard Worker             policy.mNativeCommissioningEnabled = true;
1027*cfb92d14SAndroid Build Coastguard Worker             break;
1028*cfb92d14SAndroid Build Coastguard Worker 
1029*cfb92d14SAndroid Build Coastguard Worker         case 'r':
1030*cfb92d14SAndroid Build Coastguard Worker             policy.mRoutersEnabled = true;
1031*cfb92d14SAndroid Build Coastguard Worker             break;
1032*cfb92d14SAndroid Build Coastguard Worker 
1033*cfb92d14SAndroid Build Coastguard Worker         case 'c':
1034*cfb92d14SAndroid Build Coastguard Worker             policy.mExternalCommissioningEnabled = true;
1035*cfb92d14SAndroid Build Coastguard Worker             break;
1036*cfb92d14SAndroid Build Coastguard Worker 
1037*cfb92d14SAndroid Build Coastguard Worker         case 'C':
1038*cfb92d14SAndroid Build Coastguard Worker             policy.mCommercialCommissioningEnabled = true;
1039*cfb92d14SAndroid Build Coastguard Worker             break;
1040*cfb92d14SAndroid Build Coastguard Worker 
1041*cfb92d14SAndroid Build Coastguard Worker         case 'e':
1042*cfb92d14SAndroid Build Coastguard Worker             policy.mAutonomousEnrollmentEnabled = true;
1043*cfb92d14SAndroid Build Coastguard Worker             break;
1044*cfb92d14SAndroid Build Coastguard Worker 
1045*cfb92d14SAndroid Build Coastguard Worker         case 'p':
1046*cfb92d14SAndroid Build Coastguard Worker             policy.mNetworkKeyProvisioningEnabled = true;
1047*cfb92d14SAndroid Build Coastguard Worker             break;
1048*cfb92d14SAndroid Build Coastguard Worker 
1049*cfb92d14SAndroid Build Coastguard Worker         case 'R':
1050*cfb92d14SAndroid Build Coastguard Worker             policy.mNonCcmRoutersEnabled = true;
1051*cfb92d14SAndroid Build Coastguard Worker             break;
1052*cfb92d14SAndroid Build Coastguard Worker 
1053*cfb92d14SAndroid Build Coastguard Worker         default:
1054*cfb92d14SAndroid Build Coastguard Worker             ExitNow(error = OT_ERROR_INVALID_ARGS);
1055*cfb92d14SAndroid Build Coastguard Worker         }
1056*cfb92d14SAndroid Build Coastguard Worker     }
1057*cfb92d14SAndroid Build Coastguard Worker 
1058*cfb92d14SAndroid Build Coastguard Worker     aArgs++;
1059*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(!aArgs->IsEmpty());
1060*cfb92d14SAndroid Build Coastguard Worker 
1061*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = aArgs->ParseAsUint8(versionThreshold));
1062*cfb92d14SAndroid Build Coastguard Worker     aArgs++;
1063*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(versionThreshold <= kMaxVersionThreshold, error = OT_ERROR_INVALID_ARGS);
1064*cfb92d14SAndroid Build Coastguard Worker     policy.mVersionThresholdForRouting = versionThreshold;
1065*cfb92d14SAndroid Build Coastguard Worker 
1066*cfb92d14SAndroid Build Coastguard Worker exit:
1067*cfb92d14SAndroid Build Coastguard Worker     if (error == OT_ERROR_NONE)
1068*cfb92d14SAndroid Build Coastguard Worker     {
1069*cfb92d14SAndroid Build Coastguard Worker         aSecurityPolicy = policy;
1070*cfb92d14SAndroid Build Coastguard Worker     }
1071*cfb92d14SAndroid Build Coastguard Worker 
1072*cfb92d14SAndroid Build Coastguard Worker     return error;
1073*cfb92d14SAndroid Build Coastguard Worker }
1074*cfb92d14SAndroid Build Coastguard Worker 
1075*cfb92d14SAndroid Build Coastguard Worker /**
1076*cfb92d14SAndroid Build Coastguard Worker  * @cli dataset set (active,pending)
1077*cfb92d14SAndroid Build Coastguard Worker  * @code
1078*cfb92d14SAndroid Build Coastguard Worker  * dataset set active 0e08000000000001000000030000103506000...3023d82c841eff0e68db86f35740c030000ff
1079*cfb92d14SAndroid Build Coastguard Worker  * Done
1080*cfb92d14SAndroid Build Coastguard Worker  * @endcode
1081*cfb92d14SAndroid Build Coastguard Worker  * @code
1082*cfb92d14SAndroid Build Coastguard Worker  * dataset set pending 0e08000000000001000000030000103506000...3023d82c841eff0e68db86f35740c030000ff
1083*cfb92d14SAndroid Build Coastguard Worker  * Done
1084*cfb92d14SAndroid Build Coastguard Worker  * @endcode
1085*cfb92d14SAndroid Build Coastguard Worker  * @cparam dataset set {active|pending} @ca{tlvs}
1086*cfb92d14SAndroid Build Coastguard Worker  * @par
1087*cfb92d14SAndroid Build Coastguard Worker  * The CLI `dataset set` command sets the Active Operational %Dataset using hex-encoded TLVs.
1088*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
1089*cfb92d14SAndroid Build Coastguard Worker  * #otDatasetSetActive
1090*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])1091*cfb92d14SAndroid Build Coastguard Worker template <> otError Dataset::Process<Cmd("set")>(Arg aArgs[])
1092*cfb92d14SAndroid Build Coastguard Worker {
1093*cfb92d14SAndroid Build Coastguard Worker     otError                  error = OT_ERROR_NONE;
1094*cfb92d14SAndroid Build Coastguard Worker     otOperationalDatasetTlvs datasetTlvs;
1095*cfb92d14SAndroid Build Coastguard Worker 
1096*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = ParseTlvs(aArgs[1], datasetTlvs));
1097*cfb92d14SAndroid Build Coastguard Worker 
1098*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "active")
1099*cfb92d14SAndroid Build Coastguard Worker     {
1100*cfb92d14SAndroid Build Coastguard Worker         error = otDatasetSetActiveTlvs(GetInstancePtr(), &datasetTlvs);
1101*cfb92d14SAndroid Build Coastguard Worker     }
1102*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "pending")
1103*cfb92d14SAndroid Build Coastguard Worker     {
1104*cfb92d14SAndroid Build Coastguard Worker         error = otDatasetSetPendingTlvs(GetInstancePtr(), &datasetTlvs);
1105*cfb92d14SAndroid Build Coastguard Worker     }
1106*cfb92d14SAndroid Build Coastguard Worker     else
1107*cfb92d14SAndroid Build Coastguard Worker     {
1108*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
1109*cfb92d14SAndroid Build Coastguard Worker     }
1110*cfb92d14SAndroid Build Coastguard Worker 
1111*cfb92d14SAndroid Build Coastguard Worker exit:
1112*cfb92d14SAndroid Build Coastguard Worker     return error;
1113*cfb92d14SAndroid Build Coastguard Worker }
1114*cfb92d14SAndroid Build Coastguard Worker 
1115*cfb92d14SAndroid Build Coastguard Worker /**
1116*cfb92d14SAndroid Build Coastguard Worker  * @cli dataset tlvs
1117*cfb92d14SAndroid Build Coastguard Worker  * @code
1118*cfb92d14SAndroid Build Coastguard Worker  * dataset tlvs
1119*cfb92d14SAndroid Build Coastguard Worker  * 0e080000000000010000000300001635060004001fffe0020...f7f8
1120*cfb92d14SAndroid Build Coastguard Worker  * Done
1121*cfb92d14SAndroid Build Coastguard Worker  * @endcode
1122*cfb92d14SAndroid Build Coastguard Worker  * @par api_copy
1123*cfb92d14SAndroid Build Coastguard Worker  * #otDatasetConvertToTlvs
1124*cfb92d14SAndroid Build Coastguard Worker  */
Process(Arg aArgs[])1125*cfb92d14SAndroid Build Coastguard Worker template <> otError Dataset::Process<Cmd("tlvs")>(Arg aArgs[])
1126*cfb92d14SAndroid Build Coastguard Worker {
1127*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
1128*cfb92d14SAndroid Build Coastguard Worker 
1129*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(aArgs[0].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
1130*cfb92d14SAndroid Build Coastguard Worker     OutputBytesLine(sDatasetTlvs.mTlvs, sDatasetTlvs.mLength);
1131*cfb92d14SAndroid Build Coastguard Worker 
1132*cfb92d14SAndroid Build Coastguard Worker exit:
1133*cfb92d14SAndroid Build Coastguard Worker     return error;
1134*cfb92d14SAndroid Build Coastguard Worker }
1135*cfb92d14SAndroid Build Coastguard Worker 
1136*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DATASET_UPDATER_ENABLE && OPENTHREAD_FTD
1137*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])1138*cfb92d14SAndroid Build Coastguard Worker template <> otError Dataset::Process<Cmd("updater")>(Arg aArgs[])
1139*cfb92d14SAndroid Build Coastguard Worker {
1140*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
1141*cfb92d14SAndroid Build Coastguard Worker 
1142*cfb92d14SAndroid Build Coastguard Worker     /**
1143*cfb92d14SAndroid Build Coastguard Worker      * @cli dataset updater
1144*cfb92d14SAndroid Build Coastguard Worker      * @code
1145*cfb92d14SAndroid Build Coastguard Worker      * dataset updater
1146*cfb92d14SAndroid Build Coastguard Worker      * Enabled
1147*cfb92d14SAndroid Build Coastguard Worker      * Done
1148*cfb92d14SAndroid Build Coastguard Worker      * @endcode
1149*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
1150*cfb92d14SAndroid Build Coastguard Worker      * #otDatasetUpdaterIsUpdateOngoing
1151*cfb92d14SAndroid Build Coastguard Worker      */
1152*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
1153*cfb92d14SAndroid Build Coastguard Worker     {
1154*cfb92d14SAndroid Build Coastguard Worker         OutputEnabledDisabledStatus(otDatasetUpdaterIsUpdateOngoing(GetInstancePtr()));
1155*cfb92d14SAndroid Build Coastguard Worker     }
1156*cfb92d14SAndroid Build Coastguard Worker     /**
1157*cfb92d14SAndroid Build Coastguard Worker      * @cli dataset updater start
1158*cfb92d14SAndroid Build Coastguard Worker      * @code
1159*cfb92d14SAndroid Build Coastguard Worker      * channel
1160*cfb92d14SAndroid Build Coastguard Worker      * 19
1161*cfb92d14SAndroid Build Coastguard Worker      * Done
1162*cfb92d14SAndroid Build Coastguard Worker      * dataset clear
1163*cfb92d14SAndroid Build Coastguard Worker      * Done
1164*cfb92d14SAndroid Build Coastguard Worker      * dataset channel 15
1165*cfb92d14SAndroid Build Coastguard Worker      * Done
1166*cfb92d14SAndroid Build Coastguard Worker      * dataset
1167*cfb92d14SAndroid Build Coastguard Worker      * Channel: 15
1168*cfb92d14SAndroid Build Coastguard Worker      * Done
1169*cfb92d14SAndroid Build Coastguard Worker      * dataset updater start
1170*cfb92d14SAndroid Build Coastguard Worker      * Done
1171*cfb92d14SAndroid Build Coastguard Worker      * dataset updater
1172*cfb92d14SAndroid Build Coastguard Worker      * Enabled
1173*cfb92d14SAndroid Build Coastguard Worker      * Done
1174*cfb92d14SAndroid Build Coastguard Worker      * Dataset update complete: OK
1175*cfb92d14SAndroid Build Coastguard Worker      * channel
1176*cfb92d14SAndroid Build Coastguard Worker      * 15
1177*cfb92d14SAndroid Build Coastguard Worker      * Done
1178*cfb92d14SAndroid Build Coastguard Worker      * @endcode
1179*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
1180*cfb92d14SAndroid Build Coastguard Worker      * #otDatasetUpdaterRequestUpdate
1181*cfb92d14SAndroid Build Coastguard Worker      */
1182*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "start")
1183*cfb92d14SAndroid Build Coastguard Worker     {
1184*cfb92d14SAndroid Build Coastguard Worker         otOperationalDataset dataset;
1185*cfb92d14SAndroid Build Coastguard Worker 
1186*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otDatasetParseTlvs(&sDatasetTlvs, &dataset));
1187*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(
1188*cfb92d14SAndroid Build Coastguard Worker             error = otDatasetUpdaterRequestUpdate(GetInstancePtr(), &dataset, &Dataset::HandleDatasetUpdater, this));
1189*cfb92d14SAndroid Build Coastguard Worker     }
1190*cfb92d14SAndroid Build Coastguard Worker     /**
1191*cfb92d14SAndroid Build Coastguard Worker      * @cli dataset updater cancel
1192*cfb92d14SAndroid Build Coastguard Worker      * @code
1193*cfb92d14SAndroid Build Coastguard Worker      * @dataset updater cancel
1194*cfb92d14SAndroid Build Coastguard Worker      * Done
1195*cfb92d14SAndroid Build Coastguard Worker      * @endcode
1196*cfb92d14SAndroid Build Coastguard Worker      * @par api_copy
1197*cfb92d14SAndroid Build Coastguard Worker      * #otDatasetUpdaterCancelUpdate
1198*cfb92d14SAndroid Build Coastguard Worker      */
1199*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "cancel")
1200*cfb92d14SAndroid Build Coastguard Worker     {
1201*cfb92d14SAndroid Build Coastguard Worker         otDatasetUpdaterCancelUpdate(GetInstancePtr());
1202*cfb92d14SAndroid Build Coastguard Worker     }
1203*cfb92d14SAndroid Build Coastguard Worker     else
1204*cfb92d14SAndroid Build Coastguard Worker     {
1205*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
1206*cfb92d14SAndroid Build Coastguard Worker     }
1207*cfb92d14SAndroid Build Coastguard Worker 
1208*cfb92d14SAndroid Build Coastguard Worker exit:
1209*cfb92d14SAndroid Build Coastguard Worker     return error;
1210*cfb92d14SAndroid Build Coastguard Worker }
1211*cfb92d14SAndroid Build Coastguard Worker 
HandleDatasetUpdater(otError aError,void * aContext)1212*cfb92d14SAndroid Build Coastguard Worker void Dataset::HandleDatasetUpdater(otError aError, void *aContext)
1213*cfb92d14SAndroid Build Coastguard Worker {
1214*cfb92d14SAndroid Build Coastguard Worker     static_cast<Dataset *>(aContext)->HandleDatasetUpdater(aError);
1215*cfb92d14SAndroid Build Coastguard Worker }
1216*cfb92d14SAndroid Build Coastguard Worker 
HandleDatasetUpdater(otError aError)1217*cfb92d14SAndroid Build Coastguard Worker void Dataset::HandleDatasetUpdater(otError aError)
1218*cfb92d14SAndroid Build Coastguard Worker {
1219*cfb92d14SAndroid Build Coastguard Worker     OutputLine("Dataset update complete: %s", otThreadErrorToString(aError));
1220*cfb92d14SAndroid Build Coastguard Worker }
1221*cfb92d14SAndroid Build Coastguard Worker 
1222*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_DATASET_UPDATER_ENABLE && OPENTHREAD_FTD
1223*cfb92d14SAndroid Build Coastguard Worker 
Process(Arg aArgs[])1224*cfb92d14SAndroid Build Coastguard Worker otError Dataset::Process(Arg aArgs[])
1225*cfb92d14SAndroid Build Coastguard Worker {
1226*cfb92d14SAndroid Build Coastguard Worker #define CmdEntry(aCommandString)                               \
1227*cfb92d14SAndroid Build Coastguard Worker     {                                                          \
1228*cfb92d14SAndroid Build Coastguard Worker         aCommandString, &Dataset::Process<Cmd(aCommandString)> \
1229*cfb92d14SAndroid Build Coastguard Worker     }
1230*cfb92d14SAndroid Build Coastguard Worker 
1231*cfb92d14SAndroid Build Coastguard Worker     static constexpr Command kCommands[] = {
1232*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("active"),
1233*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("clear"),
1234*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("commit"),
1235*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("init"),
1236*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("mgmtgetcommand"),
1237*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("mgmtsetcommand"),
1238*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("pending"),
1239*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("set"),
1240*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("tlvs"),
1241*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DATASET_UPDATER_ENABLE && OPENTHREAD_FTD
1242*cfb92d14SAndroid Build Coastguard Worker         CmdEntry("updater"),
1243*cfb92d14SAndroid Build Coastguard Worker #endif
1244*cfb92d14SAndroid Build Coastguard Worker     };
1245*cfb92d14SAndroid Build Coastguard Worker 
1246*cfb92d14SAndroid Build Coastguard Worker #undef CmdEntry
1247*cfb92d14SAndroid Build Coastguard Worker 
1248*cfb92d14SAndroid Build Coastguard Worker     static_assert(BinarySearch::IsSorted(kCommands), "kCommands is not sorted");
1249*cfb92d14SAndroid Build Coastguard Worker 
1250*cfb92d14SAndroid Build Coastguard Worker     otError                error = OT_ERROR_INVALID_COMMAND;
1251*cfb92d14SAndroid Build Coastguard Worker     const Command         *command;
1252*cfb92d14SAndroid Build Coastguard Worker     const ComponentMapper *mapper;
1253*cfb92d14SAndroid Build Coastguard Worker 
1254*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
1255*cfb92d14SAndroid Build Coastguard Worker     {
1256*cfb92d14SAndroid Build Coastguard Worker         ExitNow(error = Print(sDatasetTlvs));
1257*cfb92d14SAndroid Build Coastguard Worker     }
1258*cfb92d14SAndroid Build Coastguard Worker 
1259*cfb92d14SAndroid Build Coastguard Worker     /**
1260*cfb92d14SAndroid Build Coastguard Worker      * @cli dataset help
1261*cfb92d14SAndroid Build Coastguard Worker      * @code
1262*cfb92d14SAndroid Build Coastguard Worker      * dataset help
1263*cfb92d14SAndroid Build Coastguard Worker      * help
1264*cfb92d14SAndroid Build Coastguard Worker      * active
1265*cfb92d14SAndroid Build Coastguard Worker      * activetimestamp
1266*cfb92d14SAndroid Build Coastguard Worker      * channel
1267*cfb92d14SAndroid Build Coastguard Worker      * channelmask
1268*cfb92d14SAndroid Build Coastguard Worker      * clear
1269*cfb92d14SAndroid Build Coastguard Worker      * commit
1270*cfb92d14SAndroid Build Coastguard Worker      * delay
1271*cfb92d14SAndroid Build Coastguard Worker      * extpanid
1272*cfb92d14SAndroid Build Coastguard Worker      * init
1273*cfb92d14SAndroid Build Coastguard Worker      * meshlocalprefix
1274*cfb92d14SAndroid Build Coastguard Worker      * mgmtgetcommand
1275*cfb92d14SAndroid Build Coastguard Worker      * mgmtsetcommand
1276*cfb92d14SAndroid Build Coastguard Worker      * networkkey
1277*cfb92d14SAndroid Build Coastguard Worker      * networkname
1278*cfb92d14SAndroid Build Coastguard Worker      * panid
1279*cfb92d14SAndroid Build Coastguard Worker      * pending
1280*cfb92d14SAndroid Build Coastguard Worker      * pendingtimestamp
1281*cfb92d14SAndroid Build Coastguard Worker      * pskc
1282*cfb92d14SAndroid Build Coastguard Worker      * securitypolicy
1283*cfb92d14SAndroid Build Coastguard Worker      * set
1284*cfb92d14SAndroid Build Coastguard Worker      * tlvs
1285*cfb92d14SAndroid Build Coastguard Worker      * Done
1286*cfb92d14SAndroid Build Coastguard Worker      * @endcode
1287*cfb92d14SAndroid Build Coastguard Worker      * @par
1288*cfb92d14SAndroid Build Coastguard Worker      * Gets a list of `dataset` CLI commands. @moreinfo{@dataset}.
1289*cfb92d14SAndroid Build Coastguard Worker      */
1290*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0] == "help")
1291*cfb92d14SAndroid Build Coastguard Worker     {
1292*cfb92d14SAndroid Build Coastguard Worker         OutputCommandTable(kCommands);
1293*cfb92d14SAndroid Build Coastguard Worker         ExitNow(error = OT_ERROR_NONE);
1294*cfb92d14SAndroid Build Coastguard Worker     }
1295*cfb92d14SAndroid Build Coastguard Worker 
1296*cfb92d14SAndroid Build Coastguard Worker     mapper = LookupMapper(aArgs[0].GetCString());
1297*cfb92d14SAndroid Build Coastguard Worker 
1298*cfb92d14SAndroid Build Coastguard Worker     if (mapper != nullptr)
1299*cfb92d14SAndroid Build Coastguard Worker     {
1300*cfb92d14SAndroid Build Coastguard Worker         error = ProcessCommand(*mapper, aArgs + 1);
1301*cfb92d14SAndroid Build Coastguard Worker         ExitNow();
1302*cfb92d14SAndroid Build Coastguard Worker     }
1303*cfb92d14SAndroid Build Coastguard Worker 
1304*cfb92d14SAndroid Build Coastguard Worker     command = BinarySearch::Find(aArgs[0].GetCString(), kCommands);
1305*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(command != nullptr);
1306*cfb92d14SAndroid Build Coastguard Worker 
1307*cfb92d14SAndroid Build Coastguard Worker     error = (this->*command->mHandler)(aArgs + 1);
1308*cfb92d14SAndroid Build Coastguard Worker 
1309*cfb92d14SAndroid Build Coastguard Worker exit:
1310*cfb92d14SAndroid Build Coastguard Worker     return error;
1311*cfb92d14SAndroid Build Coastguard Worker }
1312*cfb92d14SAndroid Build Coastguard Worker 
1313*cfb92d14SAndroid Build Coastguard Worker } // namespace Cli
1314*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
1315