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