xref: /aosp_15_r20/external/openthread/examples/platforms/simulation/trel.c (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker  *  Copyright (c) 2019-21, 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 #include "platform-simulation.h"
30*cfb92d14SAndroid Build Coastguard Worker 
31*cfb92d14SAndroid Build Coastguard Worker #include <openthread/random_noncrypto.h>
32*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/trel.h>
33*cfb92d14SAndroid Build Coastguard Worker 
34*cfb92d14SAndroid Build Coastguard Worker #include "simul_utils.h"
35*cfb92d14SAndroid Build Coastguard Worker #include "utils/code_utils.h"
36*cfb92d14SAndroid Build Coastguard Worker 
37*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE
38*cfb92d14SAndroid Build Coastguard Worker 
39*cfb92d14SAndroid Build Coastguard Worker // Change DEBUG_LOG to all extra logging
40*cfb92d14SAndroid Build Coastguard Worker #define DEBUG_LOG 0
41*cfb92d14SAndroid Build Coastguard Worker 
42*cfb92d14SAndroid Build Coastguard Worker #define TREL_SIM_PORT 9200
43*cfb92d14SAndroid Build Coastguard Worker 
44*cfb92d14SAndroid Build Coastguard Worker #define TREL_MAX_PACKET_SIZE 1800
45*cfb92d14SAndroid Build Coastguard Worker 
46*cfb92d14SAndroid Build Coastguard Worker #define TREL_MAX_PENDING_TX 64
47*cfb92d14SAndroid Build Coastguard Worker 
48*cfb92d14SAndroid Build Coastguard Worker #define TREL_MAX_SERVICE_TXT_DATA_LEN 128
49*cfb92d14SAndroid Build Coastguard Worker 
50*cfb92d14SAndroid Build Coastguard Worker typedef enum MessageType
51*cfb92d14SAndroid Build Coastguard Worker {
52*cfb92d14SAndroid Build Coastguard Worker     TREL_DATA_MESSAGE,
53*cfb92d14SAndroid Build Coastguard Worker     TREL_DNSSD_BROWSE_MESSAGE,
54*cfb92d14SAndroid Build Coastguard Worker     TREL_DNSSD_ADD_SERVICE_MESSAGE,
55*cfb92d14SAndroid Build Coastguard Worker     TREL_DNSSD_REMOVE_SERVICE_MESSAGE,
56*cfb92d14SAndroid Build Coastguard Worker } MessageType;
57*cfb92d14SAndroid Build Coastguard Worker 
58*cfb92d14SAndroid Build Coastguard Worker typedef struct Message
59*cfb92d14SAndroid Build Coastguard Worker {
60*cfb92d14SAndroid Build Coastguard Worker     MessageType mType;
61*cfb92d14SAndroid Build Coastguard Worker     otSockAddr  mSockAddr;                   // Destination (when TREL_DATA_MESSAGE), or peer addr (when DNS-SD service)
62*cfb92d14SAndroid Build Coastguard Worker     uint16_t    mDataLength;                 // mData length
63*cfb92d14SAndroid Build Coastguard Worker     uint8_t     mData[TREL_MAX_PACKET_SIZE]; // TREL UDP packet (when TREL_DATA_MESSAGE), or service TXT data.
64*cfb92d14SAndroid Build Coastguard Worker } Message;
65*cfb92d14SAndroid Build Coastguard Worker 
66*cfb92d14SAndroid Build Coastguard Worker static uint8_t sNumPendingTx = 0;
67*cfb92d14SAndroid Build Coastguard Worker static Message sPendingTx[TREL_MAX_PENDING_TX];
68*cfb92d14SAndroid Build Coastguard Worker 
69*cfb92d14SAndroid Build Coastguard Worker static utilsSocket sSocket;
70*cfb92d14SAndroid Build Coastguard Worker static uint16_t    sPortOffset = 0;
71*cfb92d14SAndroid Build Coastguard Worker static bool        sEnabled    = false;
72*cfb92d14SAndroid Build Coastguard Worker 
73*cfb92d14SAndroid Build Coastguard Worker static bool               sServiceRegistered = false;
74*cfb92d14SAndroid Build Coastguard Worker static uint16_t           sServicePort;
75*cfb92d14SAndroid Build Coastguard Worker static uint8_t            sServiceTxtLength;
76*cfb92d14SAndroid Build Coastguard Worker static char               sServiceTxtData[TREL_MAX_SERVICE_TXT_DATA_LEN];
77*cfb92d14SAndroid Build Coastguard Worker static otPlatTrelCounters sCounters;
78*cfb92d14SAndroid Build Coastguard Worker 
79*cfb92d14SAndroid Build Coastguard Worker #if DEBUG_LOG
dumpBuffer(const void * aBuffer,uint16_t aLength)80*cfb92d14SAndroid Build Coastguard Worker static void dumpBuffer(const void *aBuffer, uint16_t aLength)
81*cfb92d14SAndroid Build Coastguard Worker {
82*cfb92d14SAndroid Build Coastguard Worker     const uint8_t *buffer = (const uint8_t *)aBuffer;
83*cfb92d14SAndroid Build Coastguard Worker     fprintf(stderr, "[ (len:%d) ", aLength);
84*cfb92d14SAndroid Build Coastguard Worker 
85*cfb92d14SAndroid Build Coastguard Worker     while (aLength--)
86*cfb92d14SAndroid Build Coastguard Worker     {
87*cfb92d14SAndroid Build Coastguard Worker         fprintf(stderr, "%02x ", *buffer++);
88*cfb92d14SAndroid Build Coastguard Worker     }
89*cfb92d14SAndroid Build Coastguard Worker 
90*cfb92d14SAndroid Build Coastguard Worker     fprintf(stderr, "]");
91*cfb92d14SAndroid Build Coastguard Worker }
92*cfb92d14SAndroid Build Coastguard Worker 
messageTypeToString(MessageType aType)93*cfb92d14SAndroid Build Coastguard Worker static const char *messageTypeToString(MessageType aType)
94*cfb92d14SAndroid Build Coastguard Worker {
95*cfb92d14SAndroid Build Coastguard Worker     const char *str = "unknown";
96*cfb92d14SAndroid Build Coastguard Worker 
97*cfb92d14SAndroid Build Coastguard Worker     switch (aType)
98*cfb92d14SAndroid Build Coastguard Worker     {
99*cfb92d14SAndroid Build Coastguard Worker     case TREL_DATA_MESSAGE:
100*cfb92d14SAndroid Build Coastguard Worker         str = "data";
101*cfb92d14SAndroid Build Coastguard Worker         break;
102*cfb92d14SAndroid Build Coastguard Worker     case TREL_DNSSD_BROWSE_MESSAGE:
103*cfb92d14SAndroid Build Coastguard Worker         str = "browse";
104*cfb92d14SAndroid Build Coastguard Worker         break;
105*cfb92d14SAndroid Build Coastguard Worker     case TREL_DNSSD_ADD_SERVICE_MESSAGE:
106*cfb92d14SAndroid Build Coastguard Worker         str = "add-service";
107*cfb92d14SAndroid Build Coastguard Worker         break;
108*cfb92d14SAndroid Build Coastguard Worker     case TREL_DNSSD_REMOVE_SERVICE_MESSAGE:
109*cfb92d14SAndroid Build Coastguard Worker         str = "remove-service";
110*cfb92d14SAndroid Build Coastguard Worker         break;
111*cfb92d14SAndroid Build Coastguard Worker     }
112*cfb92d14SAndroid Build Coastguard Worker 
113*cfb92d14SAndroid Build Coastguard Worker     return str;
114*cfb92d14SAndroid Build Coastguard Worker }
115*cfb92d14SAndroid Build Coastguard Worker #endif
116*cfb92d14SAndroid Build Coastguard Worker 
getMessageSize(const Message * aMessage)117*cfb92d14SAndroid Build Coastguard Worker static uint16_t getMessageSize(const Message *aMessage)
118*cfb92d14SAndroid Build Coastguard Worker {
119*cfb92d14SAndroid Build Coastguard Worker     return (uint16_t)(&aMessage->mData[aMessage->mDataLength] - (const uint8_t *)aMessage);
120*cfb92d14SAndroid Build Coastguard Worker }
121*cfb92d14SAndroid Build Coastguard Worker 
sendPendingTxMessages(void)122*cfb92d14SAndroid Build Coastguard Worker static void sendPendingTxMessages(void)
123*cfb92d14SAndroid Build Coastguard Worker {
124*cfb92d14SAndroid Build Coastguard Worker     for (uint8_t i = 0; i < sNumPendingTx; i++)
125*cfb92d14SAndroid Build Coastguard Worker     {
126*cfb92d14SAndroid Build Coastguard Worker #if DEBUG_LOG
127*cfb92d14SAndroid Build Coastguard Worker         fprintf(stderr, "\r\n[trel-sim] Sending message (num:%d, type:%s, port:%u)\r\n", i,
128*cfb92d14SAndroid Build Coastguard Worker                 messageTypeToString(sPendingTx[i].mType), sPendingTx[i].mSockAddr.mPort);
129*cfb92d14SAndroid Build Coastguard Worker #endif
130*cfb92d14SAndroid Build Coastguard Worker         utilsSendOverSocket(&sSocket, &sPendingTx[i], getMessageSize(&sPendingTx[i]));
131*cfb92d14SAndroid Build Coastguard Worker     }
132*cfb92d14SAndroid Build Coastguard Worker 
133*cfb92d14SAndroid Build Coastguard Worker     sNumPendingTx = 0;
134*cfb92d14SAndroid Build Coastguard Worker }
135*cfb92d14SAndroid Build Coastguard Worker 
sendBrowseMessage(void)136*cfb92d14SAndroid Build Coastguard Worker static void sendBrowseMessage(void)
137*cfb92d14SAndroid Build Coastguard Worker {
138*cfb92d14SAndroid Build Coastguard Worker     Message *message;
139*cfb92d14SAndroid Build Coastguard Worker 
140*cfb92d14SAndroid Build Coastguard Worker     assert(sNumPendingTx < TREL_MAX_PENDING_TX);
141*cfb92d14SAndroid Build Coastguard Worker     message = &sPendingTx[sNumPendingTx++];
142*cfb92d14SAndroid Build Coastguard Worker 
143*cfb92d14SAndroid Build Coastguard Worker     message->mType       = TREL_DNSSD_BROWSE_MESSAGE;
144*cfb92d14SAndroid Build Coastguard Worker     message->mDataLength = 0;
145*cfb92d14SAndroid Build Coastguard Worker 
146*cfb92d14SAndroid Build Coastguard Worker #if DEBUG_LOG
147*cfb92d14SAndroid Build Coastguard Worker     fprintf(stderr, "\r\n[trel-sim] sendBrowseMessage()\r\n");
148*cfb92d14SAndroid Build Coastguard Worker #endif
149*cfb92d14SAndroid Build Coastguard Worker }
150*cfb92d14SAndroid Build Coastguard Worker 
sendServiceMessage(MessageType aType)151*cfb92d14SAndroid Build Coastguard Worker static void sendServiceMessage(MessageType aType)
152*cfb92d14SAndroid Build Coastguard Worker {
153*cfb92d14SAndroid Build Coastguard Worker     Message *message;
154*cfb92d14SAndroid Build Coastguard Worker 
155*cfb92d14SAndroid Build Coastguard Worker     assert((aType == TREL_DNSSD_ADD_SERVICE_MESSAGE) || (aType == TREL_DNSSD_REMOVE_SERVICE_MESSAGE));
156*cfb92d14SAndroid Build Coastguard Worker 
157*cfb92d14SAndroid Build Coastguard Worker     assert(sNumPendingTx < TREL_MAX_PENDING_TX);
158*cfb92d14SAndroid Build Coastguard Worker     message = &sPendingTx[sNumPendingTx++];
159*cfb92d14SAndroid Build Coastguard Worker 
160*cfb92d14SAndroid Build Coastguard Worker     message->mType = aType;
161*cfb92d14SAndroid Build Coastguard Worker     memset(&message->mSockAddr, 0, sizeof(otSockAddr));
162*cfb92d14SAndroid Build Coastguard Worker     message->mSockAddr.mPort = sServicePort;
163*cfb92d14SAndroid Build Coastguard Worker     message->mDataLength     = sServiceTxtLength;
164*cfb92d14SAndroid Build Coastguard Worker     memcpy(message->mData, sServiceTxtData, sServiceTxtLength);
165*cfb92d14SAndroid Build Coastguard Worker 
166*cfb92d14SAndroid Build Coastguard Worker #if DEBUG_LOG
167*cfb92d14SAndroid Build Coastguard Worker     fprintf(stderr, "\r\n[trel-sim] sendServiceMessage(%s): service-port:%u, txt-len:%u\r\n",
168*cfb92d14SAndroid Build Coastguard Worker             aType == TREL_DNSSD_ADD_SERVICE_MESSAGE ? "add" : "remove", sServicePort, sServiceTxtLength);
169*cfb92d14SAndroid Build Coastguard Worker #endif
170*cfb92d14SAndroid Build Coastguard Worker }
171*cfb92d14SAndroid Build Coastguard Worker 
processMessage(otInstance * aInstance,Message * aMessage,uint16_t aLength)172*cfb92d14SAndroid Build Coastguard Worker static void processMessage(otInstance *aInstance, Message *aMessage, uint16_t aLength)
173*cfb92d14SAndroid Build Coastguard Worker {
174*cfb92d14SAndroid Build Coastguard Worker     otPlatTrelPeerInfo peerInfo;
175*cfb92d14SAndroid Build Coastguard Worker 
176*cfb92d14SAndroid Build Coastguard Worker #if DEBUG_LOG
177*cfb92d14SAndroid Build Coastguard Worker     fprintf(stderr, "\r\n[trel-sim] processMessage(len:%u, type:%s, port:%u)\r\n", aLength,
178*cfb92d14SAndroid Build Coastguard Worker             messageTypeToString(aMessage->mType), aMessage->mSockAddr.mPort);
179*cfb92d14SAndroid Build Coastguard Worker #endif
180*cfb92d14SAndroid Build Coastguard Worker 
181*cfb92d14SAndroid Build Coastguard Worker     otEXPECT(aLength > 0);
182*cfb92d14SAndroid Build Coastguard Worker     otEXPECT(getMessageSize(aMessage) == aLength);
183*cfb92d14SAndroid Build Coastguard Worker 
184*cfb92d14SAndroid Build Coastguard Worker     switch (aMessage->mType)
185*cfb92d14SAndroid Build Coastguard Worker     {
186*cfb92d14SAndroid Build Coastguard Worker     case TREL_DATA_MESSAGE:
187*cfb92d14SAndroid Build Coastguard Worker         otEXPECT(aMessage->mSockAddr.mPort == sSocket.mPort);
188*cfb92d14SAndroid Build Coastguard Worker         otPlatTrelHandleReceived(aInstance, aMessage->mData, aMessage->mDataLength);
189*cfb92d14SAndroid Build Coastguard Worker         break;
190*cfb92d14SAndroid Build Coastguard Worker 
191*cfb92d14SAndroid Build Coastguard Worker     case TREL_DNSSD_BROWSE_MESSAGE:
192*cfb92d14SAndroid Build Coastguard Worker         sendServiceMessage(TREL_DNSSD_ADD_SERVICE_MESSAGE);
193*cfb92d14SAndroid Build Coastguard Worker         break;
194*cfb92d14SAndroid Build Coastguard Worker 
195*cfb92d14SAndroid Build Coastguard Worker     case TREL_DNSSD_ADD_SERVICE_MESSAGE:
196*cfb92d14SAndroid Build Coastguard Worker     case TREL_DNSSD_REMOVE_SERVICE_MESSAGE:
197*cfb92d14SAndroid Build Coastguard Worker         memset(&peerInfo, 0, sizeof(peerInfo));
198*cfb92d14SAndroid Build Coastguard Worker         peerInfo.mRemoved   = (aMessage->mType == TREL_DNSSD_REMOVE_SERVICE_MESSAGE);
199*cfb92d14SAndroid Build Coastguard Worker         peerInfo.mTxtData   = aMessage->mData;
200*cfb92d14SAndroid Build Coastguard Worker         peerInfo.mTxtLength = (uint8_t)(aMessage->mDataLength);
201*cfb92d14SAndroid Build Coastguard Worker         peerInfo.mSockAddr  = aMessage->mSockAddr;
202*cfb92d14SAndroid Build Coastguard Worker         otPlatTrelHandleDiscoveredPeerInfo(aInstance, &peerInfo);
203*cfb92d14SAndroid Build Coastguard Worker         break;
204*cfb92d14SAndroid Build Coastguard Worker     }
205*cfb92d14SAndroid Build Coastguard Worker 
206*cfb92d14SAndroid Build Coastguard Worker exit:
207*cfb92d14SAndroid Build Coastguard Worker     return;
208*cfb92d14SAndroid Build Coastguard Worker }
209*cfb92d14SAndroid Build Coastguard Worker 
210*cfb92d14SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------
211*cfb92d14SAndroid Build Coastguard Worker // otPlatTrel
212*cfb92d14SAndroid Build Coastguard Worker 
otPlatTrelEnable(otInstance * aInstance,uint16_t * aUdpPort)213*cfb92d14SAndroid Build Coastguard Worker void otPlatTrelEnable(otInstance *aInstance, uint16_t *aUdpPort)
214*cfb92d14SAndroid Build Coastguard Worker {
215*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
216*cfb92d14SAndroid Build Coastguard Worker 
217*cfb92d14SAndroid Build Coastguard Worker     *aUdpPort = sSocket.mPort;
218*cfb92d14SAndroid Build Coastguard Worker 
219*cfb92d14SAndroid Build Coastguard Worker #if DEBUG_LOG
220*cfb92d14SAndroid Build Coastguard Worker     fprintf(stderr, "\r\n[trel-sim] otPlatTrelEnable() *aUdpPort=%u\r\n", *aUdpPort);
221*cfb92d14SAndroid Build Coastguard Worker #endif
222*cfb92d14SAndroid Build Coastguard Worker 
223*cfb92d14SAndroid Build Coastguard Worker     if (!sEnabled)
224*cfb92d14SAndroid Build Coastguard Worker     {
225*cfb92d14SAndroid Build Coastguard Worker         sEnabled = true;
226*cfb92d14SAndroid Build Coastguard Worker         sendBrowseMessage();
227*cfb92d14SAndroid Build Coastguard Worker     }
228*cfb92d14SAndroid Build Coastguard Worker }
229*cfb92d14SAndroid Build Coastguard Worker 
otPlatTrelDisable(otInstance * aInstance)230*cfb92d14SAndroid Build Coastguard Worker void otPlatTrelDisable(otInstance *aInstance)
231*cfb92d14SAndroid Build Coastguard Worker {
232*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
233*cfb92d14SAndroid Build Coastguard Worker 
234*cfb92d14SAndroid Build Coastguard Worker #if DEBUG_LOG
235*cfb92d14SAndroid Build Coastguard Worker     fprintf(stderr, "\r\n[trel-sim] otPlatTrelDisable()\r\n");
236*cfb92d14SAndroid Build Coastguard Worker #endif
237*cfb92d14SAndroid Build Coastguard Worker 
238*cfb92d14SAndroid Build Coastguard Worker     if (sEnabled)
239*cfb92d14SAndroid Build Coastguard Worker     {
240*cfb92d14SAndroid Build Coastguard Worker         sEnabled = false;
241*cfb92d14SAndroid Build Coastguard Worker 
242*cfb92d14SAndroid Build Coastguard Worker         if (sServiceRegistered)
243*cfb92d14SAndroid Build Coastguard Worker         {
244*cfb92d14SAndroid Build Coastguard Worker             sendServiceMessage(TREL_DNSSD_REMOVE_SERVICE_MESSAGE);
245*cfb92d14SAndroid Build Coastguard Worker             sServiceRegistered = false;
246*cfb92d14SAndroid Build Coastguard Worker         }
247*cfb92d14SAndroid Build Coastguard Worker     }
248*cfb92d14SAndroid Build Coastguard Worker }
249*cfb92d14SAndroid Build Coastguard Worker 
otPlatTrelRegisterService(otInstance * aInstance,uint16_t aPort,const uint8_t * aTxtData,uint8_t aTxtLength)250*cfb92d14SAndroid Build Coastguard Worker void otPlatTrelRegisterService(otInstance *aInstance, uint16_t aPort, const uint8_t *aTxtData, uint8_t aTxtLength)
251*cfb92d14SAndroid Build Coastguard Worker {
252*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
253*cfb92d14SAndroid Build Coastguard Worker 
254*cfb92d14SAndroid Build Coastguard Worker     assert(aTxtLength <= TREL_MAX_SERVICE_TXT_DATA_LEN);
255*cfb92d14SAndroid Build Coastguard Worker 
256*cfb92d14SAndroid Build Coastguard Worker     if (sServiceRegistered)
257*cfb92d14SAndroid Build Coastguard Worker     {
258*cfb92d14SAndroid Build Coastguard Worker         sendServiceMessage(TREL_DNSSD_REMOVE_SERVICE_MESSAGE);
259*cfb92d14SAndroid Build Coastguard Worker     }
260*cfb92d14SAndroid Build Coastguard Worker 
261*cfb92d14SAndroid Build Coastguard Worker     sServiceRegistered = true;
262*cfb92d14SAndroid Build Coastguard Worker     sServicePort       = aPort;
263*cfb92d14SAndroid Build Coastguard Worker     sServiceTxtLength  = aTxtLength;
264*cfb92d14SAndroid Build Coastguard Worker     memcpy(sServiceTxtData, aTxtData, aTxtLength);
265*cfb92d14SAndroid Build Coastguard Worker 
266*cfb92d14SAndroid Build Coastguard Worker     sendServiceMessage(TREL_DNSSD_ADD_SERVICE_MESSAGE);
267*cfb92d14SAndroid Build Coastguard Worker 
268*cfb92d14SAndroid Build Coastguard Worker #if DEBUG_LOG
269*cfb92d14SAndroid Build Coastguard Worker     fprintf(stderr, "\r\n[trel-sim] otPlatTrelRegisterService(aPort:%d, aTxtData:", aPort);
270*cfb92d14SAndroid Build Coastguard Worker     dumpBuffer(aTxtData, aTxtLength);
271*cfb92d14SAndroid Build Coastguard Worker     fprintf(stderr, ")\r\n");
272*cfb92d14SAndroid Build Coastguard Worker #endif
273*cfb92d14SAndroid Build Coastguard Worker }
274*cfb92d14SAndroid Build Coastguard Worker 
otPlatTrelSend(otInstance * aInstance,const uint8_t * aUdpPayload,uint16_t aUdpPayloadLen,const otSockAddr * aDestSockAddr)275*cfb92d14SAndroid Build Coastguard Worker void otPlatTrelSend(otInstance       *aInstance,
276*cfb92d14SAndroid Build Coastguard Worker                     const uint8_t    *aUdpPayload,
277*cfb92d14SAndroid Build Coastguard Worker                     uint16_t          aUdpPayloadLen,
278*cfb92d14SAndroid Build Coastguard Worker                     const otSockAddr *aDestSockAddr)
279*cfb92d14SAndroid Build Coastguard Worker {
280*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
281*cfb92d14SAndroid Build Coastguard Worker 
282*cfb92d14SAndroid Build Coastguard Worker     Message *message;
283*cfb92d14SAndroid Build Coastguard Worker 
284*cfb92d14SAndroid Build Coastguard Worker     assert(sNumPendingTx < TREL_MAX_PENDING_TX);
285*cfb92d14SAndroid Build Coastguard Worker     assert(aUdpPayloadLen <= TREL_MAX_PACKET_SIZE);
286*cfb92d14SAndroid Build Coastguard Worker 
287*cfb92d14SAndroid Build Coastguard Worker     message = &sPendingTx[sNumPendingTx++];
288*cfb92d14SAndroid Build Coastguard Worker 
289*cfb92d14SAndroid Build Coastguard Worker     message->mType       = TREL_DATA_MESSAGE;
290*cfb92d14SAndroid Build Coastguard Worker     message->mSockAddr   = *aDestSockAddr;
291*cfb92d14SAndroid Build Coastguard Worker     message->mDataLength = aUdpPayloadLen;
292*cfb92d14SAndroid Build Coastguard Worker     memcpy(message->mData, aUdpPayload, aUdpPayloadLen);
293*cfb92d14SAndroid Build Coastguard Worker 
294*cfb92d14SAndroid Build Coastguard Worker #if DEBUG_LOG
295*cfb92d14SAndroid Build Coastguard Worker     fprintf(stderr, "\r\n[trel-sim] otPlatTrelSend(len:%u, port:%u)\r\n", aUdpPayloadLen, aDestSockAddr->mPort);
296*cfb92d14SAndroid Build Coastguard Worker #endif
297*cfb92d14SAndroid Build Coastguard Worker     ++sCounters.mTxPackets;
298*cfb92d14SAndroid Build Coastguard Worker     sCounters.mTxBytes += aUdpPayloadLen;
299*cfb92d14SAndroid Build Coastguard Worker }
300*cfb92d14SAndroid Build Coastguard Worker 
301*cfb92d14SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------
302*cfb92d14SAndroid Build Coastguard Worker // platformTrel system
303*cfb92d14SAndroid Build Coastguard Worker 
platformTrelInit(uint32_t aSpeedUpFactor)304*cfb92d14SAndroid Build Coastguard Worker void platformTrelInit(uint32_t aSpeedUpFactor)
305*cfb92d14SAndroid Build Coastguard Worker {
306*cfb92d14SAndroid Build Coastguard Worker     char *str;
307*cfb92d14SAndroid Build Coastguard Worker 
308*cfb92d14SAndroid Build Coastguard Worker     str = getenv("PORT_OFFSET");
309*cfb92d14SAndroid Build Coastguard Worker 
310*cfb92d14SAndroid Build Coastguard Worker     if (str != NULL)
311*cfb92d14SAndroid Build Coastguard Worker     {
312*cfb92d14SAndroid Build Coastguard Worker         char *endptr;
313*cfb92d14SAndroid Build Coastguard Worker 
314*cfb92d14SAndroid Build Coastguard Worker         sPortOffset = (uint16_t)strtol(str, &endptr, 0);
315*cfb92d14SAndroid Build Coastguard Worker 
316*cfb92d14SAndroid Build Coastguard Worker         if (*endptr != '\0')
317*cfb92d14SAndroid Build Coastguard Worker         {
318*cfb92d14SAndroid Build Coastguard Worker             fprintf(stderr, "\r\nInvalid PORT_OFFSET: %s\r\n", str);
319*cfb92d14SAndroid Build Coastguard Worker             exit(EXIT_FAILURE);
320*cfb92d14SAndroid Build Coastguard Worker         }
321*cfb92d14SAndroid Build Coastguard Worker 
322*cfb92d14SAndroid Build Coastguard Worker         sPortOffset *= (MAX_NETWORK_SIZE + 1);
323*cfb92d14SAndroid Build Coastguard Worker     }
324*cfb92d14SAndroid Build Coastguard Worker 
325*cfb92d14SAndroid Build Coastguard Worker     utilsInitSocket(&sSocket, TREL_SIM_PORT + sPortOffset);
326*cfb92d14SAndroid Build Coastguard Worker 
327*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aSpeedUpFactor);
328*cfb92d14SAndroid Build Coastguard Worker }
329*cfb92d14SAndroid Build Coastguard Worker 
platformTrelDeinit(void)330*cfb92d14SAndroid Build Coastguard Worker void platformTrelDeinit(void) { utilsDeinitSocket(&sSocket); }
331*cfb92d14SAndroid Build Coastguard Worker 
platformTrelUpdateFdSet(fd_set * aReadFdSet,fd_set * aWriteFdSet,struct timeval * aTimeout,int * aMaxFd)332*cfb92d14SAndroid Build Coastguard Worker void platformTrelUpdateFdSet(fd_set *aReadFdSet, fd_set *aWriteFdSet, struct timeval *aTimeout, int *aMaxFd)
333*cfb92d14SAndroid Build Coastguard Worker {
334*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aTimeout);
335*cfb92d14SAndroid Build Coastguard Worker 
336*cfb92d14SAndroid Build Coastguard Worker     // Always ready to receive
337*cfb92d14SAndroid Build Coastguard Worker     utilsAddSocketRxFd(&sSocket, aReadFdSet, aMaxFd);
338*cfb92d14SAndroid Build Coastguard Worker 
339*cfb92d14SAndroid Build Coastguard Worker     if (sNumPendingTx > 0)
340*cfb92d14SAndroid Build Coastguard Worker     {
341*cfb92d14SAndroid Build Coastguard Worker         utilsAddSocketTxFd(&sSocket, aWriteFdSet, aMaxFd);
342*cfb92d14SAndroid Build Coastguard Worker     }
343*cfb92d14SAndroid Build Coastguard Worker }
344*cfb92d14SAndroid Build Coastguard Worker 
platformTrelProcess(otInstance * aInstance,const fd_set * aReadFdSet,const fd_set * aWriteFdSet)345*cfb92d14SAndroid Build Coastguard Worker void platformTrelProcess(otInstance *aInstance, const fd_set *aReadFdSet, const fd_set *aWriteFdSet)
346*cfb92d14SAndroid Build Coastguard Worker {
347*cfb92d14SAndroid Build Coastguard Worker     if ((sNumPendingTx > 0) && utilsCanSocketSend(&sSocket, aWriteFdSet))
348*cfb92d14SAndroid Build Coastguard Worker     {
349*cfb92d14SAndroid Build Coastguard Worker         sendPendingTxMessages();
350*cfb92d14SAndroid Build Coastguard Worker     }
351*cfb92d14SAndroid Build Coastguard Worker 
352*cfb92d14SAndroid Build Coastguard Worker     if (utilsCanSocketReceive(&sSocket, aReadFdSet))
353*cfb92d14SAndroid Build Coastguard Worker     {
354*cfb92d14SAndroid Build Coastguard Worker         Message  message;
355*cfb92d14SAndroid Build Coastguard Worker         uint16_t len;
356*cfb92d14SAndroid Build Coastguard Worker 
357*cfb92d14SAndroid Build Coastguard Worker         message.mDataLength = 0;
358*cfb92d14SAndroid Build Coastguard Worker 
359*cfb92d14SAndroid Build Coastguard Worker         len = utilsReceiveFromSocket(&sSocket, &message, sizeof(message), NULL);
360*cfb92d14SAndroid Build Coastguard Worker 
361*cfb92d14SAndroid Build Coastguard Worker         if (len > 0)
362*cfb92d14SAndroid Build Coastguard Worker         {
363*cfb92d14SAndroid Build Coastguard Worker             processMessage(aInstance, &message, len);
364*cfb92d14SAndroid Build Coastguard Worker         }
365*cfb92d14SAndroid Build Coastguard Worker     }
366*cfb92d14SAndroid Build Coastguard Worker }
367*cfb92d14SAndroid Build Coastguard Worker 
otPlatTrelGetCounters(otInstance * aInstance)368*cfb92d14SAndroid Build Coastguard Worker const otPlatTrelCounters *otPlatTrelGetCounters(otInstance *aInstance)
369*cfb92d14SAndroid Build Coastguard Worker {
370*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
371*cfb92d14SAndroid Build Coastguard Worker     return &sCounters;
372*cfb92d14SAndroid Build Coastguard Worker }
373*cfb92d14SAndroid Build Coastguard Worker 
otPlatTrelResetCounters(otInstance * aInstance)374*cfb92d14SAndroid Build Coastguard Worker void otPlatTrelResetCounters(otInstance *aInstance)
375*cfb92d14SAndroid Build Coastguard Worker {
376*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
377*cfb92d14SAndroid Build Coastguard Worker     memset(&sCounters, 0, sizeof(sCounters));
378*cfb92d14SAndroid Build Coastguard Worker }
379*cfb92d14SAndroid Build Coastguard Worker 
380*cfb92d14SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------
381*cfb92d14SAndroid Build Coastguard Worker 
382*cfb92d14SAndroid Build Coastguard Worker // This is added for RCP build to be built ok
otPlatTrelHandleReceived(otInstance * aInstance,uint8_t * aBuffer,uint16_t aLength)383*cfb92d14SAndroid Build Coastguard Worker OT_TOOL_WEAK void otPlatTrelHandleReceived(otInstance *aInstance, uint8_t *aBuffer, uint16_t aLength)
384*cfb92d14SAndroid Build Coastguard Worker {
385*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
386*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aBuffer);
387*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aLength);
388*cfb92d14SAndroid Build Coastguard Worker 
389*cfb92d14SAndroid Build Coastguard Worker     assert(false);
390*cfb92d14SAndroid Build Coastguard Worker }
391*cfb92d14SAndroid Build Coastguard Worker 
otPlatTrelHandleDiscoveredPeerInfo(otInstance * aInstance,const otPlatTrelPeerInfo * aInfo)392*cfb92d14SAndroid Build Coastguard Worker OT_TOOL_WEAK void otPlatTrelHandleDiscoveredPeerInfo(otInstance *aInstance, const otPlatTrelPeerInfo *aInfo)
393*cfb92d14SAndroid Build Coastguard Worker {
394*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
395*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInfo);
396*cfb92d14SAndroid Build Coastguard Worker 
397*cfb92d14SAndroid Build Coastguard Worker     assert(false);
398*cfb92d14SAndroid Build Coastguard Worker }
399*cfb92d14SAndroid Build Coastguard Worker 
400*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE
401