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