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