1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker * Copyright (c) 2020, 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 a simple CLI for the SRP server.
32*cfb92d14SAndroid Build Coastguard Worker */
33*cfb92d14SAndroid Build Coastguard Worker
34*cfb92d14SAndroid Build Coastguard Worker #include "cli_srp_server.hpp"
35*cfb92d14SAndroid Build Coastguard Worker
36*cfb92d14SAndroid Build Coastguard Worker #include <inttypes.h>
37*cfb92d14SAndroid Build Coastguard Worker
38*cfb92d14SAndroid Build Coastguard Worker #include "cli/cli.hpp"
39*cfb92d14SAndroid Build Coastguard Worker #include "common/string.hpp"
40*cfb92d14SAndroid Build Coastguard Worker
41*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_SRP_SERVER_ENABLE
42*cfb92d14SAndroid Build Coastguard Worker
43*cfb92d14SAndroid Build Coastguard Worker namespace ot {
44*cfb92d14SAndroid Build Coastguard Worker namespace Cli {
45*cfb92d14SAndroid Build Coastguard Worker
46*cfb92d14SAndroid Build Coastguard Worker /**
47*cfb92d14SAndroid Build Coastguard Worker * @cli srp server addrmode (get,set)
48*cfb92d14SAndroid Build Coastguard Worker * @code
49*cfb92d14SAndroid Build Coastguard Worker * srp server addrmode anycast
50*cfb92d14SAndroid Build Coastguard Worker * Done
51*cfb92d14SAndroid Build Coastguard Worker * @endcode
52*cfb92d14SAndroid Build Coastguard Worker * @code
53*cfb92d14SAndroid Build Coastguard Worker * srp server addrmode
54*cfb92d14SAndroid Build Coastguard Worker * anycast
55*cfb92d14SAndroid Build Coastguard Worker * Done
56*cfb92d14SAndroid Build Coastguard Worker * @endcode
57*cfb92d14SAndroid Build Coastguard Worker * @cparam srp server addrmode [@ca{anycast}|@ca{unicast}]
58*cfb92d14SAndroid Build Coastguard Worker * @par
59*cfb92d14SAndroid Build Coastguard Worker * Gets or sets the address mode used by the SRP server.
60*cfb92d14SAndroid Build Coastguard Worker * @par
61*cfb92d14SAndroid Build Coastguard Worker * The address mode tells the SRP server how to determine its address and port number,
62*cfb92d14SAndroid Build Coastguard Worker * which then get published in the Thread network data.
63*cfb92d14SAndroid Build Coastguard Worker * @sa otSrpServerGetAddressMode
64*cfb92d14SAndroid Build Coastguard Worker * @sa otSrpServerSetAddressMode
65*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])66*cfb92d14SAndroid Build Coastguard Worker template <> otError SrpServer::Process<Cmd("addrmode")>(Arg aArgs[])
67*cfb92d14SAndroid Build Coastguard Worker {
68*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_INVALID_ARGS;
69*cfb92d14SAndroid Build Coastguard Worker
70*cfb92d14SAndroid Build Coastguard Worker if (aArgs[0].IsEmpty())
71*cfb92d14SAndroid Build Coastguard Worker {
72*cfb92d14SAndroid Build Coastguard Worker switch (otSrpServerGetAddressMode(GetInstancePtr()))
73*cfb92d14SAndroid Build Coastguard Worker {
74*cfb92d14SAndroid Build Coastguard Worker case OT_SRP_SERVER_ADDRESS_MODE_UNICAST:
75*cfb92d14SAndroid Build Coastguard Worker OutputLine("unicast");
76*cfb92d14SAndroid Build Coastguard Worker break;
77*cfb92d14SAndroid Build Coastguard Worker
78*cfb92d14SAndroid Build Coastguard Worker case OT_SRP_SERVER_ADDRESS_MODE_ANYCAST:
79*cfb92d14SAndroid Build Coastguard Worker OutputLine("anycast");
80*cfb92d14SAndroid Build Coastguard Worker break;
81*cfb92d14SAndroid Build Coastguard Worker }
82*cfb92d14SAndroid Build Coastguard Worker
83*cfb92d14SAndroid Build Coastguard Worker error = OT_ERROR_NONE;
84*cfb92d14SAndroid Build Coastguard Worker }
85*cfb92d14SAndroid Build Coastguard Worker else if (aArgs[0] == "unicast")
86*cfb92d14SAndroid Build Coastguard Worker {
87*cfb92d14SAndroid Build Coastguard Worker error = otSrpServerSetAddressMode(GetInstancePtr(), OT_SRP_SERVER_ADDRESS_MODE_UNICAST);
88*cfb92d14SAndroid Build Coastguard Worker }
89*cfb92d14SAndroid Build Coastguard Worker else if (aArgs[0] == "anycast")
90*cfb92d14SAndroid Build Coastguard Worker {
91*cfb92d14SAndroid Build Coastguard Worker error = otSrpServerSetAddressMode(GetInstancePtr(), OT_SRP_SERVER_ADDRESS_MODE_ANYCAST);
92*cfb92d14SAndroid Build Coastguard Worker }
93*cfb92d14SAndroid Build Coastguard Worker
94*cfb92d14SAndroid Build Coastguard Worker return error;
95*cfb92d14SAndroid Build Coastguard Worker }
96*cfb92d14SAndroid Build Coastguard Worker
97*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE
98*cfb92d14SAndroid Build Coastguard Worker
99*cfb92d14SAndroid Build Coastguard Worker /**
100*cfb92d14SAndroid Build Coastguard Worker * @cli srp server auto (enable,disable)
101*cfb92d14SAndroid Build Coastguard Worker * @code
102*cfb92d14SAndroid Build Coastguard Worker * srp server auto enable
103*cfb92d14SAndroid Build Coastguard Worker * Done
104*cfb92d14SAndroid Build Coastguard Worker * @endcode
105*cfb92d14SAndroid Build Coastguard Worker * @code
106*cfb92d14SAndroid Build Coastguard Worker * srp server auto
107*cfb92d14SAndroid Build Coastguard Worker * Enabled
108*cfb92d14SAndroid Build Coastguard Worker * Done
109*cfb92d14SAndroid Build Coastguard Worker * @endcode
110*cfb92d14SAndroid Build Coastguard Worker * @cparam srp server auto [@ca{enable}|@ca{disable}]
111*cfb92d14SAndroid Build Coastguard Worker * @par
112*cfb92d14SAndroid Build Coastguard Worker * Enables or disables the auto-enable mode on the SRP server.
113*cfb92d14SAndroid Build Coastguard Worker * @par
114*cfb92d14SAndroid Build Coastguard Worker * When this mode is enabled, the Border Routing Manager controls if and when
115*cfb92d14SAndroid Build Coastguard Worker * to enable or disable the SRP server.
116*cfb92d14SAndroid Build Coastguard Worker * @par
117*cfb92d14SAndroid Build Coastguard Worker * This command requires that `OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE` be enabled.
118*cfb92d14SAndroid Build Coastguard Worker * @moreinfo{@srp}.
119*cfb92d14SAndroid Build Coastguard Worker * @sa otSrpServerIsAutoEnableMode
120*cfb92d14SAndroid Build Coastguard Worker * @sa otSrpServerSetAutoEnableMode
121*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])122*cfb92d14SAndroid Build Coastguard Worker template <> otError SrpServer::Process<Cmd("auto")>(Arg aArgs[])
123*cfb92d14SAndroid Build Coastguard Worker {
124*cfb92d14SAndroid Build Coastguard Worker return ProcessEnableDisable(aArgs, otSrpServerIsAutoEnableMode, otSrpServerSetAutoEnableMode);
125*cfb92d14SAndroid Build Coastguard Worker }
126*cfb92d14SAndroid Build Coastguard Worker #endif
127*cfb92d14SAndroid Build Coastguard Worker
128*cfb92d14SAndroid Build Coastguard Worker /**
129*cfb92d14SAndroid Build Coastguard Worker * @cli srp server domain (get,set)
130*cfb92d14SAndroid Build Coastguard Worker * @code
131*cfb92d14SAndroid Build Coastguard Worker * srp server domain thread.service.arpa.
132*cfb92d14SAndroid Build Coastguard Worker * Done
133*cfb92d14SAndroid Build Coastguard Worker * @endcode
134*cfb92d14SAndroid Build Coastguard Worker * @code
135*cfb92d14SAndroid Build Coastguard Worker * srp server domain
136*cfb92d14SAndroid Build Coastguard Worker * thread.service.arpa.
137*cfb92d14SAndroid Build Coastguard Worker * Done
138*cfb92d14SAndroid Build Coastguard Worker * @endcode
139*cfb92d14SAndroid Build Coastguard Worker * @cparam srp server domain [@ca{domain-name}]
140*cfb92d14SAndroid Build Coastguard Worker * @par
141*cfb92d14SAndroid Build Coastguard Worker * Gets or sets the domain name of the SRP server.
142*cfb92d14SAndroid Build Coastguard Worker * @sa otSrpServerGetDomain
143*cfb92d14SAndroid Build Coastguard Worker * @sa otSrpServerSetDomain
144*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])145*cfb92d14SAndroid Build Coastguard Worker template <> otError SrpServer::Process<Cmd("domain")>(Arg aArgs[])
146*cfb92d14SAndroid Build Coastguard Worker {
147*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
148*cfb92d14SAndroid Build Coastguard Worker
149*cfb92d14SAndroid Build Coastguard Worker if (aArgs[0].IsEmpty())
150*cfb92d14SAndroid Build Coastguard Worker {
151*cfb92d14SAndroid Build Coastguard Worker OutputLine("%s", otSrpServerGetDomain(GetInstancePtr()));
152*cfb92d14SAndroid Build Coastguard Worker }
153*cfb92d14SAndroid Build Coastguard Worker else
154*cfb92d14SAndroid Build Coastguard Worker {
155*cfb92d14SAndroid Build Coastguard Worker error = otSrpServerSetDomain(GetInstancePtr(), aArgs[0].GetCString());
156*cfb92d14SAndroid Build Coastguard Worker }
157*cfb92d14SAndroid Build Coastguard Worker
158*cfb92d14SAndroid Build Coastguard Worker return error;
159*cfb92d14SAndroid Build Coastguard Worker }
160*cfb92d14SAndroid Build Coastguard Worker
161*cfb92d14SAndroid Build Coastguard Worker /**
162*cfb92d14SAndroid Build Coastguard Worker * @cli srp server state
163*cfb92d14SAndroid Build Coastguard Worker * @code
164*cfb92d14SAndroid Build Coastguard Worker * srp server state
165*cfb92d14SAndroid Build Coastguard Worker * running
166*cfb92d14SAndroid Build Coastguard Worker * Done
167*cfb92d14SAndroid Build Coastguard Worker * @endcode
168*cfb92d14SAndroid Build Coastguard Worker * @par
169*cfb92d14SAndroid Build Coastguard Worker * Returns one of the following possible states of the SRP server:
170*cfb92d14SAndroid Build Coastguard Worker * * `disabled`: The SRP server is not enabled.
171*cfb92d14SAndroid Build Coastguard Worker * * `stopped`: The SRP server is enabled but not active due to existing
172*cfb92d14SAndroid Build Coastguard Worker * SRP servers that are already active in the Thread network.
173*cfb92d14SAndroid Build Coastguard Worker * The SRP server may become active when the existing
174*cfb92d14SAndroid Build Coastguard Worker * SRP servers are no longer active within the Thread network.
175*cfb92d14SAndroid Build Coastguard Worker * * `running`: The SRP server is active and can handle service registrations.
176*cfb92d14SAndroid Build Coastguard Worker * @par
177*cfb92d14SAndroid Build Coastguard Worker * @moreinfo{@srp}.
178*cfb92d14SAndroid Build Coastguard Worker * @sa otSrpServerGetState
179*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])180*cfb92d14SAndroid Build Coastguard Worker template <> otError SrpServer::Process<Cmd("state")>(Arg aArgs[])
181*cfb92d14SAndroid Build Coastguard Worker {
182*cfb92d14SAndroid Build Coastguard Worker static const char *const kStateStrings[] = {
183*cfb92d14SAndroid Build Coastguard Worker "disabled", // (0) OT_SRP_SERVER_STATE_DISABLED
184*cfb92d14SAndroid Build Coastguard Worker "running", // (1) OT_SRP_SERVER_STATE_RUNNING
185*cfb92d14SAndroid Build Coastguard Worker "stopped", // (2) OT_SRP_SERVER_STATE_STOPPED
186*cfb92d14SAndroid Build Coastguard Worker };
187*cfb92d14SAndroid Build Coastguard Worker
188*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aArgs);
189*cfb92d14SAndroid Build Coastguard Worker
190*cfb92d14SAndroid Build Coastguard Worker static_assert(0 == OT_SRP_SERVER_STATE_DISABLED, "OT_SRP_SERVER_STATE_DISABLED value is incorrect");
191*cfb92d14SAndroid Build Coastguard Worker static_assert(1 == OT_SRP_SERVER_STATE_RUNNING, "OT_SRP_SERVER_STATE_RUNNING value is incorrect");
192*cfb92d14SAndroid Build Coastguard Worker static_assert(2 == OT_SRP_SERVER_STATE_STOPPED, "OT_SRP_SERVER_STATE_STOPPED value is incorrect");
193*cfb92d14SAndroid Build Coastguard Worker
194*cfb92d14SAndroid Build Coastguard Worker OutputLine("%s", Stringify(otSrpServerGetState(GetInstancePtr()), kStateStrings));
195*cfb92d14SAndroid Build Coastguard Worker
196*cfb92d14SAndroid Build Coastguard Worker return OT_ERROR_NONE;
197*cfb92d14SAndroid Build Coastguard Worker }
198*cfb92d14SAndroid Build Coastguard Worker
Process(Arg aArgs[])199*cfb92d14SAndroid Build Coastguard Worker template <> otError SrpServer::Process<Cmd("enable")>(Arg aArgs[])
200*cfb92d14SAndroid Build Coastguard Worker {
201*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aArgs);
202*cfb92d14SAndroid Build Coastguard Worker
203*cfb92d14SAndroid Build Coastguard Worker otSrpServerSetEnabled(GetInstancePtr(), /* aEnabled */ true);
204*cfb92d14SAndroid Build Coastguard Worker
205*cfb92d14SAndroid Build Coastguard Worker return OT_ERROR_NONE;
206*cfb92d14SAndroid Build Coastguard Worker }
207*cfb92d14SAndroid Build Coastguard Worker
208*cfb92d14SAndroid Build Coastguard Worker /**
209*cfb92d14SAndroid Build Coastguard Worker * @cli srp server (enable,disable)
210*cfb92d14SAndroid Build Coastguard Worker * @code
211*cfb92d14SAndroid Build Coastguard Worker * srp server disable
212*cfb92d14SAndroid Build Coastguard Worker * Done
213*cfb92d14SAndroid Build Coastguard Worker * @endcode
214*cfb92d14SAndroid Build Coastguard Worker * @cparam srp server [@ca{enable}|@ca{disable}]
215*cfb92d14SAndroid Build Coastguard Worker * @par
216*cfb92d14SAndroid Build Coastguard Worker * Enables or disables the SRP server. @moreinfo{@srp}.
217*cfb92d14SAndroid Build Coastguard Worker * @sa otSrpServerSetEnabled
218*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])219*cfb92d14SAndroid Build Coastguard Worker template <> otError SrpServer::Process<Cmd("disable")>(Arg aArgs[])
220*cfb92d14SAndroid Build Coastguard Worker {
221*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aArgs);
222*cfb92d14SAndroid Build Coastguard Worker
223*cfb92d14SAndroid Build Coastguard Worker otSrpServerSetEnabled(GetInstancePtr(), /* aEnabled */ false);
224*cfb92d14SAndroid Build Coastguard Worker
225*cfb92d14SAndroid Build Coastguard Worker return OT_ERROR_NONE;
226*cfb92d14SAndroid Build Coastguard Worker }
227*cfb92d14SAndroid Build Coastguard Worker
Process(Arg aArgs[])228*cfb92d14SAndroid Build Coastguard Worker template <> otError SrpServer::Process<Cmd("ttl")>(Arg aArgs[])
229*cfb92d14SAndroid Build Coastguard Worker {
230*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
231*cfb92d14SAndroid Build Coastguard Worker otSrpServerTtlConfig ttlConfig;
232*cfb92d14SAndroid Build Coastguard Worker
233*cfb92d14SAndroid Build Coastguard Worker if (aArgs[0].IsEmpty())
234*cfb92d14SAndroid Build Coastguard Worker {
235*cfb92d14SAndroid Build Coastguard Worker otSrpServerGetTtlConfig(GetInstancePtr(), &ttlConfig);
236*cfb92d14SAndroid Build Coastguard Worker OutputLine("min ttl: %lu", ToUlong(ttlConfig.mMinTtl));
237*cfb92d14SAndroid Build Coastguard Worker OutputLine("max ttl: %lu", ToUlong(ttlConfig.mMaxTtl));
238*cfb92d14SAndroid Build Coastguard Worker }
239*cfb92d14SAndroid Build Coastguard Worker else
240*cfb92d14SAndroid Build Coastguard Worker {
241*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = aArgs[0].ParseAsUint32(ttlConfig.mMinTtl));
242*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = aArgs[1].ParseAsUint32(ttlConfig.mMaxTtl));
243*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(aArgs[2].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
244*cfb92d14SAndroid Build Coastguard Worker
245*cfb92d14SAndroid Build Coastguard Worker error = otSrpServerSetTtlConfig(GetInstancePtr(), &ttlConfig);
246*cfb92d14SAndroid Build Coastguard Worker }
247*cfb92d14SAndroid Build Coastguard Worker
248*cfb92d14SAndroid Build Coastguard Worker exit:
249*cfb92d14SAndroid Build Coastguard Worker return error;
250*cfb92d14SAndroid Build Coastguard Worker }
251*cfb92d14SAndroid Build Coastguard Worker
252*cfb92d14SAndroid Build Coastguard Worker /**
253*cfb92d14SAndroid Build Coastguard Worker * @cli srp server lease (get,set)
254*cfb92d14SAndroid Build Coastguard Worker * @code
255*cfb92d14SAndroid Build Coastguard Worker * srp server lease 1800 7200 86400 1209600
256*cfb92d14SAndroid Build Coastguard Worker * Done
257*cfb92d14SAndroid Build Coastguard Worker * @endcode
258*cfb92d14SAndroid Build Coastguard Worker * @code
259*cfb92d14SAndroid Build Coastguard Worker * srp server lease
260*cfb92d14SAndroid Build Coastguard Worker * min lease: 1800
261*cfb92d14SAndroid Build Coastguard Worker * max lease: 7200
262*cfb92d14SAndroid Build Coastguard Worker * min key-lease: 86400
263*cfb92d14SAndroid Build Coastguard Worker * max key-lease: 1209600
264*cfb92d14SAndroid Build Coastguard Worker * Done
265*cfb92d14SAndroid Build Coastguard Worker * @endcode
266*cfb92d14SAndroid Build Coastguard Worker * @cparam srp server lease [@ca{min-lease} @ca{max-lease} @ca{min-key-lease} @ca{max-key-lease}]
267*cfb92d14SAndroid Build Coastguard Worker * @par
268*cfb92d14SAndroid Build Coastguard Worker * Gets or sets the SRP server lease values in number of seconds.
269*cfb92d14SAndroid Build Coastguard Worker * @sa otSrpServerGetLeaseConfig
270*cfb92d14SAndroid Build Coastguard Worker * @sa otSrpServerSetLeaseConfig
271*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])272*cfb92d14SAndroid Build Coastguard Worker template <> otError SrpServer::Process<Cmd("lease")>(Arg aArgs[])
273*cfb92d14SAndroid Build Coastguard Worker {
274*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
275*cfb92d14SAndroid Build Coastguard Worker otSrpServerLeaseConfig leaseConfig;
276*cfb92d14SAndroid Build Coastguard Worker
277*cfb92d14SAndroid Build Coastguard Worker if (aArgs[0].IsEmpty())
278*cfb92d14SAndroid Build Coastguard Worker {
279*cfb92d14SAndroid Build Coastguard Worker otSrpServerGetLeaseConfig(GetInstancePtr(), &leaseConfig);
280*cfb92d14SAndroid Build Coastguard Worker OutputLine("min lease: %lu", ToUlong(leaseConfig.mMinLease));
281*cfb92d14SAndroid Build Coastguard Worker OutputLine("max lease: %lu", ToUlong(leaseConfig.mMaxLease));
282*cfb92d14SAndroid Build Coastguard Worker OutputLine("min key-lease: %lu", ToUlong(leaseConfig.mMinKeyLease));
283*cfb92d14SAndroid Build Coastguard Worker OutputLine("max key-lease: %lu", ToUlong(leaseConfig.mMaxKeyLease));
284*cfb92d14SAndroid Build Coastguard Worker }
285*cfb92d14SAndroid Build Coastguard Worker else
286*cfb92d14SAndroid Build Coastguard Worker {
287*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = aArgs[0].ParseAsUint32(leaseConfig.mMinLease));
288*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = aArgs[1].ParseAsUint32(leaseConfig.mMaxLease));
289*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = aArgs[2].ParseAsUint32(leaseConfig.mMinKeyLease));
290*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = aArgs[3].ParseAsUint32(leaseConfig.mMaxKeyLease));
291*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(aArgs[4].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
292*cfb92d14SAndroid Build Coastguard Worker
293*cfb92d14SAndroid Build Coastguard Worker error = otSrpServerSetLeaseConfig(GetInstancePtr(), &leaseConfig);
294*cfb92d14SAndroid Build Coastguard Worker }
295*cfb92d14SAndroid Build Coastguard Worker
296*cfb92d14SAndroid Build Coastguard Worker exit:
297*cfb92d14SAndroid Build Coastguard Worker return error;
298*cfb92d14SAndroid Build Coastguard Worker }
299*cfb92d14SAndroid Build Coastguard Worker
300*cfb92d14SAndroid Build Coastguard Worker /**
301*cfb92d14SAndroid Build Coastguard Worker * @cli srp server host
302*cfb92d14SAndroid Build Coastguard Worker * @code
303*cfb92d14SAndroid Build Coastguard Worker * srp server host
304*cfb92d14SAndroid Build Coastguard Worker * srp-api-test-1.default.service.arpa.
305*cfb92d14SAndroid Build Coastguard Worker * deleted: false
306*cfb92d14SAndroid Build Coastguard Worker * addresses: [fdde:ad00:beef:0:0:ff:fe00:fc10]
307*cfb92d14SAndroid Build Coastguard Worker * srp-api-test-0.default.service.arpa.
308*cfb92d14SAndroid Build Coastguard Worker * deleted: false
309*cfb92d14SAndroid Build Coastguard Worker * addresses: [fdde:ad00:beef:0:0:ff:fe00:fc10]
310*cfb92d14SAndroid Build Coastguard Worker * Done
311*cfb92d14SAndroid Build Coastguard Worker * @endcode
312*cfb92d14SAndroid Build Coastguard Worker * @par
313*cfb92d14SAndroid Build Coastguard Worker * Returns information about all registered hosts. @moreinfo{@srp}.
314*cfb92d14SAndroid Build Coastguard Worker * @sa otSrpServerGetNextHost
315*cfb92d14SAndroid Build Coastguard Worker * @sa otSrpServerHostGetAddresses
316*cfb92d14SAndroid Build Coastguard Worker * @sa otSrpServerHostGetFullName
317*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])318*cfb92d14SAndroid Build Coastguard Worker template <> otError SrpServer::Process<Cmd("host")>(Arg aArgs[])
319*cfb92d14SAndroid Build Coastguard Worker {
320*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
321*cfb92d14SAndroid Build Coastguard Worker const otSrpServerHost *host;
322*cfb92d14SAndroid Build Coastguard Worker
323*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(aArgs[0].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
324*cfb92d14SAndroid Build Coastguard Worker
325*cfb92d14SAndroid Build Coastguard Worker host = nullptr;
326*cfb92d14SAndroid Build Coastguard Worker while ((host = otSrpServerGetNextHost(GetInstancePtr(), host)) != nullptr)
327*cfb92d14SAndroid Build Coastguard Worker {
328*cfb92d14SAndroid Build Coastguard Worker const otIp6Address *addresses;
329*cfb92d14SAndroid Build Coastguard Worker uint8_t addressesNum;
330*cfb92d14SAndroid Build Coastguard Worker bool isDeleted = otSrpServerHostIsDeleted(host);
331*cfb92d14SAndroid Build Coastguard Worker
332*cfb92d14SAndroid Build Coastguard Worker OutputLine("%s", otSrpServerHostGetFullName(host));
333*cfb92d14SAndroid Build Coastguard Worker OutputLine(kIndentSize, "deleted: %s", isDeleted ? "true" : "false");
334*cfb92d14SAndroid Build Coastguard Worker if (isDeleted)
335*cfb92d14SAndroid Build Coastguard Worker {
336*cfb92d14SAndroid Build Coastguard Worker continue;
337*cfb92d14SAndroid Build Coastguard Worker }
338*cfb92d14SAndroid Build Coastguard Worker
339*cfb92d14SAndroid Build Coastguard Worker OutputSpaces(kIndentSize);
340*cfb92d14SAndroid Build Coastguard Worker OutputFormat("addresses: [");
341*cfb92d14SAndroid Build Coastguard Worker
342*cfb92d14SAndroid Build Coastguard Worker addresses = otSrpServerHostGetAddresses(host, &addressesNum);
343*cfb92d14SAndroid Build Coastguard Worker
344*cfb92d14SAndroid Build Coastguard Worker for (uint8_t i = 0; i < addressesNum; ++i)
345*cfb92d14SAndroid Build Coastguard Worker {
346*cfb92d14SAndroid Build Coastguard Worker OutputIp6Address(addresses[i]);
347*cfb92d14SAndroid Build Coastguard Worker if (i < addressesNum - 1)
348*cfb92d14SAndroid Build Coastguard Worker {
349*cfb92d14SAndroid Build Coastguard Worker OutputFormat(", ");
350*cfb92d14SAndroid Build Coastguard Worker }
351*cfb92d14SAndroid Build Coastguard Worker }
352*cfb92d14SAndroid Build Coastguard Worker
353*cfb92d14SAndroid Build Coastguard Worker OutputLine("]");
354*cfb92d14SAndroid Build Coastguard Worker }
355*cfb92d14SAndroid Build Coastguard Worker
356*cfb92d14SAndroid Build Coastguard Worker exit:
357*cfb92d14SAndroid Build Coastguard Worker return error;
358*cfb92d14SAndroid Build Coastguard Worker }
359*cfb92d14SAndroid Build Coastguard Worker
OutputHostAddresses(const otSrpServerHost * aHost)360*cfb92d14SAndroid Build Coastguard Worker void SrpServer::OutputHostAddresses(const otSrpServerHost *aHost)
361*cfb92d14SAndroid Build Coastguard Worker {
362*cfb92d14SAndroid Build Coastguard Worker const otIp6Address *addresses;
363*cfb92d14SAndroid Build Coastguard Worker uint8_t addressesNum;
364*cfb92d14SAndroid Build Coastguard Worker
365*cfb92d14SAndroid Build Coastguard Worker addresses = otSrpServerHostGetAddresses(aHost, &addressesNum);
366*cfb92d14SAndroid Build Coastguard Worker
367*cfb92d14SAndroid Build Coastguard Worker OutputFormat("[");
368*cfb92d14SAndroid Build Coastguard Worker for (uint8_t i = 0; i < addressesNum; ++i)
369*cfb92d14SAndroid Build Coastguard Worker {
370*cfb92d14SAndroid Build Coastguard Worker if (i != 0)
371*cfb92d14SAndroid Build Coastguard Worker {
372*cfb92d14SAndroid Build Coastguard Worker OutputFormat(", ");
373*cfb92d14SAndroid Build Coastguard Worker }
374*cfb92d14SAndroid Build Coastguard Worker
375*cfb92d14SAndroid Build Coastguard Worker OutputIp6Address(addresses[i]);
376*cfb92d14SAndroid Build Coastguard Worker }
377*cfb92d14SAndroid Build Coastguard Worker OutputFormat("]");
378*cfb92d14SAndroid Build Coastguard Worker }
379*cfb92d14SAndroid Build Coastguard Worker
380*cfb92d14SAndroid Build Coastguard Worker /**
381*cfb92d14SAndroid Build Coastguard Worker * @cli srp server service
382*cfb92d14SAndroid Build Coastguard Worker * @code
383*cfb92d14SAndroid Build Coastguard Worker * srp server service
384*cfb92d14SAndroid Build Coastguard Worker * srp-api-test-1._ipps._tcp.default.service.arpa.
385*cfb92d14SAndroid Build Coastguard Worker * deleted: false
386*cfb92d14SAndroid Build Coastguard Worker * subtypes: (null)
387*cfb92d14SAndroid Build Coastguard Worker * port: 49152
388*cfb92d14SAndroid Build Coastguard Worker * priority: 0
389*cfb92d14SAndroid Build Coastguard Worker * weight: 0
390*cfb92d14SAndroid Build Coastguard Worker * ttl: 7200
391*cfb92d14SAndroid Build Coastguard Worker * lease: 7200
392*cfb92d14SAndroid Build Coastguard Worker * key-lease: 1209600
393*cfb92d14SAndroid Build Coastguard Worker * TXT: [616263, xyz=585960]
394*cfb92d14SAndroid Build Coastguard Worker * host: srp-api-test-1.default.service.arpa.
395*cfb92d14SAndroid Build Coastguard Worker * addresses: [fdde:ad00:beef:0:0:ff:fe00:fc10]
396*cfb92d14SAndroid Build Coastguard Worker * srp-api-test-0._ipps._tcp.default.service.arpa.
397*cfb92d14SAndroid Build Coastguard Worker * deleted: false
398*cfb92d14SAndroid Build Coastguard Worker * subtypes: _sub1,_sub2
399*cfb92d14SAndroid Build Coastguard Worker * port: 49152
400*cfb92d14SAndroid Build Coastguard Worker * priority: 0
401*cfb92d14SAndroid Build Coastguard Worker * weight: 0
402*cfb92d14SAndroid Build Coastguard Worker * ttl: 3600
403*cfb92d14SAndroid Build Coastguard Worker * lease: 3600
404*cfb92d14SAndroid Build Coastguard Worker * key-lease: 1209600
405*cfb92d14SAndroid Build Coastguard Worker * TXT: [616263, xyz=585960]
406*cfb92d14SAndroid Build Coastguard Worker * host: srp-api-test-0.default.service.arpa.
407*cfb92d14SAndroid Build Coastguard Worker * addresses: [fdde:ad00:beef:0:0:ff:fe00:fc10]
408*cfb92d14SAndroid Build Coastguard Worker * Done
409*cfb92d14SAndroid Build Coastguard Worker * @endcode
410*cfb92d14SAndroid Build Coastguard Worker * @par
411*cfb92d14SAndroid Build Coastguard Worker * Returns information about registered services.
412*cfb92d14SAndroid Build Coastguard Worker * @par
413*cfb92d14SAndroid Build Coastguard Worker * The `TXT` record is displayed
414*cfb92d14SAndroid Build Coastguard Worker * as an array of entries. If an entry contains a key, the key is printed in
415*cfb92d14SAndroid Build Coastguard Worker * ASCII format. The value portion is printed in hexadecimal bytes.
416*cfb92d14SAndroid Build Coastguard Worker * @moreinfo{@srp}.
417*cfb92d14SAndroid Build Coastguard Worker * @sa otSrpServerServiceGetInstanceName
418*cfb92d14SAndroid Build Coastguard Worker * @sa otSrpServerServiceGetServiceName
419*cfb92d14SAndroid Build Coastguard Worker * @sa otSrpServerServiceGetSubTypeServiceNameAt
420*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])421*cfb92d14SAndroid Build Coastguard Worker template <> otError SrpServer::Process<Cmd("service")>(Arg aArgs[])
422*cfb92d14SAndroid Build Coastguard Worker {
423*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
424*cfb92d14SAndroid Build Coastguard Worker const otSrpServerHost *host = nullptr;
425*cfb92d14SAndroid Build Coastguard Worker
426*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(aArgs[0].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
427*cfb92d14SAndroid Build Coastguard Worker
428*cfb92d14SAndroid Build Coastguard Worker while ((host = otSrpServerGetNextHost(GetInstancePtr(), host)) != nullptr)
429*cfb92d14SAndroid Build Coastguard Worker {
430*cfb92d14SAndroid Build Coastguard Worker const otSrpServerService *service = nullptr;
431*cfb92d14SAndroid Build Coastguard Worker
432*cfb92d14SAndroid Build Coastguard Worker while ((service = otSrpServerHostGetNextService(host, service)) != nullptr)
433*cfb92d14SAndroid Build Coastguard Worker {
434*cfb92d14SAndroid Build Coastguard Worker bool isDeleted = otSrpServerServiceIsDeleted(service);
435*cfb92d14SAndroid Build Coastguard Worker const uint8_t *txtData;
436*cfb92d14SAndroid Build Coastguard Worker uint16_t txtDataLength;
437*cfb92d14SAndroid Build Coastguard Worker bool hasSubType = false;
438*cfb92d14SAndroid Build Coastguard Worker otSrpServerLeaseInfo leaseInfo;
439*cfb92d14SAndroid Build Coastguard Worker
440*cfb92d14SAndroid Build Coastguard Worker OutputLine("%s", otSrpServerServiceGetInstanceName(service));
441*cfb92d14SAndroid Build Coastguard Worker OutputLine(kIndentSize, "deleted: %s", isDeleted ? "true" : "false");
442*cfb92d14SAndroid Build Coastguard Worker
443*cfb92d14SAndroid Build Coastguard Worker if (isDeleted)
444*cfb92d14SAndroid Build Coastguard Worker {
445*cfb92d14SAndroid Build Coastguard Worker continue;
446*cfb92d14SAndroid Build Coastguard Worker }
447*cfb92d14SAndroid Build Coastguard Worker
448*cfb92d14SAndroid Build Coastguard Worker otSrpServerServiceGetLeaseInfo(service, &leaseInfo);
449*cfb92d14SAndroid Build Coastguard Worker
450*cfb92d14SAndroid Build Coastguard Worker OutputFormat(kIndentSize, "subtypes: ");
451*cfb92d14SAndroid Build Coastguard Worker
452*cfb92d14SAndroid Build Coastguard Worker for (uint16_t index = 0;; index++)
453*cfb92d14SAndroid Build Coastguard Worker {
454*cfb92d14SAndroid Build Coastguard Worker char subLabel[OT_DNS_MAX_LABEL_SIZE];
455*cfb92d14SAndroid Build Coastguard Worker const char *subTypeName = otSrpServerServiceGetSubTypeServiceNameAt(service, index);
456*cfb92d14SAndroid Build Coastguard Worker
457*cfb92d14SAndroid Build Coastguard Worker if (subTypeName == nullptr)
458*cfb92d14SAndroid Build Coastguard Worker {
459*cfb92d14SAndroid Build Coastguard Worker break;
460*cfb92d14SAndroid Build Coastguard Worker }
461*cfb92d14SAndroid Build Coastguard Worker
462*cfb92d14SAndroid Build Coastguard Worker IgnoreError(otSrpServerParseSubTypeServiceName(subTypeName, subLabel, sizeof(subLabel)));
463*cfb92d14SAndroid Build Coastguard Worker OutputFormat("%s%s", hasSubType ? "," : "", subLabel);
464*cfb92d14SAndroid Build Coastguard Worker hasSubType = true;
465*cfb92d14SAndroid Build Coastguard Worker }
466*cfb92d14SAndroid Build Coastguard Worker
467*cfb92d14SAndroid Build Coastguard Worker OutputLine(hasSubType ? "" : "(null)");
468*cfb92d14SAndroid Build Coastguard Worker
469*cfb92d14SAndroid Build Coastguard Worker OutputLine(kIndentSize, "port: %u", otSrpServerServiceGetPort(service));
470*cfb92d14SAndroid Build Coastguard Worker OutputLine(kIndentSize, "priority: %u", otSrpServerServiceGetPriority(service));
471*cfb92d14SAndroid Build Coastguard Worker OutputLine(kIndentSize, "weight: %u", otSrpServerServiceGetWeight(service));
472*cfb92d14SAndroid Build Coastguard Worker OutputLine(kIndentSize, "ttl: %lu", ToUlong(otSrpServerServiceGetTtl(service)));
473*cfb92d14SAndroid Build Coastguard Worker OutputLine(kIndentSize, "lease: %lu", ToUlong(leaseInfo.mLease / 1000));
474*cfb92d14SAndroid Build Coastguard Worker OutputLine(kIndentSize, "key-lease: %lu", ToUlong(leaseInfo.mKeyLease / 1000));
475*cfb92d14SAndroid Build Coastguard Worker
476*cfb92d14SAndroid Build Coastguard Worker txtData = otSrpServerServiceGetTxtData(service, &txtDataLength);
477*cfb92d14SAndroid Build Coastguard Worker OutputFormat(kIndentSize, "TXT: ");
478*cfb92d14SAndroid Build Coastguard Worker OutputDnsTxtData(txtData, txtDataLength);
479*cfb92d14SAndroid Build Coastguard Worker OutputNewLine();
480*cfb92d14SAndroid Build Coastguard Worker
481*cfb92d14SAndroid Build Coastguard Worker OutputLine(kIndentSize, "host: %s", otSrpServerHostGetFullName(host));
482*cfb92d14SAndroid Build Coastguard Worker
483*cfb92d14SAndroid Build Coastguard Worker OutputFormat(kIndentSize, "addresses: ");
484*cfb92d14SAndroid Build Coastguard Worker OutputHostAddresses(host);
485*cfb92d14SAndroid Build Coastguard Worker OutputNewLine();
486*cfb92d14SAndroid Build Coastguard Worker }
487*cfb92d14SAndroid Build Coastguard Worker }
488*cfb92d14SAndroid Build Coastguard Worker
489*cfb92d14SAndroid Build Coastguard Worker exit:
490*cfb92d14SAndroid Build Coastguard Worker return error;
491*cfb92d14SAndroid Build Coastguard Worker }
492*cfb92d14SAndroid Build Coastguard Worker
493*cfb92d14SAndroid Build Coastguard Worker /**
494*cfb92d14SAndroid Build Coastguard Worker * @cli srp server seqnum (get,set)
495*cfb92d14SAndroid Build Coastguard Worker * @code
496*cfb92d14SAndroid Build Coastguard Worker * srp server seqnum 20
497*cfb92d14SAndroid Build Coastguard Worker * Done
498*cfb92d14SAndroid Build Coastguard Worker * @endcode
499*cfb92d14SAndroid Build Coastguard Worker * @code
500*cfb92d14SAndroid Build Coastguard Worker * srp server seqnum
501*cfb92d14SAndroid Build Coastguard Worker * 20
502*cfb92d14SAndroid Build Coastguard Worker * Done
503*cfb92d14SAndroid Build Coastguard Worker * @endcode
504*cfb92d14SAndroid Build Coastguard Worker * @cparam srp server seqnum [@ca{seqnum}]
505*cfb92d14SAndroid Build Coastguard Worker * @par
506*cfb92d14SAndroid Build Coastguard Worker * Gets or sets the sequence number used with the anycast address mode.
507*cfb92d14SAndroid Build Coastguard Worker * The sequence number is included in the "DNS/SRP Service Anycast Address"
508*cfb92d14SAndroid Build Coastguard Worker * entry that is published in the Network Data.
509*cfb92d14SAndroid Build Coastguard Worker * @sa otSrpServerGetAnycastModeSequenceNumber
510*cfb92d14SAndroid Build Coastguard Worker * @sa otSrpServerSetAnycastModeSequenceNumber
511*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])512*cfb92d14SAndroid Build Coastguard Worker template <> otError SrpServer::Process<Cmd("seqnum")>(Arg aArgs[])
513*cfb92d14SAndroid Build Coastguard Worker {
514*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
515*cfb92d14SAndroid Build Coastguard Worker
516*cfb92d14SAndroid Build Coastguard Worker if (aArgs[0].IsEmpty())
517*cfb92d14SAndroid Build Coastguard Worker {
518*cfb92d14SAndroid Build Coastguard Worker OutputLine("%u", otSrpServerGetAnycastModeSequenceNumber(GetInstancePtr()));
519*cfb92d14SAndroid Build Coastguard Worker }
520*cfb92d14SAndroid Build Coastguard Worker else
521*cfb92d14SAndroid Build Coastguard Worker {
522*cfb92d14SAndroid Build Coastguard Worker uint8_t sequenceNumber;
523*cfb92d14SAndroid Build Coastguard Worker
524*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = aArgs[0].ParseAsUint8(sequenceNumber));
525*cfb92d14SAndroid Build Coastguard Worker error = otSrpServerSetAnycastModeSequenceNumber(GetInstancePtr(), sequenceNumber);
526*cfb92d14SAndroid Build Coastguard Worker }
527*cfb92d14SAndroid Build Coastguard Worker
528*cfb92d14SAndroid Build Coastguard Worker exit:
529*cfb92d14SAndroid Build Coastguard Worker return error;
530*cfb92d14SAndroid Build Coastguard Worker }
531*cfb92d14SAndroid Build Coastguard Worker
Process(Arg aArgs[])532*cfb92d14SAndroid Build Coastguard Worker otError SrpServer::Process(Arg aArgs[])
533*cfb92d14SAndroid Build Coastguard Worker {
534*cfb92d14SAndroid Build Coastguard Worker #define CmdEntry(aCommandString) \
535*cfb92d14SAndroid Build Coastguard Worker { \
536*cfb92d14SAndroid Build Coastguard Worker aCommandString, &SrpServer::Process<Cmd(aCommandString)> \
537*cfb92d14SAndroid Build Coastguard Worker }
538*cfb92d14SAndroid Build Coastguard Worker
539*cfb92d14SAndroid Build Coastguard Worker static constexpr Command kCommands[] = {
540*cfb92d14SAndroid Build Coastguard Worker CmdEntry("addrmode"),
541*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE
542*cfb92d14SAndroid Build Coastguard Worker CmdEntry("auto"),
543*cfb92d14SAndroid Build Coastguard Worker #endif
544*cfb92d14SAndroid Build Coastguard Worker CmdEntry("disable"),
545*cfb92d14SAndroid Build Coastguard Worker CmdEntry("domain"),
546*cfb92d14SAndroid Build Coastguard Worker CmdEntry("enable"),
547*cfb92d14SAndroid Build Coastguard Worker CmdEntry("host"),
548*cfb92d14SAndroid Build Coastguard Worker CmdEntry("lease"),
549*cfb92d14SAndroid Build Coastguard Worker CmdEntry("seqnum"),
550*cfb92d14SAndroid Build Coastguard Worker CmdEntry("service"),
551*cfb92d14SAndroid Build Coastguard Worker CmdEntry("state"),
552*cfb92d14SAndroid Build Coastguard Worker CmdEntry("ttl"),
553*cfb92d14SAndroid Build Coastguard Worker };
554*cfb92d14SAndroid Build Coastguard Worker
555*cfb92d14SAndroid Build Coastguard Worker static_assert(BinarySearch::IsSorted(kCommands), "kCommands is not sorted");
556*cfb92d14SAndroid Build Coastguard Worker
557*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_INVALID_COMMAND;
558*cfb92d14SAndroid Build Coastguard Worker const Command *command;
559*cfb92d14SAndroid Build Coastguard Worker
560*cfb92d14SAndroid Build Coastguard Worker if (aArgs[0].IsEmpty() || (aArgs[0] == "help"))
561*cfb92d14SAndroid Build Coastguard Worker {
562*cfb92d14SAndroid Build Coastguard Worker OutputCommandTable(kCommands);
563*cfb92d14SAndroid Build Coastguard Worker ExitNow(error = aArgs[0].IsEmpty() ? error : OT_ERROR_NONE);
564*cfb92d14SAndroid Build Coastguard Worker }
565*cfb92d14SAndroid Build Coastguard Worker
566*cfb92d14SAndroid Build Coastguard Worker command = BinarySearch::Find(aArgs[0].GetCString(), kCommands);
567*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(command != nullptr);
568*cfb92d14SAndroid Build Coastguard Worker
569*cfb92d14SAndroid Build Coastguard Worker error = (this->*command->mHandler)(aArgs + 1);
570*cfb92d14SAndroid Build Coastguard Worker
571*cfb92d14SAndroid Build Coastguard Worker exit:
572*cfb92d14SAndroid Build Coastguard Worker return error;
573*cfb92d14SAndroid Build Coastguard Worker }
574*cfb92d14SAndroid Build Coastguard Worker
575*cfb92d14SAndroid Build Coastguard Worker } // namespace Cli
576*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
577*cfb92d14SAndroid Build Coastguard Worker
578*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_SRP_SERVER_ENABLE
579