xref: /aosp_15_r20/external/openthread/examples/platforms/simulation/system.c (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 "platform-simulation.h"
36*cfb92d14SAndroid Build Coastguard Worker 
37*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_SIMULATION_VIRTUAL_TIME == 0
38*cfb92d14SAndroid Build Coastguard Worker 
39*cfb92d14SAndroid Build Coastguard Worker #include <arpa/inet.h>
40*cfb92d14SAndroid Build Coastguard Worker #include <assert.h>
41*cfb92d14SAndroid Build Coastguard Worker #include <errno.h>
42*cfb92d14SAndroid Build Coastguard Worker #include <getopt.h>
43*cfb92d14SAndroid Build Coastguard Worker #include <libgen.h>
44*cfb92d14SAndroid Build Coastguard Worker #include <stddef.h>
45*cfb92d14SAndroid Build Coastguard Worker #include <stdint.h>
46*cfb92d14SAndroid Build Coastguard Worker #include <stdio.h>
47*cfb92d14SAndroid Build Coastguard Worker #include <stdlib.h>
48*cfb92d14SAndroid Build Coastguard Worker #include <string.h>
49*cfb92d14SAndroid Build Coastguard Worker #include <sys/types.h>
50*cfb92d14SAndroid Build Coastguard Worker 
51*cfb92d14SAndroid Build Coastguard Worker #include <openthread/tasklet.h>
52*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/alarm-milli.h>
53*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/radio.h>
54*cfb92d14SAndroid Build Coastguard Worker 
55*cfb92d14SAndroid Build Coastguard Worker #include "simul_utils.h"
56*cfb92d14SAndroid Build Coastguard Worker 
57*cfb92d14SAndroid Build Coastguard Worker uint32_t gNodeId = 1;
58*cfb92d14SAndroid Build Coastguard Worker 
59*cfb92d14SAndroid Build Coastguard Worker extern bool        gPlatformPseudoResetWasRequested;
60*cfb92d14SAndroid Build Coastguard Worker extern otRadioCaps gRadioCaps;
61*cfb92d14SAndroid Build Coastguard Worker 
62*cfb92d14SAndroid Build Coastguard Worker static volatile bool gTerminate = false;
63*cfb92d14SAndroid Build Coastguard Worker 
handleSignal(int aSignal)64*cfb92d14SAndroid Build Coastguard Worker static void handleSignal(int aSignal)
65*cfb92d14SAndroid Build Coastguard Worker {
66*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aSignal);
67*cfb92d14SAndroid Build Coastguard Worker 
68*cfb92d14SAndroid Build Coastguard Worker     gTerminate = true;
69*cfb92d14SAndroid Build Coastguard Worker }
70*cfb92d14SAndroid Build Coastguard Worker 
71*cfb92d14SAndroid Build Coastguard Worker /**
72*cfb92d14SAndroid Build Coastguard Worker  * Defines the argument return values.
73*cfb92d14SAndroid Build Coastguard Worker  *
74*cfb92d14SAndroid Build Coastguard Worker  */
75*cfb92d14SAndroid Build Coastguard Worker enum
76*cfb92d14SAndroid Build Coastguard Worker {
77*cfb92d14SAndroid Build Coastguard Worker     OT_SIM_OPT_HELP               = 'h',
78*cfb92d14SAndroid Build Coastguard Worker     OT_SIM_OPT_ENABLE_ENERGY_SCAN = 'E',
79*cfb92d14SAndroid Build Coastguard Worker     OT_SIM_OPT_LOCAL_INTERFACE    = 'L',
80*cfb92d14SAndroid Build Coastguard Worker     OT_SIM_OPT_SLEEP_TO_TX        = 't',
81*cfb92d14SAndroid Build Coastguard Worker     OT_SIM_OPT_TIME_SPEED         = 's',
82*cfb92d14SAndroid Build Coastguard Worker     OT_SIM_OPT_LOG_FILE           = 'l',
83*cfb92d14SAndroid Build Coastguard Worker     OT_SIM_OPT_UNKNOWN            = '?',
84*cfb92d14SAndroid Build Coastguard Worker };
85*cfb92d14SAndroid Build Coastguard Worker 
PrintUsage(const char * aProgramName,int aExitCode)86*cfb92d14SAndroid Build Coastguard Worker static void PrintUsage(const char *aProgramName, int aExitCode)
87*cfb92d14SAndroid Build Coastguard Worker {
88*cfb92d14SAndroid Build Coastguard Worker     fprintf(stderr,
89*cfb92d14SAndroid Build Coastguard Worker             "Syntax:\n"
90*cfb92d14SAndroid Build Coastguard Worker             "    %s [Options] NodeId\n"
91*cfb92d14SAndroid Build Coastguard Worker             "Options:\n"
92*cfb92d14SAndroid Build Coastguard Worker             "    -h --help                  Display this usage information.\n"
93*cfb92d14SAndroid Build Coastguard Worker             "    -L --local-interface=val   The address or name of the netif to simulate Thread radio.\n"
94*cfb92d14SAndroid Build Coastguard Worker             "    -E --enable-energy-scan    Enable energy scan capability.\n"
95*cfb92d14SAndroid Build Coastguard Worker             "    -t --sleep-to-tx           Let radio support direct transition from sleep to TX with CSMA.\n"
96*cfb92d14SAndroid Build Coastguard Worker             "    -s --time-speed=val        Speed up the time in simulation.\n"
97*cfb92d14SAndroid Build Coastguard Worker #if (OPENTHREAD_CONFIG_LOG_OUTPUT == OPENTHREAD_CONFIG_LOG_OUTPUT_PLATFORM_DEFINED)
98*cfb92d14SAndroid Build Coastguard Worker             "    -l --log-file=name         File name to write logs.\n"
99*cfb92d14SAndroid Build Coastguard Worker #endif
100*cfb92d14SAndroid Build Coastguard Worker             ,
101*cfb92d14SAndroid Build Coastguard Worker             aProgramName);
102*cfb92d14SAndroid Build Coastguard Worker 
103*cfb92d14SAndroid Build Coastguard Worker     exit(aExitCode);
104*cfb92d14SAndroid Build Coastguard Worker }
105*cfb92d14SAndroid Build Coastguard Worker 
otSysInit(int aArgCount,char * aArgVector[])106*cfb92d14SAndroid Build Coastguard Worker void otSysInit(int aArgCount, char *aArgVector[])
107*cfb92d14SAndroid Build Coastguard Worker {
108*cfb92d14SAndroid Build Coastguard Worker     char    *endptr;
109*cfb92d14SAndroid Build Coastguard Worker     uint32_t speedUpFactor = 1;
110*cfb92d14SAndroid Build Coastguard Worker 
111*cfb92d14SAndroid Build Coastguard Worker     static const struct option long_options[] = {
112*cfb92d14SAndroid Build Coastguard Worker         {"help", no_argument, 0, OT_SIM_OPT_HELP},
113*cfb92d14SAndroid Build Coastguard Worker         {"enable-energy-scan", no_argument, 0, OT_SIM_OPT_ENABLE_ENERGY_SCAN},
114*cfb92d14SAndroid Build Coastguard Worker         {"sleep-to-tx", no_argument, 0, OT_SIM_OPT_SLEEP_TO_TX},
115*cfb92d14SAndroid Build Coastguard Worker         {"time-speed", required_argument, 0, OT_SIM_OPT_TIME_SPEED},
116*cfb92d14SAndroid Build Coastguard Worker         {"local-interface", required_argument, 0, OT_SIM_OPT_LOCAL_INTERFACE},
117*cfb92d14SAndroid Build Coastguard Worker #if (OPENTHREAD_CONFIG_LOG_OUTPUT == OPENTHREAD_CONFIG_LOG_OUTPUT_PLATFORM_DEFINED)
118*cfb92d14SAndroid Build Coastguard Worker         {"log-file", required_argument, 0, OT_SIM_OPT_LOG_FILE},
119*cfb92d14SAndroid Build Coastguard Worker #endif
120*cfb92d14SAndroid Build Coastguard Worker         {0, 0, 0, 0},
121*cfb92d14SAndroid Build Coastguard Worker     };
122*cfb92d14SAndroid Build Coastguard Worker 
123*cfb92d14SAndroid Build Coastguard Worker #if (OPENTHREAD_CONFIG_LOG_OUTPUT == OPENTHREAD_CONFIG_LOG_OUTPUT_PLATFORM_DEFINED)
124*cfb92d14SAndroid Build Coastguard Worker     static const char options[] = "Ehts:L:l:";
125*cfb92d14SAndroid Build Coastguard Worker #else
126*cfb92d14SAndroid Build Coastguard Worker     static const char options[] = "Ehts:L:";
127*cfb92d14SAndroid Build Coastguard Worker #endif
128*cfb92d14SAndroid Build Coastguard Worker 
129*cfb92d14SAndroid Build Coastguard Worker     if (gPlatformPseudoResetWasRequested)
130*cfb92d14SAndroid Build Coastguard Worker     {
131*cfb92d14SAndroid Build Coastguard Worker         gPlatformPseudoResetWasRequested = false;
132*cfb92d14SAndroid Build Coastguard Worker         return;
133*cfb92d14SAndroid Build Coastguard Worker     }
134*cfb92d14SAndroid Build Coastguard Worker 
135*cfb92d14SAndroid Build Coastguard Worker     optind = 1;
136*cfb92d14SAndroid Build Coastguard Worker 
137*cfb92d14SAndroid Build Coastguard Worker     while (true)
138*cfb92d14SAndroid Build Coastguard Worker     {
139*cfb92d14SAndroid Build Coastguard Worker         int c = getopt_long(aArgCount, aArgVector, options, long_options, NULL);
140*cfb92d14SAndroid Build Coastguard Worker 
141*cfb92d14SAndroid Build Coastguard Worker         if (c == -1)
142*cfb92d14SAndroid Build Coastguard Worker         {
143*cfb92d14SAndroid Build Coastguard Worker             break;
144*cfb92d14SAndroid Build Coastguard Worker         }
145*cfb92d14SAndroid Build Coastguard Worker 
146*cfb92d14SAndroid Build Coastguard Worker         switch (c)
147*cfb92d14SAndroid Build Coastguard Worker         {
148*cfb92d14SAndroid Build Coastguard Worker         case OT_SIM_OPT_UNKNOWN:
149*cfb92d14SAndroid Build Coastguard Worker             PrintUsage(aArgVector[0], EXIT_FAILURE);
150*cfb92d14SAndroid Build Coastguard Worker             break;
151*cfb92d14SAndroid Build Coastguard Worker         case OT_SIM_OPT_HELP:
152*cfb92d14SAndroid Build Coastguard Worker             PrintUsage(aArgVector[0], EXIT_SUCCESS);
153*cfb92d14SAndroid Build Coastguard Worker             break;
154*cfb92d14SAndroid Build Coastguard Worker         case OT_SIM_OPT_ENABLE_ENERGY_SCAN:
155*cfb92d14SAndroid Build Coastguard Worker             gRadioCaps |= OT_RADIO_CAPS_ENERGY_SCAN;
156*cfb92d14SAndroid Build Coastguard Worker             break;
157*cfb92d14SAndroid Build Coastguard Worker         case OT_SIM_OPT_SLEEP_TO_TX:
158*cfb92d14SAndroid Build Coastguard Worker             gRadioCaps |= OT_RADIO_CAPS_SLEEP_TO_TX;
159*cfb92d14SAndroid Build Coastguard Worker             break;
160*cfb92d14SAndroid Build Coastguard Worker         case OT_SIM_OPT_LOCAL_INTERFACE:
161*cfb92d14SAndroid Build Coastguard Worker             gLocalInterface = optarg;
162*cfb92d14SAndroid Build Coastguard Worker             break;
163*cfb92d14SAndroid Build Coastguard Worker         case OT_SIM_OPT_TIME_SPEED:
164*cfb92d14SAndroid Build Coastguard Worker             speedUpFactor = (uint32_t)strtol(optarg, &endptr, 10);
165*cfb92d14SAndroid Build Coastguard Worker             if (*endptr != '\0' || speedUpFactor == 0)
166*cfb92d14SAndroid Build Coastguard Worker             {
167*cfb92d14SAndroid Build Coastguard Worker                 fprintf(stderr, "Invalid value for TimerSpeedUpFactor: %s\n", optarg);
168*cfb92d14SAndroid Build Coastguard Worker                 exit(EXIT_FAILURE);
169*cfb92d14SAndroid Build Coastguard Worker             }
170*cfb92d14SAndroid Build Coastguard Worker             break;
171*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_LOG_OUTPUT == OPENTHREAD_CONFIG_LOG_OUTPUT_PLATFORM_DEFINED
172*cfb92d14SAndroid Build Coastguard Worker         case OT_SIM_OPT_LOG_FILE:
173*cfb92d14SAndroid Build Coastguard Worker             platformLoggingSetFileName(optarg);
174*cfb92d14SAndroid Build Coastguard Worker             break;
175*cfb92d14SAndroid Build Coastguard Worker #endif
176*cfb92d14SAndroid Build Coastguard Worker         default:
177*cfb92d14SAndroid Build Coastguard Worker             break;
178*cfb92d14SAndroid Build Coastguard Worker         }
179*cfb92d14SAndroid Build Coastguard Worker     }
180*cfb92d14SAndroid Build Coastguard Worker 
181*cfb92d14SAndroid Build Coastguard Worker     if (optind != aArgCount - 1)
182*cfb92d14SAndroid Build Coastguard Worker     {
183*cfb92d14SAndroid Build Coastguard Worker         PrintUsage(aArgVector[0], EXIT_FAILURE);
184*cfb92d14SAndroid Build Coastguard Worker     }
185*cfb92d14SAndroid Build Coastguard Worker 
186*cfb92d14SAndroid Build Coastguard Worker     gNodeId = (uint32_t)strtol(aArgVector[optind], &endptr, 0);
187*cfb92d14SAndroid Build Coastguard Worker 
188*cfb92d14SAndroid Build Coastguard Worker     if (*endptr != '\0' || gNodeId < 1 || gNodeId > MAX_NETWORK_SIZE)
189*cfb92d14SAndroid Build Coastguard Worker     {
190*cfb92d14SAndroid Build Coastguard Worker         fprintf(stderr, "Invalid NodeId: %s\n", aArgVector[optind]);
191*cfb92d14SAndroid Build Coastguard Worker         exit(EXIT_FAILURE);
192*cfb92d14SAndroid Build Coastguard Worker     }
193*cfb92d14SAndroid Build Coastguard Worker 
194*cfb92d14SAndroid Build Coastguard Worker     signal(SIGTERM, &handleSignal);
195*cfb92d14SAndroid Build Coastguard Worker     signal(SIGHUP, &handleSignal);
196*cfb92d14SAndroid Build Coastguard Worker 
197*cfb92d14SAndroid Build Coastguard Worker     platformLoggingInit(basename(aArgVector[0]));
198*cfb92d14SAndroid Build Coastguard Worker     platformAlarmInit(speedUpFactor);
199*cfb92d14SAndroid Build Coastguard Worker     platformRadioInit();
200*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE
201*cfb92d14SAndroid Build Coastguard Worker     platformTrelInit(speedUpFactor);
202*cfb92d14SAndroid Build Coastguard Worker #endif
203*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_SIMULATION_IMPLEMENT_INFRA_IF && OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE
204*cfb92d14SAndroid Build Coastguard Worker     platformInfraIfInit();
205*cfb92d14SAndroid Build Coastguard Worker #endif
206*cfb92d14SAndroid Build Coastguard Worker     platformRandomInit();
207*cfb92d14SAndroid Build Coastguard Worker }
208*cfb92d14SAndroid Build Coastguard Worker 
otSysPseudoResetWasRequested(void)209*cfb92d14SAndroid Build Coastguard Worker bool otSysPseudoResetWasRequested(void) { return gPlatformPseudoResetWasRequested; }
210*cfb92d14SAndroid Build Coastguard Worker 
otSysDeinit(void)211*cfb92d14SAndroid Build Coastguard Worker void otSysDeinit(void)
212*cfb92d14SAndroid Build Coastguard Worker {
213*cfb92d14SAndroid Build Coastguard Worker     platformRadioDeinit();
214*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE
215*cfb92d14SAndroid Build Coastguard Worker     platformTrelDeinit();
216*cfb92d14SAndroid Build Coastguard Worker #endif
217*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_SIMULATION_IMPLEMENT_INFRA_IF && OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE
218*cfb92d14SAndroid Build Coastguard Worker     platformInfraIfDeinit();
219*cfb92d14SAndroid Build Coastguard Worker #endif
220*cfb92d14SAndroid Build Coastguard Worker     platformLoggingDeinit();
221*cfb92d14SAndroid Build Coastguard Worker }
222*cfb92d14SAndroid Build Coastguard Worker 
otSysProcessDrivers(otInstance * aInstance)223*cfb92d14SAndroid Build Coastguard Worker void otSysProcessDrivers(otInstance *aInstance)
224*cfb92d14SAndroid Build Coastguard Worker {
225*cfb92d14SAndroid Build Coastguard Worker     fd_set         read_fds;
226*cfb92d14SAndroid Build Coastguard Worker     fd_set         write_fds;
227*cfb92d14SAndroid Build Coastguard Worker     fd_set         error_fds;
228*cfb92d14SAndroid Build Coastguard Worker     int            max_fd = -1;
229*cfb92d14SAndroid Build Coastguard Worker     struct timeval timeout;
230*cfb92d14SAndroid Build Coastguard Worker     int            rval;
231*cfb92d14SAndroid Build Coastguard Worker 
232*cfb92d14SAndroid Build Coastguard Worker     FD_ZERO(&read_fds);
233*cfb92d14SAndroid Build Coastguard Worker     FD_ZERO(&write_fds);
234*cfb92d14SAndroid Build Coastguard Worker     FD_ZERO(&error_fds);
235*cfb92d14SAndroid Build Coastguard Worker 
236*cfb92d14SAndroid Build Coastguard Worker     platformUartUpdateFdSet(&read_fds, &write_fds, &error_fds, &max_fd);
237*cfb92d14SAndroid Build Coastguard Worker     platformAlarmUpdateTimeout(&timeout);
238*cfb92d14SAndroid Build Coastguard Worker     platformRadioUpdateFdSet(&read_fds, &write_fds, &timeout, &max_fd);
239*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE
240*cfb92d14SAndroid Build Coastguard Worker     platformTrelUpdateFdSet(&read_fds, &write_fds, &timeout, &max_fd);
241*cfb92d14SAndroid Build Coastguard Worker #endif
242*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_SIMULATION_IMPLEMENT_INFRA_IF && OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE
243*cfb92d14SAndroid Build Coastguard Worker     platformInfraIfUpdateFdSet(&read_fds, &write_fds, &max_fd);
244*cfb92d14SAndroid Build Coastguard Worker #endif
245*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MULTICAST_DNS_ENABLE && OPENTHREAD_SIMULATION_MDNS_SOCKET_IMPLEMENT_POSIX
246*cfb92d14SAndroid Build Coastguard Worker     platformMdnsSocketUpdateFdSet(&read_fds, &max_fd);
247*cfb92d14SAndroid Build Coastguard Worker #endif
248*cfb92d14SAndroid Build Coastguard Worker 
249*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BLE_TCAT_ENABLE
250*cfb92d14SAndroid Build Coastguard Worker     platformBleUpdateFdSet(&read_fds, &write_fds, &timeout, &max_fd);
251*cfb92d14SAndroid Build Coastguard Worker #endif
252*cfb92d14SAndroid Build Coastguard Worker 
253*cfb92d14SAndroid Build Coastguard Worker     if (otTaskletsArePending(aInstance))
254*cfb92d14SAndroid Build Coastguard Worker     {
255*cfb92d14SAndroid Build Coastguard Worker         timeout.tv_sec  = 0;
256*cfb92d14SAndroid Build Coastguard Worker         timeout.tv_usec = 0;
257*cfb92d14SAndroid Build Coastguard Worker     }
258*cfb92d14SAndroid Build Coastguard Worker 
259*cfb92d14SAndroid Build Coastguard Worker     rval = select(max_fd + 1, &read_fds, &write_fds, &error_fds, &timeout);
260*cfb92d14SAndroid Build Coastguard Worker 
261*cfb92d14SAndroid Build Coastguard Worker     if (rval >= 0)
262*cfb92d14SAndroid Build Coastguard Worker     {
263*cfb92d14SAndroid Build Coastguard Worker         platformUartProcess();
264*cfb92d14SAndroid Build Coastguard Worker         platformRadioProcess(aInstance, &read_fds, &write_fds);
265*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_BLE_TCAT_ENABLE
266*cfb92d14SAndroid Build Coastguard Worker         platformBleProcess(aInstance, &read_fds, &write_fds);
267*cfb92d14SAndroid Build Coastguard Worker #endif
268*cfb92d14SAndroid Build Coastguard Worker     }
269*cfb92d14SAndroid Build Coastguard Worker     else if (errno != EINTR)
270*cfb92d14SAndroid Build Coastguard Worker     {
271*cfb92d14SAndroid Build Coastguard Worker         perror("select");
272*cfb92d14SAndroid Build Coastguard Worker         exit(EXIT_FAILURE);
273*cfb92d14SAndroid Build Coastguard Worker     }
274*cfb92d14SAndroid Build Coastguard Worker 
275*cfb92d14SAndroid Build Coastguard Worker     platformAlarmProcess(aInstance);
276*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE
277*cfb92d14SAndroid Build Coastguard Worker     platformTrelProcess(aInstance, &read_fds, &write_fds);
278*cfb92d14SAndroid Build Coastguard Worker #endif
279*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_SIMULATION_IMPLEMENT_INFRA_IF && OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE
280*cfb92d14SAndroid Build Coastguard Worker     platformInfraIfProcess(aInstance, &read_fds, &write_fds);
281*cfb92d14SAndroid Build Coastguard Worker #endif
282*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MULTICAST_DNS_ENABLE && OPENTHREAD_SIMULATION_MDNS_SOCKET_IMPLEMENT_POSIX
283*cfb92d14SAndroid Build Coastguard Worker     platformMdnsSocketProcess(aInstance, &read_fds);
284*cfb92d14SAndroid Build Coastguard Worker #endif
285*cfb92d14SAndroid Build Coastguard Worker 
286*cfb92d14SAndroid Build Coastguard Worker     if (gTerminate)
287*cfb92d14SAndroid Build Coastguard Worker     {
288*cfb92d14SAndroid Build Coastguard Worker         exit(0);
289*cfb92d14SAndroid Build Coastguard Worker     }
290*cfb92d14SAndroid Build Coastguard Worker }
291*cfb92d14SAndroid Build Coastguard Worker 
292*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_SIMULATION_VIRTUAL_TIME == 0
293