xref: /aosp_15_r20/external/openthread/src/ncp/ncp_base_ftd.cpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker  *    Copyright (c) 2016-2017, 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" AND
17*cfb92d14SAndroid Build Coastguard Worker  *    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18*cfb92d14SAndroid Build Coastguard Worker  *    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19*cfb92d14SAndroid Build Coastguard Worker  *    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
20*cfb92d14SAndroid Build Coastguard Worker  *    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21*cfb92d14SAndroid Build Coastguard Worker  *    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22*cfb92d14SAndroid Build Coastguard Worker  *    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23*cfb92d14SAndroid Build Coastguard Worker  *    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*cfb92d14SAndroid Build Coastguard Worker  *    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25*cfb92d14SAndroid Build Coastguard Worker  *    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*cfb92d14SAndroid Build Coastguard Worker  */
27*cfb92d14SAndroid Build Coastguard Worker 
28*cfb92d14SAndroid Build Coastguard Worker /**
29*cfb92d14SAndroid Build Coastguard Worker  * @file
30*cfb92d14SAndroid Build Coastguard Worker  *   This file implements full thread device specified Spinel interface to the OpenThread stack.
31*cfb92d14SAndroid Build Coastguard Worker  */
32*cfb92d14SAndroid Build Coastguard Worker 
33*cfb92d14SAndroid Build Coastguard Worker #include "ncp_base.hpp"
34*cfb92d14SAndroid Build Coastguard Worker #include <openthread/config.h>
35*cfb92d14SAndroid Build Coastguard Worker 
36*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE
37*cfb92d14SAndroid Build Coastguard Worker #include <openthread/backbone_router_ftd.h>
38*cfb92d14SAndroid Build Coastguard Worker #endif
39*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE
40*cfb92d14SAndroid Build Coastguard Worker #include <openthread/channel_manager.h>
41*cfb92d14SAndroid Build Coastguard Worker #endif
42*cfb92d14SAndroid Build Coastguard Worker #include <openthread/child_supervision.h>
43*cfb92d14SAndroid Build Coastguard Worker #include <openthread/dataset.h>
44*cfb92d14SAndroid Build Coastguard Worker #include <openthread/dataset_ftd.h>
45*cfb92d14SAndroid Build Coastguard Worker #include <openthread/diag.h>
46*cfb92d14SAndroid Build Coastguard Worker #include <openthread/icmp6.h>
47*cfb92d14SAndroid Build Coastguard Worker #include <openthread/ncp.h>
48*cfb92d14SAndroid Build Coastguard Worker #include <openthread/thread_ftd.h>
49*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/misc.h>
50*cfb92d14SAndroid Build Coastguard Worker 
51*cfb92d14SAndroid Build Coastguard Worker #include "common/code_utils.hpp"
52*cfb92d14SAndroid Build Coastguard Worker #include "common/debug.hpp"
53*cfb92d14SAndroid Build Coastguard Worker #include "instance/instance.hpp"
54*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE
55*cfb92d14SAndroid Build Coastguard Worker #include "meshcop/commissioner.hpp"
56*cfb92d14SAndroid Build Coastguard Worker #endif
57*cfb92d14SAndroid Build Coastguard Worker 
58*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD
59*cfb92d14SAndroid Build Coastguard Worker namespace ot {
60*cfb92d14SAndroid Build Coastguard Worker namespace Ncp {
61*cfb92d14SAndroid Build Coastguard Worker 
EncodeChildInfo(const otChildInfo & aChildInfo)62*cfb92d14SAndroid Build Coastguard Worker otError NcpBase::EncodeChildInfo(const otChildInfo &aChildInfo)
63*cfb92d14SAndroid Build Coastguard Worker {
64*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
65*cfb92d14SAndroid Build Coastguard Worker     uint8_t modeFlags;
66*cfb92d14SAndroid Build Coastguard Worker 
67*cfb92d14SAndroid Build Coastguard Worker     modeFlags =
68*cfb92d14SAndroid Build Coastguard Worker         LinkFlagsToFlagByte(aChildInfo.mRxOnWhenIdle, aChildInfo.mFullThreadDevice, aChildInfo.mFullNetworkData);
69*cfb92d14SAndroid Build Coastguard Worker 
70*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.WriteEui64(aChildInfo.mExtAddress));
71*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.WriteUint16(aChildInfo.mRloc16));
72*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.WriteUint32(aChildInfo.mTimeout));
73*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.WriteUint32(aChildInfo.mAge));
74*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.WriteUint8(aChildInfo.mNetworkDataVersion));
75*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.WriteUint8(aChildInfo.mLinkQualityIn));
76*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.WriteInt8(aChildInfo.mAverageRssi));
77*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.WriteUint8(modeFlags));
78*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.WriteInt8(aChildInfo.mLastRssi));
79*cfb92d14SAndroid Build Coastguard Worker 
80*cfb92d14SAndroid Build Coastguard Worker exit:
81*cfb92d14SAndroid Build Coastguard Worker     return error;
82*cfb92d14SAndroid Build Coastguard Worker }
83*cfb92d14SAndroid Build Coastguard Worker 
84*cfb92d14SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
85*cfb92d14SAndroid Build Coastguard Worker // MARK: Property/Status Changed
86*cfb92d14SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
87*cfb92d14SAndroid Build Coastguard Worker 
88*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MLE_PARENT_RESPONSE_CALLBACK_API_ENABLE
HandleParentResponseInfo(otThreadParentResponseInfo * aInfo,void * aContext)89*cfb92d14SAndroid Build Coastguard Worker void NcpBase::HandleParentResponseInfo(otThreadParentResponseInfo *aInfo, void *aContext)
90*cfb92d14SAndroid Build Coastguard Worker {
91*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(aInfo && aContext);
92*cfb92d14SAndroid Build Coastguard Worker 
93*cfb92d14SAndroid Build Coastguard Worker     static_cast<NcpBase *>(aContext)->HandleParentResponseInfo(*aInfo);
94*cfb92d14SAndroid Build Coastguard Worker 
95*cfb92d14SAndroid Build Coastguard Worker exit:
96*cfb92d14SAndroid Build Coastguard Worker     return;
97*cfb92d14SAndroid Build Coastguard Worker }
98*cfb92d14SAndroid Build Coastguard Worker 
HandleParentResponseInfo(const otThreadParentResponseInfo & aInfo)99*cfb92d14SAndroid Build Coastguard Worker void NcpBase::HandleParentResponseInfo(const otThreadParentResponseInfo &aInfo)
100*cfb92d14SAndroid Build Coastguard Worker {
101*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(!mChangedPropsSet.IsPropertyFiltered(SPINEL_PROP_PARENT_RESPONSE_INFO));
102*cfb92d14SAndroid Build Coastguard Worker 
103*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(mEncoder.BeginFrame(SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0, SPINEL_CMD_PROP_VALUE_IS,
104*cfb92d14SAndroid Build Coastguard Worker                                       SPINEL_PROP_PARENT_RESPONSE_INFO));
105*cfb92d14SAndroid Build Coastguard Worker 
106*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(mEncoder.WriteEui64(aInfo.mExtAddr));
107*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(mEncoder.WriteUint16(aInfo.mRloc16));
108*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(mEncoder.WriteInt8(aInfo.mRssi));
109*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(mEncoder.WriteInt8(aInfo.mPriority));
110*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(mEncoder.WriteUint8(aInfo.mLinkQuality3));
111*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(mEncoder.WriteUint8(aInfo.mLinkQuality2));
112*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(mEncoder.WriteUint8(aInfo.mLinkQuality1));
113*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(mEncoder.WriteBool(aInfo.mIsAttached));
114*cfb92d14SAndroid Build Coastguard Worker 
115*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(mEncoder.EndFrame());
116*cfb92d14SAndroid Build Coastguard Worker 
117*cfb92d14SAndroid Build Coastguard Worker exit:
118*cfb92d14SAndroid Build Coastguard Worker     return;
119*cfb92d14SAndroid Build Coastguard Worker }
120*cfb92d14SAndroid Build Coastguard Worker #endif
121*cfb92d14SAndroid Build Coastguard Worker 
HandleNeighborTableChanged(otNeighborTableEvent aEvent,const otNeighborTableEntryInfo * aEntry)122*cfb92d14SAndroid Build Coastguard Worker void NcpBase::HandleNeighborTableChanged(otNeighborTableEvent aEvent, const otNeighborTableEntryInfo *aEntry)
123*cfb92d14SAndroid Build Coastguard Worker {
124*cfb92d14SAndroid Build Coastguard Worker     GetNcpInstance()->HandleNeighborTableChanged(aEvent, *aEntry);
125*cfb92d14SAndroid Build Coastguard Worker }
126*cfb92d14SAndroid Build Coastguard Worker 
HandleNeighborTableChanged(otNeighborTableEvent aEvent,const otNeighborTableEntryInfo & aEntry)127*cfb92d14SAndroid Build Coastguard Worker void NcpBase::HandleNeighborTableChanged(otNeighborTableEvent aEvent, const otNeighborTableEntryInfo &aEntry)
128*cfb92d14SAndroid Build Coastguard Worker {
129*cfb92d14SAndroid Build Coastguard Worker     otError           error   = OT_ERROR_NONE;
130*cfb92d14SAndroid Build Coastguard Worker     unsigned int      command = SPINEL_CMD_PROP_VALUE_REMOVED;
131*cfb92d14SAndroid Build Coastguard Worker     spinel_prop_key_t property;
132*cfb92d14SAndroid Build Coastguard Worker 
133*cfb92d14SAndroid Build Coastguard Worker     switch (aEvent)
134*cfb92d14SAndroid Build Coastguard Worker     {
135*cfb92d14SAndroid Build Coastguard Worker     case OT_NEIGHBOR_TABLE_EVENT_CHILD_ADDED:
136*cfb92d14SAndroid Build Coastguard Worker         command = SPINEL_CMD_PROP_VALUE_INSERTED;
137*cfb92d14SAndroid Build Coastguard Worker 
138*cfb92d14SAndroid Build Coastguard Worker         OT_FALL_THROUGH;
139*cfb92d14SAndroid Build Coastguard Worker 
140*cfb92d14SAndroid Build Coastguard Worker     case OT_NEIGHBOR_TABLE_EVENT_CHILD_REMOVED:
141*cfb92d14SAndroid Build Coastguard Worker         property = SPINEL_PROP_THREAD_CHILD_TABLE;
142*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(!aEntry.mInfo.mChild.mIsStateRestoring);
143*cfb92d14SAndroid Build Coastguard Worker         break;
144*cfb92d14SAndroid Build Coastguard Worker 
145*cfb92d14SAndroid Build Coastguard Worker     case OT_NEIGHBOR_TABLE_EVENT_ROUTER_ADDED:
146*cfb92d14SAndroid Build Coastguard Worker         command = SPINEL_CMD_PROP_VALUE_INSERTED;
147*cfb92d14SAndroid Build Coastguard Worker 
148*cfb92d14SAndroid Build Coastguard Worker         OT_FALL_THROUGH;
149*cfb92d14SAndroid Build Coastguard Worker 
150*cfb92d14SAndroid Build Coastguard Worker     case OT_NEIGHBOR_TABLE_EVENT_ROUTER_REMOVED:
151*cfb92d14SAndroid Build Coastguard Worker         property = SPINEL_PROP_THREAD_NEIGHBOR_TABLE;
152*cfb92d14SAndroid Build Coastguard Worker         break;
153*cfb92d14SAndroid Build Coastguard Worker 
154*cfb92d14SAndroid Build Coastguard Worker     default:
155*cfb92d14SAndroid Build Coastguard Worker         ExitNow();
156*cfb92d14SAndroid Build Coastguard Worker     }
157*cfb92d14SAndroid Build Coastguard Worker 
158*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(!mChangedPropsSet.IsPropertyFiltered(property));
159*cfb92d14SAndroid Build Coastguard Worker 
160*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.BeginFrame(SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0, command, property));
161*cfb92d14SAndroid Build Coastguard Worker 
162*cfb92d14SAndroid Build Coastguard Worker     if (property == SPINEL_PROP_THREAD_CHILD_TABLE)
163*cfb92d14SAndroid Build Coastguard Worker     {
164*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = EncodeChildInfo(aEntry.mInfo.mChild));
165*cfb92d14SAndroid Build Coastguard Worker     }
166*cfb92d14SAndroid Build Coastguard Worker     else
167*cfb92d14SAndroid Build Coastguard Worker     {
168*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = EncodeNeighborInfo(aEntry.mInfo.mRouter));
169*cfb92d14SAndroid Build Coastguard Worker     }
170*cfb92d14SAndroid Build Coastguard Worker 
171*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.EndFrame());
172*cfb92d14SAndroid Build Coastguard Worker 
173*cfb92d14SAndroid Build Coastguard Worker exit:
174*cfb92d14SAndroid Build Coastguard Worker 
175*cfb92d14SAndroid Build Coastguard Worker     // If the frame can not be added (out of NCP buffer space), we remember
176*cfb92d14SAndroid Build Coastguard Worker     // to send an async `LAST_STATUS(NOMEM)` when buffer space becomes
177*cfb92d14SAndroid Build Coastguard Worker     // available. Also `mShouldEmitChildTableUpdate` flag is set to `true` so
178*cfb92d14SAndroid Build Coastguard Worker     // that the entire child table is later emitted as `VALUE_IS` spinel frame
179*cfb92d14SAndroid Build Coastguard Worker     // update from `ProcessThreadChangedFlags()`.
180*cfb92d14SAndroid Build Coastguard Worker 
181*cfb92d14SAndroid Build Coastguard Worker     if (error != OT_ERROR_NONE)
182*cfb92d14SAndroid Build Coastguard Worker     {
183*cfb92d14SAndroid Build Coastguard Worker         if (property == SPINEL_PROP_THREAD_CHILD_TABLE)
184*cfb92d14SAndroid Build Coastguard Worker         {
185*cfb92d14SAndroid Build Coastguard Worker             mShouldEmitChildTableUpdate = true;
186*cfb92d14SAndroid Build Coastguard Worker         }
187*cfb92d14SAndroid Build Coastguard Worker 
188*cfb92d14SAndroid Build Coastguard Worker         mChangedPropsSet.AddLastStatus(SPINEL_STATUS_NOMEM);
189*cfb92d14SAndroid Build Coastguard Worker         mUpdateChangedPropsTask.Post();
190*cfb92d14SAndroid Build Coastguard Worker     }
191*cfb92d14SAndroid Build Coastguard Worker }
192*cfb92d14SAndroid Build Coastguard Worker 
193*cfb92d14SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
194*cfb92d14SAndroid Build Coastguard Worker // MARK: Individual Property Handlers
195*cfb92d14SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
196*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)197*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_LOCAL_LEADER_WEIGHT>(void)
198*cfb92d14SAndroid Build Coastguard Worker {
199*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint8(otThreadGetLocalLeaderWeight(mInstance));
200*cfb92d14SAndroid Build Coastguard Worker }
201*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)202*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_LEADER_WEIGHT>(void)
203*cfb92d14SAndroid Build Coastguard Worker {
204*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint8(otThreadGetLeaderWeight(mInstance));
205*cfb92d14SAndroid Build Coastguard Worker }
206*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)207*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_CHILD_TABLE>(void)
208*cfb92d14SAndroid Build Coastguard Worker {
209*cfb92d14SAndroid Build Coastguard Worker     otError     error = OT_ERROR_NONE;
210*cfb92d14SAndroid Build Coastguard Worker     otChildInfo childInfo;
211*cfb92d14SAndroid Build Coastguard Worker     uint16_t    maxChildren;
212*cfb92d14SAndroid Build Coastguard Worker 
213*cfb92d14SAndroid Build Coastguard Worker     maxChildren = otThreadGetMaxAllowedChildren(mInstance);
214*cfb92d14SAndroid Build Coastguard Worker 
215*cfb92d14SAndroid Build Coastguard Worker     for (uint16_t index = 0; index < maxChildren; index++)
216*cfb92d14SAndroid Build Coastguard Worker     {
217*cfb92d14SAndroid Build Coastguard Worker         if ((otThreadGetChildInfoByIndex(mInstance, index, &childInfo) != OT_ERROR_NONE) || childInfo.mIsStateRestoring)
218*cfb92d14SAndroid Build Coastguard Worker         {
219*cfb92d14SAndroid Build Coastguard Worker             continue;
220*cfb92d14SAndroid Build Coastguard Worker         }
221*cfb92d14SAndroid Build Coastguard Worker 
222*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.OpenStruct());
223*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = EncodeChildInfo(childInfo));
224*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.CloseStruct());
225*cfb92d14SAndroid Build Coastguard Worker     }
226*cfb92d14SAndroid Build Coastguard Worker 
227*cfb92d14SAndroid Build Coastguard Worker exit:
228*cfb92d14SAndroid Build Coastguard Worker     return error;
229*cfb92d14SAndroid Build Coastguard Worker }
230*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)231*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_ROUTER_TABLE>(void)
232*cfb92d14SAndroid Build Coastguard Worker {
233*cfb92d14SAndroid Build Coastguard Worker     otError      error = OT_ERROR_NONE;
234*cfb92d14SAndroid Build Coastguard Worker     otRouterInfo routerInfo;
235*cfb92d14SAndroid Build Coastguard Worker     uint8_t      maxRouterId;
236*cfb92d14SAndroid Build Coastguard Worker 
237*cfb92d14SAndroid Build Coastguard Worker     maxRouterId = otThreadGetMaxRouterId(mInstance);
238*cfb92d14SAndroid Build Coastguard Worker 
239*cfb92d14SAndroid Build Coastguard Worker     for (uint8_t routerId = 0; routerId <= maxRouterId; routerId++)
240*cfb92d14SAndroid Build Coastguard Worker     {
241*cfb92d14SAndroid Build Coastguard Worker         if ((otThreadGetRouterInfo(mInstance, routerId, &routerInfo) != OT_ERROR_NONE) || !routerInfo.mAllocated)
242*cfb92d14SAndroid Build Coastguard Worker         {
243*cfb92d14SAndroid Build Coastguard Worker             continue;
244*cfb92d14SAndroid Build Coastguard Worker         }
245*cfb92d14SAndroid Build Coastguard Worker 
246*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.OpenStruct());
247*cfb92d14SAndroid Build Coastguard Worker 
248*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.WriteEui64(routerInfo.mExtAddress));
249*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.WriteUint16(routerInfo.mRloc16));
250*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.WriteUint8(routerInfo.mRouterId));
251*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.WriteUint8(routerInfo.mNextHop));
252*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.WriteUint8(routerInfo.mPathCost));
253*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.WriteUint8(routerInfo.mLinkQualityIn));
254*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.WriteUint8(routerInfo.mLinkQualityOut));
255*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.WriteUint8(routerInfo.mAge));
256*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.WriteBool(routerInfo.mLinkEstablished));
257*cfb92d14SAndroid Build Coastguard Worker 
258*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.CloseStruct());
259*cfb92d14SAndroid Build Coastguard Worker     }
260*cfb92d14SAndroid Build Coastguard Worker 
261*cfb92d14SAndroid Build Coastguard Worker exit:
262*cfb92d14SAndroid Build Coastguard Worker     return error;
263*cfb92d14SAndroid Build Coastguard Worker }
264*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)265*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_CHILD_TABLE_ADDRESSES>(void)
266*cfb92d14SAndroid Build Coastguard Worker {
267*cfb92d14SAndroid Build Coastguard Worker     otError                   error = OT_ERROR_NONE;
268*cfb92d14SAndroid Build Coastguard Worker     otChildInfo               childInfo;
269*cfb92d14SAndroid Build Coastguard Worker     uint16_t                  maxChildren;
270*cfb92d14SAndroid Build Coastguard Worker     otIp6Address              ip6Address;
271*cfb92d14SAndroid Build Coastguard Worker     otChildIp6AddressIterator iterator = OT_CHILD_IP6_ADDRESS_ITERATOR_INIT;
272*cfb92d14SAndroid Build Coastguard Worker 
273*cfb92d14SAndroid Build Coastguard Worker     maxChildren = otThreadGetMaxAllowedChildren(mInstance);
274*cfb92d14SAndroid Build Coastguard Worker 
275*cfb92d14SAndroid Build Coastguard Worker     for (uint16_t childIndex = 0; childIndex < maxChildren; childIndex++)
276*cfb92d14SAndroid Build Coastguard Worker     {
277*cfb92d14SAndroid Build Coastguard Worker         if ((otThreadGetChildInfoByIndex(mInstance, childIndex, &childInfo) != OT_ERROR_NONE) ||
278*cfb92d14SAndroid Build Coastguard Worker             childInfo.mIsStateRestoring)
279*cfb92d14SAndroid Build Coastguard Worker         {
280*cfb92d14SAndroid Build Coastguard Worker             continue;
281*cfb92d14SAndroid Build Coastguard Worker         }
282*cfb92d14SAndroid Build Coastguard Worker 
283*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.OpenStruct());
284*cfb92d14SAndroid Build Coastguard Worker 
285*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.WriteEui64(childInfo.mExtAddress));
286*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.WriteUint16(childInfo.mRloc16));
287*cfb92d14SAndroid Build Coastguard Worker 
288*cfb92d14SAndroid Build Coastguard Worker         iterator = OT_CHILD_IP6_ADDRESS_ITERATOR_INIT;
289*cfb92d14SAndroid Build Coastguard Worker 
290*cfb92d14SAndroid Build Coastguard Worker         while (otThreadGetChildNextIp6Address(mInstance, childIndex, &iterator, &ip6Address) == OT_ERROR_NONE)
291*cfb92d14SAndroid Build Coastguard Worker         {
292*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = mEncoder.WriteIp6Address(ip6Address));
293*cfb92d14SAndroid Build Coastguard Worker         }
294*cfb92d14SAndroid Build Coastguard Worker 
295*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.CloseStruct());
296*cfb92d14SAndroid Build Coastguard Worker     }
297*cfb92d14SAndroid Build Coastguard Worker 
298*cfb92d14SAndroid Build Coastguard Worker exit:
299*cfb92d14SAndroid Build Coastguard Worker     return error;
300*cfb92d14SAndroid Build Coastguard Worker }
301*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)302*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_ROUTER_ROLE_ENABLED>(void)
303*cfb92d14SAndroid Build Coastguard Worker {
304*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteBool(otThreadIsRouterEligible(mInstance));
305*cfb92d14SAndroid Build Coastguard Worker }
306*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)307*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_ROUTER_ROLE_ENABLED>(void)
308*cfb92d14SAndroid Build Coastguard Worker {
309*cfb92d14SAndroid Build Coastguard Worker     bool    eligible;
310*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
311*cfb92d14SAndroid Build Coastguard Worker 
312*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadBool(eligible));
313*cfb92d14SAndroid Build Coastguard Worker 
314*cfb92d14SAndroid Build Coastguard Worker     error = otThreadSetRouterEligible(mInstance, eligible);
315*cfb92d14SAndroid Build Coastguard Worker 
316*cfb92d14SAndroid Build Coastguard Worker exit:
317*cfb92d14SAndroid Build Coastguard Worker     return error;
318*cfb92d14SAndroid Build Coastguard Worker }
319*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)320*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_MAC_MAX_RETRY_NUMBER_INDIRECT>(void)
321*cfb92d14SAndroid Build Coastguard Worker {
322*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint8(otLinkGetMaxFrameRetriesIndirect(mInstance));
323*cfb92d14SAndroid Build Coastguard Worker }
324*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)325*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_MAC_MAX_RETRY_NUMBER_INDIRECT>(void)
326*cfb92d14SAndroid Build Coastguard Worker {
327*cfb92d14SAndroid Build Coastguard Worker     uint8_t maxFrameRetriesIndirect;
328*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
329*cfb92d14SAndroid Build Coastguard Worker 
330*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint8(maxFrameRetriesIndirect));
331*cfb92d14SAndroid Build Coastguard Worker     otLinkSetMaxFrameRetriesIndirect(mInstance, maxFrameRetriesIndirect);
332*cfb92d14SAndroid Build Coastguard Worker 
333*cfb92d14SAndroid Build Coastguard Worker exit:
334*cfb92d14SAndroid Build Coastguard Worker     return error;
335*cfb92d14SAndroid Build Coastguard Worker }
336*cfb92d14SAndroid Build Coastguard Worker 
337*cfb92d14SAndroid Build Coastguard Worker #if (OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2)
HandlePropertyGet(void)338*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_DOMAIN_NAME>(void)
339*cfb92d14SAndroid Build Coastguard Worker {
340*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUtf8(otThreadGetDomainName(mInstance));
341*cfb92d14SAndroid Build Coastguard Worker }
342*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)343*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_DOMAIN_NAME>(void)
344*cfb92d14SAndroid Build Coastguard Worker {
345*cfb92d14SAndroid Build Coastguard Worker     otError     error = OT_ERROR_NONE;
346*cfb92d14SAndroid Build Coastguard Worker     const char *domainName;
347*cfb92d14SAndroid Build Coastguard Worker 
348*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUtf8(domainName));
349*cfb92d14SAndroid Build Coastguard Worker 
350*cfb92d14SAndroid Build Coastguard Worker     error = otThreadSetDomainName(mInstance, domainName);
351*cfb92d14SAndroid Build Coastguard Worker 
352*cfb92d14SAndroid Build Coastguard Worker exit:
353*cfb92d14SAndroid Build Coastguard Worker     return error;
354*cfb92d14SAndroid Build Coastguard Worker }
355*cfb92d14SAndroid Build Coastguard Worker #endif
356*cfb92d14SAndroid Build Coastguard Worker 
357*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DUA_ENABLE
HandlePropertyGet(void)358*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_DUA_ID>(void)
359*cfb92d14SAndroid Build Coastguard Worker {
360*cfb92d14SAndroid Build Coastguard Worker     const otIp6InterfaceIdentifier *iid   = otThreadGetFixedDuaInterfaceIdentifier(mInstance);
361*cfb92d14SAndroid Build Coastguard Worker     otError                         error = OT_ERROR_NONE;
362*cfb92d14SAndroid Build Coastguard Worker 
363*cfb92d14SAndroid Build Coastguard Worker     if (iid == nullptr)
364*cfb92d14SAndroid Build Coastguard Worker     {
365*cfb92d14SAndroid Build Coastguard Worker         // send empty response
366*cfb92d14SAndroid Build Coastguard Worker     }
367*cfb92d14SAndroid Build Coastguard Worker     else
368*cfb92d14SAndroid Build Coastguard Worker     {
369*cfb92d14SAndroid Build Coastguard Worker         for (uint8_t i : iid->mFields.m8)
370*cfb92d14SAndroid Build Coastguard Worker         {
371*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = mEncoder.WriteUint8(i));
372*cfb92d14SAndroid Build Coastguard Worker         }
373*cfb92d14SAndroid Build Coastguard Worker     }
374*cfb92d14SAndroid Build Coastguard Worker 
375*cfb92d14SAndroid Build Coastguard Worker exit:
376*cfb92d14SAndroid Build Coastguard Worker     return error;
377*cfb92d14SAndroid Build Coastguard Worker }
378*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)379*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_DUA_ID>(void)
380*cfb92d14SAndroid Build Coastguard Worker {
381*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
382*cfb92d14SAndroid Build Coastguard Worker 
383*cfb92d14SAndroid Build Coastguard Worker     if (mDecoder.GetRemainingLength() == 0)
384*cfb92d14SAndroid Build Coastguard Worker     {
385*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otThreadSetFixedDuaInterfaceIdentifier(mInstance, nullptr));
386*cfb92d14SAndroid Build Coastguard Worker     }
387*cfb92d14SAndroid Build Coastguard Worker     else
388*cfb92d14SAndroid Build Coastguard Worker     {
389*cfb92d14SAndroid Build Coastguard Worker         otIp6InterfaceIdentifier iid;
390*cfb92d14SAndroid Build Coastguard Worker 
391*cfb92d14SAndroid Build Coastguard Worker         for (uint8_t &i : iid.mFields.m8)
392*cfb92d14SAndroid Build Coastguard Worker         {
393*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = mDecoder.ReadUint8(i));
394*cfb92d14SAndroid Build Coastguard Worker         }
395*cfb92d14SAndroid Build Coastguard Worker 
396*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = otThreadSetFixedDuaInterfaceIdentifier(mInstance, &iid));
397*cfb92d14SAndroid Build Coastguard Worker     }
398*cfb92d14SAndroid Build Coastguard Worker 
399*cfb92d14SAndroid Build Coastguard Worker exit:
400*cfb92d14SAndroid Build Coastguard Worker     return error;
401*cfb92d14SAndroid Build Coastguard Worker }
402*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_DUA_ENABLE
403*cfb92d14SAndroid Build Coastguard Worker 
404*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE
HandlePropertyGet(void)405*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_BACKBONE_ROUTER_LOCAL_STATE>(void)
406*cfb92d14SAndroid Build Coastguard Worker {
407*cfb92d14SAndroid Build Coastguard Worker     uint8_t state = SPINEL_THREAD_BACKBONE_ROUTER_STATE_DISABLED;
408*cfb92d14SAndroid Build Coastguard Worker 
409*cfb92d14SAndroid Build Coastguard Worker     switch (otBackboneRouterGetState(mInstance))
410*cfb92d14SAndroid Build Coastguard Worker     {
411*cfb92d14SAndroid Build Coastguard Worker     case OT_BACKBONE_ROUTER_STATE_DISABLED:
412*cfb92d14SAndroid Build Coastguard Worker         state = SPINEL_THREAD_BACKBONE_ROUTER_STATE_DISABLED;
413*cfb92d14SAndroid Build Coastguard Worker         break;
414*cfb92d14SAndroid Build Coastguard Worker 
415*cfb92d14SAndroid Build Coastguard Worker     case OT_BACKBONE_ROUTER_STATE_SECONDARY:
416*cfb92d14SAndroid Build Coastguard Worker         state = SPINEL_THREAD_BACKBONE_ROUTER_STATE_SECONDARY;
417*cfb92d14SAndroid Build Coastguard Worker         break;
418*cfb92d14SAndroid Build Coastguard Worker 
419*cfb92d14SAndroid Build Coastguard Worker     case OT_BACKBONE_ROUTER_STATE_PRIMARY:
420*cfb92d14SAndroid Build Coastguard Worker         state = SPINEL_THREAD_BACKBONE_ROUTER_STATE_PRIMARY;
421*cfb92d14SAndroid Build Coastguard Worker         break;
422*cfb92d14SAndroid Build Coastguard Worker     }
423*cfb92d14SAndroid Build Coastguard Worker 
424*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint8(state);
425*cfb92d14SAndroid Build Coastguard Worker }
426*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)427*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_BACKBONE_ROUTER_LOCAL_STATE>(void)
428*cfb92d14SAndroid Build Coastguard Worker {
429*cfb92d14SAndroid Build Coastguard Worker     uint8_t state;
430*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
431*cfb92d14SAndroid Build Coastguard Worker 
432*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint8(state));
433*cfb92d14SAndroid Build Coastguard Worker 
434*cfb92d14SAndroid Build Coastguard Worker     if (state)
435*cfb92d14SAndroid Build Coastguard Worker     {
436*cfb92d14SAndroid Build Coastguard Worker         otBackboneRouterSetEnabled(mInstance, true);
437*cfb92d14SAndroid Build Coastguard Worker     }
438*cfb92d14SAndroid Build Coastguard Worker     else
439*cfb92d14SAndroid Build Coastguard Worker     {
440*cfb92d14SAndroid Build Coastguard Worker         otBackboneRouterSetEnabled(mInstance, false);
441*cfb92d14SAndroid Build Coastguard Worker     }
442*cfb92d14SAndroid Build Coastguard Worker 
443*cfb92d14SAndroid Build Coastguard Worker exit:
444*cfb92d14SAndroid Build Coastguard Worker     return error;
445*cfb92d14SAndroid Build Coastguard Worker }
446*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)447*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_BACKBONE_ROUTER_LOCAL_CONFIG>(void)
448*cfb92d14SAndroid Build Coastguard Worker {
449*cfb92d14SAndroid Build Coastguard Worker     otError                error = OT_ERROR_NONE;
450*cfb92d14SAndroid Build Coastguard Worker     otBackboneRouterConfig bbrConfig;
451*cfb92d14SAndroid Build Coastguard Worker 
452*cfb92d14SAndroid Build Coastguard Worker     otBackboneRouterGetConfig(mInstance, &bbrConfig);
453*cfb92d14SAndroid Build Coastguard Worker 
454*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.WriteUint16(bbrConfig.mReregistrationDelay));
455*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.WriteUint32(bbrConfig.mMlrTimeout));
456*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.WriteUint8(bbrConfig.mSequenceNumber));
457*cfb92d14SAndroid Build Coastguard Worker 
458*cfb92d14SAndroid Build Coastguard Worker exit:
459*cfb92d14SAndroid Build Coastguard Worker     return error;
460*cfb92d14SAndroid Build Coastguard Worker }
461*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)462*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_BACKBONE_ROUTER_LOCAL_CONFIG>(void)
463*cfb92d14SAndroid Build Coastguard Worker {
464*cfb92d14SAndroid Build Coastguard Worker     otError                error = OT_ERROR_NONE;
465*cfb92d14SAndroid Build Coastguard Worker     otBackboneRouterConfig bbrConfig;
466*cfb92d14SAndroid Build Coastguard Worker 
467*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint16(bbrConfig.mReregistrationDelay));
468*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint32(bbrConfig.mMlrTimeout));
469*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint8(bbrConfig.mSequenceNumber));
470*cfb92d14SAndroid Build Coastguard Worker 
471*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = otBackboneRouterSetConfig(mInstance, &bbrConfig));
472*cfb92d14SAndroid Build Coastguard Worker 
473*cfb92d14SAndroid Build Coastguard Worker exit:
474*cfb92d14SAndroid Build Coastguard Worker     return error;
475*cfb92d14SAndroid Build Coastguard Worker }
476*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)477*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_BACKBONE_ROUTER_LOCAL_REGISTER>(void)
478*cfb92d14SAndroid Build Coastguard Worker {
479*cfb92d14SAndroid Build Coastguard Worker     return otBackboneRouterRegister(mInstance);
480*cfb92d14SAndroid Build Coastguard Worker }
481*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)482*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_BACKBONE_ROUTER_LOCAL_REGISTRATION_JITTER>(void)
483*cfb92d14SAndroid Build Coastguard Worker {
484*cfb92d14SAndroid Build Coastguard Worker     uint8_t jitter = otBackboneRouterGetRegistrationJitter(mInstance);
485*cfb92d14SAndroid Build Coastguard Worker 
486*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint8(jitter);
487*cfb92d14SAndroid Build Coastguard Worker }
488*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)489*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_BACKBONE_ROUTER_LOCAL_REGISTRATION_JITTER>(void)
490*cfb92d14SAndroid Build Coastguard Worker {
491*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
492*cfb92d14SAndroid Build Coastguard Worker     uint8_t jitter;
493*cfb92d14SAndroid Build Coastguard Worker 
494*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint8(jitter));
495*cfb92d14SAndroid Build Coastguard Worker 
496*cfb92d14SAndroid Build Coastguard Worker     otBackboneRouterSetRegistrationJitter(mInstance, jitter);
497*cfb92d14SAndroid Build Coastguard Worker 
498*cfb92d14SAndroid Build Coastguard Worker exit:
499*cfb92d14SAndroid Build Coastguard Worker     return error;
500*cfb92d14SAndroid Build Coastguard Worker }
501*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE
502*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)503*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_NET_PSKC>(void)
504*cfb92d14SAndroid Build Coastguard Worker {
505*cfb92d14SAndroid Build Coastguard Worker     Pskc pskc;
506*cfb92d14SAndroid Build Coastguard Worker 
507*cfb92d14SAndroid Build Coastguard Worker     otThreadGetPskc(mInstance, &pskc);
508*cfb92d14SAndroid Build Coastguard Worker 
509*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteData(pskc.m8, sizeof(spinel_net_pskc_t));
510*cfb92d14SAndroid Build Coastguard Worker }
511*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)512*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_NET_PSKC>(void)
513*cfb92d14SAndroid Build Coastguard Worker {
514*cfb92d14SAndroid Build Coastguard Worker     const uint8_t *ptr = nullptr;
515*cfb92d14SAndroid Build Coastguard Worker     uint16_t       len;
516*cfb92d14SAndroid Build Coastguard Worker     otError        error = OT_ERROR_NONE;
517*cfb92d14SAndroid Build Coastguard Worker 
518*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadData(ptr, len));
519*cfb92d14SAndroid Build Coastguard Worker 
520*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(len == sizeof(spinel_net_pskc_t), error = OT_ERROR_PARSE);
521*cfb92d14SAndroid Build Coastguard Worker 
522*cfb92d14SAndroid Build Coastguard Worker     error = otThreadSetPskc(mInstance, reinterpret_cast<const otPskc *>(ptr));
523*cfb92d14SAndroid Build Coastguard Worker 
524*cfb92d14SAndroid Build Coastguard Worker exit:
525*cfb92d14SAndroid Build Coastguard Worker     return error;
526*cfb92d14SAndroid Build Coastguard Worker }
527*cfb92d14SAndroid Build Coastguard Worker 
528*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
HandlePropertySet(void)529*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_NET_PARTITION_ID>(void)
530*cfb92d14SAndroid Build Coastguard Worker {
531*cfb92d14SAndroid Build Coastguard Worker     uint32_t partitionId = 0;
532*cfb92d14SAndroid Build Coastguard Worker     otError  error       = OT_ERROR_NONE;
533*cfb92d14SAndroid Build Coastguard Worker 
534*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint32(partitionId));
535*cfb92d14SAndroid Build Coastguard Worker 
536*cfb92d14SAndroid Build Coastguard Worker     otThreadSetPreferredLeaderPartitionId(mInstance, partitionId);
537*cfb92d14SAndroid Build Coastguard Worker 
538*cfb92d14SAndroid Build Coastguard Worker exit:
539*cfb92d14SAndroid Build Coastguard Worker     return error;
540*cfb92d14SAndroid Build Coastguard Worker }
541*cfb92d14SAndroid Build Coastguard Worker #endif
542*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)543*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_CHILD_COUNT_MAX>(void)
544*cfb92d14SAndroid Build Coastguard Worker {
545*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint8(static_cast<uint8_t>(otThreadGetMaxAllowedChildren(mInstance)));
546*cfb92d14SAndroid Build Coastguard Worker }
547*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)548*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_CHILD_COUNT_MAX>(void)
549*cfb92d14SAndroid Build Coastguard Worker {
550*cfb92d14SAndroid Build Coastguard Worker     uint8_t maxChildren = 0;
551*cfb92d14SAndroid Build Coastguard Worker     otError error       = OT_ERROR_NONE;
552*cfb92d14SAndroid Build Coastguard Worker 
553*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint8(maxChildren));
554*cfb92d14SAndroid Build Coastguard Worker 
555*cfb92d14SAndroid Build Coastguard Worker     error = otThreadSetMaxAllowedChildren(mInstance, maxChildren);
556*cfb92d14SAndroid Build Coastguard Worker 
557*cfb92d14SAndroid Build Coastguard Worker exit:
558*cfb92d14SAndroid Build Coastguard Worker     return error;
559*cfb92d14SAndroid Build Coastguard Worker }
560*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)561*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_ROUTER_UPGRADE_THRESHOLD>(void)
562*cfb92d14SAndroid Build Coastguard Worker {
563*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint8(otThreadGetRouterUpgradeThreshold(mInstance));
564*cfb92d14SAndroid Build Coastguard Worker }
565*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)566*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_ROUTER_UPGRADE_THRESHOLD>(void)
567*cfb92d14SAndroid Build Coastguard Worker {
568*cfb92d14SAndroid Build Coastguard Worker     uint8_t threshold = 0;
569*cfb92d14SAndroid Build Coastguard Worker     otError error     = OT_ERROR_NONE;
570*cfb92d14SAndroid Build Coastguard Worker 
571*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint8(threshold));
572*cfb92d14SAndroid Build Coastguard Worker 
573*cfb92d14SAndroid Build Coastguard Worker     otThreadSetRouterUpgradeThreshold(mInstance, threshold);
574*cfb92d14SAndroid Build Coastguard Worker 
575*cfb92d14SAndroid Build Coastguard Worker exit:
576*cfb92d14SAndroid Build Coastguard Worker     return error;
577*cfb92d14SAndroid Build Coastguard Worker }
578*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)579*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_ROUTER_DOWNGRADE_THRESHOLD>(void)
580*cfb92d14SAndroid Build Coastguard Worker {
581*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint8(otThreadGetRouterDowngradeThreshold(mInstance));
582*cfb92d14SAndroid Build Coastguard Worker }
583*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)584*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_ROUTER_DOWNGRADE_THRESHOLD>(void)
585*cfb92d14SAndroid Build Coastguard Worker {
586*cfb92d14SAndroid Build Coastguard Worker     uint8_t threshold = 0;
587*cfb92d14SAndroid Build Coastguard Worker     otError error     = OT_ERROR_NONE;
588*cfb92d14SAndroid Build Coastguard Worker 
589*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint8(threshold));
590*cfb92d14SAndroid Build Coastguard Worker 
591*cfb92d14SAndroid Build Coastguard Worker     otThreadSetRouterDowngradeThreshold(mInstance, threshold);
592*cfb92d14SAndroid Build Coastguard Worker 
593*cfb92d14SAndroid Build Coastguard Worker exit:
594*cfb92d14SAndroid Build Coastguard Worker     return error;
595*cfb92d14SAndroid Build Coastguard Worker }
596*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)597*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_ROUTER_SELECTION_JITTER>(void)
598*cfb92d14SAndroid Build Coastguard Worker {
599*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint8(otThreadGetRouterSelectionJitter(mInstance));
600*cfb92d14SAndroid Build Coastguard Worker }
601*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)602*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_ROUTER_SELECTION_JITTER>(void)
603*cfb92d14SAndroid Build Coastguard Worker {
604*cfb92d14SAndroid Build Coastguard Worker     uint8_t jitter = 0;
605*cfb92d14SAndroid Build Coastguard Worker     otError error  = OT_ERROR_NONE;
606*cfb92d14SAndroid Build Coastguard Worker 
607*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint8(jitter));
608*cfb92d14SAndroid Build Coastguard Worker 
609*cfb92d14SAndroid Build Coastguard Worker     otThreadSetRouterSelectionJitter(mInstance, jitter);
610*cfb92d14SAndroid Build Coastguard Worker 
611*cfb92d14SAndroid Build Coastguard Worker exit:
612*cfb92d14SAndroid Build Coastguard Worker     return error;
613*cfb92d14SAndroid Build Coastguard Worker }
614*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)615*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_CONTEXT_REUSE_DELAY>(void)
616*cfb92d14SAndroid Build Coastguard Worker {
617*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint32(otThreadGetContextIdReuseDelay(mInstance));
618*cfb92d14SAndroid Build Coastguard Worker }
619*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)620*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_CONTEXT_REUSE_DELAY>(void)
621*cfb92d14SAndroid Build Coastguard Worker {
622*cfb92d14SAndroid Build Coastguard Worker     uint32_t delay = 0;
623*cfb92d14SAndroid Build Coastguard Worker     otError  error = OT_ERROR_NONE;
624*cfb92d14SAndroid Build Coastguard Worker 
625*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint32(delay));
626*cfb92d14SAndroid Build Coastguard Worker 
627*cfb92d14SAndroid Build Coastguard Worker     otThreadSetContextIdReuseDelay(mInstance, delay);
628*cfb92d14SAndroid Build Coastguard Worker 
629*cfb92d14SAndroid Build Coastguard Worker exit:
630*cfb92d14SAndroid Build Coastguard Worker     return error;
631*cfb92d14SAndroid Build Coastguard Worker }
632*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)633*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_NETWORK_ID_TIMEOUT>(void)
634*cfb92d14SAndroid Build Coastguard Worker {
635*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint8(otThreadGetNetworkIdTimeout(mInstance));
636*cfb92d14SAndroid Build Coastguard Worker }
637*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)638*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_NETWORK_ID_TIMEOUT>(void)
639*cfb92d14SAndroid Build Coastguard Worker {
640*cfb92d14SAndroid Build Coastguard Worker     uint8_t timeout = 0;
641*cfb92d14SAndroid Build Coastguard Worker     otError error   = OT_ERROR_NONE;
642*cfb92d14SAndroid Build Coastguard Worker 
643*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint8(timeout));
644*cfb92d14SAndroid Build Coastguard Worker 
645*cfb92d14SAndroid Build Coastguard Worker     otThreadSetNetworkIdTimeout(mInstance, timeout);
646*cfb92d14SAndroid Build Coastguard Worker 
647*cfb92d14SAndroid Build Coastguard Worker exit:
648*cfb92d14SAndroid Build Coastguard Worker     return error;
649*cfb92d14SAndroid Build Coastguard Worker }
650*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)651*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_NEW_DATASET>(void)
652*cfb92d14SAndroid Build Coastguard Worker {
653*cfb92d14SAndroid Build Coastguard Worker     otError              error;
654*cfb92d14SAndroid Build Coastguard Worker     otOperationalDataset dataset;
655*cfb92d14SAndroid Build Coastguard Worker 
656*cfb92d14SAndroid Build Coastguard Worker     error = otDatasetCreateNewNetwork(mInstance, &dataset);
657*cfb92d14SAndroid Build Coastguard Worker 
658*cfb92d14SAndroid Build Coastguard Worker     if (error == OT_ERROR_NONE)
659*cfb92d14SAndroid Build Coastguard Worker     {
660*cfb92d14SAndroid Build Coastguard Worker         error = EncodeOperationalDataset(dataset);
661*cfb92d14SAndroid Build Coastguard Worker     }
662*cfb92d14SAndroid Build Coastguard Worker     else
663*cfb92d14SAndroid Build Coastguard Worker     {
664*cfb92d14SAndroid Build Coastguard Worker         error = mEncoder.OverwriteWithLastStatusError(ThreadErrorToSpinelStatus(error));
665*cfb92d14SAndroid Build Coastguard Worker     }
666*cfb92d14SAndroid Build Coastguard Worker 
667*cfb92d14SAndroid Build Coastguard Worker     return error;
668*cfb92d14SAndroid Build Coastguard Worker }
669*cfb92d14SAndroid Build Coastguard Worker 
670*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE
671*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)672*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_MESHCOP_COMMISSIONER_STATE>(void)
673*cfb92d14SAndroid Build Coastguard Worker {
674*cfb92d14SAndroid Build Coastguard Worker     uint8_t state = SPINEL_MESHCOP_COMMISSIONER_STATE_DISABLED;
675*cfb92d14SAndroid Build Coastguard Worker 
676*cfb92d14SAndroid Build Coastguard Worker     switch (otCommissionerGetState(mInstance))
677*cfb92d14SAndroid Build Coastguard Worker     {
678*cfb92d14SAndroid Build Coastguard Worker     case OT_COMMISSIONER_STATE_DISABLED:
679*cfb92d14SAndroid Build Coastguard Worker         state = SPINEL_MESHCOP_COMMISSIONER_STATE_DISABLED;
680*cfb92d14SAndroid Build Coastguard Worker         break;
681*cfb92d14SAndroid Build Coastguard Worker 
682*cfb92d14SAndroid Build Coastguard Worker     case OT_COMMISSIONER_STATE_PETITION:
683*cfb92d14SAndroid Build Coastguard Worker         state = SPINEL_MESHCOP_COMMISSIONER_STATE_PETITION;
684*cfb92d14SAndroid Build Coastguard Worker         break;
685*cfb92d14SAndroid Build Coastguard Worker 
686*cfb92d14SAndroid Build Coastguard Worker     case OT_COMMISSIONER_STATE_ACTIVE:
687*cfb92d14SAndroid Build Coastguard Worker         state = SPINEL_MESHCOP_COMMISSIONER_STATE_ACTIVE;
688*cfb92d14SAndroid Build Coastguard Worker         break;
689*cfb92d14SAndroid Build Coastguard Worker     }
690*cfb92d14SAndroid Build Coastguard Worker 
691*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint8(state);
692*cfb92d14SAndroid Build Coastguard Worker }
693*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)694*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_MESHCOP_COMMISSIONER_STATE>(void)
695*cfb92d14SAndroid Build Coastguard Worker {
696*cfb92d14SAndroid Build Coastguard Worker     uint8_t state;
697*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
698*cfb92d14SAndroid Build Coastguard Worker 
699*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint8(state));
700*cfb92d14SAndroid Build Coastguard Worker 
701*cfb92d14SAndroid Build Coastguard Worker     switch (state)
702*cfb92d14SAndroid Build Coastguard Worker     {
703*cfb92d14SAndroid Build Coastguard Worker     case SPINEL_MESHCOP_COMMISSIONER_STATE_DISABLED:
704*cfb92d14SAndroid Build Coastguard Worker         error = otCommissionerStop(mInstance);
705*cfb92d14SAndroid Build Coastguard Worker         break;
706*cfb92d14SAndroid Build Coastguard Worker 
707*cfb92d14SAndroid Build Coastguard Worker     case SPINEL_MESHCOP_COMMISSIONER_STATE_ACTIVE:
708*cfb92d14SAndroid Build Coastguard Worker         error = otCommissionerStart(mInstance, nullptr, nullptr, nullptr);
709*cfb92d14SAndroid Build Coastguard Worker         break;
710*cfb92d14SAndroid Build Coastguard Worker 
711*cfb92d14SAndroid Build Coastguard Worker     default:
712*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
713*cfb92d14SAndroid Build Coastguard Worker         break;
714*cfb92d14SAndroid Build Coastguard Worker     }
715*cfb92d14SAndroid Build Coastguard Worker 
716*cfb92d14SAndroid Build Coastguard Worker exit:
717*cfb92d14SAndroid Build Coastguard Worker     return error;
718*cfb92d14SAndroid Build Coastguard Worker }
719*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)720*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS>(void)
721*cfb92d14SAndroid Build Coastguard Worker {
722*cfb92d14SAndroid Build Coastguard Worker     otError      error = OT_ERROR_NONE;
723*cfb92d14SAndroid Build Coastguard Worker     uint16_t     iter  = 0;
724*cfb92d14SAndroid Build Coastguard Worker     otJoinerInfo joinerInfo;
725*cfb92d14SAndroid Build Coastguard Worker 
726*cfb92d14SAndroid Build Coastguard Worker     while (otCommissionerGetNextJoinerInfo(mInstance, &iter, &joinerInfo) == OT_ERROR_NONE)
727*cfb92d14SAndroid Build Coastguard Worker     {
728*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.OpenStruct());
729*cfb92d14SAndroid Build Coastguard Worker 
730*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.OpenStruct()); // Joiner Id (any, EUI64 or a Joiner Discerner) struct
731*cfb92d14SAndroid Build Coastguard Worker 
732*cfb92d14SAndroid Build Coastguard Worker         switch (joinerInfo.mType)
733*cfb92d14SAndroid Build Coastguard Worker         {
734*cfb92d14SAndroid Build Coastguard Worker         case OT_JOINER_INFO_TYPE_ANY:
735*cfb92d14SAndroid Build Coastguard Worker             break;
736*cfb92d14SAndroid Build Coastguard Worker 
737*cfb92d14SAndroid Build Coastguard Worker         case OT_JOINER_INFO_TYPE_EUI64:
738*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = mEncoder.WriteEui64(joinerInfo.mSharedId.mEui64));
739*cfb92d14SAndroid Build Coastguard Worker             break;
740*cfb92d14SAndroid Build Coastguard Worker 
741*cfb92d14SAndroid Build Coastguard Worker         case OT_JOINER_INFO_TYPE_DISCERNER:
742*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = mEncoder.WriteUint8(joinerInfo.mSharedId.mDiscerner.mLength));
743*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = mEncoder.WriteUint64(joinerInfo.mSharedId.mDiscerner.mValue));
744*cfb92d14SAndroid Build Coastguard Worker             break;
745*cfb92d14SAndroid Build Coastguard Worker         }
746*cfb92d14SAndroid Build Coastguard Worker 
747*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.CloseStruct());
748*cfb92d14SAndroid Build Coastguard Worker 
749*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.WriteUint32(joinerInfo.mExpirationTime));
750*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.WriteUtf8(joinerInfo.mPskd.m8));
751*cfb92d14SAndroid Build Coastguard Worker 
752*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.CloseStruct());
753*cfb92d14SAndroid Build Coastguard Worker     }
754*cfb92d14SAndroid Build Coastguard Worker 
755*cfb92d14SAndroid Build Coastguard Worker exit:
756*cfb92d14SAndroid Build Coastguard Worker     return error;
757*cfb92d14SAndroid Build Coastguard Worker }
758*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyInsert(void)759*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyInsert<SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS>(void)
760*cfb92d14SAndroid Build Coastguard Worker {
761*cfb92d14SAndroid Build Coastguard Worker     otError             error = OT_ERROR_NONE;
762*cfb92d14SAndroid Build Coastguard Worker     otJoinerDiscerner   discerner;
763*cfb92d14SAndroid Build Coastguard Worker     bool                withDiscerner = false;
764*cfb92d14SAndroid Build Coastguard Worker     const otExtAddress *eui64;
765*cfb92d14SAndroid Build Coastguard Worker     uint32_t            timeout;
766*cfb92d14SAndroid Build Coastguard Worker     const char         *psk;
767*cfb92d14SAndroid Build Coastguard Worker 
768*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.OpenStruct());
769*cfb92d14SAndroid Build Coastguard Worker 
770*cfb92d14SAndroid Build Coastguard Worker     switch (mDecoder.GetRemainingLengthInStruct())
771*cfb92d14SAndroid Build Coastguard Worker     {
772*cfb92d14SAndroid Build Coastguard Worker     case 0:
773*cfb92d14SAndroid Build Coastguard Worker         // Empty struct indicates any joiner
774*cfb92d14SAndroid Build Coastguard Worker         eui64 = nullptr;
775*cfb92d14SAndroid Build Coastguard Worker         break;
776*cfb92d14SAndroid Build Coastguard Worker 
777*cfb92d14SAndroid Build Coastguard Worker     case sizeof(spinel_eui64_t):
778*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mDecoder.ReadEui64(eui64));
779*cfb92d14SAndroid Build Coastguard Worker         break;
780*cfb92d14SAndroid Build Coastguard Worker 
781*cfb92d14SAndroid Build Coastguard Worker     default:
782*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mDecoder.ReadUint8(discerner.mLength));
783*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mDecoder.ReadUint64(discerner.mValue));
784*cfb92d14SAndroid Build Coastguard Worker         withDiscerner = true;
785*cfb92d14SAndroid Build Coastguard Worker         break;
786*cfb92d14SAndroid Build Coastguard Worker     }
787*cfb92d14SAndroid Build Coastguard Worker 
788*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.CloseStruct());
789*cfb92d14SAndroid Build Coastguard Worker 
790*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint32(timeout));
791*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUtf8(psk));
792*cfb92d14SAndroid Build Coastguard Worker 
793*cfb92d14SAndroid Build Coastguard Worker     if (withDiscerner)
794*cfb92d14SAndroid Build Coastguard Worker     {
795*cfb92d14SAndroid Build Coastguard Worker         error = otCommissionerAddJoinerWithDiscerner(mInstance, &discerner, psk, timeout);
796*cfb92d14SAndroid Build Coastguard Worker     }
797*cfb92d14SAndroid Build Coastguard Worker     else
798*cfb92d14SAndroid Build Coastguard Worker     {
799*cfb92d14SAndroid Build Coastguard Worker         error = otCommissionerAddJoiner(mInstance, eui64, psk, timeout);
800*cfb92d14SAndroid Build Coastguard Worker     }
801*cfb92d14SAndroid Build Coastguard Worker 
802*cfb92d14SAndroid Build Coastguard Worker exit:
803*cfb92d14SAndroid Build Coastguard Worker     return error;
804*cfb92d14SAndroid Build Coastguard Worker }
805*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyRemove(void)806*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyRemove<SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS>(void)
807*cfb92d14SAndroid Build Coastguard Worker {
808*cfb92d14SAndroid Build Coastguard Worker     otError             error = OT_ERROR_NONE;
809*cfb92d14SAndroid Build Coastguard Worker     otJoinerDiscerner   discerner;
810*cfb92d14SAndroid Build Coastguard Worker     bool                withDiscerner = false;
811*cfb92d14SAndroid Build Coastguard Worker     const otExtAddress *eui64;
812*cfb92d14SAndroid Build Coastguard Worker 
813*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.OpenStruct());
814*cfb92d14SAndroid Build Coastguard Worker 
815*cfb92d14SAndroid Build Coastguard Worker     switch (mDecoder.GetRemainingLengthInStruct())
816*cfb92d14SAndroid Build Coastguard Worker     {
817*cfb92d14SAndroid Build Coastguard Worker     case 0:
818*cfb92d14SAndroid Build Coastguard Worker         // Empty struct indicates any joiner
819*cfb92d14SAndroid Build Coastguard Worker         eui64 = nullptr;
820*cfb92d14SAndroid Build Coastguard Worker         break;
821*cfb92d14SAndroid Build Coastguard Worker 
822*cfb92d14SAndroid Build Coastguard Worker     case sizeof(spinel_eui64_t):
823*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mDecoder.ReadEui64(eui64));
824*cfb92d14SAndroid Build Coastguard Worker         break;
825*cfb92d14SAndroid Build Coastguard Worker 
826*cfb92d14SAndroid Build Coastguard Worker     default:
827*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mDecoder.ReadUint8(discerner.mLength));
828*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mDecoder.ReadUint64(discerner.mValue));
829*cfb92d14SAndroid Build Coastguard Worker         withDiscerner = true;
830*cfb92d14SAndroid Build Coastguard Worker         break;
831*cfb92d14SAndroid Build Coastguard Worker     }
832*cfb92d14SAndroid Build Coastguard Worker 
833*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.CloseStruct());
834*cfb92d14SAndroid Build Coastguard Worker 
835*cfb92d14SAndroid Build Coastguard Worker     if (withDiscerner)
836*cfb92d14SAndroid Build Coastguard Worker     {
837*cfb92d14SAndroid Build Coastguard Worker         error = otCommissionerRemoveJoinerWithDiscerner(mInstance, &discerner);
838*cfb92d14SAndroid Build Coastguard Worker     }
839*cfb92d14SAndroid Build Coastguard Worker     else
840*cfb92d14SAndroid Build Coastguard Worker     {
841*cfb92d14SAndroid Build Coastguard Worker         error = otCommissionerRemoveJoiner(mInstance, eui64);
842*cfb92d14SAndroid Build Coastguard Worker     }
843*cfb92d14SAndroid Build Coastguard Worker 
844*cfb92d14SAndroid Build Coastguard Worker exit:
845*cfb92d14SAndroid Build Coastguard Worker     return error;
846*cfb92d14SAndroid Build Coastguard Worker }
847*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)848*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_MESHCOP_COMMISSIONER_PROVISIONING_URL>(void)
849*cfb92d14SAndroid Build Coastguard Worker {
850*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUtf8(otCommissionerGetProvisioningUrl(mInstance));
851*cfb92d14SAndroid Build Coastguard Worker }
852*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)853*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_MESHCOP_COMMISSIONER_PROVISIONING_URL>(void)
854*cfb92d14SAndroid Build Coastguard Worker {
855*cfb92d14SAndroid Build Coastguard Worker     otError     error = OT_ERROR_NONE;
856*cfb92d14SAndroid Build Coastguard Worker     const char *url;
857*cfb92d14SAndroid Build Coastguard Worker 
858*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUtf8(url));
859*cfb92d14SAndroid Build Coastguard Worker 
860*cfb92d14SAndroid Build Coastguard Worker     error = otCommissionerSetProvisioningUrl(mInstance, url);
861*cfb92d14SAndroid Build Coastguard Worker 
862*cfb92d14SAndroid Build Coastguard Worker exit:
863*cfb92d14SAndroid Build Coastguard Worker     return error;
864*cfb92d14SAndroid Build Coastguard Worker }
865*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)866*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_MESHCOP_COMMISSIONER_SESSION_ID>(void)
867*cfb92d14SAndroid Build Coastguard Worker {
868*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint16(otCommissionerGetSessionId(mInstance));
869*cfb92d14SAndroid Build Coastguard Worker }
870*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)871*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_MESHCOP_COMMISSIONER_ANNOUNCE_BEGIN>(void)
872*cfb92d14SAndroid Build Coastguard Worker {
873*cfb92d14SAndroid Build Coastguard Worker     otError             error = OT_ERROR_NONE;
874*cfb92d14SAndroid Build Coastguard Worker     uint32_t            channelMask;
875*cfb92d14SAndroid Build Coastguard Worker     uint8_t             count;
876*cfb92d14SAndroid Build Coastguard Worker     uint16_t            period;
877*cfb92d14SAndroid Build Coastguard Worker     const otIp6Address *address;
878*cfb92d14SAndroid Build Coastguard Worker 
879*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint32(channelMask));
880*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint8(count));
881*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint16(period));
882*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadIp6Address(address));
883*cfb92d14SAndroid Build Coastguard Worker 
884*cfb92d14SAndroid Build Coastguard Worker     error = otCommissionerAnnounceBegin(mInstance, channelMask, count, period, address);
885*cfb92d14SAndroid Build Coastguard Worker 
886*cfb92d14SAndroid Build Coastguard Worker exit:
887*cfb92d14SAndroid Build Coastguard Worker     return error;
888*cfb92d14SAndroid Build Coastguard Worker }
889*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)890*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_MESHCOP_COMMISSIONER_ENERGY_SCAN>(void)
891*cfb92d14SAndroid Build Coastguard Worker {
892*cfb92d14SAndroid Build Coastguard Worker     otError             error = OT_ERROR_NONE;
893*cfb92d14SAndroid Build Coastguard Worker     uint32_t            channelMask;
894*cfb92d14SAndroid Build Coastguard Worker     uint8_t             count;
895*cfb92d14SAndroid Build Coastguard Worker     uint16_t            period;
896*cfb92d14SAndroid Build Coastguard Worker     uint16_t            scanDuration;
897*cfb92d14SAndroid Build Coastguard Worker     const otIp6Address *address;
898*cfb92d14SAndroid Build Coastguard Worker 
899*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint32(channelMask));
900*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint8(count));
901*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint16(period));
902*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint16(scanDuration));
903*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadIp6Address(address));
904*cfb92d14SAndroid Build Coastguard Worker 
905*cfb92d14SAndroid Build Coastguard Worker     error = otCommissionerEnergyScan(mInstance, channelMask, count, period, scanDuration, address,
906*cfb92d14SAndroid Build Coastguard Worker                                      &NcpBase::HandleCommissionerEnergyReport_Jump, this);
907*cfb92d14SAndroid Build Coastguard Worker 
908*cfb92d14SAndroid Build Coastguard Worker exit:
909*cfb92d14SAndroid Build Coastguard Worker     return error;
910*cfb92d14SAndroid Build Coastguard Worker }
911*cfb92d14SAndroid Build Coastguard Worker 
HandleCommissionerEnergyReport_Jump(uint32_t aChannelMask,const uint8_t * aEnergyData,uint8_t aLength,void * aContext)912*cfb92d14SAndroid Build Coastguard Worker void NcpBase::HandleCommissionerEnergyReport_Jump(uint32_t       aChannelMask,
913*cfb92d14SAndroid Build Coastguard Worker                                                   const uint8_t *aEnergyData,
914*cfb92d14SAndroid Build Coastguard Worker                                                   uint8_t        aLength,
915*cfb92d14SAndroid Build Coastguard Worker                                                   void          *aContext)
916*cfb92d14SAndroid Build Coastguard Worker {
917*cfb92d14SAndroid Build Coastguard Worker     static_cast<NcpBase *>(aContext)->HandleCommissionerEnergyReport(aChannelMask, aEnergyData, aLength);
918*cfb92d14SAndroid Build Coastguard Worker }
919*cfb92d14SAndroid Build Coastguard Worker 
HandleCommissionerEnergyReport(uint32_t aChannelMask,const uint8_t * aEnergyData,uint8_t aLength)920*cfb92d14SAndroid Build Coastguard Worker void NcpBase::HandleCommissionerEnergyReport(uint32_t aChannelMask, const uint8_t *aEnergyData, uint8_t aLength)
921*cfb92d14SAndroid Build Coastguard Worker {
922*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
923*cfb92d14SAndroid Build Coastguard Worker 
924*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.BeginFrame(SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0, SPINEL_CMD_PROP_VALUE_INSERTED,
925*cfb92d14SAndroid Build Coastguard Worker                                               SPINEL_PROP_MESHCOP_COMMISSIONER_ENERGY_SCAN_RESULT));
926*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.WriteUint32(aChannelMask));
927*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.WriteDataWithLen(aEnergyData, aLength));
928*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.EndFrame());
929*cfb92d14SAndroid Build Coastguard Worker 
930*cfb92d14SAndroid Build Coastguard Worker exit:
931*cfb92d14SAndroid Build Coastguard Worker 
932*cfb92d14SAndroid Build Coastguard Worker     if (error != OT_ERROR_NONE)
933*cfb92d14SAndroid Build Coastguard Worker     {
934*cfb92d14SAndroid Build Coastguard Worker         mChangedPropsSet.AddLastStatus(SPINEL_STATUS_NOMEM);
935*cfb92d14SAndroid Build Coastguard Worker         mUpdateChangedPropsTask.Post();
936*cfb92d14SAndroid Build Coastguard Worker     }
937*cfb92d14SAndroid Build Coastguard Worker }
938*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)939*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_MESHCOP_COMMISSIONER_PAN_ID_QUERY>(void)
940*cfb92d14SAndroid Build Coastguard Worker {
941*cfb92d14SAndroid Build Coastguard Worker     otError             error = OT_ERROR_NONE;
942*cfb92d14SAndroid Build Coastguard Worker     uint16_t            panId;
943*cfb92d14SAndroid Build Coastguard Worker     uint32_t            channelMask;
944*cfb92d14SAndroid Build Coastguard Worker     const otIp6Address *address;
945*cfb92d14SAndroid Build Coastguard Worker 
946*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint16(panId));
947*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint32(channelMask));
948*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadIp6Address(address));
949*cfb92d14SAndroid Build Coastguard Worker 
950*cfb92d14SAndroid Build Coastguard Worker     error = otCommissionerPanIdQuery(mInstance, panId, channelMask, address,
951*cfb92d14SAndroid Build Coastguard Worker                                      &NcpBase::HandleCommissionerPanIdConflict_Jump, this);
952*cfb92d14SAndroid Build Coastguard Worker 
953*cfb92d14SAndroid Build Coastguard Worker exit:
954*cfb92d14SAndroid Build Coastguard Worker     return error;
955*cfb92d14SAndroid Build Coastguard Worker }
956*cfb92d14SAndroid Build Coastguard Worker 
HandleCommissionerPanIdConflict_Jump(uint16_t aPanId,uint32_t aChannelMask,void * aContext)957*cfb92d14SAndroid Build Coastguard Worker void NcpBase::HandleCommissionerPanIdConflict_Jump(uint16_t aPanId, uint32_t aChannelMask, void *aContext)
958*cfb92d14SAndroid Build Coastguard Worker {
959*cfb92d14SAndroid Build Coastguard Worker     static_cast<NcpBase *>(aContext)->HandleCommissionerPanIdConflict(aPanId, aChannelMask);
960*cfb92d14SAndroid Build Coastguard Worker }
961*cfb92d14SAndroid Build Coastguard Worker 
HandleCommissionerPanIdConflict(uint16_t aPanId,uint32_t aChannelMask)962*cfb92d14SAndroid Build Coastguard Worker void NcpBase::HandleCommissionerPanIdConflict(uint16_t aPanId, uint32_t aChannelMask)
963*cfb92d14SAndroid Build Coastguard Worker {
964*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
965*cfb92d14SAndroid Build Coastguard Worker 
966*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.BeginFrame(SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0, SPINEL_CMD_PROP_VALUE_INSERTED,
967*cfb92d14SAndroid Build Coastguard Worker                                               SPINEL_PROP_MESHCOP_COMMISSIONER_PAN_ID_CONFLICT_RESULT));
968*cfb92d14SAndroid Build Coastguard Worker 
969*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.WriteUint16(aPanId));
970*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.WriteUint32(aChannelMask));
971*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.EndFrame());
972*cfb92d14SAndroid Build Coastguard Worker 
973*cfb92d14SAndroid Build Coastguard Worker exit:
974*cfb92d14SAndroid Build Coastguard Worker 
975*cfb92d14SAndroid Build Coastguard Worker     if (error != OT_ERROR_NONE)
976*cfb92d14SAndroid Build Coastguard Worker     {
977*cfb92d14SAndroid Build Coastguard Worker         mChangedPropsSet.AddLastStatus(SPINEL_STATUS_NOMEM);
978*cfb92d14SAndroid Build Coastguard Worker         mUpdateChangedPropsTask.Post();
979*cfb92d14SAndroid Build Coastguard Worker     }
980*cfb92d14SAndroid Build Coastguard Worker }
981*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)982*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_GET>(void)
983*cfb92d14SAndroid Build Coastguard Worker {
984*cfb92d14SAndroid Build Coastguard Worker     otError        error = OT_ERROR_NONE;
985*cfb92d14SAndroid Build Coastguard Worker     const uint8_t *tlvs;
986*cfb92d14SAndroid Build Coastguard Worker     uint16_t       length;
987*cfb92d14SAndroid Build Coastguard Worker 
988*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadDataWithLen(tlvs, length));
989*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(length <= 255, error = OT_ERROR_INVALID_ARGS);
990*cfb92d14SAndroid Build Coastguard Worker 
991*cfb92d14SAndroid Build Coastguard Worker     error = otCommissionerSendMgmtGet(mInstance, tlvs, static_cast<uint8_t>(length));
992*cfb92d14SAndroid Build Coastguard Worker 
993*cfb92d14SAndroid Build Coastguard Worker exit:
994*cfb92d14SAndroid Build Coastguard Worker     return error;
995*cfb92d14SAndroid Build Coastguard Worker }
996*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)997*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_SET>(void)
998*cfb92d14SAndroid Build Coastguard Worker {
999*cfb92d14SAndroid Build Coastguard Worker     otError                error = OT_ERROR_NONE;
1000*cfb92d14SAndroid Build Coastguard Worker     const uint8_t         *tlvs;
1001*cfb92d14SAndroid Build Coastguard Worker     uint16_t               length;
1002*cfb92d14SAndroid Build Coastguard Worker     otCommissioningDataset dataset;
1003*cfb92d14SAndroid Build Coastguard Worker 
1004*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadDataWithLen(tlvs, length));
1005*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(length <= 255, error = OT_ERROR_INVALID_ARGS);
1006*cfb92d14SAndroid Build Coastguard Worker 
1007*cfb92d14SAndroid Build Coastguard Worker     memset(&dataset, 0, sizeof(otCommissioningDataset));
1008*cfb92d14SAndroid Build Coastguard Worker     error = otCommissionerSendMgmtSet(mInstance, &dataset, tlvs, static_cast<uint8_t>(length));
1009*cfb92d14SAndroid Build Coastguard Worker 
1010*cfb92d14SAndroid Build Coastguard Worker exit:
1011*cfb92d14SAndroid Build Coastguard Worker     return error;
1012*cfb92d14SAndroid Build Coastguard Worker }
1013*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet_SPINEL_PROP_MESHCOP_COMMISSIONER_GENERATE_PSKC(uint8_t aHeader)1014*cfb92d14SAndroid Build Coastguard Worker otError NcpBase::HandlePropertySet_SPINEL_PROP_MESHCOP_COMMISSIONER_GENERATE_PSKC(uint8_t aHeader)
1015*cfb92d14SAndroid Build Coastguard Worker {
1016*cfb92d14SAndroid Build Coastguard Worker     otError        error = OT_ERROR_NONE;
1017*cfb92d14SAndroid Build Coastguard Worker     const char    *passPhrase;
1018*cfb92d14SAndroid Build Coastguard Worker     const char    *networkName;
1019*cfb92d14SAndroid Build Coastguard Worker     const uint8_t *extPanIdData;
1020*cfb92d14SAndroid Build Coastguard Worker     uint16_t       length;
1021*cfb92d14SAndroid Build Coastguard Worker     otPskc         pskc;
1022*cfb92d14SAndroid Build Coastguard Worker 
1023*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUtf8(passPhrase));
1024*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUtf8(networkName));
1025*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadDataWithLen(extPanIdData, length));
1026*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(length == sizeof(spinel_net_xpanid_t), error = OT_ERROR_PARSE);
1027*cfb92d14SAndroid Build Coastguard Worker 
1028*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = otDatasetGeneratePskc(passPhrase, reinterpret_cast<const otNetworkName *>(networkName),
1029*cfb92d14SAndroid Build Coastguard Worker                                                 reinterpret_cast<const otExtendedPanId *>(extPanIdData), &pskc));
1030*cfb92d14SAndroid Build Coastguard Worker 
1031*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(
1032*cfb92d14SAndroid Build Coastguard Worker         error = mEncoder.BeginFrame(aHeader, SPINEL_CMD_PROP_VALUE_IS, SPINEL_PROP_MESHCOP_COMMISSIONER_GENERATE_PSKC));
1033*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.WriteData(pskc.m8, sizeof(pskc)));
1034*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mEncoder.EndFrame());
1035*cfb92d14SAndroid Build Coastguard Worker 
1036*cfb92d14SAndroid Build Coastguard Worker exit:
1037*cfb92d14SAndroid Build Coastguard Worker     return error;
1038*cfb92d14SAndroid Build Coastguard Worker }
1039*cfb92d14SAndroid Build Coastguard Worker 
1040*cfb92d14SAndroid Build Coastguard Worker // SPINEL_PROP_THREAD_COMMISSIONER_ENABLED is replaced by SPINEL_PROP_MESHCOP_COMMISSIONER_STATE. Please use the new
1041*cfb92d14SAndroid Build Coastguard Worker // property. The old property/implementation remains for backward compatibility.
1042*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)1043*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_COMMISSIONER_ENABLED>(void)
1044*cfb92d14SAndroid Build Coastguard Worker {
1045*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteBool(otCommissionerGetState(mInstance) == OT_COMMISSIONER_STATE_ACTIVE);
1046*cfb92d14SAndroid Build Coastguard Worker }
1047*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet_SPINEL_PROP_THREAD_COMMISSIONER_ENABLED(uint8_t aHeader)1048*cfb92d14SAndroid Build Coastguard Worker otError NcpBase::HandlePropertySet_SPINEL_PROP_THREAD_COMMISSIONER_ENABLED(uint8_t aHeader)
1049*cfb92d14SAndroid Build Coastguard Worker {
1050*cfb92d14SAndroid Build Coastguard Worker     bool    enabled = false;
1051*cfb92d14SAndroid Build Coastguard Worker     otError error   = OT_ERROR_NONE;
1052*cfb92d14SAndroid Build Coastguard Worker 
1053*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadBool(enabled));
1054*cfb92d14SAndroid Build Coastguard Worker 
1055*cfb92d14SAndroid Build Coastguard Worker     if (!enabled)
1056*cfb92d14SAndroid Build Coastguard Worker     {
1057*cfb92d14SAndroid Build Coastguard Worker         error = otCommissionerStop(mInstance);
1058*cfb92d14SAndroid Build Coastguard Worker     }
1059*cfb92d14SAndroid Build Coastguard Worker     else
1060*cfb92d14SAndroid Build Coastguard Worker     {
1061*cfb92d14SAndroid Build Coastguard Worker         error = otCommissionerStart(mInstance, nullptr, nullptr, nullptr);
1062*cfb92d14SAndroid Build Coastguard Worker     }
1063*cfb92d14SAndroid Build Coastguard Worker 
1064*cfb92d14SAndroid Build Coastguard Worker exit:
1065*cfb92d14SAndroid Build Coastguard Worker     return PrepareLastStatusResponse(aHeader, ThreadErrorToSpinelStatus(error));
1066*cfb92d14SAndroid Build Coastguard Worker }
1067*cfb92d14SAndroid Build Coastguard Worker 
1068*cfb92d14SAndroid Build Coastguard Worker // SPINEL_PROP_THREAD_JOINERS is replaced by SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS. Please us the new property.
1069*cfb92d14SAndroid Build Coastguard Worker // The old property/implementation remains for backward compatibility.
1070*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyInsert(void)1071*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyInsert<SPINEL_PROP_THREAD_JOINERS>(void)
1072*cfb92d14SAndroid Build Coastguard Worker {
1073*cfb92d14SAndroid Build Coastguard Worker     otError             error         = OT_ERROR_NONE;
1074*cfb92d14SAndroid Build Coastguard Worker     const otExtAddress *eui64         = nullptr;
1075*cfb92d14SAndroid Build Coastguard Worker     const char         *pskd          = nullptr;
1076*cfb92d14SAndroid Build Coastguard Worker     uint32_t            joinerTimeout = 0;
1077*cfb92d14SAndroid Build Coastguard Worker 
1078*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUtf8(pskd));
1079*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint32(joinerTimeout));
1080*cfb92d14SAndroid Build Coastguard Worker 
1081*cfb92d14SAndroid Build Coastguard Worker     if (mDecoder.ReadEui64(eui64) != OT_ERROR_NONE)
1082*cfb92d14SAndroid Build Coastguard Worker     {
1083*cfb92d14SAndroid Build Coastguard Worker         eui64 = nullptr;
1084*cfb92d14SAndroid Build Coastguard Worker     }
1085*cfb92d14SAndroid Build Coastguard Worker 
1086*cfb92d14SAndroid Build Coastguard Worker     error = otCommissionerAddJoiner(mInstance, eui64, pskd, joinerTimeout);
1087*cfb92d14SAndroid Build Coastguard Worker 
1088*cfb92d14SAndroid Build Coastguard Worker exit:
1089*cfb92d14SAndroid Build Coastguard Worker     return error;
1090*cfb92d14SAndroid Build Coastguard Worker }
1091*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_COMMISSIONER_ENABLE
1092*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)1093*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_LOCAL_LEADER_WEIGHT>(void)
1094*cfb92d14SAndroid Build Coastguard Worker {
1095*cfb92d14SAndroid Build Coastguard Worker     uint8_t weight;
1096*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
1097*cfb92d14SAndroid Build Coastguard Worker 
1098*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint8(weight));
1099*cfb92d14SAndroid Build Coastguard Worker 
1100*cfb92d14SAndroid Build Coastguard Worker     otThreadSetLocalLeaderWeight(mInstance, weight);
1101*cfb92d14SAndroid Build Coastguard Worker 
1102*cfb92d14SAndroid Build Coastguard Worker exit:
1103*cfb92d14SAndroid Build Coastguard Worker     return error;
1104*cfb92d14SAndroid Build Coastguard Worker }
1105*cfb92d14SAndroid Build Coastguard Worker 
1106*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE
1107*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)1108*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_STEERING_DATA>(void)
1109*cfb92d14SAndroid Build Coastguard Worker {
1110*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteEui64(mSteeringDataAddress);
1111*cfb92d14SAndroid Build Coastguard Worker }
1112*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)1113*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_STEERING_DATA>(void)
1114*cfb92d14SAndroid Build Coastguard Worker {
1115*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
1116*cfb92d14SAndroid Build Coastguard Worker 
1117*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadEui64(mSteeringDataAddress));
1118*cfb92d14SAndroid Build Coastguard Worker 
1119*cfb92d14SAndroid Build Coastguard Worker     otThreadSetSteeringData(mInstance, &mSteeringDataAddress);
1120*cfb92d14SAndroid Build Coastguard Worker 
1121*cfb92d14SAndroid Build Coastguard Worker exit:
1122*cfb92d14SAndroid Build Coastguard Worker     return error;
1123*cfb92d14SAndroid Build Coastguard Worker }
1124*cfb92d14SAndroid Build Coastguard Worker #endif // #if OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE
1125*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)1126*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_PREFERRED_ROUTER_ID>(void)
1127*cfb92d14SAndroid Build Coastguard Worker {
1128*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint8(mPreferredRouteId);
1129*cfb92d14SAndroid Build Coastguard Worker }
1130*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)1131*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_PREFERRED_ROUTER_ID>(void)
1132*cfb92d14SAndroid Build Coastguard Worker {
1133*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
1134*cfb92d14SAndroid Build Coastguard Worker 
1135*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint8(mPreferredRouteId));
1136*cfb92d14SAndroid Build Coastguard Worker 
1137*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = otThreadSetPreferredRouterId(mInstance, mPreferredRouteId));
1138*cfb92d14SAndroid Build Coastguard Worker 
1139*cfb92d14SAndroid Build Coastguard Worker exit:
1140*cfb92d14SAndroid Build Coastguard Worker     return error;
1141*cfb92d14SAndroid Build Coastguard Worker }
1142*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyRemove(void)1143*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyRemove<SPINEL_PROP_THREAD_ACTIVE_ROUTER_IDS>(void)
1144*cfb92d14SAndroid Build Coastguard Worker {
1145*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
1146*cfb92d14SAndroid Build Coastguard Worker     uint8_t routerId;
1147*cfb92d14SAndroid Build Coastguard Worker 
1148*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint8(routerId));
1149*cfb92d14SAndroid Build Coastguard Worker 
1150*cfb92d14SAndroid Build Coastguard Worker     error = otThreadReleaseRouterId(mInstance, routerId);
1151*cfb92d14SAndroid Build Coastguard Worker 
1152*cfb92d14SAndroid Build Coastguard Worker     // `INVALID_STATE` is returned when router ID was not allocated (i.e. not in the list)
1153*cfb92d14SAndroid Build Coastguard Worker     // in such a case, the "remove" operation can be considered successful.
1154*cfb92d14SAndroid Build Coastguard Worker 
1155*cfb92d14SAndroid Build Coastguard Worker     if (error == OT_ERROR_INVALID_STATE)
1156*cfb92d14SAndroid Build Coastguard Worker     {
1157*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_NONE;
1158*cfb92d14SAndroid Build Coastguard Worker     }
1159*cfb92d14SAndroid Build Coastguard Worker 
1160*cfb92d14SAndroid Build Coastguard Worker exit:
1161*cfb92d14SAndroid Build Coastguard Worker     return error;
1162*cfb92d14SAndroid Build Coastguard Worker }
1163*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)1164*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_ADDRESS_CACHE_TABLE>(void)
1165*cfb92d14SAndroid Build Coastguard Worker {
1166*cfb92d14SAndroid Build Coastguard Worker     otError              error = OT_ERROR_NONE;
1167*cfb92d14SAndroid Build Coastguard Worker     otCacheEntryIterator iterator;
1168*cfb92d14SAndroid Build Coastguard Worker     otCacheEntryInfo     entry;
1169*cfb92d14SAndroid Build Coastguard Worker 
1170*cfb92d14SAndroid Build Coastguard Worker     memset(&iterator, 0, sizeof(iterator));
1171*cfb92d14SAndroid Build Coastguard Worker 
1172*cfb92d14SAndroid Build Coastguard Worker     for (uint8_t index = 0;; index++)
1173*cfb92d14SAndroid Build Coastguard Worker     {
1174*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(otThreadGetNextCacheEntry(mInstance, &entry, &iterator));
1175*cfb92d14SAndroid Build Coastguard Worker 
1176*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.OpenStruct());
1177*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.WriteIp6Address(entry.mTarget));
1178*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.WriteUint16(entry.mRloc16));
1179*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.WriteUint8(index));
1180*cfb92d14SAndroid Build Coastguard Worker 
1181*cfb92d14SAndroid Build Coastguard Worker         switch (entry.mState)
1182*cfb92d14SAndroid Build Coastguard Worker         {
1183*cfb92d14SAndroid Build Coastguard Worker         case OT_CACHE_ENTRY_STATE_CACHED:
1184*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = mEncoder.WriteUint8(SPINEL_ADDRESS_CACHE_ENTRY_STATE_CACHED));
1185*cfb92d14SAndroid Build Coastguard Worker             break;
1186*cfb92d14SAndroid Build Coastguard Worker         case OT_CACHE_ENTRY_STATE_SNOOPED:
1187*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = mEncoder.WriteUint8(SPINEL_ADDRESS_CACHE_ENTRY_STATE_SNOOPED));
1188*cfb92d14SAndroid Build Coastguard Worker             break;
1189*cfb92d14SAndroid Build Coastguard Worker         case OT_CACHE_ENTRY_STATE_QUERY:
1190*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = mEncoder.WriteUint8(SPINEL_ADDRESS_CACHE_ENTRY_STATE_QUERY));
1191*cfb92d14SAndroid Build Coastguard Worker             break;
1192*cfb92d14SAndroid Build Coastguard Worker         case OT_CACHE_ENTRY_STATE_RETRY_QUERY:
1193*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = mEncoder.WriteUint8(SPINEL_ADDRESS_CACHE_ENTRY_STATE_RETRY_QUERY));
1194*cfb92d14SAndroid Build Coastguard Worker             break;
1195*cfb92d14SAndroid Build Coastguard Worker         }
1196*cfb92d14SAndroid Build Coastguard Worker 
1197*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.OpenStruct());
1198*cfb92d14SAndroid Build Coastguard Worker 
1199*cfb92d14SAndroid Build Coastguard Worker         if (entry.mState == OT_CACHE_ENTRY_STATE_CACHED)
1200*cfb92d14SAndroid Build Coastguard Worker         {
1201*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = mEncoder.WriteBool(entry.mValidLastTrans));
1202*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = mEncoder.WriteUint32(entry.mLastTransTime));
1203*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = mEncoder.WriteIp6Address(entry.mMeshLocalEid));
1204*cfb92d14SAndroid Build Coastguard Worker         }
1205*cfb92d14SAndroid Build Coastguard Worker 
1206*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.CloseStruct());
1207*cfb92d14SAndroid Build Coastguard Worker 
1208*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.OpenStruct());
1209*cfb92d14SAndroid Build Coastguard Worker 
1210*cfb92d14SAndroid Build Coastguard Worker         if (entry.mState != OT_CACHE_ENTRY_STATE_CACHED)
1211*cfb92d14SAndroid Build Coastguard Worker         {
1212*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = mEncoder.WriteBool(entry.mCanEvict));
1213*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = mEncoder.WriteUint16(entry.mRampDown ? 0 : entry.mTimeout));
1214*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = mEncoder.WriteUint16(entry.mRetryDelay));
1215*cfb92d14SAndroid Build Coastguard Worker         }
1216*cfb92d14SAndroid Build Coastguard Worker 
1217*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.CloseStruct());
1218*cfb92d14SAndroid Build Coastguard Worker 
1219*cfb92d14SAndroid Build Coastguard Worker         SuccessOrExit(error = mEncoder.CloseStruct());
1220*cfb92d14SAndroid Build Coastguard Worker     }
1221*cfb92d14SAndroid Build Coastguard Worker 
1222*cfb92d14SAndroid Build Coastguard Worker exit:
1223*cfb92d14SAndroid Build Coastguard Worker     return error;
1224*cfb92d14SAndroid Build Coastguard Worker }
1225*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)1226*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_CHILD_SUPERVISION_INTERVAL>(void)
1227*cfb92d14SAndroid Build Coastguard Worker {
1228*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint16(otChildSupervisionGetInterval(mInstance));
1229*cfb92d14SAndroid Build Coastguard Worker }
1230*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)1231*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_CHILD_SUPERVISION_INTERVAL>(void)
1232*cfb92d14SAndroid Build Coastguard Worker {
1233*cfb92d14SAndroid Build Coastguard Worker     otError  error = OT_ERROR_NONE;
1234*cfb92d14SAndroid Build Coastguard Worker     uint16_t interval;
1235*cfb92d14SAndroid Build Coastguard Worker 
1236*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint16(interval));
1237*cfb92d14SAndroid Build Coastguard Worker     otChildSupervisionSetInterval(mInstance, interval);
1238*cfb92d14SAndroid Build Coastguard Worker 
1239*cfb92d14SAndroid Build Coastguard Worker exit:
1240*cfb92d14SAndroid Build Coastguard Worker     return error;
1241*cfb92d14SAndroid Build Coastguard Worker }
1242*cfb92d14SAndroid Build Coastguard Worker 
1243*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE
1244*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)1245*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_CHANNEL_MANAGER_NEW_CHANNEL>(void)
1246*cfb92d14SAndroid Build Coastguard Worker {
1247*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint8(otChannelManagerGetRequestedChannel(mInstance));
1248*cfb92d14SAndroid Build Coastguard Worker }
1249*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)1250*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_CHANNEL_MANAGER_NEW_CHANNEL>(void)
1251*cfb92d14SAndroid Build Coastguard Worker {
1252*cfb92d14SAndroid Build Coastguard Worker     uint8_t channel;
1253*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
1254*cfb92d14SAndroid Build Coastguard Worker 
1255*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint8(channel));
1256*cfb92d14SAndroid Build Coastguard Worker 
1257*cfb92d14SAndroid Build Coastguard Worker     otChannelManagerRequestChannelChange(mInstance, channel);
1258*cfb92d14SAndroid Build Coastguard Worker 
1259*cfb92d14SAndroid Build Coastguard Worker exit:
1260*cfb92d14SAndroid Build Coastguard Worker     return error;
1261*cfb92d14SAndroid Build Coastguard Worker }
1262*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)1263*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_CHANNEL_MANAGER_DELAY>(void)
1264*cfb92d14SAndroid Build Coastguard Worker {
1265*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint16(otChannelManagerGetDelay(mInstance));
1266*cfb92d14SAndroid Build Coastguard Worker }
1267*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)1268*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_CHANNEL_MANAGER_DELAY>(void)
1269*cfb92d14SAndroid Build Coastguard Worker {
1270*cfb92d14SAndroid Build Coastguard Worker     uint16_t delay;
1271*cfb92d14SAndroid Build Coastguard Worker     otError  error = OT_ERROR_NONE;
1272*cfb92d14SAndroid Build Coastguard Worker 
1273*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint16(delay));
1274*cfb92d14SAndroid Build Coastguard Worker 
1275*cfb92d14SAndroid Build Coastguard Worker     error = otChannelManagerSetDelay(mInstance, delay);
1276*cfb92d14SAndroid Build Coastguard Worker 
1277*cfb92d14SAndroid Build Coastguard Worker exit:
1278*cfb92d14SAndroid Build Coastguard Worker     return error;
1279*cfb92d14SAndroid Build Coastguard Worker }
1280*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)1281*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_CHANNEL_MANAGER_SUPPORTED_CHANNELS>(void)
1282*cfb92d14SAndroid Build Coastguard Worker {
1283*cfb92d14SAndroid Build Coastguard Worker     return EncodeChannelMask(otChannelManagerGetSupportedChannels(mInstance));
1284*cfb92d14SAndroid Build Coastguard Worker }
1285*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)1286*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_CHANNEL_MANAGER_SUPPORTED_CHANNELS>(void)
1287*cfb92d14SAndroid Build Coastguard Worker {
1288*cfb92d14SAndroid Build Coastguard Worker     uint32_t channelMask = 0;
1289*cfb92d14SAndroid Build Coastguard Worker     otError  error       = OT_ERROR_NONE;
1290*cfb92d14SAndroid Build Coastguard Worker 
1291*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = DecodeChannelMask(channelMask));
1292*cfb92d14SAndroid Build Coastguard Worker     otChannelManagerSetSupportedChannels(mInstance, channelMask);
1293*cfb92d14SAndroid Build Coastguard Worker 
1294*cfb92d14SAndroid Build Coastguard Worker exit:
1295*cfb92d14SAndroid Build Coastguard Worker     return error;
1296*cfb92d14SAndroid Build Coastguard Worker }
1297*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)1298*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_CHANNEL_MANAGER_FAVORED_CHANNELS>(void)
1299*cfb92d14SAndroid Build Coastguard Worker {
1300*cfb92d14SAndroid Build Coastguard Worker     return EncodeChannelMask(otChannelManagerGetFavoredChannels(mInstance));
1301*cfb92d14SAndroid Build Coastguard Worker }
1302*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)1303*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_CHANNEL_MANAGER_FAVORED_CHANNELS>(void)
1304*cfb92d14SAndroid Build Coastguard Worker {
1305*cfb92d14SAndroid Build Coastguard Worker     uint32_t channelMask = 0;
1306*cfb92d14SAndroid Build Coastguard Worker     otError  error       = OT_ERROR_NONE;
1307*cfb92d14SAndroid Build Coastguard Worker 
1308*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = DecodeChannelMask(channelMask));
1309*cfb92d14SAndroid Build Coastguard Worker     otChannelManagerSetFavoredChannels(mInstance, channelMask);
1310*cfb92d14SAndroid Build Coastguard Worker 
1311*cfb92d14SAndroid Build Coastguard Worker exit:
1312*cfb92d14SAndroid Build Coastguard Worker     return error;
1313*cfb92d14SAndroid Build Coastguard Worker }
1314*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)1315*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_CHANNEL_MANAGER_CHANNEL_SELECT>(void)
1316*cfb92d14SAndroid Build Coastguard Worker {
1317*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteBool(false);
1318*cfb92d14SAndroid Build Coastguard Worker }
1319*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)1320*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_CHANNEL_MANAGER_CHANNEL_SELECT>(void)
1321*cfb92d14SAndroid Build Coastguard Worker {
1322*cfb92d14SAndroid Build Coastguard Worker     bool    skipQualityCheck = false;
1323*cfb92d14SAndroid Build Coastguard Worker     otError error            = OT_ERROR_NONE;
1324*cfb92d14SAndroid Build Coastguard Worker 
1325*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadBool(skipQualityCheck));
1326*cfb92d14SAndroid Build Coastguard Worker     error = otChannelManagerRequestChannelSelect(mInstance, skipQualityCheck);
1327*cfb92d14SAndroid Build Coastguard Worker 
1328*cfb92d14SAndroid Build Coastguard Worker exit:
1329*cfb92d14SAndroid Build Coastguard Worker     return error;
1330*cfb92d14SAndroid Build Coastguard Worker }
1331*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)1332*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_CHANNEL_MANAGER_AUTO_SELECT_ENABLED>(void)
1333*cfb92d14SAndroid Build Coastguard Worker {
1334*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteBool(otChannelManagerGetAutoChannelSelectionEnabled(mInstance));
1335*cfb92d14SAndroid Build Coastguard Worker }
1336*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)1337*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_CHANNEL_MANAGER_AUTO_SELECT_ENABLED>(void)
1338*cfb92d14SAndroid Build Coastguard Worker {
1339*cfb92d14SAndroid Build Coastguard Worker     bool    enabled = false;
1340*cfb92d14SAndroid Build Coastguard Worker     otError error   = OT_ERROR_NONE;
1341*cfb92d14SAndroid Build Coastguard Worker 
1342*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadBool(enabled));
1343*cfb92d14SAndroid Build Coastguard Worker     otChannelManagerSetAutoChannelSelectionEnabled(mInstance, enabled);
1344*cfb92d14SAndroid Build Coastguard Worker 
1345*cfb92d14SAndroid Build Coastguard Worker exit:
1346*cfb92d14SAndroid Build Coastguard Worker     return error;
1347*cfb92d14SAndroid Build Coastguard Worker }
1348*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)1349*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_CHANNEL_MANAGER_AUTO_SELECT_INTERVAL>(void)
1350*cfb92d14SAndroid Build Coastguard Worker {
1351*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint32(otChannelManagerGetAutoChannelSelectionInterval(mInstance));
1352*cfb92d14SAndroid Build Coastguard Worker }
1353*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)1354*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_CHANNEL_MANAGER_AUTO_SELECT_INTERVAL>(void)
1355*cfb92d14SAndroid Build Coastguard Worker {
1356*cfb92d14SAndroid Build Coastguard Worker     uint32_t interval;
1357*cfb92d14SAndroid Build Coastguard Worker     otError  error = OT_ERROR_NONE;
1358*cfb92d14SAndroid Build Coastguard Worker 
1359*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint32(interval));
1360*cfb92d14SAndroid Build Coastguard Worker     error = otChannelManagerSetAutoChannelSelectionInterval(mInstance, interval);
1361*cfb92d14SAndroid Build Coastguard Worker 
1362*cfb92d14SAndroid Build Coastguard Worker exit:
1363*cfb92d14SAndroid Build Coastguard Worker     return error;
1364*cfb92d14SAndroid Build Coastguard Worker }
1365*cfb92d14SAndroid Build Coastguard Worker 
1366*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE
1367*cfb92d14SAndroid Build Coastguard Worker 
1368*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
HandlePropertyGet(void)1369*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_TIME_SYNC_PERIOD>(void)
1370*cfb92d14SAndroid Build Coastguard Worker {
1371*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint16(otNetworkTimeGetSyncPeriod(mInstance));
1372*cfb92d14SAndroid Build Coastguard Worker }
1373*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)1374*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_TIME_SYNC_PERIOD>(void)
1375*cfb92d14SAndroid Build Coastguard Worker {
1376*cfb92d14SAndroid Build Coastguard Worker     otError  error = OT_ERROR_NONE;
1377*cfb92d14SAndroid Build Coastguard Worker     uint16_t timeSyncPeriod;
1378*cfb92d14SAndroid Build Coastguard Worker 
1379*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint16(timeSyncPeriod));
1380*cfb92d14SAndroid Build Coastguard Worker 
1381*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = otNetworkTimeSetSyncPeriod(mInstance, timeSyncPeriod));
1382*cfb92d14SAndroid Build Coastguard Worker 
1383*cfb92d14SAndroid Build Coastguard Worker exit:
1384*cfb92d14SAndroid Build Coastguard Worker     return error;
1385*cfb92d14SAndroid Build Coastguard Worker }
1386*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertyGet(void)1387*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_TIME_SYNC_XTAL_THRESHOLD>(void)
1388*cfb92d14SAndroid Build Coastguard Worker {
1389*cfb92d14SAndroid Build Coastguard Worker     return mEncoder.WriteUint16(otNetworkTimeGetXtalThreshold(mInstance));
1390*cfb92d14SAndroid Build Coastguard Worker }
1391*cfb92d14SAndroid Build Coastguard Worker 
HandlePropertySet(void)1392*cfb92d14SAndroid Build Coastguard Worker template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_TIME_SYNC_XTAL_THRESHOLD>(void)
1393*cfb92d14SAndroid Build Coastguard Worker {
1394*cfb92d14SAndroid Build Coastguard Worker     otError  error = OT_ERROR_NONE;
1395*cfb92d14SAndroid Build Coastguard Worker     uint16_t xtalThreshold;
1396*cfb92d14SAndroid Build Coastguard Worker 
1397*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = mDecoder.ReadUint16(xtalThreshold));
1398*cfb92d14SAndroid Build Coastguard Worker 
1399*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = otNetworkTimeSetXtalThreshold(mInstance, xtalThreshold));
1400*cfb92d14SAndroid Build Coastguard Worker 
1401*cfb92d14SAndroid Build Coastguard Worker exit:
1402*cfb92d14SAndroid Build Coastguard Worker     return error;
1403*cfb92d14SAndroid Build Coastguard Worker }
1404*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
1405*cfb92d14SAndroid Build Coastguard Worker 
1406*cfb92d14SAndroid Build Coastguard Worker } // namespace Ncp
1407*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
1408*cfb92d14SAndroid Build Coastguard Worker 
1409*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_FTD
1410