xref: /aosp_15_r20/external/openthread/src/cli/cli_srp_server.cpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
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