1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker * Copyright (c) 2016, The OpenThread Authors.
3*cfb92d14SAndroid Build Coastguard Worker * All rights reserved.
4*cfb92d14SAndroid Build Coastguard Worker *
5*cfb92d14SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*cfb92d14SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
7*cfb92d14SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
8*cfb92d14SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
9*cfb92d14SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
10*cfb92d14SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
11*cfb92d14SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
12*cfb92d14SAndroid Build Coastguard Worker * 3. Neither the name of the copyright holder nor the
13*cfb92d14SAndroid Build Coastguard Worker * names of its contributors may be used to endorse or promote products
14*cfb92d14SAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
15*cfb92d14SAndroid Build Coastguard Worker *
16*cfb92d14SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*cfb92d14SAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*cfb92d14SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*cfb92d14SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20*cfb92d14SAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*cfb92d14SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*cfb92d14SAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*cfb92d14SAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*cfb92d14SAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*cfb92d14SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*cfb92d14SAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
27*cfb92d14SAndroid Build Coastguard Worker */
28*cfb92d14SAndroid Build Coastguard Worker
29*cfb92d14SAndroid Build Coastguard Worker /**
30*cfb92d14SAndroid Build Coastguard Worker * @file
31*cfb92d14SAndroid Build Coastguard Worker * @brief
32*cfb92d14SAndroid Build Coastguard Worker * This file includes the platform-specific initializers.
33*cfb92d14SAndroid Build Coastguard Worker */
34*cfb92d14SAndroid Build Coastguard Worker
35*cfb92d14SAndroid Build Coastguard Worker #include "openthread-posix-config.h"
36*cfb92d14SAndroid Build Coastguard Worker #include "platform-posix.h"
37*cfb92d14SAndroid Build Coastguard Worker
38*cfb92d14SAndroid Build Coastguard Worker #include <assert.h>
39*cfb92d14SAndroid Build Coastguard Worker #include <inttypes.h>
40*cfb92d14SAndroid Build Coastguard Worker
41*cfb92d14SAndroid Build Coastguard Worker #include <openthread-core-config.h>
42*cfb92d14SAndroid Build Coastguard Worker #include <openthread/border_router.h>
43*cfb92d14SAndroid Build Coastguard Worker #include <openthread/cli.h>
44*cfb92d14SAndroid Build Coastguard Worker #include <openthread/heap.h>
45*cfb92d14SAndroid Build Coastguard Worker #include <openthread/tasklet.h>
46*cfb92d14SAndroid Build Coastguard Worker #include <openthread/trel.h>
47*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/alarm-milli.h>
48*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/infra_if.h>
49*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/logging.h>
50*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/otns.h>
51*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/radio.h>
52*cfb92d14SAndroid Build Coastguard Worker
53*cfb92d14SAndroid Build Coastguard Worker #include "common/code_utils.hpp"
54*cfb92d14SAndroid Build Coastguard Worker #include "common/debug.hpp"
55*cfb92d14SAndroid Build Coastguard Worker #include "posix/platform/daemon.hpp"
56*cfb92d14SAndroid Build Coastguard Worker #include "posix/platform/firewall.hpp"
57*cfb92d14SAndroid Build Coastguard Worker #include "posix/platform/infra_if.hpp"
58*cfb92d14SAndroid Build Coastguard Worker #include "posix/platform/mainloop.hpp"
59*cfb92d14SAndroid Build Coastguard Worker #include "posix/platform/mdns_socket.hpp"
60*cfb92d14SAndroid Build Coastguard Worker #include "posix/platform/radio_url.hpp"
61*cfb92d14SAndroid Build Coastguard Worker #include "posix/platform/spinel_driver_getter.hpp"
62*cfb92d14SAndroid Build Coastguard Worker #include "posix/platform/udp.hpp"
63*cfb92d14SAndroid Build Coastguard Worker
64*cfb92d14SAndroid Build Coastguard Worker otInstance *gInstance = nullptr;
65*cfb92d14SAndroid Build Coastguard Worker bool gDryRun = false;
66*cfb92d14SAndroid Build Coastguard Worker
67*cfb92d14SAndroid Build Coastguard Worker CoprocessorType sCoprocessorType = OT_COPROCESSOR_UNKNOWN;
68*cfb92d14SAndroid Build Coastguard Worker
processStateChange(otChangedFlags aFlags,void * aContext)69*cfb92d14SAndroid Build Coastguard Worker static void processStateChange(otChangedFlags aFlags, void *aContext)
70*cfb92d14SAndroid Build Coastguard Worker {
71*cfb92d14SAndroid Build Coastguard Worker otInstance *instance = static_cast<otInstance *>(aContext);
72*cfb92d14SAndroid Build Coastguard Worker
73*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(instance);
74*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aFlags);
75*cfb92d14SAndroid Build Coastguard Worker
76*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_NETIF_ENABLE
77*cfb92d14SAndroid Build Coastguard Worker platformNetifStateChange(instance, aFlags);
78*cfb92d14SAndroid Build Coastguard Worker #endif
79*cfb92d14SAndroid Build Coastguard Worker
80*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE
81*cfb92d14SAndroid Build Coastguard Worker ot::Posix::InfraNetif::Get().HandleBackboneStateChange(instance, aFlags);
82*cfb92d14SAndroid Build Coastguard Worker #endif
83*cfb92d14SAndroid Build Coastguard Worker
84*cfb92d14SAndroid Build Coastguard Worker platformRadioHandleStateChange(instance, aFlags);
85*cfb92d14SAndroid Build Coastguard Worker }
86*cfb92d14SAndroid Build Coastguard Worker
get802154RadioUrl(const otPlatformCoprocessorUrls & aUrls)87*cfb92d14SAndroid Build Coastguard Worker static const char *get802154RadioUrl(const otPlatformCoprocessorUrls &aUrls)
88*cfb92d14SAndroid Build Coastguard Worker {
89*cfb92d14SAndroid Build Coastguard Worker const char *radioUrl = nullptr;
90*cfb92d14SAndroid Build Coastguard Worker
91*cfb92d14SAndroid Build Coastguard Worker for (uint8_t i = 0; i < aUrls.mNum; i++)
92*cfb92d14SAndroid Build Coastguard Worker {
93*cfb92d14SAndroid Build Coastguard Worker ot::Posix::RadioUrl url(aUrls.mUrls[i]);
94*cfb92d14SAndroid Build Coastguard Worker
95*cfb92d14SAndroid Build Coastguard Worker if (strcmp(url.GetProtocol(), "trel") == 0)
96*cfb92d14SAndroid Build Coastguard Worker {
97*cfb92d14SAndroid Build Coastguard Worker continue;
98*cfb92d14SAndroid Build Coastguard Worker }
99*cfb92d14SAndroid Build Coastguard Worker
100*cfb92d14SAndroid Build Coastguard Worker radioUrl = aUrls.mUrls[i];
101*cfb92d14SAndroid Build Coastguard Worker break;
102*cfb92d14SAndroid Build Coastguard Worker }
103*cfb92d14SAndroid Build Coastguard Worker
104*cfb92d14SAndroid Build Coastguard Worker VerifyOrDie(radioUrl != nullptr, OT_EXIT_INVALID_ARGUMENTS);
105*cfb92d14SAndroid Build Coastguard Worker return radioUrl;
106*cfb92d14SAndroid Build Coastguard Worker }
107*cfb92d14SAndroid Build Coastguard Worker
108*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE
getTrelRadioUrl(otPlatformConfig * aPlatformConfig)109*cfb92d14SAndroid Build Coastguard Worker static const char *getTrelRadioUrl(otPlatformConfig *aPlatformConfig)
110*cfb92d14SAndroid Build Coastguard Worker {
111*cfb92d14SAndroid Build Coastguard Worker const char *radioUrl = nullptr;
112*cfb92d14SAndroid Build Coastguard Worker
113*cfb92d14SAndroid Build Coastguard Worker for (uint8_t i = 0; i < aPlatformConfig->mCoprocessorUrls.mNum; i++)
114*cfb92d14SAndroid Build Coastguard Worker {
115*cfb92d14SAndroid Build Coastguard Worker ot::Posix::RadioUrl url(aPlatformConfig->mCoprocessorUrls.mUrls[i]);
116*cfb92d14SAndroid Build Coastguard Worker
117*cfb92d14SAndroid Build Coastguard Worker if (strcmp(url.GetProtocol(), "trel") == 0)
118*cfb92d14SAndroid Build Coastguard Worker {
119*cfb92d14SAndroid Build Coastguard Worker radioUrl = aPlatformConfig->mCoprocessorUrls.mUrls[i];
120*cfb92d14SAndroid Build Coastguard Worker break;
121*cfb92d14SAndroid Build Coastguard Worker }
122*cfb92d14SAndroid Build Coastguard Worker }
123*cfb92d14SAndroid Build Coastguard Worker
124*cfb92d14SAndroid Build Coastguard Worker return radioUrl;
125*cfb92d14SAndroid Build Coastguard Worker }
126*cfb92d14SAndroid Build Coastguard Worker #endif
127*cfb92d14SAndroid Build Coastguard Worker
128*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_INFRA_IF_ENABLE
otSysSetInfraNetif(const char * aInfraNetifName,int aIcmp6Socket)129*cfb92d14SAndroid Build Coastguard Worker void otSysSetInfraNetif(const char *aInfraNetifName, int aIcmp6Socket)
130*cfb92d14SAndroid Build Coastguard Worker {
131*cfb92d14SAndroid Build Coastguard Worker ot::Posix::InfraNetif::Get().SetInfraNetif(aInfraNetifName, aIcmp6Socket);
132*cfb92d14SAndroid Build Coastguard Worker }
133*cfb92d14SAndroid Build Coastguard Worker #endif
134*cfb92d14SAndroid Build Coastguard Worker
platformInitRcpMode(otPlatformConfig * aPlatformConfig)135*cfb92d14SAndroid Build Coastguard Worker void platformInitRcpMode(otPlatformConfig *aPlatformConfig)
136*cfb92d14SAndroid Build Coastguard Worker {
137*cfb92d14SAndroid Build Coastguard Worker platformRadioInit(get802154RadioUrl(aPlatformConfig->mCoprocessorUrls));
138*cfb92d14SAndroid Build Coastguard Worker
139*cfb92d14SAndroid Build Coastguard Worker // For Dry-Run option, only init the co-processor.
140*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(!aPlatformConfig->mDryRun);
141*cfb92d14SAndroid Build Coastguard Worker
142*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE && !OPENTHREAD_POSIX_CONFIG_TREL_SELECT_INFRA_IF
143*cfb92d14SAndroid Build Coastguard Worker platformTrelInit(getTrelRadioUrl(aPlatformConfig));
144*cfb92d14SAndroid Build Coastguard Worker #endif
145*cfb92d14SAndroid Build Coastguard Worker platformRandomInit();
146*cfb92d14SAndroid Build Coastguard Worker
147*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_INFRA_IF_ENABLE
148*cfb92d14SAndroid Build Coastguard Worker ot::Posix::InfraNetif::Get().Init();
149*cfb92d14SAndroid Build Coastguard Worker #endif
150*cfb92d14SAndroid Build Coastguard Worker
151*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MULTICAST_DNS_ENABLE
152*cfb92d14SAndroid Build Coastguard Worker ot::Posix::MdnsSocket::Get().Init();
153*cfb92d14SAndroid Build Coastguard Worker #endif
154*cfb92d14SAndroid Build Coastguard Worker
155*cfb92d14SAndroid Build Coastguard Worker gNetifName[0] = '\0';
156*cfb92d14SAndroid Build Coastguard Worker
157*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_NETIF_ENABLE
158*cfb92d14SAndroid Build Coastguard Worker platformNetifInit(aPlatformConfig);
159*cfb92d14SAndroid Build Coastguard Worker #endif
160*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DNS_UPSTREAM_QUERY_ENABLE
161*cfb92d14SAndroid Build Coastguard Worker platformResolverInit();
162*cfb92d14SAndroid Build Coastguard Worker #endif
163*cfb92d14SAndroid Build Coastguard Worker
164*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_UDP_ENABLE
165*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_NETIF_ENABLE
166*cfb92d14SAndroid Build Coastguard Worker ot::Posix::Udp::Get().Init(otSysGetThreadNetifName());
167*cfb92d14SAndroid Build Coastguard Worker #else
168*cfb92d14SAndroid Build Coastguard Worker ot::Posix::Udp::Get().Init(aPlatformConfig->mInterfaceName);
169*cfb92d14SAndroid Build Coastguard Worker #endif
170*cfb92d14SAndroid Build Coastguard Worker #endif
171*cfb92d14SAndroid Build Coastguard Worker exit:
172*cfb92d14SAndroid Build Coastguard Worker return;
173*cfb92d14SAndroid Build Coastguard Worker }
174*cfb92d14SAndroid Build Coastguard Worker
platformInitNcpMode(otPlatformConfig * aPlatformConfig)175*cfb92d14SAndroid Build Coastguard Worker void platformInitNcpMode(otPlatformConfig *aPlatformConfig)
176*cfb92d14SAndroid Build Coastguard Worker {
177*cfb92d14SAndroid Build Coastguard Worker // Do nothing now.
178*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aPlatformConfig);
179*cfb92d14SAndroid Build Coastguard Worker }
180*cfb92d14SAndroid Build Coastguard Worker
platformInit(otPlatformConfig * aPlatformConfig)181*cfb92d14SAndroid Build Coastguard Worker void platformInit(otPlatformConfig *aPlatformConfig)
182*cfb92d14SAndroid Build Coastguard Worker {
183*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_BACKTRACE_ENABLE
184*cfb92d14SAndroid Build Coastguard Worker platformBacktraceInit();
185*cfb92d14SAndroid Build Coastguard Worker #endif
186*cfb92d14SAndroid Build Coastguard Worker
187*cfb92d14SAndroid Build Coastguard Worker platformAlarmInit(aPlatformConfig->mSpeedUpFactor, aPlatformConfig->mRealTimeSignal);
188*cfb92d14SAndroid Build Coastguard Worker
189*cfb92d14SAndroid Build Coastguard Worker if (sCoprocessorType == OT_COPROCESSOR_UNKNOWN)
190*cfb92d14SAndroid Build Coastguard Worker {
191*cfb92d14SAndroid Build Coastguard Worker sCoprocessorType = platformSpinelManagerInit(get802154RadioUrl(aPlatformConfig->mCoprocessorUrls));
192*cfb92d14SAndroid Build Coastguard Worker }
193*cfb92d14SAndroid Build Coastguard Worker
194*cfb92d14SAndroid Build Coastguard Worker switch (sCoprocessorType)
195*cfb92d14SAndroid Build Coastguard Worker {
196*cfb92d14SAndroid Build Coastguard Worker case OT_COPROCESSOR_RCP:
197*cfb92d14SAndroid Build Coastguard Worker platformInitRcpMode(aPlatformConfig);
198*cfb92d14SAndroid Build Coastguard Worker break;
199*cfb92d14SAndroid Build Coastguard Worker
200*cfb92d14SAndroid Build Coastguard Worker case OT_COPROCESSOR_NCP:
201*cfb92d14SAndroid Build Coastguard Worker platformInitNcpMode(aPlatformConfig);
202*cfb92d14SAndroid Build Coastguard Worker break;
203*cfb92d14SAndroid Build Coastguard Worker
204*cfb92d14SAndroid Build Coastguard Worker default:
205*cfb92d14SAndroid Build Coastguard Worker otPlatLog(OT_LOG_LEVEL_CRIT, OT_LOG_REGION_PLATFORM, "Unknown type of the co-processor!\n");
206*cfb92d14SAndroid Build Coastguard Worker exit(OT_EXIT_FAILURE);
207*cfb92d14SAndroid Build Coastguard Worker break;
208*cfb92d14SAndroid Build Coastguard Worker }
209*cfb92d14SAndroid Build Coastguard Worker
210*cfb92d14SAndroid Build Coastguard Worker aPlatformConfig->mCoprocessorType = sCoprocessorType;
211*cfb92d14SAndroid Build Coastguard Worker }
212*cfb92d14SAndroid Build Coastguard Worker
platformSetUp(otPlatformConfig * aPlatformConfig)213*cfb92d14SAndroid Build Coastguard Worker void platformSetUp(otPlatformConfig *aPlatformConfig)
214*cfb92d14SAndroid Build Coastguard Worker {
215*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aPlatformConfig);
216*cfb92d14SAndroid Build Coastguard Worker
217*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(!gDryRun);
218*cfb92d14SAndroid Build Coastguard Worker
219*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_INFRA_IF_ENABLE
220*cfb92d14SAndroid Build Coastguard Worker if (aPlatformConfig->mBackboneInterfaceName != nullptr && strlen(aPlatformConfig->mBackboneInterfaceName) > 0)
221*cfb92d14SAndroid Build Coastguard Worker {
222*cfb92d14SAndroid Build Coastguard Worker int icmp6Sock = -1;
223*cfb92d14SAndroid Build Coastguard Worker
224*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE
225*cfb92d14SAndroid Build Coastguard Worker icmp6Sock = ot::Posix::InfraNetif::CreateIcmp6Socket(aPlatformConfig->mBackboneInterfaceName);
226*cfb92d14SAndroid Build Coastguard Worker #endif
227*cfb92d14SAndroid Build Coastguard Worker
228*cfb92d14SAndroid Build Coastguard Worker otSysSetInfraNetif(aPlatformConfig->mBackboneInterfaceName, icmp6Sock);
229*cfb92d14SAndroid Build Coastguard Worker }
230*cfb92d14SAndroid Build Coastguard Worker #endif
231*cfb92d14SAndroid Build Coastguard Worker
232*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_INFRA_IF_ENABLE
233*cfb92d14SAndroid Build Coastguard Worker ot::Posix::InfraNetif::Get().SetUp();
234*cfb92d14SAndroid Build Coastguard Worker #endif
235*cfb92d14SAndroid Build Coastguard Worker
236*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_NETIF_ENABLE
237*cfb92d14SAndroid Build Coastguard Worker platformNetifSetUp();
238*cfb92d14SAndroid Build Coastguard Worker #endif
239*cfb92d14SAndroid Build Coastguard Worker
240*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_UDP_ENABLE
241*cfb92d14SAndroid Build Coastguard Worker ot::Posix::Udp::Get().SetUp();
242*cfb92d14SAndroid Build Coastguard Worker #endif
243*cfb92d14SAndroid Build Coastguard Worker
244*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MULTICAST_DNS_ENABLE
245*cfb92d14SAndroid Build Coastguard Worker ot::Posix::MdnsSocket::Get().SetUp();
246*cfb92d14SAndroid Build Coastguard Worker #endif
247*cfb92d14SAndroid Build Coastguard Worker
248*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_DAEMON_ENABLE
249*cfb92d14SAndroid Build Coastguard Worker ot::Posix::Daemon::Get().SetUp();
250*cfb92d14SAndroid Build Coastguard Worker #endif
251*cfb92d14SAndroid Build Coastguard Worker
252*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(otSetStateChangedCallback(gInstance, processStateChange, gInstance));
253*cfb92d14SAndroid Build Coastguard Worker
254*cfb92d14SAndroid Build Coastguard Worker exit:
255*cfb92d14SAndroid Build Coastguard Worker return;
256*cfb92d14SAndroid Build Coastguard Worker }
257*cfb92d14SAndroid Build Coastguard Worker
otSysInitCoprocessor(otPlatformCoprocessorUrls * aUrls)258*cfb92d14SAndroid Build Coastguard Worker CoprocessorType otSysInitCoprocessor(otPlatformCoprocessorUrls *aUrls)
259*cfb92d14SAndroid Build Coastguard Worker {
260*cfb92d14SAndroid Build Coastguard Worker sCoprocessorType = platformSpinelManagerInit(get802154RadioUrl(*aUrls));
261*cfb92d14SAndroid Build Coastguard Worker return sCoprocessorType;
262*cfb92d14SAndroid Build Coastguard Worker }
263*cfb92d14SAndroid Build Coastguard Worker
otSysGetSpinelDriver(void)264*cfb92d14SAndroid Build Coastguard Worker otSpinelDriver *otSysGetSpinelDriver(void) { return &ot::Posix::GetSpinelDriver(); }
265*cfb92d14SAndroid Build Coastguard Worker
otSysInit(otPlatformConfig * aPlatformConfig)266*cfb92d14SAndroid Build Coastguard Worker otInstance *otSysInit(otPlatformConfig *aPlatformConfig)
267*cfb92d14SAndroid Build Coastguard Worker {
268*cfb92d14SAndroid Build Coastguard Worker OT_ASSERT(gInstance == nullptr);
269*cfb92d14SAndroid Build Coastguard Worker
270*cfb92d14SAndroid Build Coastguard Worker platformInit(aPlatformConfig);
271*cfb92d14SAndroid Build Coastguard Worker
272*cfb92d14SAndroid Build Coastguard Worker gDryRun = aPlatformConfig->mDryRun;
273*cfb92d14SAndroid Build Coastguard Worker if (sCoprocessorType == OT_COPROCESSOR_RCP)
274*cfb92d14SAndroid Build Coastguard Worker {
275*cfb92d14SAndroid Build Coastguard Worker gInstance = otInstanceInitSingle();
276*cfb92d14SAndroid Build Coastguard Worker OT_ASSERT(gInstance != nullptr);
277*cfb92d14SAndroid Build Coastguard Worker
278*cfb92d14SAndroid Build Coastguard Worker platformSetUp(aPlatformConfig);
279*cfb92d14SAndroid Build Coastguard Worker }
280*cfb92d14SAndroid Build Coastguard Worker
281*cfb92d14SAndroid Build Coastguard Worker return gInstance;
282*cfb92d14SAndroid Build Coastguard Worker }
283*cfb92d14SAndroid Build Coastguard Worker
platformTearDown(void)284*cfb92d14SAndroid Build Coastguard Worker void platformTearDown(void)
285*cfb92d14SAndroid Build Coastguard Worker {
286*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(!gDryRun);
287*cfb92d14SAndroid Build Coastguard Worker
288*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_DAEMON_ENABLE
289*cfb92d14SAndroid Build Coastguard Worker ot::Posix::Daemon::Get().TearDown();
290*cfb92d14SAndroid Build Coastguard Worker #endif
291*cfb92d14SAndroid Build Coastguard Worker
292*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_UDP_ENABLE
293*cfb92d14SAndroid Build Coastguard Worker ot::Posix::Udp::Get().TearDown();
294*cfb92d14SAndroid Build Coastguard Worker #endif
295*cfb92d14SAndroid Build Coastguard Worker
296*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_NETIF_ENABLE
297*cfb92d14SAndroid Build Coastguard Worker platformNetifTearDown();
298*cfb92d14SAndroid Build Coastguard Worker #endif
299*cfb92d14SAndroid Build Coastguard Worker
300*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_INFRA_IF_ENABLE
301*cfb92d14SAndroid Build Coastguard Worker ot::Posix::InfraNetif::Get().TearDown();
302*cfb92d14SAndroid Build Coastguard Worker #endif
303*cfb92d14SAndroid Build Coastguard Worker
304*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MULTICAST_DNS_ENABLE
305*cfb92d14SAndroid Build Coastguard Worker ot::Posix::MdnsSocket::Get().TearDown();
306*cfb92d14SAndroid Build Coastguard Worker #endif
307*cfb92d14SAndroid Build Coastguard Worker
308*cfb92d14SAndroid Build Coastguard Worker exit:
309*cfb92d14SAndroid Build Coastguard Worker return;
310*cfb92d14SAndroid Build Coastguard Worker }
311*cfb92d14SAndroid Build Coastguard Worker
platformDeinitRcpMode(void)312*cfb92d14SAndroid Build Coastguard Worker void platformDeinitRcpMode(void)
313*cfb92d14SAndroid Build Coastguard Worker {
314*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_VIRTUAL_TIME
315*cfb92d14SAndroid Build Coastguard Worker virtualTimeDeinit();
316*cfb92d14SAndroid Build Coastguard Worker #endif
317*cfb92d14SAndroid Build Coastguard Worker platformRadioDeinit();
318*cfb92d14SAndroid Build Coastguard Worker platformSpinelManagerDeinit();
319*cfb92d14SAndroid Build Coastguard Worker sCoprocessorType = OT_COPROCESSOR_UNKNOWN;
320*cfb92d14SAndroid Build Coastguard Worker
321*cfb92d14SAndroid Build Coastguard Worker // For Dry-Run option, only the radio is initialized.
322*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(!gDryRun);
323*cfb92d14SAndroid Build Coastguard Worker
324*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_UDP_ENABLE
325*cfb92d14SAndroid Build Coastguard Worker ot::Posix::Udp::Get().Deinit();
326*cfb92d14SAndroid Build Coastguard Worker #endif
327*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_NETIF_ENABLE
328*cfb92d14SAndroid Build Coastguard Worker platformNetifDeinit();
329*cfb92d14SAndroid Build Coastguard Worker #endif
330*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE && !OPENTHREAD_POSIX_CONFIG_TREL_SELECT_INFRA_IF
331*cfb92d14SAndroid Build Coastguard Worker otPlatTrelDisable(/* aInstance */ nullptr);
332*cfb92d14SAndroid Build Coastguard Worker platformTrelDeinit();
333*cfb92d14SAndroid Build Coastguard Worker #endif
334*cfb92d14SAndroid Build Coastguard Worker
335*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_INFRA_IF_ENABLE
336*cfb92d14SAndroid Build Coastguard Worker ot::Posix::InfraNetif::Get().Deinit();
337*cfb92d14SAndroid Build Coastguard Worker #endif
338*cfb92d14SAndroid Build Coastguard Worker
339*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MULTICAST_DNS_ENABLE
340*cfb92d14SAndroid Build Coastguard Worker ot::Posix::MdnsSocket::Get().Deinit();
341*cfb92d14SAndroid Build Coastguard Worker #endif
342*cfb92d14SAndroid Build Coastguard Worker
343*cfb92d14SAndroid Build Coastguard Worker exit:
344*cfb92d14SAndroid Build Coastguard Worker return;
345*cfb92d14SAndroid Build Coastguard Worker }
346*cfb92d14SAndroid Build Coastguard Worker
platformDeinitNcpMode(void)347*cfb92d14SAndroid Build Coastguard Worker void platformDeinitNcpMode(void)
348*cfb92d14SAndroid Build Coastguard Worker {
349*cfb92d14SAndroid Build Coastguard Worker platformSpinelManagerDeinit();
350*cfb92d14SAndroid Build Coastguard Worker sCoprocessorType = OT_COPROCESSOR_UNKNOWN;
351*cfb92d14SAndroid Build Coastguard Worker }
352*cfb92d14SAndroid Build Coastguard Worker
otSysDeinit(void)353*cfb92d14SAndroid Build Coastguard Worker void otSysDeinit(void)
354*cfb92d14SAndroid Build Coastguard Worker {
355*cfb92d14SAndroid Build Coastguard Worker if (sCoprocessorType == OT_COPROCESSOR_RCP)
356*cfb92d14SAndroid Build Coastguard Worker {
357*cfb92d14SAndroid Build Coastguard Worker OT_ASSERT(gInstance != nullptr);
358*cfb92d14SAndroid Build Coastguard Worker platformTearDown();
359*cfb92d14SAndroid Build Coastguard Worker otInstanceFinalize(gInstance);
360*cfb92d14SAndroid Build Coastguard Worker gInstance = nullptr;
361*cfb92d14SAndroid Build Coastguard Worker platformDeinitRcpMode();
362*cfb92d14SAndroid Build Coastguard Worker }
363*cfb92d14SAndroid Build Coastguard Worker else if (sCoprocessorType == OT_COPROCESSOR_NCP)
364*cfb92d14SAndroid Build Coastguard Worker {
365*cfb92d14SAndroid Build Coastguard Worker platformDeinitNcpMode();
366*cfb92d14SAndroid Build Coastguard Worker }
367*cfb92d14SAndroid Build Coastguard Worker }
368*cfb92d14SAndroid Build Coastguard Worker
369*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_VIRTUAL_TIME
370*cfb92d14SAndroid Build Coastguard Worker /**
371*cfb92d14SAndroid Build Coastguard Worker * Try selecting the given file descriptors in nonblocking mode.
372*cfb92d14SAndroid Build Coastguard Worker *
373*cfb92d14SAndroid Build Coastguard Worker * @param[in,out] aContext A reference to the mainloop context.
374*cfb92d14SAndroid Build Coastguard Worker *
375*cfb92d14SAndroid Build Coastguard Worker * @returns The value returned from select().
376*cfb92d14SAndroid Build Coastguard Worker *
377*cfb92d14SAndroid Build Coastguard Worker */
trySelect(otSysMainloopContext & aContext)378*cfb92d14SAndroid Build Coastguard Worker static int trySelect(otSysMainloopContext &aContext)
379*cfb92d14SAndroid Build Coastguard Worker {
380*cfb92d14SAndroid Build Coastguard Worker struct timeval timeout = {0, 0};
381*cfb92d14SAndroid Build Coastguard Worker fd_set originReadFdSet = aContext.mReadFdSet;
382*cfb92d14SAndroid Build Coastguard Worker fd_set originWriteFdSet = aContext.mWriteFdSet;
383*cfb92d14SAndroid Build Coastguard Worker fd_set originErrorFdSet = aContext.mErrorFdSet;
384*cfb92d14SAndroid Build Coastguard Worker int rval;
385*cfb92d14SAndroid Build Coastguard Worker
386*cfb92d14SAndroid Build Coastguard Worker rval = select(aContext.mMaxFd + 1, &aContext.mReadFdSet, &aContext.mWriteFdSet, &aContext.mErrorFdSet, &timeout);
387*cfb92d14SAndroid Build Coastguard Worker
388*cfb92d14SAndroid Build Coastguard Worker if (rval == 0)
389*cfb92d14SAndroid Build Coastguard Worker {
390*cfb92d14SAndroid Build Coastguard Worker aContext.mReadFdSet = originReadFdSet;
391*cfb92d14SAndroid Build Coastguard Worker aContext.mWriteFdSet = originWriteFdSet;
392*cfb92d14SAndroid Build Coastguard Worker aContext.mErrorFdSet = originErrorFdSet;
393*cfb92d14SAndroid Build Coastguard Worker }
394*cfb92d14SAndroid Build Coastguard Worker
395*cfb92d14SAndroid Build Coastguard Worker return rval;
396*cfb92d14SAndroid Build Coastguard Worker }
397*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_POSIX_VIRTUAL_TIME
398*cfb92d14SAndroid Build Coastguard Worker
otSysMainloopUpdate(otInstance * aInstance,otSysMainloopContext * aMainloop)399*cfb92d14SAndroid Build Coastguard Worker void otSysMainloopUpdate(otInstance *aInstance, otSysMainloopContext *aMainloop)
400*cfb92d14SAndroid Build Coastguard Worker {
401*cfb92d14SAndroid Build Coastguard Worker ot::Posix::Mainloop::Manager::Get().Update(*aMainloop);
402*cfb92d14SAndroid Build Coastguard Worker
403*cfb92d14SAndroid Build Coastguard Worker platformAlarmUpdateTimeout(&aMainloop->mTimeout);
404*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_NETIF_ENABLE
405*cfb92d14SAndroid Build Coastguard Worker platformNetifUpdateFdSet(aMainloop);
406*cfb92d14SAndroid Build Coastguard Worker #endif
407*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_VIRTUAL_TIME
408*cfb92d14SAndroid Build Coastguard Worker virtualTimeUpdateFdSet(aMainloop);
409*cfb92d14SAndroid Build Coastguard Worker #else
410*cfb92d14SAndroid Build Coastguard Worker platformSpinelManagerUpdateFdSet(aMainloop);
411*cfb92d14SAndroid Build Coastguard Worker platformRadioUpdateFdSet(aMainloop);
412*cfb92d14SAndroid Build Coastguard Worker #endif
413*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE
414*cfb92d14SAndroid Build Coastguard Worker platformTrelUpdateFdSet(aMainloop);
415*cfb92d14SAndroid Build Coastguard Worker #endif
416*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DNS_UPSTREAM_QUERY_ENABLE
417*cfb92d14SAndroid Build Coastguard Worker platformResolverUpdateFdSet(aMainloop);
418*cfb92d14SAndroid Build Coastguard Worker #endif
419*cfb92d14SAndroid Build Coastguard Worker
420*cfb92d14SAndroid Build Coastguard Worker if (otTaskletsArePending(aInstance))
421*cfb92d14SAndroid Build Coastguard Worker {
422*cfb92d14SAndroid Build Coastguard Worker aMainloop->mTimeout.tv_sec = 0;
423*cfb92d14SAndroid Build Coastguard Worker aMainloop->mTimeout.tv_usec = 0;
424*cfb92d14SAndroid Build Coastguard Worker }
425*cfb92d14SAndroid Build Coastguard Worker }
426*cfb92d14SAndroid Build Coastguard Worker
otSysMainloopPoll(otSysMainloopContext * aMainloop)427*cfb92d14SAndroid Build Coastguard Worker int otSysMainloopPoll(otSysMainloopContext *aMainloop)
428*cfb92d14SAndroid Build Coastguard Worker {
429*cfb92d14SAndroid Build Coastguard Worker int rval;
430*cfb92d14SAndroid Build Coastguard Worker
431*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_VIRTUAL_TIME
432*cfb92d14SAndroid Build Coastguard Worker if (timerisset(&aMainloop->mTimeout))
433*cfb92d14SAndroid Build Coastguard Worker {
434*cfb92d14SAndroid Build Coastguard Worker // Make sure there are no data ready in UART
435*cfb92d14SAndroid Build Coastguard Worker rval = trySelect(*aMainloop);
436*cfb92d14SAndroid Build Coastguard Worker
437*cfb92d14SAndroid Build Coastguard Worker if (rval == 0)
438*cfb92d14SAndroid Build Coastguard Worker {
439*cfb92d14SAndroid Build Coastguard Worker bool noWrite = true;
440*cfb92d14SAndroid Build Coastguard Worker
441*cfb92d14SAndroid Build Coastguard Worker // If there are write requests, the device is supposed to wake soon
442*cfb92d14SAndroid Build Coastguard Worker for (int i = 0; i < aMainloop->mMaxFd + 1; ++i)
443*cfb92d14SAndroid Build Coastguard Worker {
444*cfb92d14SAndroid Build Coastguard Worker if (FD_ISSET(i, &aMainloop->mWriteFdSet))
445*cfb92d14SAndroid Build Coastguard Worker {
446*cfb92d14SAndroid Build Coastguard Worker noWrite = false;
447*cfb92d14SAndroid Build Coastguard Worker break;
448*cfb92d14SAndroid Build Coastguard Worker }
449*cfb92d14SAndroid Build Coastguard Worker }
450*cfb92d14SAndroid Build Coastguard Worker
451*cfb92d14SAndroid Build Coastguard Worker if (noWrite)
452*cfb92d14SAndroid Build Coastguard Worker {
453*cfb92d14SAndroid Build Coastguard Worker virtualTimeSendSleepEvent(&aMainloop->mTimeout);
454*cfb92d14SAndroid Build Coastguard Worker }
455*cfb92d14SAndroid Build Coastguard Worker
456*cfb92d14SAndroid Build Coastguard Worker rval = select(aMainloop->mMaxFd + 1, &aMainloop->mReadFdSet, &aMainloop->mWriteFdSet,
457*cfb92d14SAndroid Build Coastguard Worker &aMainloop->mErrorFdSet, nullptr);
458*cfb92d14SAndroid Build Coastguard Worker }
459*cfb92d14SAndroid Build Coastguard Worker }
460*cfb92d14SAndroid Build Coastguard Worker else
461*cfb92d14SAndroid Build Coastguard Worker #endif
462*cfb92d14SAndroid Build Coastguard Worker {
463*cfb92d14SAndroid Build Coastguard Worker rval = select(aMainloop->mMaxFd + 1, &aMainloop->mReadFdSet, &aMainloop->mWriteFdSet, &aMainloop->mErrorFdSet,
464*cfb92d14SAndroid Build Coastguard Worker &aMainloop->mTimeout);
465*cfb92d14SAndroid Build Coastguard Worker }
466*cfb92d14SAndroid Build Coastguard Worker
467*cfb92d14SAndroid Build Coastguard Worker return rval;
468*cfb92d14SAndroid Build Coastguard Worker }
469*cfb92d14SAndroid Build Coastguard Worker
otSysMainloopProcess(otInstance * aInstance,const otSysMainloopContext * aMainloop)470*cfb92d14SAndroid Build Coastguard Worker void otSysMainloopProcess(otInstance *aInstance, const otSysMainloopContext *aMainloop)
471*cfb92d14SAndroid Build Coastguard Worker {
472*cfb92d14SAndroid Build Coastguard Worker ot::Posix::Mainloop::Manager::Get().Process(*aMainloop);
473*cfb92d14SAndroid Build Coastguard Worker
474*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_VIRTUAL_TIME
475*cfb92d14SAndroid Build Coastguard Worker virtualTimeProcess(aInstance, aMainloop);
476*cfb92d14SAndroid Build Coastguard Worker #else
477*cfb92d14SAndroid Build Coastguard Worker platformSpinelManagerProcess(aInstance, aMainloop);
478*cfb92d14SAndroid Build Coastguard Worker platformRadioProcess(aInstance, aMainloop);
479*cfb92d14SAndroid Build Coastguard Worker #endif
480*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE
481*cfb92d14SAndroid Build Coastguard Worker platformTrelProcess(aInstance, aMainloop);
482*cfb92d14SAndroid Build Coastguard Worker #endif
483*cfb92d14SAndroid Build Coastguard Worker platformAlarmProcess(aInstance);
484*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_NETIF_ENABLE
485*cfb92d14SAndroid Build Coastguard Worker platformNetifProcess(aMainloop);
486*cfb92d14SAndroid Build Coastguard Worker #endif
487*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DNS_UPSTREAM_QUERY_ENABLE
488*cfb92d14SAndroid Build Coastguard Worker platformResolverProcess(aMainloop);
489*cfb92d14SAndroid Build Coastguard Worker #endif
490*cfb92d14SAndroid Build Coastguard Worker }
491*cfb92d14SAndroid Build Coastguard Worker
IsSystemDryRun(void)492*cfb92d14SAndroid Build Coastguard Worker bool IsSystemDryRun(void) { return gDryRun; }
493*cfb92d14SAndroid Build Coastguard Worker
494*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_DAEMON_ENABLE && OPENTHREAD_POSIX_CONFIG_DAEMON_CLI_ENABLE
otSysCliInitUsingDaemon(otInstance * aInstance)495*cfb92d14SAndroid Build Coastguard Worker void otSysCliInitUsingDaemon(otInstance *aInstance)
496*cfb92d14SAndroid Build Coastguard Worker {
497*cfb92d14SAndroid Build Coastguard Worker otCliInit(
498*cfb92d14SAndroid Build Coastguard Worker aInstance,
499*cfb92d14SAndroid Build Coastguard Worker [](void *aContext, const char *aFormat, va_list aArguments) -> int {
500*cfb92d14SAndroid Build Coastguard Worker return static_cast<ot::Posix::Daemon *>(aContext)->OutputFormatV(aFormat, aArguments);
501*cfb92d14SAndroid Build Coastguard Worker },
502*cfb92d14SAndroid Build Coastguard Worker &ot::Posix::Daemon::Get());
503*cfb92d14SAndroid Build Coastguard Worker }
504*cfb92d14SAndroid Build Coastguard Worker #endif
505