1*4a64e381SAndroid Build Coastguard Worker /*
2*4a64e381SAndroid Build Coastguard Worker * Copyright (c) 2019, The OpenThread Authors.
3*4a64e381SAndroid Build Coastguard Worker * All rights reserved.
4*4a64e381SAndroid Build Coastguard Worker *
5*4a64e381SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*4a64e381SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
7*4a64e381SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
8*4a64e381SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
9*4a64e381SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
10*4a64e381SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
11*4a64e381SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
12*4a64e381SAndroid Build Coastguard Worker * 3. Neither the name of the copyright holder nor the
13*4a64e381SAndroid Build Coastguard Worker * names of its contributors may be used to endorse or promote products
14*4a64e381SAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
15*4a64e381SAndroid Build Coastguard Worker *
16*4a64e381SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*4a64e381SAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*4a64e381SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*4a64e381SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20*4a64e381SAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*4a64e381SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*4a64e381SAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*4a64e381SAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*4a64e381SAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*4a64e381SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*4a64e381SAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
27*4a64e381SAndroid Build Coastguard Worker */
28*4a64e381SAndroid Build Coastguard Worker
29*4a64e381SAndroid Build Coastguard Worker #if __ORDER_BIG_ENDIAN__
30*4a64e381SAndroid Build Coastguard Worker #define BYTE_ORDER_BIG_ENDIAN 1
31*4a64e381SAndroid Build Coastguard Worker #endif
32*4a64e381SAndroid Build Coastguard Worker
33*4a64e381SAndroid Build Coastguard Worker #define OTBR_LOG_TAG "UBUS"
34*4a64e381SAndroid Build Coastguard Worker
35*4a64e381SAndroid Build Coastguard Worker #include "openwrt/ubus/otubus.hpp"
36*4a64e381SAndroid Build Coastguard Worker
37*4a64e381SAndroid Build Coastguard Worker #include <mutex>
38*4a64e381SAndroid Build Coastguard Worker
39*4a64e381SAndroid Build Coastguard Worker #include <arpa/inet.h>
40*4a64e381SAndroid Build Coastguard Worker #include <sys/eventfd.h>
41*4a64e381SAndroid Build Coastguard Worker
42*4a64e381SAndroid Build Coastguard Worker #include <openthread/commissioner.h>
43*4a64e381SAndroid Build Coastguard Worker #include <openthread/thread.h>
44*4a64e381SAndroid Build Coastguard Worker #include <openthread/thread_ftd.h>
45*4a64e381SAndroid Build Coastguard Worker
46*4a64e381SAndroid Build Coastguard Worker #include "common/logging.hpp"
47*4a64e381SAndroid Build Coastguard Worker #include "ncp/rcp_host.hpp"
48*4a64e381SAndroid Build Coastguard Worker
49*4a64e381SAndroid Build Coastguard Worker namespace otbr {
50*4a64e381SAndroid Build Coastguard Worker namespace ubus {
51*4a64e381SAndroid Build Coastguard Worker
52*4a64e381SAndroid Build Coastguard Worker static UbusServer *sUbusServerInstance = nullptr;
53*4a64e381SAndroid Build Coastguard Worker static int sUbusEfd = -1;
54*4a64e381SAndroid Build Coastguard Worker static void *sJsonUri = nullptr;
55*4a64e381SAndroid Build Coastguard Worker static int sBufNum;
56*4a64e381SAndroid Build Coastguard Worker
57*4a64e381SAndroid Build Coastguard Worker const static int PANID_LENGTH = 10;
58*4a64e381SAndroid Build Coastguard Worker const static int XPANID_LENGTH = 64;
59*4a64e381SAndroid Build Coastguard Worker const static int NETWORKKEY_LENGTH = 64;
60*4a64e381SAndroid Build Coastguard Worker
UbusServer(Ncp::RcpHost * aHost,std::mutex * aMutex)61*4a64e381SAndroid Build Coastguard Worker UbusServer::UbusServer(Ncp::RcpHost *aHost, std::mutex *aMutex)
62*4a64e381SAndroid Build Coastguard Worker : mIfFinishScan(false)
63*4a64e381SAndroid Build Coastguard Worker , mContext(nullptr)
64*4a64e381SAndroid Build Coastguard Worker , mSockPath(nullptr)
65*4a64e381SAndroid Build Coastguard Worker , mHost(aHost)
66*4a64e381SAndroid Build Coastguard Worker , mHostMutex(aMutex)
67*4a64e381SAndroid Build Coastguard Worker , mSecond(0)
68*4a64e381SAndroid Build Coastguard Worker {
69*4a64e381SAndroid Build Coastguard Worker memset(&mNetworkdataBuf, 0, sizeof(mNetworkdataBuf));
70*4a64e381SAndroid Build Coastguard Worker memset(&mBuf, 0, sizeof(mBuf));
71*4a64e381SAndroid Build Coastguard Worker
72*4a64e381SAndroid Build Coastguard Worker blob_buf_init(&mBuf, 0);
73*4a64e381SAndroid Build Coastguard Worker blob_buf_init(&mNetworkdataBuf, 0);
74*4a64e381SAndroid Build Coastguard Worker }
75*4a64e381SAndroid Build Coastguard Worker
GetInstance(void)76*4a64e381SAndroid Build Coastguard Worker UbusServer &UbusServer::GetInstance(void)
77*4a64e381SAndroid Build Coastguard Worker {
78*4a64e381SAndroid Build Coastguard Worker return *sUbusServerInstance;
79*4a64e381SAndroid Build Coastguard Worker }
80*4a64e381SAndroid Build Coastguard Worker
Initialize(Ncp::RcpHost * aHost,std::mutex * aMutex)81*4a64e381SAndroid Build Coastguard Worker void UbusServer::Initialize(Ncp::RcpHost *aHost, std::mutex *aMutex)
82*4a64e381SAndroid Build Coastguard Worker {
83*4a64e381SAndroid Build Coastguard Worker sUbusServerInstance = new UbusServer(aHost, aMutex);
84*4a64e381SAndroid Build Coastguard Worker }
85*4a64e381SAndroid Build Coastguard Worker
86*4a64e381SAndroid Build Coastguard Worker enum
87*4a64e381SAndroid Build Coastguard Worker {
88*4a64e381SAndroid Build Coastguard Worker SETNETWORK,
89*4a64e381SAndroid Build Coastguard Worker SET_NETWORK_MAX,
90*4a64e381SAndroid Build Coastguard Worker };
91*4a64e381SAndroid Build Coastguard Worker
92*4a64e381SAndroid Build Coastguard Worker enum
93*4a64e381SAndroid Build Coastguard Worker {
94*4a64e381SAndroid Build Coastguard Worker PSKD,
95*4a64e381SAndroid Build Coastguard Worker EUI64,
96*4a64e381SAndroid Build Coastguard Worker ADD_JOINER_MAX,
97*4a64e381SAndroid Build Coastguard Worker };
98*4a64e381SAndroid Build Coastguard Worker
99*4a64e381SAndroid Build Coastguard Worker enum
100*4a64e381SAndroid Build Coastguard Worker {
101*4a64e381SAndroid Build Coastguard Worker NETWORKKEY,
102*4a64e381SAndroid Build Coastguard Worker NETWORKNAME,
103*4a64e381SAndroid Build Coastguard Worker EXTPANID,
104*4a64e381SAndroid Build Coastguard Worker PANID,
105*4a64e381SAndroid Build Coastguard Worker CHANNEL,
106*4a64e381SAndroid Build Coastguard Worker PSKC,
107*4a64e381SAndroid Build Coastguard Worker MGMTSET_MAX,
108*4a64e381SAndroid Build Coastguard Worker };
109*4a64e381SAndroid Build Coastguard Worker
110*4a64e381SAndroid Build Coastguard Worker static const struct blobmsg_policy setNetworknamePolicy[SET_NETWORK_MAX] = {
111*4a64e381SAndroid Build Coastguard Worker [SETNETWORK] = {.name = "networkname", .type = BLOBMSG_TYPE_STRING},
112*4a64e381SAndroid Build Coastguard Worker };
113*4a64e381SAndroid Build Coastguard Worker
114*4a64e381SAndroid Build Coastguard Worker static const struct blobmsg_policy setPanIdPolicy[SET_NETWORK_MAX] = {
115*4a64e381SAndroid Build Coastguard Worker [SETNETWORK] = {.name = "panid", .type = BLOBMSG_TYPE_STRING},
116*4a64e381SAndroid Build Coastguard Worker };
117*4a64e381SAndroid Build Coastguard Worker
118*4a64e381SAndroid Build Coastguard Worker static const struct blobmsg_policy setExtPanIdPolicy[SET_NETWORK_MAX] = {
119*4a64e381SAndroid Build Coastguard Worker [SETNETWORK] = {.name = "extpanid", .type = BLOBMSG_TYPE_STRING},
120*4a64e381SAndroid Build Coastguard Worker };
121*4a64e381SAndroid Build Coastguard Worker
122*4a64e381SAndroid Build Coastguard Worker static const struct blobmsg_policy setChannelPolicy[SET_NETWORK_MAX] = {
123*4a64e381SAndroid Build Coastguard Worker [SETNETWORK] = {.name = "channel", .type = BLOBMSG_TYPE_INT32},
124*4a64e381SAndroid Build Coastguard Worker };
125*4a64e381SAndroid Build Coastguard Worker
126*4a64e381SAndroid Build Coastguard Worker static const struct blobmsg_policy setPskcPolicy[SET_NETWORK_MAX] = {
127*4a64e381SAndroid Build Coastguard Worker [SETNETWORK] = {.name = "pskc", .type = BLOBMSG_TYPE_STRING},
128*4a64e381SAndroid Build Coastguard Worker };
129*4a64e381SAndroid Build Coastguard Worker
130*4a64e381SAndroid Build Coastguard Worker static const struct blobmsg_policy setNetworkkeyPolicy[SET_NETWORK_MAX] = {
131*4a64e381SAndroid Build Coastguard Worker [SETNETWORK] = {.name = "networkkey", .type = BLOBMSG_TYPE_STRING},
132*4a64e381SAndroid Build Coastguard Worker };
133*4a64e381SAndroid Build Coastguard Worker
134*4a64e381SAndroid Build Coastguard Worker static const struct blobmsg_policy setModePolicy[SET_NETWORK_MAX] = {
135*4a64e381SAndroid Build Coastguard Worker [SETNETWORK] = {.name = "mode", .type = BLOBMSG_TYPE_STRING},
136*4a64e381SAndroid Build Coastguard Worker };
137*4a64e381SAndroid Build Coastguard Worker
138*4a64e381SAndroid Build Coastguard Worker static const struct blobmsg_policy macfilterAddPolicy[SET_NETWORK_MAX] = {
139*4a64e381SAndroid Build Coastguard Worker [SETNETWORK] = {.name = "addr", .type = BLOBMSG_TYPE_STRING},
140*4a64e381SAndroid Build Coastguard Worker };
141*4a64e381SAndroid Build Coastguard Worker
142*4a64e381SAndroid Build Coastguard Worker static const struct blobmsg_policy macfilterRemovePolicy[SET_NETWORK_MAX] = {
143*4a64e381SAndroid Build Coastguard Worker [SETNETWORK] = {.name = "addr", .type = BLOBMSG_TYPE_STRING},
144*4a64e381SAndroid Build Coastguard Worker };
145*4a64e381SAndroid Build Coastguard Worker
146*4a64e381SAndroid Build Coastguard Worker static const struct blobmsg_policy macfilterSetStatePolicy[SET_NETWORK_MAX] = {
147*4a64e381SAndroid Build Coastguard Worker [SETNETWORK] = {.name = "state", .type = BLOBMSG_TYPE_STRING},
148*4a64e381SAndroid Build Coastguard Worker };
149*4a64e381SAndroid Build Coastguard Worker
150*4a64e381SAndroid Build Coastguard Worker static const struct blobmsg_policy removeJoinerPolicy[SET_NETWORK_MAX] = {
151*4a64e381SAndroid Build Coastguard Worker [SETNETWORK] = {.name = "eui64", .type = BLOBMSG_TYPE_STRING},
152*4a64e381SAndroid Build Coastguard Worker };
153*4a64e381SAndroid Build Coastguard Worker
154*4a64e381SAndroid Build Coastguard Worker static const struct blobmsg_policy addJoinerPolicy[ADD_JOINER_MAX] = {
155*4a64e381SAndroid Build Coastguard Worker [PSKD] = {.name = "pskd", .type = BLOBMSG_TYPE_STRING},
156*4a64e381SAndroid Build Coastguard Worker [EUI64] = {.name = "eui64", .type = BLOBMSG_TYPE_STRING},
157*4a64e381SAndroid Build Coastguard Worker };
158*4a64e381SAndroid Build Coastguard Worker
159*4a64e381SAndroid Build Coastguard Worker static const struct blobmsg_policy mgmtsetPolicy[MGMTSET_MAX] = {
160*4a64e381SAndroid Build Coastguard Worker [NETWORKKEY] = {.name = "networkkey", .type = BLOBMSG_TYPE_STRING},
161*4a64e381SAndroid Build Coastguard Worker [NETWORKNAME] = {.name = "networkname", .type = BLOBMSG_TYPE_STRING},
162*4a64e381SAndroid Build Coastguard Worker [EXTPANID] = {.name = "extpanid", .type = BLOBMSG_TYPE_STRING},
163*4a64e381SAndroid Build Coastguard Worker [PANID] = {.name = "panid", .type = BLOBMSG_TYPE_STRING},
164*4a64e381SAndroid Build Coastguard Worker [CHANNEL] = {.name = "channel", .type = BLOBMSG_TYPE_STRING},
165*4a64e381SAndroid Build Coastguard Worker [PSKC] = {.name = "pskc", .type = BLOBMSG_TYPE_STRING},
166*4a64e381SAndroid Build Coastguard Worker };
167*4a64e381SAndroid Build Coastguard Worker
168*4a64e381SAndroid Build Coastguard Worker static const struct ubus_method otbrMethods[] = {
169*4a64e381SAndroid Build Coastguard Worker {"scan", &UbusServer::UbusScanHandler, 0, 0, nullptr, 0},
170*4a64e381SAndroid Build Coastguard Worker {"channel", &UbusServer::UbusChannelHandler, 0, 0, nullptr, 0},
171*4a64e381SAndroid Build Coastguard Worker {"setchannel", &UbusServer::UbusSetChannelHandler, 0, 0, setChannelPolicy, ARRAY_SIZE(setChannelPolicy)},
172*4a64e381SAndroid Build Coastguard Worker {"networkname", &UbusServer::UbusNetworknameHandler, 0, 0, nullptr, 0},
173*4a64e381SAndroid Build Coastguard Worker {"setnetworkname", &UbusServer::UbusSetNetworknameHandler, 0, 0, setNetworknamePolicy,
174*4a64e381SAndroid Build Coastguard Worker ARRAY_SIZE(setNetworknamePolicy)},
175*4a64e381SAndroid Build Coastguard Worker {"state", &UbusServer::UbusStateHandler, 0, 0, nullptr, 0},
176*4a64e381SAndroid Build Coastguard Worker {"panid", &UbusServer::UbusPanIdHandler, 0, 0, nullptr, 0},
177*4a64e381SAndroid Build Coastguard Worker {"setpanid", &UbusServer::UbusSetPanIdHandler, 0, 0, setPanIdPolicy, ARRAY_SIZE(setPanIdPolicy)},
178*4a64e381SAndroid Build Coastguard Worker {"rloc16", &UbusServer::UbusRloc16Handler, 0, 0, nullptr, 0},
179*4a64e381SAndroid Build Coastguard Worker {"extpanid", &UbusServer::UbusExtPanIdHandler, 0, 0, nullptr, 0},
180*4a64e381SAndroid Build Coastguard Worker {"setextpanid", &UbusServer::UbusSetExtPanIdHandler, 0, 0, setExtPanIdPolicy, ARRAY_SIZE(setExtPanIdPolicy)},
181*4a64e381SAndroid Build Coastguard Worker {"networkkey", &UbusServer::UbusNetworkkeyHandler, 0, 0, nullptr, 0},
182*4a64e381SAndroid Build Coastguard Worker {"setnetworkkey", &UbusServer::UbusSetNetworkkeyHandler, 0, 0, setNetworkkeyPolicy,
183*4a64e381SAndroid Build Coastguard Worker ARRAY_SIZE(setNetworkkeyPolicy)},
184*4a64e381SAndroid Build Coastguard Worker {"pskc", &UbusServer::UbusPskcHandler, 0, 0, nullptr, 0},
185*4a64e381SAndroid Build Coastguard Worker {"setpskc", &UbusServer::UbusSetPskcHandler, 0, 0, setPskcPolicy, ARRAY_SIZE(setPskcPolicy)},
186*4a64e381SAndroid Build Coastguard Worker {"threadstart", &UbusServer::UbusThreadStartHandler, 0, 0, nullptr, 0},
187*4a64e381SAndroid Build Coastguard Worker {"threadstop", &UbusServer::UbusThreadStopHandler, 0, 0, nullptr, 0},
188*4a64e381SAndroid Build Coastguard Worker {"neighbor", &UbusServer::UbusNeighborHandler, 0, 0, nullptr, 0},
189*4a64e381SAndroid Build Coastguard Worker {"parent", &UbusServer::UbusParentHandler, 0, 0, nullptr, 0},
190*4a64e381SAndroid Build Coastguard Worker {"mode", &UbusServer::UbusModeHandler, 0, 0, nullptr, 0},
191*4a64e381SAndroid Build Coastguard Worker {"setmode", &UbusServer::UbusSetModeHandler, 0, 0, setModePolicy, ARRAY_SIZE(setModePolicy)},
192*4a64e381SAndroid Build Coastguard Worker {"partitionid", &UbusServer::UbusPartitionIdHandler, 0, 0, nullptr, 0},
193*4a64e381SAndroid Build Coastguard Worker {"leave", &UbusServer::UbusLeaveHandler, 0, 0, nullptr, 0},
194*4a64e381SAndroid Build Coastguard Worker {"leaderdata", &UbusServer::UbusLeaderdataHandler, 0, 0, nullptr, 0},
195*4a64e381SAndroid Build Coastguard Worker {"networkdata", &UbusServer::UbusNetworkdataHandler, 0, 0, nullptr, 0},
196*4a64e381SAndroid Build Coastguard Worker {"commissionerstart", &UbusServer::UbusCommissionerStartHandler, 0, 0, nullptr, 0},
197*4a64e381SAndroid Build Coastguard Worker {"joinernum", &UbusServer::UbusJoinerNumHandler, 0, 0, nullptr, 0},
198*4a64e381SAndroid Build Coastguard Worker {"joinerremove", &UbusServer::UbusJoinerRemoveHandler, 0, 0, nullptr, 0},
199*4a64e381SAndroid Build Coastguard Worker {"macfiltersetstate", &UbusServer::UbusMacfilterSetStateHandler, 0, 0, macfilterSetStatePolicy,
200*4a64e381SAndroid Build Coastguard Worker ARRAY_SIZE(macfilterSetStatePolicy)},
201*4a64e381SAndroid Build Coastguard Worker {"macfilteradd", &UbusServer::UbusMacfilterAddHandler, 0, 0, macfilterAddPolicy, ARRAY_SIZE(macfilterAddPolicy)},
202*4a64e381SAndroid Build Coastguard Worker {"macfilterremove", &UbusServer::UbusMacfilterRemoveHandler, 0, 0, macfilterRemovePolicy,
203*4a64e381SAndroid Build Coastguard Worker ARRAY_SIZE(macfilterRemovePolicy)},
204*4a64e381SAndroid Build Coastguard Worker {"macfilterclear", &UbusServer::UbusMacfilterClearHandler, 0, 0, nullptr, 0},
205*4a64e381SAndroid Build Coastguard Worker {"macfilterstate", &UbusServer::UbusMacfilterStateHandler, 0, 0, nullptr, 0},
206*4a64e381SAndroid Build Coastguard Worker {"macfilteraddr", &UbusServer::UbusMacfilterAddrHandler, 0, 0, nullptr, 0},
207*4a64e381SAndroid Build Coastguard Worker {"joineradd", &UbusServer::UbusJoinerAddHandler, 0, 0, addJoinerPolicy, ARRAY_SIZE(addJoinerPolicy)},
208*4a64e381SAndroid Build Coastguard Worker {"mgmtset", &UbusServer::UbusMgmtsetHandler, 0, 0, mgmtsetPolicy, ARRAY_SIZE(mgmtsetPolicy)},
209*4a64e381SAndroid Build Coastguard Worker {"interfacename", &UbusServer::UbusInterfaceNameHandler, 0, 0, nullptr, 0},
210*4a64e381SAndroid Build Coastguard Worker };
211*4a64e381SAndroid Build Coastguard Worker
212*4a64e381SAndroid Build Coastguard Worker static struct ubus_object_type otbrObjType = {"otbr_prog", 0, otbrMethods, ARRAY_SIZE(otbrMethods)};
213*4a64e381SAndroid Build Coastguard Worker
214*4a64e381SAndroid Build Coastguard Worker static struct ubus_object otbr = {
215*4a64e381SAndroid Build Coastguard Worker avl : {},
216*4a64e381SAndroid Build Coastguard Worker name : "otbr",
217*4a64e381SAndroid Build Coastguard Worker id : 0,
218*4a64e381SAndroid Build Coastguard Worker path : nullptr,
219*4a64e381SAndroid Build Coastguard Worker type : &otbrObjType,
220*4a64e381SAndroid Build Coastguard Worker subscribe_cb : nullptr,
221*4a64e381SAndroid Build Coastguard Worker has_subscribers : false,
222*4a64e381SAndroid Build Coastguard Worker methods : otbrMethods,
223*4a64e381SAndroid Build Coastguard Worker n_methods : ARRAY_SIZE(otbrMethods),
224*4a64e381SAndroid Build Coastguard Worker };
225*4a64e381SAndroid Build Coastguard Worker
ProcessScan(void)226*4a64e381SAndroid Build Coastguard Worker void UbusServer::ProcessScan(void)
227*4a64e381SAndroid Build Coastguard Worker {
228*4a64e381SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
229*4a64e381SAndroid Build Coastguard Worker uint32_t scanChannels = 0;
230*4a64e381SAndroid Build Coastguard Worker uint16_t scanDuration = 0;
231*4a64e381SAndroid Build Coastguard Worker
232*4a64e381SAndroid Build Coastguard Worker mHostMutex->lock();
233*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = otLinkActiveScan(mHost->GetInstance(), scanChannels, scanDuration,
234*4a64e381SAndroid Build Coastguard Worker &UbusServer::HandleActiveScanResult, this));
235*4a64e381SAndroid Build Coastguard Worker exit:
236*4a64e381SAndroid Build Coastguard Worker mHostMutex->unlock();
237*4a64e381SAndroid Build Coastguard Worker return;
238*4a64e381SAndroid Build Coastguard Worker }
239*4a64e381SAndroid Build Coastguard Worker
HandleActiveScanResult(otActiveScanResult * aResult,void * aContext)240*4a64e381SAndroid Build Coastguard Worker void UbusServer::HandleActiveScanResult(otActiveScanResult *aResult, void *aContext)
241*4a64e381SAndroid Build Coastguard Worker {
242*4a64e381SAndroid Build Coastguard Worker static_cast<UbusServer *>(aContext)->HandleActiveScanResultDetail(aResult);
243*4a64e381SAndroid Build Coastguard Worker }
244*4a64e381SAndroid Build Coastguard Worker
OutputBytes(const uint8_t * aBytes,uint8_t aLength,char * aOutput)245*4a64e381SAndroid Build Coastguard Worker void UbusServer::OutputBytes(const uint8_t *aBytes, uint8_t aLength, char *aOutput)
246*4a64e381SAndroid Build Coastguard Worker {
247*4a64e381SAndroid Build Coastguard Worker char byte2char[5] = "";
248*4a64e381SAndroid Build Coastguard Worker for (int i = 0; i < aLength; i++)
249*4a64e381SAndroid Build Coastguard Worker {
250*4a64e381SAndroid Build Coastguard Worker sprintf(byte2char, "%02x", aBytes[i]);
251*4a64e381SAndroid Build Coastguard Worker strcat(aOutput, byte2char);
252*4a64e381SAndroid Build Coastguard Worker }
253*4a64e381SAndroid Build Coastguard Worker }
254*4a64e381SAndroid Build Coastguard Worker
AppendResult(otError aError,struct ubus_context * aContext,struct ubus_request_data * aRequest)255*4a64e381SAndroid Build Coastguard Worker void UbusServer::AppendResult(otError aError, struct ubus_context *aContext, struct ubus_request_data *aRequest)
256*4a64e381SAndroid Build Coastguard Worker {
257*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u16(&mBuf, "Error", aError);
258*4a64e381SAndroid Build Coastguard Worker ubus_send_reply(aContext, aRequest, mBuf.head);
259*4a64e381SAndroid Build Coastguard Worker }
260*4a64e381SAndroid Build Coastguard Worker
HandleActiveScanResultDetail(otActiveScanResult * aResult)261*4a64e381SAndroid Build Coastguard Worker void UbusServer::HandleActiveScanResultDetail(otActiveScanResult *aResult)
262*4a64e381SAndroid Build Coastguard Worker {
263*4a64e381SAndroid Build Coastguard Worker void *jsonList = nullptr;
264*4a64e381SAndroid Build Coastguard Worker
265*4a64e381SAndroid Build Coastguard Worker char panidstring[PANID_LENGTH];
266*4a64e381SAndroid Build Coastguard Worker char xpanidstring[XPANID_LENGTH] = "";
267*4a64e381SAndroid Build Coastguard Worker
268*4a64e381SAndroid Build Coastguard Worker if (aResult == nullptr)
269*4a64e381SAndroid Build Coastguard Worker {
270*4a64e381SAndroid Build Coastguard Worker blobmsg_close_array(&mBuf, sJsonUri);
271*4a64e381SAndroid Build Coastguard Worker mIfFinishScan = true;
272*4a64e381SAndroid Build Coastguard Worker goto exit;
273*4a64e381SAndroid Build Coastguard Worker }
274*4a64e381SAndroid Build Coastguard Worker
275*4a64e381SAndroid Build Coastguard Worker jsonList = blobmsg_open_table(&mBuf, nullptr);
276*4a64e381SAndroid Build Coastguard Worker
277*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "NetworkName", aResult->mNetworkName.m8);
278*4a64e381SAndroid Build Coastguard Worker
279*4a64e381SAndroid Build Coastguard Worker OutputBytes(aResult->mExtendedPanId.m8, OT_EXT_PAN_ID_SIZE, xpanidstring);
280*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "ExtendedPanId", xpanidstring);
281*4a64e381SAndroid Build Coastguard Worker
282*4a64e381SAndroid Build Coastguard Worker sprintf(panidstring, "0x%04x", aResult->mPanId);
283*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "PanId", panidstring);
284*4a64e381SAndroid Build Coastguard Worker
285*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u32(&mBuf, "Channel", aResult->mChannel);
286*4a64e381SAndroid Build Coastguard Worker
287*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u32(&mBuf, "Rssi", aResult->mRssi);
288*4a64e381SAndroid Build Coastguard Worker
289*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u32(&mBuf, "Lqi", aResult->mLqi);
290*4a64e381SAndroid Build Coastguard Worker
291*4a64e381SAndroid Build Coastguard Worker blobmsg_close_table(&mBuf, jsonList);
292*4a64e381SAndroid Build Coastguard Worker
293*4a64e381SAndroid Build Coastguard Worker exit:
294*4a64e381SAndroid Build Coastguard Worker return;
295*4a64e381SAndroid Build Coastguard Worker }
296*4a64e381SAndroid Build Coastguard Worker
UbusScanHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)297*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusScanHandler(struct ubus_context *aContext,
298*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
299*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
300*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
301*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
302*4a64e381SAndroid Build Coastguard Worker {
303*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusScanHandlerDetail(aContext, aObj, aRequest, aMethod, aMsg);
304*4a64e381SAndroid Build Coastguard Worker }
305*4a64e381SAndroid Build Coastguard Worker
UbusScanHandlerDetail(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)306*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusScanHandlerDetail(struct ubus_context *aContext,
307*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
308*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
309*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
310*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
311*4a64e381SAndroid Build Coastguard Worker {
312*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aObj);
313*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMethod);
314*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMsg);
315*4a64e381SAndroid Build Coastguard Worker
316*4a64e381SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
317*4a64e381SAndroid Build Coastguard Worker uint64_t eventNum;
318*4a64e381SAndroid Build Coastguard Worker ssize_t retval;
319*4a64e381SAndroid Build Coastguard Worker
320*4a64e381SAndroid Build Coastguard Worker blob_buf_init(&mBuf, 0);
321*4a64e381SAndroid Build Coastguard Worker sJsonUri = blobmsg_open_array(&mBuf, "scan_list");
322*4a64e381SAndroid Build Coastguard Worker
323*4a64e381SAndroid Build Coastguard Worker mIfFinishScan = 0;
324*4a64e381SAndroid Build Coastguard Worker sUbusServerInstance->ProcessScan();
325*4a64e381SAndroid Build Coastguard Worker
326*4a64e381SAndroid Build Coastguard Worker eventNum = 1;
327*4a64e381SAndroid Build Coastguard Worker retval = write(sUbusEfd, &eventNum, sizeof(uint64_t));
328*4a64e381SAndroid Build Coastguard Worker if (retval != sizeof(uint64_t))
329*4a64e381SAndroid Build Coastguard Worker {
330*4a64e381SAndroid Build Coastguard Worker error = OT_ERROR_FAILED;
331*4a64e381SAndroid Build Coastguard Worker goto exit;
332*4a64e381SAndroid Build Coastguard Worker }
333*4a64e381SAndroid Build Coastguard Worker
334*4a64e381SAndroid Build Coastguard Worker while (!mIfFinishScan)
335*4a64e381SAndroid Build Coastguard Worker {
336*4a64e381SAndroid Build Coastguard Worker sleep(1);
337*4a64e381SAndroid Build Coastguard Worker }
338*4a64e381SAndroid Build Coastguard Worker
339*4a64e381SAndroid Build Coastguard Worker exit:
340*4a64e381SAndroid Build Coastguard Worker AppendResult(error, aContext, aRequest);
341*4a64e381SAndroid Build Coastguard Worker return 0;
342*4a64e381SAndroid Build Coastguard Worker }
343*4a64e381SAndroid Build Coastguard Worker
UbusChannelHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)344*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusChannelHandler(struct ubus_context *aContext,
345*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
346*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
347*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
348*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
349*4a64e381SAndroid Build Coastguard Worker {
350*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusGetInformation(aContext, aObj, aRequest, aMethod, aMsg, "channel");
351*4a64e381SAndroid Build Coastguard Worker }
352*4a64e381SAndroid Build Coastguard Worker
UbusSetChannelHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)353*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusSetChannelHandler(struct ubus_context *aContext,
354*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
355*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
356*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
357*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
358*4a64e381SAndroid Build Coastguard Worker {
359*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusSetInformation(aContext, aObj, aRequest, aMethod, aMsg, "channel");
360*4a64e381SAndroid Build Coastguard Worker }
361*4a64e381SAndroid Build Coastguard Worker
UbusJoinerNumHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)362*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusJoinerNumHandler(struct ubus_context *aContext,
363*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
364*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
365*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
366*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
367*4a64e381SAndroid Build Coastguard Worker {
368*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusGetInformation(aContext, aObj, aRequest, aMethod, aMsg, "joinernum");
369*4a64e381SAndroid Build Coastguard Worker }
370*4a64e381SAndroid Build Coastguard Worker
UbusNetworknameHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)371*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusNetworknameHandler(struct ubus_context *aContext,
372*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
373*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
374*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
375*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
376*4a64e381SAndroid Build Coastguard Worker {
377*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusGetInformation(aContext, aObj, aRequest, aMethod, aMsg, "networkname");
378*4a64e381SAndroid Build Coastguard Worker }
379*4a64e381SAndroid Build Coastguard Worker
UbusSetNetworknameHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)380*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusSetNetworknameHandler(struct ubus_context *aContext,
381*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
382*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
383*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
384*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
385*4a64e381SAndroid Build Coastguard Worker {
386*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusSetInformation(aContext, aObj, aRequest, aMethod, aMsg, "networkname");
387*4a64e381SAndroid Build Coastguard Worker }
388*4a64e381SAndroid Build Coastguard Worker
UbusStateHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)389*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusStateHandler(struct ubus_context *aContext,
390*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
391*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
392*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
393*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
394*4a64e381SAndroid Build Coastguard Worker {
395*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusGetInformation(aContext, aObj, aRequest, aMethod, aMsg, "state");
396*4a64e381SAndroid Build Coastguard Worker }
397*4a64e381SAndroid Build Coastguard Worker
UbusRloc16Handler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)398*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusRloc16Handler(struct ubus_context *aContext,
399*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
400*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
401*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
402*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
403*4a64e381SAndroid Build Coastguard Worker {
404*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusGetInformation(aContext, aObj, aRequest, aMethod, aMsg, "rloc16");
405*4a64e381SAndroid Build Coastguard Worker }
406*4a64e381SAndroid Build Coastguard Worker
UbusPanIdHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)407*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusPanIdHandler(struct ubus_context *aContext,
408*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
409*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
410*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
411*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
412*4a64e381SAndroid Build Coastguard Worker {
413*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusGetInformation(aContext, aObj, aRequest, aMethod, aMsg, "panid");
414*4a64e381SAndroid Build Coastguard Worker }
415*4a64e381SAndroid Build Coastguard Worker
UbusSetPanIdHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)416*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusSetPanIdHandler(struct ubus_context *aContext,
417*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
418*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
419*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
420*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
421*4a64e381SAndroid Build Coastguard Worker {
422*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusSetInformation(aContext, aObj, aRequest, aMethod, aMsg, "panid");
423*4a64e381SAndroid Build Coastguard Worker }
424*4a64e381SAndroid Build Coastguard Worker
UbusExtPanIdHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)425*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusExtPanIdHandler(struct ubus_context *aContext,
426*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
427*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
428*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
429*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
430*4a64e381SAndroid Build Coastguard Worker {
431*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusGetInformation(aContext, aObj, aRequest, aMethod, aMsg, "extpanid");
432*4a64e381SAndroid Build Coastguard Worker }
433*4a64e381SAndroid Build Coastguard Worker
UbusSetExtPanIdHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)434*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusSetExtPanIdHandler(struct ubus_context *aContext,
435*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
436*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
437*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
438*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
439*4a64e381SAndroid Build Coastguard Worker {
440*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusSetInformation(aContext, aObj, aRequest, aMethod, aMsg, "extpanid");
441*4a64e381SAndroid Build Coastguard Worker }
442*4a64e381SAndroid Build Coastguard Worker
UbusPskcHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)443*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusPskcHandler(struct ubus_context *aContext,
444*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
445*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
446*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
447*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
448*4a64e381SAndroid Build Coastguard Worker {
449*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusGetInformation(aContext, aObj, aRequest, aMethod, aMsg, "pskc");
450*4a64e381SAndroid Build Coastguard Worker }
451*4a64e381SAndroid Build Coastguard Worker
UbusSetPskcHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)452*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusSetPskcHandler(struct ubus_context *aContext,
453*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
454*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
455*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
456*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
457*4a64e381SAndroid Build Coastguard Worker {
458*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusSetInformation(aContext, aObj, aRequest, aMethod, aMsg, "pskc");
459*4a64e381SAndroid Build Coastguard Worker }
460*4a64e381SAndroid Build Coastguard Worker
UbusNetworkkeyHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)461*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusNetworkkeyHandler(struct ubus_context *aContext,
462*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
463*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
464*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
465*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
466*4a64e381SAndroid Build Coastguard Worker {
467*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusGetInformation(aContext, aObj, aRequest, aMethod, aMsg, "networkkey");
468*4a64e381SAndroid Build Coastguard Worker }
469*4a64e381SAndroid Build Coastguard Worker
UbusSetNetworkkeyHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)470*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusSetNetworkkeyHandler(struct ubus_context *aContext,
471*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
472*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
473*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
474*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
475*4a64e381SAndroid Build Coastguard Worker {
476*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusSetInformation(aContext, aObj, aRequest, aMethod, aMsg, "networkkey");
477*4a64e381SAndroid Build Coastguard Worker }
478*4a64e381SAndroid Build Coastguard Worker
UbusThreadStartHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)479*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusThreadStartHandler(struct ubus_context *aContext,
480*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
481*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
482*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
483*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
484*4a64e381SAndroid Build Coastguard Worker {
485*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusThreadHandler(aContext, aObj, aRequest, aMethod, aMsg, "start");
486*4a64e381SAndroid Build Coastguard Worker }
487*4a64e381SAndroid Build Coastguard Worker
UbusThreadStopHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)488*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusThreadStopHandler(struct ubus_context *aContext,
489*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
490*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
491*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
492*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
493*4a64e381SAndroid Build Coastguard Worker {
494*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusThreadHandler(aContext, aObj, aRequest, aMethod, aMsg, "stop");
495*4a64e381SAndroid Build Coastguard Worker }
496*4a64e381SAndroid Build Coastguard Worker
UbusParentHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)497*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusParentHandler(struct ubus_context *aContext,
498*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
499*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
500*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
501*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
502*4a64e381SAndroid Build Coastguard Worker {
503*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusParentHandlerDetail(aContext, aObj, aRequest, aMethod, aMsg);
504*4a64e381SAndroid Build Coastguard Worker }
505*4a64e381SAndroid Build Coastguard Worker
UbusNeighborHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)506*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusNeighborHandler(struct ubus_context *aContext,
507*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
508*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
509*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
510*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
511*4a64e381SAndroid Build Coastguard Worker {
512*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusNeighborHandlerDetail(aContext, aObj, aRequest, aMethod, aMsg);
513*4a64e381SAndroid Build Coastguard Worker }
514*4a64e381SAndroid Build Coastguard Worker
UbusModeHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)515*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusModeHandler(struct ubus_context *aContext,
516*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
517*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
518*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
519*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
520*4a64e381SAndroid Build Coastguard Worker {
521*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusGetInformation(aContext, aObj, aRequest, aMethod, aMsg, "mode");
522*4a64e381SAndroid Build Coastguard Worker }
523*4a64e381SAndroid Build Coastguard Worker
UbusSetModeHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)524*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusSetModeHandler(struct ubus_context *aContext,
525*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
526*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
527*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
528*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
529*4a64e381SAndroid Build Coastguard Worker {
530*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusSetInformation(aContext, aObj, aRequest, aMethod, aMsg, "mode");
531*4a64e381SAndroid Build Coastguard Worker }
532*4a64e381SAndroid Build Coastguard Worker
UbusPartitionIdHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)533*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusPartitionIdHandler(struct ubus_context *aContext,
534*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
535*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
536*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
537*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
538*4a64e381SAndroid Build Coastguard Worker {
539*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusGetInformation(aContext, aObj, aRequest, aMethod, aMsg, "partitionid");
540*4a64e381SAndroid Build Coastguard Worker }
541*4a64e381SAndroid Build Coastguard Worker
UbusLeaveHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)542*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusLeaveHandler(struct ubus_context *aContext,
543*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
544*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
545*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
546*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
547*4a64e381SAndroid Build Coastguard Worker {
548*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusLeaveHandlerDetail(aContext, aObj, aRequest, aMethod, aMsg);
549*4a64e381SAndroid Build Coastguard Worker }
550*4a64e381SAndroid Build Coastguard Worker
UbusLeaderdataHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)551*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusLeaderdataHandler(struct ubus_context *aContext,
552*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
553*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
554*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
555*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
556*4a64e381SAndroid Build Coastguard Worker {
557*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusGetInformation(aContext, aObj, aRequest, aMethod, aMsg, "leaderdata");
558*4a64e381SAndroid Build Coastguard Worker }
559*4a64e381SAndroid Build Coastguard Worker
UbusNetworkdataHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)560*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusNetworkdataHandler(struct ubus_context *aContext,
561*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
562*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
563*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
564*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
565*4a64e381SAndroid Build Coastguard Worker {
566*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusGetInformation(aContext, aObj, aRequest, aMethod, aMsg, "networkdata");
567*4a64e381SAndroid Build Coastguard Worker }
568*4a64e381SAndroid Build Coastguard Worker
UbusCommissionerStartHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)569*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusCommissionerStartHandler(struct ubus_context *aContext,
570*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
571*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
572*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
573*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
574*4a64e381SAndroid Build Coastguard Worker {
575*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusCommissioner(aContext, aObj, aRequest, aMethod, aMsg, "start");
576*4a64e381SAndroid Build Coastguard Worker }
577*4a64e381SAndroid Build Coastguard Worker
UbusJoinerRemoveHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)578*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusJoinerRemoveHandler(struct ubus_context *aContext,
579*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
580*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
581*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
582*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
583*4a64e381SAndroid Build Coastguard Worker {
584*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusCommissioner(aContext, aObj, aRequest, aMethod, aMsg, "joinerremove");
585*4a64e381SAndroid Build Coastguard Worker }
586*4a64e381SAndroid Build Coastguard Worker
UbusMgmtsetHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)587*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusMgmtsetHandler(struct ubus_context *aContext,
588*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
589*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
590*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
591*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
592*4a64e381SAndroid Build Coastguard Worker {
593*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusMgmtset(aContext, aObj, aRequest, aMethod, aMsg);
594*4a64e381SAndroid Build Coastguard Worker }
595*4a64e381SAndroid Build Coastguard Worker
UbusInterfaceNameHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)596*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusInterfaceNameHandler(struct ubus_context *aContext,
597*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
598*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
599*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
600*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
601*4a64e381SAndroid Build Coastguard Worker {
602*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusGetInformation(aContext, aObj, aRequest, aMethod, aMsg, "interfacename");
603*4a64e381SAndroid Build Coastguard Worker }
604*4a64e381SAndroid Build Coastguard Worker
UbusJoinerAddHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)605*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusJoinerAddHandler(struct ubus_context *aContext,
606*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
607*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
608*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
609*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
610*4a64e381SAndroid Build Coastguard Worker {
611*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusCommissioner(aContext, aObj, aRequest, aMethod, aMsg, "joineradd");
612*4a64e381SAndroid Build Coastguard Worker }
613*4a64e381SAndroid Build Coastguard Worker
UbusMacfilterAddrHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)614*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusMacfilterAddrHandler(struct ubus_context *aContext,
615*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
616*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
617*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
618*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
619*4a64e381SAndroid Build Coastguard Worker {
620*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusGetInformation(aContext, aObj, aRequest, aMethod, aMsg, "macfilteraddr");
621*4a64e381SAndroid Build Coastguard Worker }
622*4a64e381SAndroid Build Coastguard Worker
UbusMacfilterStateHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)623*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusMacfilterStateHandler(struct ubus_context *aContext,
624*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
625*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
626*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
627*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
628*4a64e381SAndroid Build Coastguard Worker {
629*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusGetInformation(aContext, aObj, aRequest, aMethod, aMsg, "macfilterstate");
630*4a64e381SAndroid Build Coastguard Worker }
631*4a64e381SAndroid Build Coastguard Worker
UbusMacfilterAddHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)632*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusMacfilterAddHandler(struct ubus_context *aContext,
633*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
634*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
635*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
636*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
637*4a64e381SAndroid Build Coastguard Worker {
638*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusSetInformation(aContext, aObj, aRequest, aMethod, aMsg, "macfilteradd");
639*4a64e381SAndroid Build Coastguard Worker }
640*4a64e381SAndroid Build Coastguard Worker
UbusMacfilterRemoveHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)641*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusMacfilterRemoveHandler(struct ubus_context *aContext,
642*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
643*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
644*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
645*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
646*4a64e381SAndroid Build Coastguard Worker {
647*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusSetInformation(aContext, aObj, aRequest, aMethod, aMsg, "macfilterremove");
648*4a64e381SAndroid Build Coastguard Worker }
649*4a64e381SAndroid Build Coastguard Worker
UbusMacfilterSetStateHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)650*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusMacfilterSetStateHandler(struct ubus_context *aContext,
651*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
652*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
653*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
654*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
655*4a64e381SAndroid Build Coastguard Worker {
656*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusSetInformation(aContext, aObj, aRequest, aMethod, aMsg, "macfiltersetstate");
657*4a64e381SAndroid Build Coastguard Worker }
658*4a64e381SAndroid Build Coastguard Worker
UbusMacfilterClearHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)659*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusMacfilterClearHandler(struct ubus_context *aContext,
660*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
661*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
662*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
663*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
664*4a64e381SAndroid Build Coastguard Worker {
665*4a64e381SAndroid Build Coastguard Worker return GetInstance().UbusSetInformation(aContext, aObj, aRequest, aMethod, aMsg, "macfilterclear");
666*4a64e381SAndroid Build Coastguard Worker }
667*4a64e381SAndroid Build Coastguard Worker
UbusLeaveHandlerDetail(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)668*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusLeaveHandlerDetail(struct ubus_context *aContext,
669*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
670*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
671*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
672*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
673*4a64e381SAndroid Build Coastguard Worker {
674*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aObj);
675*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMethod);
676*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMsg);
677*4a64e381SAndroid Build Coastguard Worker
678*4a64e381SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
679*4a64e381SAndroid Build Coastguard Worker uint64_t eventNum;
680*4a64e381SAndroid Build Coastguard Worker ssize_t retval;
681*4a64e381SAndroid Build Coastguard Worker
682*4a64e381SAndroid Build Coastguard Worker mHostMutex->lock();
683*4a64e381SAndroid Build Coastguard Worker otInstanceFactoryReset(mHost->GetInstance());
684*4a64e381SAndroid Build Coastguard Worker
685*4a64e381SAndroid Build Coastguard Worker eventNum = 1;
686*4a64e381SAndroid Build Coastguard Worker retval = write(sUbusEfd, &eventNum, sizeof(uint64_t));
687*4a64e381SAndroid Build Coastguard Worker if (retval != sizeof(uint64_t))
688*4a64e381SAndroid Build Coastguard Worker {
689*4a64e381SAndroid Build Coastguard Worker error = OT_ERROR_FAILED;
690*4a64e381SAndroid Build Coastguard Worker goto exit;
691*4a64e381SAndroid Build Coastguard Worker }
692*4a64e381SAndroid Build Coastguard Worker
693*4a64e381SAndroid Build Coastguard Worker blob_buf_init(&mBuf, 0);
694*4a64e381SAndroid Build Coastguard Worker
695*4a64e381SAndroid Build Coastguard Worker exit:
696*4a64e381SAndroid Build Coastguard Worker mHostMutex->unlock();
697*4a64e381SAndroid Build Coastguard Worker AppendResult(error, aContext, aRequest);
698*4a64e381SAndroid Build Coastguard Worker return 0;
699*4a64e381SAndroid Build Coastguard Worker }
UbusThreadHandler(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg,const char * aAction)700*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusThreadHandler(struct ubus_context *aContext,
701*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
702*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
703*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
704*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg,
705*4a64e381SAndroid Build Coastguard Worker const char *aAction)
706*4a64e381SAndroid Build Coastguard Worker {
707*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aObj);
708*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMethod);
709*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMsg);
710*4a64e381SAndroid Build Coastguard Worker
711*4a64e381SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
712*4a64e381SAndroid Build Coastguard Worker
713*4a64e381SAndroid Build Coastguard Worker blob_buf_init(&mBuf, 0);
714*4a64e381SAndroid Build Coastguard Worker
715*4a64e381SAndroid Build Coastguard Worker if (!strcmp(aAction, "start"))
716*4a64e381SAndroid Build Coastguard Worker {
717*4a64e381SAndroid Build Coastguard Worker mHostMutex->lock();
718*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = otIp6SetEnabled(mHost->GetInstance(), true));
719*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = otThreadSetEnabled(mHost->GetInstance(), true));
720*4a64e381SAndroid Build Coastguard Worker }
721*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "stop"))
722*4a64e381SAndroid Build Coastguard Worker {
723*4a64e381SAndroid Build Coastguard Worker mHostMutex->lock();
724*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = otThreadSetEnabled(mHost->GetInstance(), false));
725*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = otIp6SetEnabled(mHost->GetInstance(), false));
726*4a64e381SAndroid Build Coastguard Worker }
727*4a64e381SAndroid Build Coastguard Worker
728*4a64e381SAndroid Build Coastguard Worker exit:
729*4a64e381SAndroid Build Coastguard Worker mHostMutex->unlock();
730*4a64e381SAndroid Build Coastguard Worker AppendResult(error, aContext, aRequest);
731*4a64e381SAndroid Build Coastguard Worker return 0;
732*4a64e381SAndroid Build Coastguard Worker }
733*4a64e381SAndroid Build Coastguard Worker
UbusParentHandlerDetail(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)734*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusParentHandlerDetail(struct ubus_context *aContext,
735*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
736*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
737*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
738*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
739*4a64e381SAndroid Build Coastguard Worker {
740*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aObj);
741*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMethod);
742*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMsg);
743*4a64e381SAndroid Build Coastguard Worker
744*4a64e381SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
745*4a64e381SAndroid Build Coastguard Worker otRouterInfo parentInfo;
746*4a64e381SAndroid Build Coastguard Worker char extAddress[XPANID_LENGTH] = "";
747*4a64e381SAndroid Build Coastguard Worker char transfer[XPANID_LENGTH] = "";
748*4a64e381SAndroid Build Coastguard Worker void *jsonList = nullptr;
749*4a64e381SAndroid Build Coastguard Worker void *jsonArray = nullptr;
750*4a64e381SAndroid Build Coastguard Worker
751*4a64e381SAndroid Build Coastguard Worker blob_buf_init(&mBuf, 0);
752*4a64e381SAndroid Build Coastguard Worker
753*4a64e381SAndroid Build Coastguard Worker mHostMutex->lock();
754*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = otThreadGetParentInfo(mHost->GetInstance(), &parentInfo));
755*4a64e381SAndroid Build Coastguard Worker
756*4a64e381SAndroid Build Coastguard Worker jsonArray = blobmsg_open_array(&mBuf, "parent_list");
757*4a64e381SAndroid Build Coastguard Worker jsonList = blobmsg_open_table(&mBuf, "parent");
758*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "Role", "R");
759*4a64e381SAndroid Build Coastguard Worker
760*4a64e381SAndroid Build Coastguard Worker sprintf(transfer, "0x%04x", parentInfo.mRloc16);
761*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "Rloc16", transfer);
762*4a64e381SAndroid Build Coastguard Worker
763*4a64e381SAndroid Build Coastguard Worker sprintf(transfer, "%3d", parentInfo.mAge);
764*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "Age", transfer);
765*4a64e381SAndroid Build Coastguard Worker
766*4a64e381SAndroid Build Coastguard Worker OutputBytes(parentInfo.mExtAddress.m8, sizeof(parentInfo.mExtAddress.m8), extAddress);
767*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "ExtAddress", extAddress);
768*4a64e381SAndroid Build Coastguard Worker
769*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u16(&mBuf, "LinkQualityIn", parentInfo.mLinkQualityIn);
770*4a64e381SAndroid Build Coastguard Worker
771*4a64e381SAndroid Build Coastguard Worker blobmsg_close_table(&mBuf, jsonList);
772*4a64e381SAndroid Build Coastguard Worker blobmsg_close_array(&mBuf, jsonArray);
773*4a64e381SAndroid Build Coastguard Worker
774*4a64e381SAndroid Build Coastguard Worker exit:
775*4a64e381SAndroid Build Coastguard Worker mHostMutex->unlock();
776*4a64e381SAndroid Build Coastguard Worker AppendResult(error, aContext, aRequest);
777*4a64e381SAndroid Build Coastguard Worker return error;
778*4a64e381SAndroid Build Coastguard Worker }
779*4a64e381SAndroid Build Coastguard Worker
UbusNeighborHandlerDetail(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)780*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusNeighborHandlerDetail(struct ubus_context *aContext,
781*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
782*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
783*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
784*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
785*4a64e381SAndroid Build Coastguard Worker {
786*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aObj);
787*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMethod);
788*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMsg);
789*4a64e381SAndroid Build Coastguard Worker
790*4a64e381SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
791*4a64e381SAndroid Build Coastguard Worker otNeighborInfo neighborInfo;
792*4a64e381SAndroid Build Coastguard Worker otNeighborInfoIterator iterator = OT_NEIGHBOR_INFO_ITERATOR_INIT;
793*4a64e381SAndroid Build Coastguard Worker char transfer[XPANID_LENGTH] = "";
794*4a64e381SAndroid Build Coastguard Worker void *jsonList = nullptr;
795*4a64e381SAndroid Build Coastguard Worker char mode[5] = "";
796*4a64e381SAndroid Build Coastguard Worker char extAddress[XPANID_LENGTH] = "";
797*4a64e381SAndroid Build Coastguard Worker
798*4a64e381SAndroid Build Coastguard Worker blob_buf_init(&mBuf, 0);
799*4a64e381SAndroid Build Coastguard Worker
800*4a64e381SAndroid Build Coastguard Worker sJsonUri = blobmsg_open_array(&mBuf, "neighbor_list");
801*4a64e381SAndroid Build Coastguard Worker
802*4a64e381SAndroid Build Coastguard Worker mHostMutex->lock();
803*4a64e381SAndroid Build Coastguard Worker while (otThreadGetNextNeighborInfo(mHost->GetInstance(), &iterator, &neighborInfo) == OT_ERROR_NONE)
804*4a64e381SAndroid Build Coastguard Worker {
805*4a64e381SAndroid Build Coastguard Worker jsonList = blobmsg_open_table(&mBuf, nullptr);
806*4a64e381SAndroid Build Coastguard Worker
807*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "Role", neighborInfo.mIsChild ? "C" : "R");
808*4a64e381SAndroid Build Coastguard Worker
809*4a64e381SAndroid Build Coastguard Worker sprintf(transfer, "0x%04x", neighborInfo.mRloc16);
810*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "Rloc16", transfer);
811*4a64e381SAndroid Build Coastguard Worker
812*4a64e381SAndroid Build Coastguard Worker sprintf(transfer, "%3d", neighborInfo.mAge);
813*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "Age", transfer);
814*4a64e381SAndroid Build Coastguard Worker
815*4a64e381SAndroid Build Coastguard Worker sprintf(transfer, "%8d", neighborInfo.mAverageRssi);
816*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "AvgRssi", transfer);
817*4a64e381SAndroid Build Coastguard Worker
818*4a64e381SAndroid Build Coastguard Worker sprintf(transfer, "%9d", neighborInfo.mLastRssi);
819*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "LastRssi", transfer);
820*4a64e381SAndroid Build Coastguard Worker
821*4a64e381SAndroid Build Coastguard Worker if (neighborInfo.mRxOnWhenIdle)
822*4a64e381SAndroid Build Coastguard Worker {
823*4a64e381SAndroid Build Coastguard Worker strcat(mode, "r");
824*4a64e381SAndroid Build Coastguard Worker }
825*4a64e381SAndroid Build Coastguard Worker
826*4a64e381SAndroid Build Coastguard Worker if (neighborInfo.mFullThreadDevice)
827*4a64e381SAndroid Build Coastguard Worker {
828*4a64e381SAndroid Build Coastguard Worker strcat(mode, "d");
829*4a64e381SAndroid Build Coastguard Worker }
830*4a64e381SAndroid Build Coastguard Worker
831*4a64e381SAndroid Build Coastguard Worker if (neighborInfo.mFullNetworkData)
832*4a64e381SAndroid Build Coastguard Worker {
833*4a64e381SAndroid Build Coastguard Worker strcat(mode, "n");
834*4a64e381SAndroid Build Coastguard Worker }
835*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "Mode", mode);
836*4a64e381SAndroid Build Coastguard Worker
837*4a64e381SAndroid Build Coastguard Worker OutputBytes(neighborInfo.mExtAddress.m8, sizeof(neighborInfo.mExtAddress.m8), extAddress);
838*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "ExtAddress", extAddress);
839*4a64e381SAndroid Build Coastguard Worker
840*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u16(&mBuf, "LinkQualityIn", neighborInfo.mLinkQualityIn);
841*4a64e381SAndroid Build Coastguard Worker
842*4a64e381SAndroid Build Coastguard Worker blobmsg_close_table(&mBuf, jsonList);
843*4a64e381SAndroid Build Coastguard Worker
844*4a64e381SAndroid Build Coastguard Worker memset(mode, 0, sizeof(mode));
845*4a64e381SAndroid Build Coastguard Worker memset(extAddress, 0, sizeof(extAddress));
846*4a64e381SAndroid Build Coastguard Worker }
847*4a64e381SAndroid Build Coastguard Worker
848*4a64e381SAndroid Build Coastguard Worker blobmsg_close_array(&mBuf, sJsonUri);
849*4a64e381SAndroid Build Coastguard Worker
850*4a64e381SAndroid Build Coastguard Worker mHostMutex->unlock();
851*4a64e381SAndroid Build Coastguard Worker
852*4a64e381SAndroid Build Coastguard Worker AppendResult(error, aContext, aRequest);
853*4a64e381SAndroid Build Coastguard Worker return 0;
854*4a64e381SAndroid Build Coastguard Worker }
855*4a64e381SAndroid Build Coastguard Worker
UbusMgmtset(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg)856*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusMgmtset(struct ubus_context *aContext,
857*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
858*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
859*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
860*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg)
861*4a64e381SAndroid Build Coastguard Worker {
862*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aObj);
863*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMethod);
864*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMsg);
865*4a64e381SAndroid Build Coastguard Worker
866*4a64e381SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
867*4a64e381SAndroid Build Coastguard Worker struct blob_attr *tb[MGMTSET_MAX];
868*4a64e381SAndroid Build Coastguard Worker otOperationalDataset dataset;
869*4a64e381SAndroid Build Coastguard Worker uint8_t tlvs[128];
870*4a64e381SAndroid Build Coastguard Worker long value;
871*4a64e381SAndroid Build Coastguard Worker int length = 0;
872*4a64e381SAndroid Build Coastguard Worker
873*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = otDatasetGetActive(mHost->GetInstance(), &dataset));
874*4a64e381SAndroid Build Coastguard Worker
875*4a64e381SAndroid Build Coastguard Worker blobmsg_parse(mgmtsetPolicy, MGMTSET_MAX, tb, blob_data(aMsg), blob_len(aMsg));
876*4a64e381SAndroid Build Coastguard Worker if (tb[NETWORKKEY] != nullptr)
877*4a64e381SAndroid Build Coastguard Worker {
878*4a64e381SAndroid Build Coastguard Worker dataset.mComponents.mIsNetworkKeyPresent = true;
879*4a64e381SAndroid Build Coastguard Worker VerifyOrExit((length = Hex2Bin(blobmsg_get_string(tb[NETWORKKEY]), dataset.mNetworkKey.m8,
880*4a64e381SAndroid Build Coastguard Worker sizeof(dataset.mNetworkKey.m8))) == OT_NETWORK_KEY_SIZE,
881*4a64e381SAndroid Build Coastguard Worker error = OT_ERROR_PARSE);
882*4a64e381SAndroid Build Coastguard Worker length = 0;
883*4a64e381SAndroid Build Coastguard Worker }
884*4a64e381SAndroid Build Coastguard Worker if (tb[NETWORKNAME] != nullptr)
885*4a64e381SAndroid Build Coastguard Worker {
886*4a64e381SAndroid Build Coastguard Worker dataset.mComponents.mIsNetworkNamePresent = true;
887*4a64e381SAndroid Build Coastguard Worker VerifyOrExit((length = static_cast<int>(strlen(blobmsg_get_string(tb[NETWORKNAME])))) <=
888*4a64e381SAndroid Build Coastguard Worker OT_NETWORK_NAME_MAX_SIZE,
889*4a64e381SAndroid Build Coastguard Worker error = OT_ERROR_PARSE);
890*4a64e381SAndroid Build Coastguard Worker memset(&dataset.mNetworkName, 0, sizeof(dataset.mNetworkName));
891*4a64e381SAndroid Build Coastguard Worker memcpy(dataset.mNetworkName.m8, blobmsg_get_string(tb[NETWORKNAME]), static_cast<size_t>(length));
892*4a64e381SAndroid Build Coastguard Worker length = 0;
893*4a64e381SAndroid Build Coastguard Worker }
894*4a64e381SAndroid Build Coastguard Worker if (tb[EXTPANID] != nullptr)
895*4a64e381SAndroid Build Coastguard Worker {
896*4a64e381SAndroid Build Coastguard Worker dataset.mComponents.mIsExtendedPanIdPresent = true;
897*4a64e381SAndroid Build Coastguard Worker VerifyOrExit(Hex2Bin(blobmsg_get_string(tb[EXTPANID]), dataset.mExtendedPanId.m8,
898*4a64e381SAndroid Build Coastguard Worker sizeof(dataset.mExtendedPanId.m8)) >= 0,
899*4a64e381SAndroid Build Coastguard Worker error = OT_ERROR_PARSE);
900*4a64e381SAndroid Build Coastguard Worker }
901*4a64e381SAndroid Build Coastguard Worker if (tb[PANID] != nullptr)
902*4a64e381SAndroid Build Coastguard Worker {
903*4a64e381SAndroid Build Coastguard Worker dataset.mComponents.mIsPanIdPresent = true;
904*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = ParseLong(blobmsg_get_string(tb[PANID]), value));
905*4a64e381SAndroid Build Coastguard Worker dataset.mPanId = static_cast<otPanId>(value);
906*4a64e381SAndroid Build Coastguard Worker }
907*4a64e381SAndroid Build Coastguard Worker if (tb[CHANNEL] != nullptr)
908*4a64e381SAndroid Build Coastguard Worker {
909*4a64e381SAndroid Build Coastguard Worker dataset.mComponents.mIsChannelPresent = true;
910*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = ParseLong(blobmsg_get_string(tb[CHANNEL]), value));
911*4a64e381SAndroid Build Coastguard Worker dataset.mChannel = static_cast<uint16_t>(value);
912*4a64e381SAndroid Build Coastguard Worker }
913*4a64e381SAndroid Build Coastguard Worker if (tb[PSKC] != nullptr)
914*4a64e381SAndroid Build Coastguard Worker {
915*4a64e381SAndroid Build Coastguard Worker dataset.mComponents.mIsPskcPresent = true;
916*4a64e381SAndroid Build Coastguard Worker VerifyOrExit((length = Hex2Bin(blobmsg_get_string(tb[PSKC]), dataset.mPskc.m8, sizeof(dataset.mPskc.m8))) ==
917*4a64e381SAndroid Build Coastguard Worker OT_PSKC_MAX_SIZE,
918*4a64e381SAndroid Build Coastguard Worker error = OT_ERROR_PARSE);
919*4a64e381SAndroid Build Coastguard Worker length = 0;
920*4a64e381SAndroid Build Coastguard Worker }
921*4a64e381SAndroid Build Coastguard Worker dataset.mActiveTimestamp.mSeconds++;
922*4a64e381SAndroid Build Coastguard Worker if (otCommissionerGetState(mHost->GetInstance()) == OT_COMMISSIONER_STATE_DISABLED)
923*4a64e381SAndroid Build Coastguard Worker {
924*4a64e381SAndroid Build Coastguard Worker otCommissionerStop(mHost->GetInstance());
925*4a64e381SAndroid Build Coastguard Worker }
926*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = otDatasetSendMgmtActiveSet(mHost->GetInstance(), &dataset, tlvs, static_cast<uint8_t>(length),
927*4a64e381SAndroid Build Coastguard Worker /* aCallback */ nullptr,
928*4a64e381SAndroid Build Coastguard Worker /* aContext */ nullptr));
929*4a64e381SAndroid Build Coastguard Worker exit:
930*4a64e381SAndroid Build Coastguard Worker AppendResult(error, aContext, aRequest);
931*4a64e381SAndroid Build Coastguard Worker return 0;
932*4a64e381SAndroid Build Coastguard Worker }
933*4a64e381SAndroid Build Coastguard Worker
UbusCommissioner(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg,const char * aAction)934*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusCommissioner(struct ubus_context *aContext,
935*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
936*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
937*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
938*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg,
939*4a64e381SAndroid Build Coastguard Worker const char *aAction)
940*4a64e381SAndroid Build Coastguard Worker {
941*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aObj);
942*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMethod);
943*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMsg);
944*4a64e381SAndroid Build Coastguard Worker
945*4a64e381SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
946*4a64e381SAndroid Build Coastguard Worker
947*4a64e381SAndroid Build Coastguard Worker mHostMutex->lock();
948*4a64e381SAndroid Build Coastguard Worker
949*4a64e381SAndroid Build Coastguard Worker if (!strcmp(aAction, "start"))
950*4a64e381SAndroid Build Coastguard Worker {
951*4a64e381SAndroid Build Coastguard Worker if (otCommissionerGetState(mHost->GetInstance()) == OT_COMMISSIONER_STATE_DISABLED)
952*4a64e381SAndroid Build Coastguard Worker {
953*4a64e381SAndroid Build Coastguard Worker error = otCommissionerStart(mHost->GetInstance(), &UbusServer::HandleStateChanged,
954*4a64e381SAndroid Build Coastguard Worker &UbusServer::HandleJoinerEvent, this);
955*4a64e381SAndroid Build Coastguard Worker }
956*4a64e381SAndroid Build Coastguard Worker }
957*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "joineradd"))
958*4a64e381SAndroid Build Coastguard Worker {
959*4a64e381SAndroid Build Coastguard Worker struct blob_attr *tb[ADD_JOINER_MAX];
960*4a64e381SAndroid Build Coastguard Worker otExtAddress addr;
961*4a64e381SAndroid Build Coastguard Worker const otExtAddress *addrPtr = nullptr;
962*4a64e381SAndroid Build Coastguard Worker char *pskd = nullptr;
963*4a64e381SAndroid Build Coastguard Worker
964*4a64e381SAndroid Build Coastguard Worker blobmsg_parse(addJoinerPolicy, ADD_JOINER_MAX, tb, blob_data(aMsg), blob_len(aMsg));
965*4a64e381SAndroid Build Coastguard Worker if (tb[PSKD] != nullptr)
966*4a64e381SAndroid Build Coastguard Worker {
967*4a64e381SAndroid Build Coastguard Worker pskd = blobmsg_get_string(tb[PSKD]);
968*4a64e381SAndroid Build Coastguard Worker }
969*4a64e381SAndroid Build Coastguard Worker if (tb[EUI64] != nullptr)
970*4a64e381SAndroid Build Coastguard Worker {
971*4a64e381SAndroid Build Coastguard Worker if (!strcmp(blobmsg_get_string(tb[EUI64]), "*"))
972*4a64e381SAndroid Build Coastguard Worker {
973*4a64e381SAndroid Build Coastguard Worker addrPtr = nullptr;
974*4a64e381SAndroid Build Coastguard Worker memset(&addr, 0, sizeof(addr));
975*4a64e381SAndroid Build Coastguard Worker }
976*4a64e381SAndroid Build Coastguard Worker else
977*4a64e381SAndroid Build Coastguard Worker {
978*4a64e381SAndroid Build Coastguard Worker VerifyOrExit(Hex2Bin(blobmsg_get_string(tb[EUI64]), addr.m8, sizeof(addr)) == sizeof(addr),
979*4a64e381SAndroid Build Coastguard Worker error = OT_ERROR_PARSE);
980*4a64e381SAndroid Build Coastguard Worker addrPtr = &addr;
981*4a64e381SAndroid Build Coastguard Worker }
982*4a64e381SAndroid Build Coastguard Worker }
983*4a64e381SAndroid Build Coastguard Worker
984*4a64e381SAndroid Build Coastguard Worker unsigned long timeout = kDefaultJoinerTimeout;
985*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error =
986*4a64e381SAndroid Build Coastguard Worker otCommissionerAddJoiner(mHost->GetInstance(), addrPtr, pskd, static_cast<uint32_t>(timeout)));
987*4a64e381SAndroid Build Coastguard Worker }
988*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "joinerremove"))
989*4a64e381SAndroid Build Coastguard Worker {
990*4a64e381SAndroid Build Coastguard Worker struct blob_attr *tb[SET_NETWORK_MAX];
991*4a64e381SAndroid Build Coastguard Worker otExtAddress addr;
992*4a64e381SAndroid Build Coastguard Worker const otExtAddress *addrPtr = nullptr;
993*4a64e381SAndroid Build Coastguard Worker
994*4a64e381SAndroid Build Coastguard Worker blobmsg_parse(removeJoinerPolicy, SET_NETWORK_MAX, tb, blob_data(aMsg), blob_len(aMsg));
995*4a64e381SAndroid Build Coastguard Worker if (tb[SETNETWORK] != nullptr)
996*4a64e381SAndroid Build Coastguard Worker {
997*4a64e381SAndroid Build Coastguard Worker if (strcmp(blobmsg_get_string(tb[SETNETWORK]), "*") == 0)
998*4a64e381SAndroid Build Coastguard Worker {
999*4a64e381SAndroid Build Coastguard Worker addrPtr = nullptr;
1000*4a64e381SAndroid Build Coastguard Worker }
1001*4a64e381SAndroid Build Coastguard Worker else
1002*4a64e381SAndroid Build Coastguard Worker {
1003*4a64e381SAndroid Build Coastguard Worker VerifyOrExit(Hex2Bin(blobmsg_get_string(tb[SETNETWORK]), addr.m8, sizeof(addr)) == sizeof(addr),
1004*4a64e381SAndroid Build Coastguard Worker error = OT_ERROR_PARSE);
1005*4a64e381SAndroid Build Coastguard Worker addrPtr = &addr;
1006*4a64e381SAndroid Build Coastguard Worker }
1007*4a64e381SAndroid Build Coastguard Worker }
1008*4a64e381SAndroid Build Coastguard Worker
1009*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = otCommissionerRemoveJoiner(mHost->GetInstance(), addrPtr));
1010*4a64e381SAndroid Build Coastguard Worker }
1011*4a64e381SAndroid Build Coastguard Worker
1012*4a64e381SAndroid Build Coastguard Worker exit:
1013*4a64e381SAndroid Build Coastguard Worker mHostMutex->unlock();
1014*4a64e381SAndroid Build Coastguard Worker blob_buf_init(&mBuf, 0);
1015*4a64e381SAndroid Build Coastguard Worker AppendResult(error, aContext, aRequest);
1016*4a64e381SAndroid Build Coastguard Worker return 0;
1017*4a64e381SAndroid Build Coastguard Worker }
1018*4a64e381SAndroid Build Coastguard Worker
HandleStateChanged(otCommissionerState aState,void * aContext)1019*4a64e381SAndroid Build Coastguard Worker void UbusServer::HandleStateChanged(otCommissionerState aState, void *aContext)
1020*4a64e381SAndroid Build Coastguard Worker {
1021*4a64e381SAndroid Build Coastguard Worker static_cast<UbusServer *>(aContext)->HandleStateChanged(aState);
1022*4a64e381SAndroid Build Coastguard Worker }
1023*4a64e381SAndroid Build Coastguard Worker
HandleStateChanged(otCommissionerState aState)1024*4a64e381SAndroid Build Coastguard Worker void UbusServer::HandleStateChanged(otCommissionerState aState)
1025*4a64e381SAndroid Build Coastguard Worker {
1026*4a64e381SAndroid Build Coastguard Worker switch (aState)
1027*4a64e381SAndroid Build Coastguard Worker {
1028*4a64e381SAndroid Build Coastguard Worker case OT_COMMISSIONER_STATE_DISABLED:
1029*4a64e381SAndroid Build Coastguard Worker otbrLogInfo("Commissioner state disabled");
1030*4a64e381SAndroid Build Coastguard Worker break;
1031*4a64e381SAndroid Build Coastguard Worker case OT_COMMISSIONER_STATE_ACTIVE:
1032*4a64e381SAndroid Build Coastguard Worker otbrLogInfo("Commissioner state active");
1033*4a64e381SAndroid Build Coastguard Worker break;
1034*4a64e381SAndroid Build Coastguard Worker case OT_COMMISSIONER_STATE_PETITION:
1035*4a64e381SAndroid Build Coastguard Worker otbrLogInfo("Commissioner state petition");
1036*4a64e381SAndroid Build Coastguard Worker break;
1037*4a64e381SAndroid Build Coastguard Worker }
1038*4a64e381SAndroid Build Coastguard Worker }
1039*4a64e381SAndroid Build Coastguard Worker
HandleJoinerEvent(otCommissionerJoinerEvent aEvent,const otJoinerInfo * aJoinerInfo,const otExtAddress * aJoinerId,void * aContext)1040*4a64e381SAndroid Build Coastguard Worker void UbusServer::HandleJoinerEvent(otCommissionerJoinerEvent aEvent,
1041*4a64e381SAndroid Build Coastguard Worker const otJoinerInfo *aJoinerInfo,
1042*4a64e381SAndroid Build Coastguard Worker const otExtAddress *aJoinerId,
1043*4a64e381SAndroid Build Coastguard Worker void *aContext)
1044*4a64e381SAndroid Build Coastguard Worker {
1045*4a64e381SAndroid Build Coastguard Worker static_cast<UbusServer *>(aContext)->HandleJoinerEvent(aEvent, aJoinerInfo, aJoinerId);
1046*4a64e381SAndroid Build Coastguard Worker }
1047*4a64e381SAndroid Build Coastguard Worker
HandleJoinerEvent(otCommissionerJoinerEvent aEvent,const otJoinerInfo * aJoinerInfo,const otExtAddress * aJoinerId)1048*4a64e381SAndroid Build Coastguard Worker void UbusServer::HandleJoinerEvent(otCommissionerJoinerEvent aEvent,
1049*4a64e381SAndroid Build Coastguard Worker const otJoinerInfo *aJoinerInfo,
1050*4a64e381SAndroid Build Coastguard Worker const otExtAddress *aJoinerId)
1051*4a64e381SAndroid Build Coastguard Worker {
1052*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aJoinerInfo);
1053*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aJoinerId);
1054*4a64e381SAndroid Build Coastguard Worker
1055*4a64e381SAndroid Build Coastguard Worker switch (aEvent)
1056*4a64e381SAndroid Build Coastguard Worker {
1057*4a64e381SAndroid Build Coastguard Worker case OT_COMMISSIONER_JOINER_START:
1058*4a64e381SAndroid Build Coastguard Worker otbrLogInfo("Joiner start");
1059*4a64e381SAndroid Build Coastguard Worker break;
1060*4a64e381SAndroid Build Coastguard Worker case OT_COMMISSIONER_JOINER_CONNECTED:
1061*4a64e381SAndroid Build Coastguard Worker otbrLogInfo("Joiner connected");
1062*4a64e381SAndroid Build Coastguard Worker break;
1063*4a64e381SAndroid Build Coastguard Worker case OT_COMMISSIONER_JOINER_FINALIZE:
1064*4a64e381SAndroid Build Coastguard Worker otbrLogInfo("Joiner finalize");
1065*4a64e381SAndroid Build Coastguard Worker break;
1066*4a64e381SAndroid Build Coastguard Worker case OT_COMMISSIONER_JOINER_END:
1067*4a64e381SAndroid Build Coastguard Worker otbrLogInfo("Joiner end");
1068*4a64e381SAndroid Build Coastguard Worker break;
1069*4a64e381SAndroid Build Coastguard Worker case OT_COMMISSIONER_JOINER_REMOVED:
1070*4a64e381SAndroid Build Coastguard Worker otbrLogInfo("Joiner remove");
1071*4a64e381SAndroid Build Coastguard Worker break;
1072*4a64e381SAndroid Build Coastguard Worker }
1073*4a64e381SAndroid Build Coastguard Worker }
1074*4a64e381SAndroid Build Coastguard Worker
UbusGetInformation(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg,const char * aAction)1075*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusGetInformation(struct ubus_context *aContext,
1076*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
1077*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
1078*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
1079*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg,
1080*4a64e381SAndroid Build Coastguard Worker const char *aAction)
1081*4a64e381SAndroid Build Coastguard Worker {
1082*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aObj);
1083*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMethod);
1084*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMsg);
1085*4a64e381SAndroid Build Coastguard Worker
1086*4a64e381SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
1087*4a64e381SAndroid Build Coastguard Worker
1088*4a64e381SAndroid Build Coastguard Worker blob_buf_init(&mBuf, 0);
1089*4a64e381SAndroid Build Coastguard Worker
1090*4a64e381SAndroid Build Coastguard Worker mHostMutex->lock();
1091*4a64e381SAndroid Build Coastguard Worker if (!strcmp(aAction, "networkname"))
1092*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "NetworkName", otThreadGetNetworkName(mHost->GetInstance()));
1093*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "interfacename"))
1094*4a64e381SAndroid Build Coastguard Worker {
1095*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "InterfaceName", mHost->GetInterfaceName());
1096*4a64e381SAndroid Build Coastguard Worker }
1097*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "state"))
1098*4a64e381SAndroid Build Coastguard Worker {
1099*4a64e381SAndroid Build Coastguard Worker char state[10];
1100*4a64e381SAndroid Build Coastguard Worker GetState(mHost->GetInstance(), state);
1101*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "State", state);
1102*4a64e381SAndroid Build Coastguard Worker }
1103*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "channel"))
1104*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u32(&mBuf, "Channel", otLinkGetChannel(mHost->GetInstance()));
1105*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "panid"))
1106*4a64e381SAndroid Build Coastguard Worker {
1107*4a64e381SAndroid Build Coastguard Worker char panIdString[PANID_LENGTH];
1108*4a64e381SAndroid Build Coastguard Worker sprintf(panIdString, "0x%04x", otLinkGetPanId(mHost->GetInstance()));
1109*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "PanId", panIdString);
1110*4a64e381SAndroid Build Coastguard Worker }
1111*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "rloc16"))
1112*4a64e381SAndroid Build Coastguard Worker {
1113*4a64e381SAndroid Build Coastguard Worker char rloc[PANID_LENGTH];
1114*4a64e381SAndroid Build Coastguard Worker sprintf(rloc, "0x%04x", otThreadGetRloc16(mHost->GetInstance()));
1115*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "rloc16", rloc);
1116*4a64e381SAndroid Build Coastguard Worker }
1117*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "networkkey"))
1118*4a64e381SAndroid Build Coastguard Worker {
1119*4a64e381SAndroid Build Coastguard Worker char outputKey[NETWORKKEY_LENGTH] = "";
1120*4a64e381SAndroid Build Coastguard Worker otNetworkKey key;
1121*4a64e381SAndroid Build Coastguard Worker
1122*4a64e381SAndroid Build Coastguard Worker otThreadGetNetworkKey(mHost->GetInstance(), &key);
1123*4a64e381SAndroid Build Coastguard Worker OutputBytes(key.m8, OT_NETWORK_KEY_SIZE, outputKey);
1124*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "Networkkey", outputKey);
1125*4a64e381SAndroid Build Coastguard Worker }
1126*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "pskc"))
1127*4a64e381SAndroid Build Coastguard Worker {
1128*4a64e381SAndroid Build Coastguard Worker char outputPskc[NETWORKKEY_LENGTH] = "";
1129*4a64e381SAndroid Build Coastguard Worker otPskc pskc;
1130*4a64e381SAndroid Build Coastguard Worker
1131*4a64e381SAndroid Build Coastguard Worker otThreadGetPskc(mHost->GetInstance(), &pskc);
1132*4a64e381SAndroid Build Coastguard Worker OutputBytes(pskc.m8, OT_PSKC_MAX_SIZE, outputPskc);
1133*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "pskc", outputPskc);
1134*4a64e381SAndroid Build Coastguard Worker }
1135*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "extpanid"))
1136*4a64e381SAndroid Build Coastguard Worker {
1137*4a64e381SAndroid Build Coastguard Worker char outputExtPanId[XPANID_LENGTH] = "";
1138*4a64e381SAndroid Build Coastguard Worker const uint8_t *extPanId = reinterpret_cast<const uint8_t *>(otThreadGetExtendedPanId(mHost->GetInstance()));
1139*4a64e381SAndroid Build Coastguard Worker OutputBytes(extPanId, OT_EXT_PAN_ID_SIZE, outputExtPanId);
1140*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "ExtPanId", outputExtPanId);
1141*4a64e381SAndroid Build Coastguard Worker }
1142*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "mode"))
1143*4a64e381SAndroid Build Coastguard Worker {
1144*4a64e381SAndroid Build Coastguard Worker otLinkModeConfig linkMode;
1145*4a64e381SAndroid Build Coastguard Worker char mode[5] = "";
1146*4a64e381SAndroid Build Coastguard Worker
1147*4a64e381SAndroid Build Coastguard Worker memset(&linkMode, 0, sizeof(otLinkModeConfig));
1148*4a64e381SAndroid Build Coastguard Worker
1149*4a64e381SAndroid Build Coastguard Worker linkMode = otThreadGetLinkMode(mHost->GetInstance());
1150*4a64e381SAndroid Build Coastguard Worker
1151*4a64e381SAndroid Build Coastguard Worker if (linkMode.mRxOnWhenIdle)
1152*4a64e381SAndroid Build Coastguard Worker {
1153*4a64e381SAndroid Build Coastguard Worker strcat(mode, "r");
1154*4a64e381SAndroid Build Coastguard Worker }
1155*4a64e381SAndroid Build Coastguard Worker
1156*4a64e381SAndroid Build Coastguard Worker if (linkMode.mDeviceType)
1157*4a64e381SAndroid Build Coastguard Worker {
1158*4a64e381SAndroid Build Coastguard Worker strcat(mode, "d");
1159*4a64e381SAndroid Build Coastguard Worker }
1160*4a64e381SAndroid Build Coastguard Worker
1161*4a64e381SAndroid Build Coastguard Worker if (linkMode.mNetworkData)
1162*4a64e381SAndroid Build Coastguard Worker {
1163*4a64e381SAndroid Build Coastguard Worker strcat(mode, "n");
1164*4a64e381SAndroid Build Coastguard Worker }
1165*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "Mode", mode);
1166*4a64e381SAndroid Build Coastguard Worker }
1167*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "partitionid"))
1168*4a64e381SAndroid Build Coastguard Worker {
1169*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u32(&mBuf, "Partitionid", otThreadGetPartitionId(mHost->GetInstance()));
1170*4a64e381SAndroid Build Coastguard Worker }
1171*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "leaderdata"))
1172*4a64e381SAndroid Build Coastguard Worker {
1173*4a64e381SAndroid Build Coastguard Worker otLeaderData leaderData;
1174*4a64e381SAndroid Build Coastguard Worker
1175*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = otThreadGetLeaderData(mHost->GetInstance(), &leaderData));
1176*4a64e381SAndroid Build Coastguard Worker
1177*4a64e381SAndroid Build Coastguard Worker sJsonUri = blobmsg_open_table(&mBuf, "leaderdata");
1178*4a64e381SAndroid Build Coastguard Worker
1179*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u32(&mBuf, "PartitionId", leaderData.mPartitionId);
1180*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u32(&mBuf, "Weighting", leaderData.mWeighting);
1181*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u32(&mBuf, "DataVersion", leaderData.mDataVersion);
1182*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u32(&mBuf, "StableDataVersion", leaderData.mStableDataVersion);
1183*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u32(&mBuf, "LeaderRouterId", leaderData.mLeaderRouterId);
1184*4a64e381SAndroid Build Coastguard Worker
1185*4a64e381SAndroid Build Coastguard Worker blobmsg_close_table(&mBuf, sJsonUri);
1186*4a64e381SAndroid Build Coastguard Worker }
1187*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "networkdata"))
1188*4a64e381SAndroid Build Coastguard Worker {
1189*4a64e381SAndroid Build Coastguard Worker ubus_send_reply(aContext, aRequest, mNetworkdataBuf.head);
1190*4a64e381SAndroid Build Coastguard Worker if (time(nullptr) - mSecond > 10)
1191*4a64e381SAndroid Build Coastguard Worker {
1192*4a64e381SAndroid Build Coastguard Worker static constexpr uint16_t kMaxTlvs = 35;
1193*4a64e381SAndroid Build Coastguard Worker
1194*4a64e381SAndroid Build Coastguard Worker struct otIp6Address address;
1195*4a64e381SAndroid Build Coastguard Worker uint8_t tlvTypes[kMaxTlvs];
1196*4a64e381SAndroid Build Coastguard Worker uint8_t count = 0;
1197*4a64e381SAndroid Build Coastguard Worker char multicastAddr[10] = "ff03::2";
1198*4a64e381SAndroid Build Coastguard Worker
1199*4a64e381SAndroid Build Coastguard Worker blob_buf_init(&mNetworkdataBuf, 0);
1200*4a64e381SAndroid Build Coastguard Worker
1201*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = otIp6AddressFromString(multicastAddr, &address));
1202*4a64e381SAndroid Build Coastguard Worker
1203*4a64e381SAndroid Build Coastguard Worker tlvTypes[count++] = static_cast<uint8_t>(OT_NETWORK_DIAGNOSTIC_TLV_ROUTE);
1204*4a64e381SAndroid Build Coastguard Worker tlvTypes[count++] = static_cast<uint8_t>(OT_NETWORK_DIAGNOSTIC_TLV_CHILD_TABLE);
1205*4a64e381SAndroid Build Coastguard Worker
1206*4a64e381SAndroid Build Coastguard Worker sBufNum = 0;
1207*4a64e381SAndroid Build Coastguard Worker otThreadSendDiagnosticGet(mHost->GetInstance(), &address, tlvTypes, count,
1208*4a64e381SAndroid Build Coastguard Worker &UbusServer::HandleDiagnosticGetResponse, this);
1209*4a64e381SAndroid Build Coastguard Worker mSecond = time(nullptr);
1210*4a64e381SAndroid Build Coastguard Worker }
1211*4a64e381SAndroid Build Coastguard Worker goto exit;
1212*4a64e381SAndroid Build Coastguard Worker }
1213*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "joinernum"))
1214*4a64e381SAndroid Build Coastguard Worker {
1215*4a64e381SAndroid Build Coastguard Worker void *jsonTable = nullptr;
1216*4a64e381SAndroid Build Coastguard Worker void *jsonArray = nullptr;
1217*4a64e381SAndroid Build Coastguard Worker otJoinerInfo joinerInfo;
1218*4a64e381SAndroid Build Coastguard Worker uint16_t iterator = 0;
1219*4a64e381SAndroid Build Coastguard Worker int joinerNum = 0;
1220*4a64e381SAndroid Build Coastguard Worker char eui64[EXTPANID] = "";
1221*4a64e381SAndroid Build Coastguard Worker
1222*4a64e381SAndroid Build Coastguard Worker blob_buf_init(&mBuf, 0);
1223*4a64e381SAndroid Build Coastguard Worker
1224*4a64e381SAndroid Build Coastguard Worker jsonArray = blobmsg_open_array(&mBuf, "joinerList");
1225*4a64e381SAndroid Build Coastguard Worker while (otCommissionerGetNextJoinerInfo(mHost->GetInstance(), &iterator, &joinerInfo) == OT_ERROR_NONE)
1226*4a64e381SAndroid Build Coastguard Worker {
1227*4a64e381SAndroid Build Coastguard Worker memset(eui64, 0, sizeof(eui64));
1228*4a64e381SAndroid Build Coastguard Worker
1229*4a64e381SAndroid Build Coastguard Worker jsonTable = blobmsg_open_table(&mBuf, nullptr);
1230*4a64e381SAndroid Build Coastguard Worker
1231*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "pskd", joinerInfo.mPskd.m8);
1232*4a64e381SAndroid Build Coastguard Worker
1233*4a64e381SAndroid Build Coastguard Worker switch (joinerInfo.mType)
1234*4a64e381SAndroid Build Coastguard Worker {
1235*4a64e381SAndroid Build Coastguard Worker case OT_JOINER_INFO_TYPE_ANY:
1236*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u16(&mBuf, "isAny", 1);
1237*4a64e381SAndroid Build Coastguard Worker break;
1238*4a64e381SAndroid Build Coastguard Worker case OT_JOINER_INFO_TYPE_EUI64:
1239*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u16(&mBuf, "isAny", 0);
1240*4a64e381SAndroid Build Coastguard Worker OutputBytes(joinerInfo.mSharedId.mEui64.m8, sizeof(joinerInfo.mSharedId.mEui64.m8), eui64);
1241*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "eui64", eui64);
1242*4a64e381SAndroid Build Coastguard Worker break;
1243*4a64e381SAndroid Build Coastguard Worker case OT_JOINER_INFO_TYPE_DISCERNER:
1244*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u16(&mBuf, "isAny", 0);
1245*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u64(&mBuf, "discernerValue", joinerInfo.mSharedId.mDiscerner.mValue);
1246*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u16(&mBuf, "discernerLength", joinerInfo.mSharedId.mDiscerner.mLength);
1247*4a64e381SAndroid Build Coastguard Worker break;
1248*4a64e381SAndroid Build Coastguard Worker }
1249*4a64e381SAndroid Build Coastguard Worker
1250*4a64e381SAndroid Build Coastguard Worker blobmsg_close_table(&mBuf, jsonTable);
1251*4a64e381SAndroid Build Coastguard Worker
1252*4a64e381SAndroid Build Coastguard Worker joinerNum++;
1253*4a64e381SAndroid Build Coastguard Worker }
1254*4a64e381SAndroid Build Coastguard Worker blobmsg_close_array(&mBuf, jsonArray);
1255*4a64e381SAndroid Build Coastguard Worker
1256*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u32(&mBuf, "joinernum", joinerNum);
1257*4a64e381SAndroid Build Coastguard Worker }
1258*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "macfilterstate"))
1259*4a64e381SAndroid Build Coastguard Worker {
1260*4a64e381SAndroid Build Coastguard Worker otMacFilterAddressMode mode = otLinkFilterGetAddressMode(mHost->GetInstance());
1261*4a64e381SAndroid Build Coastguard Worker
1262*4a64e381SAndroid Build Coastguard Worker blob_buf_init(&mBuf, 0);
1263*4a64e381SAndroid Build Coastguard Worker
1264*4a64e381SAndroid Build Coastguard Worker if (mode == OT_MAC_FILTER_ADDRESS_MODE_DISABLED)
1265*4a64e381SAndroid Build Coastguard Worker {
1266*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "state", "disable");
1267*4a64e381SAndroid Build Coastguard Worker }
1268*4a64e381SAndroid Build Coastguard Worker else if (mode == OT_MAC_FILTER_ADDRESS_MODE_ALLOWLIST)
1269*4a64e381SAndroid Build Coastguard Worker {
1270*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "state", "allowlist");
1271*4a64e381SAndroid Build Coastguard Worker }
1272*4a64e381SAndroid Build Coastguard Worker else if (mode == OT_MAC_FILTER_ADDRESS_MODE_DENYLIST)
1273*4a64e381SAndroid Build Coastguard Worker {
1274*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "state", "denylist");
1275*4a64e381SAndroid Build Coastguard Worker }
1276*4a64e381SAndroid Build Coastguard Worker else
1277*4a64e381SAndroid Build Coastguard Worker {
1278*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "state", "error");
1279*4a64e381SAndroid Build Coastguard Worker }
1280*4a64e381SAndroid Build Coastguard Worker }
1281*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "macfilteraddr"))
1282*4a64e381SAndroid Build Coastguard Worker {
1283*4a64e381SAndroid Build Coastguard Worker otMacFilterEntry entry;
1284*4a64e381SAndroid Build Coastguard Worker otMacFilterIterator iterator = OT_MAC_FILTER_ITERATOR_INIT;
1285*4a64e381SAndroid Build Coastguard Worker
1286*4a64e381SAndroid Build Coastguard Worker blob_buf_init(&mBuf, 0);
1287*4a64e381SAndroid Build Coastguard Worker
1288*4a64e381SAndroid Build Coastguard Worker sJsonUri = blobmsg_open_array(&mBuf, "addrlist");
1289*4a64e381SAndroid Build Coastguard Worker
1290*4a64e381SAndroid Build Coastguard Worker while (otLinkFilterGetNextAddress(mHost->GetInstance(), &iterator, &entry) == OT_ERROR_NONE)
1291*4a64e381SAndroid Build Coastguard Worker {
1292*4a64e381SAndroid Build Coastguard Worker char extAddress[XPANID_LENGTH] = "";
1293*4a64e381SAndroid Build Coastguard Worker OutputBytes(entry.mExtAddress.m8, sizeof(entry.mExtAddress.m8), extAddress);
1294*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mBuf, "addr", extAddress);
1295*4a64e381SAndroid Build Coastguard Worker }
1296*4a64e381SAndroid Build Coastguard Worker
1297*4a64e381SAndroid Build Coastguard Worker blobmsg_close_array(&mBuf, sJsonUri);
1298*4a64e381SAndroid Build Coastguard Worker }
1299*4a64e381SAndroid Build Coastguard Worker else
1300*4a64e381SAndroid Build Coastguard Worker {
1301*4a64e381SAndroid Build Coastguard Worker perror("invalid argument in get information ubus\n");
1302*4a64e381SAndroid Build Coastguard Worker }
1303*4a64e381SAndroid Build Coastguard Worker
1304*4a64e381SAndroid Build Coastguard Worker AppendResult(error, aContext, aRequest);
1305*4a64e381SAndroid Build Coastguard Worker exit:
1306*4a64e381SAndroid Build Coastguard Worker mHostMutex->unlock();
1307*4a64e381SAndroid Build Coastguard Worker return 0;
1308*4a64e381SAndroid Build Coastguard Worker }
1309*4a64e381SAndroid Build Coastguard Worker
HandleDiagnosticGetResponse(otError aError,otMessage * aMessage,const otMessageInfo * aMessageInfo,void * aContext)1310*4a64e381SAndroid Build Coastguard Worker void UbusServer::HandleDiagnosticGetResponse(otError aError,
1311*4a64e381SAndroid Build Coastguard Worker otMessage *aMessage,
1312*4a64e381SAndroid Build Coastguard Worker const otMessageInfo *aMessageInfo,
1313*4a64e381SAndroid Build Coastguard Worker void *aContext)
1314*4a64e381SAndroid Build Coastguard Worker {
1315*4a64e381SAndroid Build Coastguard Worker static_cast<UbusServer *>(aContext)->HandleDiagnosticGetResponse(aError, aMessage, aMessageInfo);
1316*4a64e381SAndroid Build Coastguard Worker }
1317*4a64e381SAndroid Build Coastguard Worker
IsRoutingLocator(const otIp6Address * aAddress)1318*4a64e381SAndroid Build Coastguard Worker static bool IsRoutingLocator(const otIp6Address *aAddress)
1319*4a64e381SAndroid Build Coastguard Worker {
1320*4a64e381SAndroid Build Coastguard Worker enum
1321*4a64e381SAndroid Build Coastguard Worker {
1322*4a64e381SAndroid Build Coastguard Worker kAloc16Mask = 0xfc, ///< The mask for Aloc16.
1323*4a64e381SAndroid Build Coastguard Worker kRloc16ReservedBitMask = 0x02, ///< The mask for the reserved bit of Rloc16.
1324*4a64e381SAndroid Build Coastguard Worker };
1325*4a64e381SAndroid Build Coastguard Worker
1326*4a64e381SAndroid Build Coastguard Worker return (aAddress->mFields.m32[2] == htonl(0x000000ff) && aAddress->mFields.m16[6] == htons(0xfe00) &&
1327*4a64e381SAndroid Build Coastguard Worker aAddress->mFields.m8[14] < kAloc16Mask && (aAddress->mFields.m8[14] & kRloc16ReservedBitMask) == 0);
1328*4a64e381SAndroid Build Coastguard Worker }
1329*4a64e381SAndroid Build Coastguard Worker
HandleDiagnosticGetResponse(otError aError,otMessage * aMessage,const otMessageInfo * aMessageInfo)1330*4a64e381SAndroid Build Coastguard Worker void UbusServer::HandleDiagnosticGetResponse(otError aError, otMessage *aMessage, const otMessageInfo *aMessageInfo)
1331*4a64e381SAndroid Build Coastguard Worker {
1332*4a64e381SAndroid Build Coastguard Worker uint16_t rloc16;
1333*4a64e381SAndroid Build Coastguard Worker uint16_t sockRloc16 = 0;
1334*4a64e381SAndroid Build Coastguard Worker void *jsonArray = nullptr;
1335*4a64e381SAndroid Build Coastguard Worker void *jsonItem = nullptr;
1336*4a64e381SAndroid Build Coastguard Worker char xrloc[10];
1337*4a64e381SAndroid Build Coastguard Worker otNetworkDiagTlv diagTlv;
1338*4a64e381SAndroid Build Coastguard Worker otNetworkDiagIterator iterator = OT_NETWORK_DIAGNOSTIC_ITERATOR_INIT;
1339*4a64e381SAndroid Build Coastguard Worker
1340*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(aError);
1341*4a64e381SAndroid Build Coastguard Worker
1342*4a64e381SAndroid Build Coastguard Worker char networkdata[20];
1343*4a64e381SAndroid Build Coastguard Worker sprintf(networkdata, "networkdata%d", sBufNum);
1344*4a64e381SAndroid Build Coastguard Worker sJsonUri = blobmsg_open_table(&mNetworkdataBuf, networkdata);
1345*4a64e381SAndroid Build Coastguard Worker sBufNum++;
1346*4a64e381SAndroid Build Coastguard Worker
1347*4a64e381SAndroid Build Coastguard Worker if (IsRoutingLocator(&aMessageInfo->mSockAddr))
1348*4a64e381SAndroid Build Coastguard Worker {
1349*4a64e381SAndroid Build Coastguard Worker sockRloc16 = ntohs(aMessageInfo->mPeerAddr.mFields.m16[7]);
1350*4a64e381SAndroid Build Coastguard Worker sprintf(xrloc, "0x%04x", sockRloc16);
1351*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mNetworkdataBuf, "rloc", xrloc);
1352*4a64e381SAndroid Build Coastguard Worker }
1353*4a64e381SAndroid Build Coastguard Worker
1354*4a64e381SAndroid Build Coastguard Worker while (otThreadGetNextDiagnosticTlv(aMessage, &iterator, &diagTlv) == OT_ERROR_NONE)
1355*4a64e381SAndroid Build Coastguard Worker {
1356*4a64e381SAndroid Build Coastguard Worker switch (diagTlv.mType)
1357*4a64e381SAndroid Build Coastguard Worker {
1358*4a64e381SAndroid Build Coastguard Worker case OT_NETWORK_DIAGNOSTIC_TLV_ROUTE:
1359*4a64e381SAndroid Build Coastguard Worker {
1360*4a64e381SAndroid Build Coastguard Worker const otNetworkDiagRoute &route = diagTlv.mData.mRoute;
1361*4a64e381SAndroid Build Coastguard Worker
1362*4a64e381SAndroid Build Coastguard Worker jsonArray = blobmsg_open_array(&mNetworkdataBuf, "routedata");
1363*4a64e381SAndroid Build Coastguard Worker
1364*4a64e381SAndroid Build Coastguard Worker for (uint16_t i = 0; i < route.mRouteCount; ++i)
1365*4a64e381SAndroid Build Coastguard Worker {
1366*4a64e381SAndroid Build Coastguard Worker uint8_t in, out;
1367*4a64e381SAndroid Build Coastguard Worker in = route.mRouteData[i].mLinkQualityIn;
1368*4a64e381SAndroid Build Coastguard Worker out = route.mRouteData[i].mLinkQualityOut;
1369*4a64e381SAndroid Build Coastguard Worker if (in != 0 && out != 0)
1370*4a64e381SAndroid Build Coastguard Worker {
1371*4a64e381SAndroid Build Coastguard Worker jsonItem = blobmsg_open_table(&mNetworkdataBuf, "router");
1372*4a64e381SAndroid Build Coastguard Worker rloc16 = route.mRouteData[i].mRouterId << 10;
1373*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u32(&mNetworkdataBuf, "routerid", route.mRouteData[i].mRouterId);
1374*4a64e381SAndroid Build Coastguard Worker sprintf(xrloc, "0x%04x", rloc16);
1375*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mNetworkdataBuf, "rloc", xrloc);
1376*4a64e381SAndroid Build Coastguard Worker blobmsg_close_table(&mNetworkdataBuf, jsonItem);
1377*4a64e381SAndroid Build Coastguard Worker }
1378*4a64e381SAndroid Build Coastguard Worker }
1379*4a64e381SAndroid Build Coastguard Worker blobmsg_close_array(&mNetworkdataBuf, jsonArray);
1380*4a64e381SAndroid Build Coastguard Worker break;
1381*4a64e381SAndroid Build Coastguard Worker }
1382*4a64e381SAndroid Build Coastguard Worker
1383*4a64e381SAndroid Build Coastguard Worker case OT_NETWORK_DIAGNOSTIC_TLV_CHILD_TABLE:
1384*4a64e381SAndroid Build Coastguard Worker {
1385*4a64e381SAndroid Build Coastguard Worker jsonArray = blobmsg_open_array(&mNetworkdataBuf, "childdata");
1386*4a64e381SAndroid Build Coastguard Worker for (uint16_t i = 0; i < diagTlv.mData.mChildTable.mCount; ++i)
1387*4a64e381SAndroid Build Coastguard Worker {
1388*4a64e381SAndroid Build Coastguard Worker enum
1389*4a64e381SAndroid Build Coastguard Worker {
1390*4a64e381SAndroid Build Coastguard Worker kModeRxOnWhenIdle = 1 << 3, ///< If the device has its receiver on when not transmitting.
1391*4a64e381SAndroid Build Coastguard Worker kModeFullThreadDevice = 1 << 1, ///< If the device is an FTD.
1392*4a64e381SAndroid Build Coastguard Worker kModeFullNetworkData = 1 << 0, ///< If the device requires the full Network Data.
1393*4a64e381SAndroid Build Coastguard Worker };
1394*4a64e381SAndroid Build Coastguard Worker const otNetworkDiagChildEntry &entry = diagTlv.mData.mChildTable.mTable[i];
1395*4a64e381SAndroid Build Coastguard Worker
1396*4a64e381SAndroid Build Coastguard Worker uint8_t mode = 0;
1397*4a64e381SAndroid Build Coastguard Worker
1398*4a64e381SAndroid Build Coastguard Worker jsonItem = blobmsg_open_table(&mNetworkdataBuf, "child");
1399*4a64e381SAndroid Build Coastguard Worker sprintf(xrloc, "0x%04x", (sockRloc16 | entry.mChildId));
1400*4a64e381SAndroid Build Coastguard Worker blobmsg_add_string(&mNetworkdataBuf, "rloc", xrloc);
1401*4a64e381SAndroid Build Coastguard Worker
1402*4a64e381SAndroid Build Coastguard Worker mode = (entry.mMode.mRxOnWhenIdle ? kModeRxOnWhenIdle : 0) |
1403*4a64e381SAndroid Build Coastguard Worker (entry.mMode.mDeviceType ? kModeFullThreadDevice : 0) |
1404*4a64e381SAndroid Build Coastguard Worker (entry.mMode.mNetworkData ? kModeFullNetworkData : 0);
1405*4a64e381SAndroid Build Coastguard Worker blobmsg_add_u16(&mNetworkdataBuf, "mode", mode);
1406*4a64e381SAndroid Build Coastguard Worker blobmsg_close_table(&mNetworkdataBuf, jsonItem);
1407*4a64e381SAndroid Build Coastguard Worker }
1408*4a64e381SAndroid Build Coastguard Worker blobmsg_close_array(&mNetworkdataBuf, jsonArray);
1409*4a64e381SAndroid Build Coastguard Worker break;
1410*4a64e381SAndroid Build Coastguard Worker }
1411*4a64e381SAndroid Build Coastguard Worker
1412*4a64e381SAndroid Build Coastguard Worker default:
1413*4a64e381SAndroid Build Coastguard Worker // Ignore other network diagnostics data.
1414*4a64e381SAndroid Build Coastguard Worker break;
1415*4a64e381SAndroid Build Coastguard Worker }
1416*4a64e381SAndroid Build Coastguard Worker }
1417*4a64e381SAndroid Build Coastguard Worker
1418*4a64e381SAndroid Build Coastguard Worker blobmsg_close_table(&mNetworkdataBuf, sJsonUri);
1419*4a64e381SAndroid Build Coastguard Worker
1420*4a64e381SAndroid Build Coastguard Worker exit:
1421*4a64e381SAndroid Build Coastguard Worker if (aError != OT_ERROR_NONE)
1422*4a64e381SAndroid Build Coastguard Worker {
1423*4a64e381SAndroid Build Coastguard Worker otbrLogWarning("Failed to receive diagnostic response: %s", otThreadErrorToString(aError));
1424*4a64e381SAndroid Build Coastguard Worker }
1425*4a64e381SAndroid Build Coastguard Worker }
1426*4a64e381SAndroid Build Coastguard Worker
UbusSetInformation(struct ubus_context * aContext,struct ubus_object * aObj,struct ubus_request_data * aRequest,const char * aMethod,struct blob_attr * aMsg,const char * aAction)1427*4a64e381SAndroid Build Coastguard Worker int UbusServer::UbusSetInformation(struct ubus_context *aContext,
1428*4a64e381SAndroid Build Coastguard Worker struct ubus_object *aObj,
1429*4a64e381SAndroid Build Coastguard Worker struct ubus_request_data *aRequest,
1430*4a64e381SAndroid Build Coastguard Worker const char *aMethod,
1431*4a64e381SAndroid Build Coastguard Worker struct blob_attr *aMsg,
1432*4a64e381SAndroid Build Coastguard Worker const char *aAction)
1433*4a64e381SAndroid Build Coastguard Worker {
1434*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aObj);
1435*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMethod);
1436*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMsg);
1437*4a64e381SAndroid Build Coastguard Worker
1438*4a64e381SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
1439*4a64e381SAndroid Build Coastguard Worker
1440*4a64e381SAndroid Build Coastguard Worker blob_buf_init(&mBuf, 0);
1441*4a64e381SAndroid Build Coastguard Worker
1442*4a64e381SAndroid Build Coastguard Worker mHostMutex->lock();
1443*4a64e381SAndroid Build Coastguard Worker if (!strcmp(aAction, "networkname"))
1444*4a64e381SAndroid Build Coastguard Worker {
1445*4a64e381SAndroid Build Coastguard Worker struct blob_attr *tb[SET_NETWORK_MAX];
1446*4a64e381SAndroid Build Coastguard Worker
1447*4a64e381SAndroid Build Coastguard Worker blobmsg_parse(setNetworknamePolicy, SET_NETWORK_MAX, tb, blob_data(aMsg), blob_len(aMsg));
1448*4a64e381SAndroid Build Coastguard Worker if (tb[SETNETWORK] != nullptr)
1449*4a64e381SAndroid Build Coastguard Worker {
1450*4a64e381SAndroid Build Coastguard Worker char *newName = blobmsg_get_string(tb[SETNETWORK]);
1451*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = otThreadSetNetworkName(mHost->GetInstance(), newName));
1452*4a64e381SAndroid Build Coastguard Worker }
1453*4a64e381SAndroid Build Coastguard Worker }
1454*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "channel"))
1455*4a64e381SAndroid Build Coastguard Worker {
1456*4a64e381SAndroid Build Coastguard Worker struct blob_attr *tb[SET_NETWORK_MAX];
1457*4a64e381SAndroid Build Coastguard Worker
1458*4a64e381SAndroid Build Coastguard Worker blobmsg_parse(setChannelPolicy, SET_NETWORK_MAX, tb, blob_data(aMsg), blob_len(aMsg));
1459*4a64e381SAndroid Build Coastguard Worker if (tb[SETNETWORK] != nullptr)
1460*4a64e381SAndroid Build Coastguard Worker {
1461*4a64e381SAndroid Build Coastguard Worker uint32_t channel = blobmsg_get_u32(tb[SETNETWORK]);
1462*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = otLinkSetChannel(mHost->GetInstance(), static_cast<uint8_t>(channel)));
1463*4a64e381SAndroid Build Coastguard Worker }
1464*4a64e381SAndroid Build Coastguard Worker }
1465*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "panid"))
1466*4a64e381SAndroid Build Coastguard Worker {
1467*4a64e381SAndroid Build Coastguard Worker struct blob_attr *tb[SET_NETWORK_MAX];
1468*4a64e381SAndroid Build Coastguard Worker
1469*4a64e381SAndroid Build Coastguard Worker blobmsg_parse(setPanIdPolicy, SET_NETWORK_MAX, tb, blob_data(aMsg), blob_len(aMsg));
1470*4a64e381SAndroid Build Coastguard Worker if (tb[SETNETWORK] != nullptr)
1471*4a64e381SAndroid Build Coastguard Worker {
1472*4a64e381SAndroid Build Coastguard Worker long value;
1473*4a64e381SAndroid Build Coastguard Worker char *panid = blobmsg_get_string(tb[SETNETWORK]);
1474*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = ParseLong(panid, value));
1475*4a64e381SAndroid Build Coastguard Worker error = otLinkSetPanId(mHost->GetInstance(), static_cast<otPanId>(value));
1476*4a64e381SAndroid Build Coastguard Worker }
1477*4a64e381SAndroid Build Coastguard Worker }
1478*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "networkkey"))
1479*4a64e381SAndroid Build Coastguard Worker {
1480*4a64e381SAndroid Build Coastguard Worker struct blob_attr *tb[SET_NETWORK_MAX];
1481*4a64e381SAndroid Build Coastguard Worker
1482*4a64e381SAndroid Build Coastguard Worker blobmsg_parse(setNetworkkeyPolicy, SET_NETWORK_MAX, tb, blob_data(aMsg), blob_len(aMsg));
1483*4a64e381SAndroid Build Coastguard Worker if (tb[SETNETWORK] != nullptr)
1484*4a64e381SAndroid Build Coastguard Worker {
1485*4a64e381SAndroid Build Coastguard Worker otNetworkKey key;
1486*4a64e381SAndroid Build Coastguard Worker char *networkkey = blobmsg_get_string(tb[SETNETWORK]);
1487*4a64e381SAndroid Build Coastguard Worker
1488*4a64e381SAndroid Build Coastguard Worker VerifyOrExit(Hex2Bin(networkkey, key.m8, sizeof(key.m8)) == OT_NETWORK_KEY_SIZE, error = OT_ERROR_PARSE);
1489*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = otThreadSetNetworkKey(mHost->GetInstance(), &key));
1490*4a64e381SAndroid Build Coastguard Worker }
1491*4a64e381SAndroid Build Coastguard Worker }
1492*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "pskc"))
1493*4a64e381SAndroid Build Coastguard Worker {
1494*4a64e381SAndroid Build Coastguard Worker struct blob_attr *tb[SET_NETWORK_MAX];
1495*4a64e381SAndroid Build Coastguard Worker
1496*4a64e381SAndroid Build Coastguard Worker blobmsg_parse(setPskcPolicy, SET_NETWORK_MAX, tb, blob_data(aMsg), blob_len(aMsg));
1497*4a64e381SAndroid Build Coastguard Worker if (tb[SETNETWORK] != nullptr)
1498*4a64e381SAndroid Build Coastguard Worker {
1499*4a64e381SAndroid Build Coastguard Worker otPskc pskc;
1500*4a64e381SAndroid Build Coastguard Worker
1501*4a64e381SAndroid Build Coastguard Worker VerifyOrExit(Hex2Bin(blobmsg_get_string(tb[SETNETWORK]), pskc.m8, sizeof(pskc)) == OT_PSKC_MAX_SIZE,
1502*4a64e381SAndroid Build Coastguard Worker error = OT_ERROR_PARSE);
1503*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = otThreadSetPskc(mHost->GetInstance(), &pskc));
1504*4a64e381SAndroid Build Coastguard Worker }
1505*4a64e381SAndroid Build Coastguard Worker }
1506*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "extpanid"))
1507*4a64e381SAndroid Build Coastguard Worker {
1508*4a64e381SAndroid Build Coastguard Worker struct blob_attr *tb[SET_NETWORK_MAX];
1509*4a64e381SAndroid Build Coastguard Worker
1510*4a64e381SAndroid Build Coastguard Worker blobmsg_parse(setExtPanIdPolicy, SET_NETWORK_MAX, tb, blob_data(aMsg), blob_len(aMsg));
1511*4a64e381SAndroid Build Coastguard Worker if (tb[SETNETWORK] != nullptr)
1512*4a64e381SAndroid Build Coastguard Worker {
1513*4a64e381SAndroid Build Coastguard Worker otExtendedPanId extPanId;
1514*4a64e381SAndroid Build Coastguard Worker char *input = blobmsg_get_string(tb[SETNETWORK]);
1515*4a64e381SAndroid Build Coastguard Worker VerifyOrExit(Hex2Bin(input, extPanId.m8, sizeof(extPanId)) >= 0, error = OT_ERROR_PARSE);
1516*4a64e381SAndroid Build Coastguard Worker error = otThreadSetExtendedPanId(mHost->GetInstance(), &extPanId);
1517*4a64e381SAndroid Build Coastguard Worker }
1518*4a64e381SAndroid Build Coastguard Worker }
1519*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "mode"))
1520*4a64e381SAndroid Build Coastguard Worker {
1521*4a64e381SAndroid Build Coastguard Worker otLinkModeConfig linkMode;
1522*4a64e381SAndroid Build Coastguard Worker struct blob_attr *tb[SET_NETWORK_MAX];
1523*4a64e381SAndroid Build Coastguard Worker
1524*4a64e381SAndroid Build Coastguard Worker blobmsg_parse(setModePolicy, SET_NETWORK_MAX, tb, blob_data(aMsg), blob_len(aMsg));
1525*4a64e381SAndroid Build Coastguard Worker if (tb[SETNETWORK] != nullptr)
1526*4a64e381SAndroid Build Coastguard Worker {
1527*4a64e381SAndroid Build Coastguard Worker char *inputMode = blobmsg_get_string(tb[SETNETWORK]);
1528*4a64e381SAndroid Build Coastguard Worker for (char *ch = inputMode; *ch != '\0'; ch++)
1529*4a64e381SAndroid Build Coastguard Worker {
1530*4a64e381SAndroid Build Coastguard Worker switch (*ch)
1531*4a64e381SAndroid Build Coastguard Worker {
1532*4a64e381SAndroid Build Coastguard Worker case 'r':
1533*4a64e381SAndroid Build Coastguard Worker linkMode.mRxOnWhenIdle = 1;
1534*4a64e381SAndroid Build Coastguard Worker break;
1535*4a64e381SAndroid Build Coastguard Worker
1536*4a64e381SAndroid Build Coastguard Worker case 'd':
1537*4a64e381SAndroid Build Coastguard Worker linkMode.mDeviceType = 1;
1538*4a64e381SAndroid Build Coastguard Worker break;
1539*4a64e381SAndroid Build Coastguard Worker
1540*4a64e381SAndroid Build Coastguard Worker case 'n':
1541*4a64e381SAndroid Build Coastguard Worker linkMode.mNetworkData = 1;
1542*4a64e381SAndroid Build Coastguard Worker break;
1543*4a64e381SAndroid Build Coastguard Worker
1544*4a64e381SAndroid Build Coastguard Worker default:
1545*4a64e381SAndroid Build Coastguard Worker ExitNow(error = OT_ERROR_PARSE);
1546*4a64e381SAndroid Build Coastguard Worker }
1547*4a64e381SAndroid Build Coastguard Worker }
1548*4a64e381SAndroid Build Coastguard Worker
1549*4a64e381SAndroid Build Coastguard Worker SuccessOrExit(error = otThreadSetLinkMode(mHost->GetInstance(), linkMode));
1550*4a64e381SAndroid Build Coastguard Worker }
1551*4a64e381SAndroid Build Coastguard Worker }
1552*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "macfilteradd"))
1553*4a64e381SAndroid Build Coastguard Worker {
1554*4a64e381SAndroid Build Coastguard Worker struct blob_attr *tb[SET_NETWORK_MAX];
1555*4a64e381SAndroid Build Coastguard Worker otExtAddress extAddr;
1556*4a64e381SAndroid Build Coastguard Worker
1557*4a64e381SAndroid Build Coastguard Worker blobmsg_parse(macfilterAddPolicy, SET_NETWORK_MAX, tb, blob_data(aMsg), blob_len(aMsg));
1558*4a64e381SAndroid Build Coastguard Worker if (tb[SETNETWORK] != nullptr)
1559*4a64e381SAndroid Build Coastguard Worker {
1560*4a64e381SAndroid Build Coastguard Worker char *addr = blobmsg_get_string(tb[SETNETWORK]);
1561*4a64e381SAndroid Build Coastguard Worker
1562*4a64e381SAndroid Build Coastguard Worker VerifyOrExit(Hex2Bin(addr, extAddr.m8, OT_EXT_ADDRESS_SIZE) == OT_EXT_ADDRESS_SIZE, error = OT_ERROR_PARSE);
1563*4a64e381SAndroid Build Coastguard Worker
1564*4a64e381SAndroid Build Coastguard Worker error = otLinkFilterAddAddress(mHost->GetInstance(), &extAddr);
1565*4a64e381SAndroid Build Coastguard Worker
1566*4a64e381SAndroid Build Coastguard Worker VerifyOrExit(error == OT_ERROR_NONE || error == OT_ERROR_ALREADY);
1567*4a64e381SAndroid Build Coastguard Worker }
1568*4a64e381SAndroid Build Coastguard Worker }
1569*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "macfilterremove"))
1570*4a64e381SAndroid Build Coastguard Worker {
1571*4a64e381SAndroid Build Coastguard Worker struct blob_attr *tb[SET_NETWORK_MAX];
1572*4a64e381SAndroid Build Coastguard Worker otExtAddress extAddr;
1573*4a64e381SAndroid Build Coastguard Worker
1574*4a64e381SAndroid Build Coastguard Worker blobmsg_parse(macfilterRemovePolicy, SET_NETWORK_MAX, tb, blob_data(aMsg), blob_len(aMsg));
1575*4a64e381SAndroid Build Coastguard Worker if (tb[SETNETWORK] != nullptr)
1576*4a64e381SAndroid Build Coastguard Worker {
1577*4a64e381SAndroid Build Coastguard Worker char *addr = blobmsg_get_string(tb[SETNETWORK]);
1578*4a64e381SAndroid Build Coastguard Worker VerifyOrExit(Hex2Bin(addr, extAddr.m8, OT_EXT_ADDRESS_SIZE) == OT_EXT_ADDRESS_SIZE, error = OT_ERROR_PARSE);
1579*4a64e381SAndroid Build Coastguard Worker
1580*4a64e381SAndroid Build Coastguard Worker otLinkFilterRemoveAddress(mHost->GetInstance(), &extAddr);
1581*4a64e381SAndroid Build Coastguard Worker }
1582*4a64e381SAndroid Build Coastguard Worker }
1583*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "macfiltersetstate"))
1584*4a64e381SAndroid Build Coastguard Worker {
1585*4a64e381SAndroid Build Coastguard Worker struct blob_attr *tb[SET_NETWORK_MAX];
1586*4a64e381SAndroid Build Coastguard Worker
1587*4a64e381SAndroid Build Coastguard Worker blobmsg_parse(macfilterSetStatePolicy, SET_NETWORK_MAX, tb, blob_data(aMsg), blob_len(aMsg));
1588*4a64e381SAndroid Build Coastguard Worker if (tb[SETNETWORK] != nullptr)
1589*4a64e381SAndroid Build Coastguard Worker {
1590*4a64e381SAndroid Build Coastguard Worker char *state = blobmsg_get_string(tb[SETNETWORK]);
1591*4a64e381SAndroid Build Coastguard Worker
1592*4a64e381SAndroid Build Coastguard Worker if (strcmp(state, "disable") == 0)
1593*4a64e381SAndroid Build Coastguard Worker {
1594*4a64e381SAndroid Build Coastguard Worker otLinkFilterSetAddressMode(mHost->GetInstance(), OT_MAC_FILTER_ADDRESS_MODE_DISABLED);
1595*4a64e381SAndroid Build Coastguard Worker }
1596*4a64e381SAndroid Build Coastguard Worker else if (strcmp(state, "allowlist") == 0)
1597*4a64e381SAndroid Build Coastguard Worker {
1598*4a64e381SAndroid Build Coastguard Worker otLinkFilterSetAddressMode(mHost->GetInstance(), OT_MAC_FILTER_ADDRESS_MODE_ALLOWLIST);
1599*4a64e381SAndroid Build Coastguard Worker }
1600*4a64e381SAndroid Build Coastguard Worker else if (strcmp(state, "denylist") == 0)
1601*4a64e381SAndroid Build Coastguard Worker {
1602*4a64e381SAndroid Build Coastguard Worker otLinkFilterSetAddressMode(mHost->GetInstance(), OT_MAC_FILTER_ADDRESS_MODE_DENYLIST);
1603*4a64e381SAndroid Build Coastguard Worker }
1604*4a64e381SAndroid Build Coastguard Worker }
1605*4a64e381SAndroid Build Coastguard Worker }
1606*4a64e381SAndroid Build Coastguard Worker else if (!strcmp(aAction, "macfilterclear"))
1607*4a64e381SAndroid Build Coastguard Worker {
1608*4a64e381SAndroid Build Coastguard Worker otLinkFilterClearAddresses(mHost->GetInstance());
1609*4a64e381SAndroid Build Coastguard Worker }
1610*4a64e381SAndroid Build Coastguard Worker else
1611*4a64e381SAndroid Build Coastguard Worker {
1612*4a64e381SAndroid Build Coastguard Worker perror("invalid argument in get information ubus\n");
1613*4a64e381SAndroid Build Coastguard Worker }
1614*4a64e381SAndroid Build Coastguard Worker
1615*4a64e381SAndroid Build Coastguard Worker exit:
1616*4a64e381SAndroid Build Coastguard Worker mHostMutex->unlock();
1617*4a64e381SAndroid Build Coastguard Worker AppendResult(error, aContext, aRequest);
1618*4a64e381SAndroid Build Coastguard Worker return 0;
1619*4a64e381SAndroid Build Coastguard Worker }
1620*4a64e381SAndroid Build Coastguard Worker
GetState(otInstance * aInstance,char * aState)1621*4a64e381SAndroid Build Coastguard Worker void UbusServer::GetState(otInstance *aInstance, char *aState)
1622*4a64e381SAndroid Build Coastguard Worker {
1623*4a64e381SAndroid Build Coastguard Worker switch (otThreadGetDeviceRole(aInstance))
1624*4a64e381SAndroid Build Coastguard Worker {
1625*4a64e381SAndroid Build Coastguard Worker case OT_DEVICE_ROLE_DISABLED:
1626*4a64e381SAndroid Build Coastguard Worker strcpy(aState, "disabled");
1627*4a64e381SAndroid Build Coastguard Worker break;
1628*4a64e381SAndroid Build Coastguard Worker
1629*4a64e381SAndroid Build Coastguard Worker case OT_DEVICE_ROLE_DETACHED:
1630*4a64e381SAndroid Build Coastguard Worker strcpy(aState, "detached");
1631*4a64e381SAndroid Build Coastguard Worker break;
1632*4a64e381SAndroid Build Coastguard Worker
1633*4a64e381SAndroid Build Coastguard Worker case OT_DEVICE_ROLE_CHILD:
1634*4a64e381SAndroid Build Coastguard Worker strcpy(aState, "child");
1635*4a64e381SAndroid Build Coastguard Worker break;
1636*4a64e381SAndroid Build Coastguard Worker
1637*4a64e381SAndroid Build Coastguard Worker case OT_DEVICE_ROLE_ROUTER:
1638*4a64e381SAndroid Build Coastguard Worker strcpy(aState, "router");
1639*4a64e381SAndroid Build Coastguard Worker break;
1640*4a64e381SAndroid Build Coastguard Worker
1641*4a64e381SAndroid Build Coastguard Worker case OT_DEVICE_ROLE_LEADER:
1642*4a64e381SAndroid Build Coastguard Worker strcpy(aState, "leader");
1643*4a64e381SAndroid Build Coastguard Worker break;
1644*4a64e381SAndroid Build Coastguard Worker default:
1645*4a64e381SAndroid Build Coastguard Worker strcpy(aState, "invalid aState");
1646*4a64e381SAndroid Build Coastguard Worker break;
1647*4a64e381SAndroid Build Coastguard Worker }
1648*4a64e381SAndroid Build Coastguard Worker }
1649*4a64e381SAndroid Build Coastguard Worker
UbusAddFd()1650*4a64e381SAndroid Build Coastguard Worker void UbusServer::UbusAddFd()
1651*4a64e381SAndroid Build Coastguard Worker {
1652*4a64e381SAndroid Build Coastguard Worker // ubus library function
1653*4a64e381SAndroid Build Coastguard Worker ubus_add_uloop(mContext);
1654*4a64e381SAndroid Build Coastguard Worker
1655*4a64e381SAndroid Build Coastguard Worker #ifdef FD_CLOEXEC
1656*4a64e381SAndroid Build Coastguard Worker fcntl(mContext->sock.fd, F_SETFD, fcntl(mContext->sock.fd, F_GETFD) | FD_CLOEXEC);
1657*4a64e381SAndroid Build Coastguard Worker #endif
1658*4a64e381SAndroid Build Coastguard Worker }
1659*4a64e381SAndroid Build Coastguard Worker
UbusReconnTimer(struct uloop_timeout * aTimeout)1660*4a64e381SAndroid Build Coastguard Worker void UbusServer::UbusReconnTimer(struct uloop_timeout *aTimeout)
1661*4a64e381SAndroid Build Coastguard Worker {
1662*4a64e381SAndroid Build Coastguard Worker GetInstance().UbusReconnTimerDetail(aTimeout);
1663*4a64e381SAndroid Build Coastguard Worker }
1664*4a64e381SAndroid Build Coastguard Worker
UbusReconnTimerDetail(struct uloop_timeout * aTimeout)1665*4a64e381SAndroid Build Coastguard Worker void UbusServer::UbusReconnTimerDetail(struct uloop_timeout *aTimeout)
1666*4a64e381SAndroid Build Coastguard Worker {
1667*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aTimeout);
1668*4a64e381SAndroid Build Coastguard Worker
1669*4a64e381SAndroid Build Coastguard Worker static struct uloop_timeout retry = {
1670*4a64e381SAndroid Build Coastguard Worker list : {},
1671*4a64e381SAndroid Build Coastguard Worker pending : false,
1672*4a64e381SAndroid Build Coastguard Worker cb : UbusReconnTimer,
1673*4a64e381SAndroid Build Coastguard Worker time : {},
1674*4a64e381SAndroid Build Coastguard Worker };
1675*4a64e381SAndroid Build Coastguard Worker int time = 2;
1676*4a64e381SAndroid Build Coastguard Worker
1677*4a64e381SAndroid Build Coastguard Worker if (ubus_reconnect(mContext, mSockPath) != 0)
1678*4a64e381SAndroid Build Coastguard Worker {
1679*4a64e381SAndroid Build Coastguard Worker uloop_timeout_set(&retry, time * 1000);
1680*4a64e381SAndroid Build Coastguard Worker return;
1681*4a64e381SAndroid Build Coastguard Worker }
1682*4a64e381SAndroid Build Coastguard Worker
1683*4a64e381SAndroid Build Coastguard Worker UbusAddFd();
1684*4a64e381SAndroid Build Coastguard Worker }
1685*4a64e381SAndroid Build Coastguard Worker
UbusConnectionLost(struct ubus_context * aContext)1686*4a64e381SAndroid Build Coastguard Worker void UbusServer::UbusConnectionLost(struct ubus_context *aContext)
1687*4a64e381SAndroid Build Coastguard Worker {
1688*4a64e381SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aContext);
1689*4a64e381SAndroid Build Coastguard Worker
1690*4a64e381SAndroid Build Coastguard Worker UbusReconnTimer(nullptr);
1691*4a64e381SAndroid Build Coastguard Worker }
1692*4a64e381SAndroid Build Coastguard Worker
DisplayUbusInit(const char * aPath)1693*4a64e381SAndroid Build Coastguard Worker int UbusServer::DisplayUbusInit(const char *aPath)
1694*4a64e381SAndroid Build Coastguard Worker {
1695*4a64e381SAndroid Build Coastguard Worker uloop_init();
1696*4a64e381SAndroid Build Coastguard Worker signal(SIGPIPE, SIG_IGN);
1697*4a64e381SAndroid Build Coastguard Worker
1698*4a64e381SAndroid Build Coastguard Worker mSockPath = aPath;
1699*4a64e381SAndroid Build Coastguard Worker
1700*4a64e381SAndroid Build Coastguard Worker mContext = ubus_connect(aPath);
1701*4a64e381SAndroid Build Coastguard Worker if (!mContext)
1702*4a64e381SAndroid Build Coastguard Worker {
1703*4a64e381SAndroid Build Coastguard Worker otbrLogErr("Ubus connect failed");
1704*4a64e381SAndroid Build Coastguard Worker return -1;
1705*4a64e381SAndroid Build Coastguard Worker }
1706*4a64e381SAndroid Build Coastguard Worker
1707*4a64e381SAndroid Build Coastguard Worker otbrLogInfo("Connected as %08x\n", mContext->local_id);
1708*4a64e381SAndroid Build Coastguard Worker mContext->connection_lost = UbusConnectionLost;
1709*4a64e381SAndroid Build Coastguard Worker
1710*4a64e381SAndroid Build Coastguard Worker /* file description */
1711*4a64e381SAndroid Build Coastguard Worker UbusAddFd();
1712*4a64e381SAndroid Build Coastguard Worker
1713*4a64e381SAndroid Build Coastguard Worker /* Add a object */
1714*4a64e381SAndroid Build Coastguard Worker if (ubus_add_object(mContext, &otbr) != 0)
1715*4a64e381SAndroid Build Coastguard Worker {
1716*4a64e381SAndroid Build Coastguard Worker otbrLogErr("Ubus add obj failed");
1717*4a64e381SAndroid Build Coastguard Worker return -1;
1718*4a64e381SAndroid Build Coastguard Worker }
1719*4a64e381SAndroid Build Coastguard Worker
1720*4a64e381SAndroid Build Coastguard Worker return 0;
1721*4a64e381SAndroid Build Coastguard Worker }
1722*4a64e381SAndroid Build Coastguard Worker
DisplayUbusDone(void)1723*4a64e381SAndroid Build Coastguard Worker void UbusServer::DisplayUbusDone(void)
1724*4a64e381SAndroid Build Coastguard Worker {
1725*4a64e381SAndroid Build Coastguard Worker if (mContext)
1726*4a64e381SAndroid Build Coastguard Worker {
1727*4a64e381SAndroid Build Coastguard Worker ubus_free(mContext);
1728*4a64e381SAndroid Build Coastguard Worker mContext = nullptr;
1729*4a64e381SAndroid Build Coastguard Worker }
1730*4a64e381SAndroid Build Coastguard Worker }
1731*4a64e381SAndroid Build Coastguard Worker
InstallUbusObject(void)1732*4a64e381SAndroid Build Coastguard Worker void UbusServer::InstallUbusObject(void)
1733*4a64e381SAndroid Build Coastguard Worker {
1734*4a64e381SAndroid Build Coastguard Worker char *path = nullptr;
1735*4a64e381SAndroid Build Coastguard Worker
1736*4a64e381SAndroid Build Coastguard Worker if (-1 == DisplayUbusInit(path))
1737*4a64e381SAndroid Build Coastguard Worker {
1738*4a64e381SAndroid Build Coastguard Worker otbrLogErr("Ubus connect failed");
1739*4a64e381SAndroid Build Coastguard Worker return;
1740*4a64e381SAndroid Build Coastguard Worker }
1741*4a64e381SAndroid Build Coastguard Worker
1742*4a64e381SAndroid Build Coastguard Worker otbrLogInfo("Uloop run");
1743*4a64e381SAndroid Build Coastguard Worker uloop_run();
1744*4a64e381SAndroid Build Coastguard Worker
1745*4a64e381SAndroid Build Coastguard Worker DisplayUbusDone();
1746*4a64e381SAndroid Build Coastguard Worker
1747*4a64e381SAndroid Build Coastguard Worker uloop_done();
1748*4a64e381SAndroid Build Coastguard Worker }
1749*4a64e381SAndroid Build Coastguard Worker
ParseLong(char * aString,long & aLong)1750*4a64e381SAndroid Build Coastguard Worker otError UbusServer::ParseLong(char *aString, long &aLong)
1751*4a64e381SAndroid Build Coastguard Worker {
1752*4a64e381SAndroid Build Coastguard Worker char *endptr;
1753*4a64e381SAndroid Build Coastguard Worker aLong = strtol(aString, &endptr, 0);
1754*4a64e381SAndroid Build Coastguard Worker return (*endptr == '\0') ? OT_ERROR_NONE : OT_ERROR_PARSE;
1755*4a64e381SAndroid Build Coastguard Worker }
1756*4a64e381SAndroid Build Coastguard Worker
Hex2Bin(const char * aHex,uint8_t * aBin,uint16_t aBinLength)1757*4a64e381SAndroid Build Coastguard Worker int UbusServer::Hex2Bin(const char *aHex, uint8_t *aBin, uint16_t aBinLength)
1758*4a64e381SAndroid Build Coastguard Worker {
1759*4a64e381SAndroid Build Coastguard Worker size_t hexLength = strlen(aHex);
1760*4a64e381SAndroid Build Coastguard Worker const char *hexEnd = aHex + hexLength;
1761*4a64e381SAndroid Build Coastguard Worker uint8_t *cur = aBin;
1762*4a64e381SAndroid Build Coastguard Worker uint8_t numChars = hexLength & 1;
1763*4a64e381SAndroid Build Coastguard Worker uint8_t byte = 0;
1764*4a64e381SAndroid Build Coastguard Worker int rval;
1765*4a64e381SAndroid Build Coastguard Worker
1766*4a64e381SAndroid Build Coastguard Worker VerifyOrExit((hexLength + 1) / 2 <= aBinLength, rval = -1);
1767*4a64e381SAndroid Build Coastguard Worker
1768*4a64e381SAndroid Build Coastguard Worker while (aHex < hexEnd)
1769*4a64e381SAndroid Build Coastguard Worker {
1770*4a64e381SAndroid Build Coastguard Worker if ('A' <= *aHex && *aHex <= 'F')
1771*4a64e381SAndroid Build Coastguard Worker {
1772*4a64e381SAndroid Build Coastguard Worker byte |= 10 + (*aHex - 'A');
1773*4a64e381SAndroid Build Coastguard Worker }
1774*4a64e381SAndroid Build Coastguard Worker else if ('a' <= *aHex && *aHex <= 'f')
1775*4a64e381SAndroid Build Coastguard Worker {
1776*4a64e381SAndroid Build Coastguard Worker byte |= 10 + (*aHex - 'a');
1777*4a64e381SAndroid Build Coastguard Worker }
1778*4a64e381SAndroid Build Coastguard Worker else if ('0' <= *aHex && *aHex <= '9')
1779*4a64e381SAndroid Build Coastguard Worker {
1780*4a64e381SAndroid Build Coastguard Worker byte |= *aHex - '0';
1781*4a64e381SAndroid Build Coastguard Worker }
1782*4a64e381SAndroid Build Coastguard Worker else
1783*4a64e381SAndroid Build Coastguard Worker {
1784*4a64e381SAndroid Build Coastguard Worker ExitNow(rval = -1);
1785*4a64e381SAndroid Build Coastguard Worker }
1786*4a64e381SAndroid Build Coastguard Worker
1787*4a64e381SAndroid Build Coastguard Worker aHex++;
1788*4a64e381SAndroid Build Coastguard Worker numChars++;
1789*4a64e381SAndroid Build Coastguard Worker
1790*4a64e381SAndroid Build Coastguard Worker if (numChars >= 2)
1791*4a64e381SAndroid Build Coastguard Worker {
1792*4a64e381SAndroid Build Coastguard Worker numChars = 0;
1793*4a64e381SAndroid Build Coastguard Worker *cur++ = byte;
1794*4a64e381SAndroid Build Coastguard Worker byte = 0;
1795*4a64e381SAndroid Build Coastguard Worker }
1796*4a64e381SAndroid Build Coastguard Worker else
1797*4a64e381SAndroid Build Coastguard Worker {
1798*4a64e381SAndroid Build Coastguard Worker byte <<= 4;
1799*4a64e381SAndroid Build Coastguard Worker }
1800*4a64e381SAndroid Build Coastguard Worker }
1801*4a64e381SAndroid Build Coastguard Worker
1802*4a64e381SAndroid Build Coastguard Worker rval = static_cast<int>(cur - aBin);
1803*4a64e381SAndroid Build Coastguard Worker
1804*4a64e381SAndroid Build Coastguard Worker exit:
1805*4a64e381SAndroid Build Coastguard Worker return rval;
1806*4a64e381SAndroid Build Coastguard Worker }
1807*4a64e381SAndroid Build Coastguard Worker
Init(void)1808*4a64e381SAndroid Build Coastguard Worker void UBusAgent::Init(void)
1809*4a64e381SAndroid Build Coastguard Worker {
1810*4a64e381SAndroid Build Coastguard Worker otbr::ubus::sUbusEfd = eventfd(0, 0);
1811*4a64e381SAndroid Build Coastguard Worker
1812*4a64e381SAndroid Build Coastguard Worker otbr::ubus::UbusServer::Initialize(&mHost, &mThreadMutex);
1813*4a64e381SAndroid Build Coastguard Worker
1814*4a64e381SAndroid Build Coastguard Worker if (otbr::ubus::sUbusEfd == -1)
1815*4a64e381SAndroid Build Coastguard Worker {
1816*4a64e381SAndroid Build Coastguard Worker perror("Failed to create eventfd for ubus");
1817*4a64e381SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
1818*4a64e381SAndroid Build Coastguard Worker }
1819*4a64e381SAndroid Build Coastguard Worker
1820*4a64e381SAndroid Build Coastguard Worker std::thread(UbusServerRun).detach();
1821*4a64e381SAndroid Build Coastguard Worker }
1822*4a64e381SAndroid Build Coastguard Worker
Update(MainloopContext & aMainloop)1823*4a64e381SAndroid Build Coastguard Worker void UBusAgent::Update(MainloopContext &aMainloop)
1824*4a64e381SAndroid Build Coastguard Worker {
1825*4a64e381SAndroid Build Coastguard Worker VerifyOrExit(otbr::ubus::sUbusEfd != -1);
1826*4a64e381SAndroid Build Coastguard Worker
1827*4a64e381SAndroid Build Coastguard Worker aMainloop.AddFdToReadSet(otbr::ubus::sUbusEfd);
1828*4a64e381SAndroid Build Coastguard Worker exit:
1829*4a64e381SAndroid Build Coastguard Worker mThreadMutex.unlock();
1830*4a64e381SAndroid Build Coastguard Worker return;
1831*4a64e381SAndroid Build Coastguard Worker }
1832*4a64e381SAndroid Build Coastguard Worker
Process(const MainloopContext & aMainloop)1833*4a64e381SAndroid Build Coastguard Worker void UBusAgent::Process(const MainloopContext &aMainloop)
1834*4a64e381SAndroid Build Coastguard Worker {
1835*4a64e381SAndroid Build Coastguard Worker ssize_t retval;
1836*4a64e381SAndroid Build Coastguard Worker uint64_t num;
1837*4a64e381SAndroid Build Coastguard Worker
1838*4a64e381SAndroid Build Coastguard Worker mThreadMutex.lock();
1839*4a64e381SAndroid Build Coastguard Worker
1840*4a64e381SAndroid Build Coastguard Worker VerifyOrExit(otbr::ubus::sUbusEfd != -1);
1841*4a64e381SAndroid Build Coastguard Worker
1842*4a64e381SAndroid Build Coastguard Worker if (FD_ISSET(otbr::ubus::sUbusEfd, &aMainloop.mReadFdSet))
1843*4a64e381SAndroid Build Coastguard Worker {
1844*4a64e381SAndroid Build Coastguard Worker retval = read(otbr::ubus::sUbusEfd, &num, sizeof(uint64_t));
1845*4a64e381SAndroid Build Coastguard Worker if (retval != sizeof(uint64_t))
1846*4a64e381SAndroid Build Coastguard Worker {
1847*4a64e381SAndroid Build Coastguard Worker perror("read ubus eventfd failed\n");
1848*4a64e381SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
1849*4a64e381SAndroid Build Coastguard Worker }
1850*4a64e381SAndroid Build Coastguard Worker }
1851*4a64e381SAndroid Build Coastguard Worker
1852*4a64e381SAndroid Build Coastguard Worker exit:
1853*4a64e381SAndroid Build Coastguard Worker return;
1854*4a64e381SAndroid Build Coastguard Worker }
1855*4a64e381SAndroid Build Coastguard Worker
1856*4a64e381SAndroid Build Coastguard Worker } // namespace ubus
1857*4a64e381SAndroid Build Coastguard Worker } // namespace otbr
1858