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