1 /*
2 * Copyright (c) 2017, The OpenThread Authors.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * 3. Neither the name of the copyright holder nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include "openthread-core-config.h"
30
31 #include "fuzzer_platform.h"
32
33 #include <string.h>
34
35 #include <openthread/platform/alarm-micro.h>
36 #include <openthread/platform/alarm-milli.h>
37 #include <openthread/platform/diag.h>
38 #include <openthread/platform/entropy.h>
39 #include <openthread/platform/logging.h>
40 #include <openthread/platform/misc.h>
41 #include <openthread/platform/multipan.h>
42 #include <openthread/platform/radio.h>
43 #include <openthread/platform/settings.h>
44
45 #include "mac/mac_frame.hpp"
46
47 using namespace ot;
48
49 typedef struct AlarmState
50 {
51 uint32_t fire;
52 bool isRunning;
53 } AlarmState;
54
55 enum
56 {
57 IEEE802154_ACK_LENGTH = 5,
58
59 IEEE802154_FRAME_TYPE_ACK = 2 << 0,
60 };
61
62 static uint32_t sAlarmNow;
63 static AlarmState sAlarmMilli;
64 static AlarmState sAlarmMicro;
65 static uint32_t sRandomState = 1;
66 static uint8_t sRadioTransmitPsdu[OT_RADIO_FRAME_MAX_SIZE];
67 static otRadioFrame sRadioTransmitFrame;
68 static uint8_t sRadioAckPsdu[OT_RADIO_FRAME_MAX_SIZE];
69 static otRadioFrame sRadioAckFrame;
70 static bool sResetWasRequested = false;
71 static otRadioState sRadioState = OT_RADIO_STATE_DISABLED;
72
otMacFrameIsAckRequested(const otRadioFrame * aFrame)73 bool otMacFrameIsAckRequested(const otRadioFrame *aFrame)
74 {
75 return static_cast<const Mac::Frame *>(aFrame)->GetAckRequest();
76 }
77
otMacFrameGetSequence(const otRadioFrame * aFrame)78 uint8_t otMacFrameGetSequence(const otRadioFrame *aFrame)
79 {
80 return static_cast<const Mac::Frame *>(aFrame)->GetSequence();
81 }
82
FuzzerPlatformInit(void)83 void FuzzerPlatformInit(void)
84 {
85 sRandomState = 1;
86 sAlarmNow = 0;
87 memset(&sAlarmMilli, 0, sizeof(sAlarmMilli));
88 memset(&sAlarmMicro, 0, sizeof(sAlarmMicro));
89
90 sRadioTransmitFrame.mPsdu = sRadioTransmitPsdu;
91 sRadioAckFrame.mPsdu = sRadioAckPsdu;
92 }
93
FuzzerPlatformProcess(otInstance * aInstance)94 void FuzzerPlatformProcess(otInstance *aInstance)
95 {
96 if (sRadioState == OT_RADIO_STATE_TRANSMIT)
97 {
98 sRadioState = OT_RADIO_STATE_RECEIVE;
99
100 if (otMacFrameIsAckRequested(&sRadioTransmitFrame))
101 {
102 sRadioAckFrame.mLength = IEEE802154_ACK_LENGTH;
103 sRadioAckFrame.mPsdu[0] = IEEE802154_FRAME_TYPE_ACK;
104 sRadioAckFrame.mPsdu[1] = 0;
105 sRadioAckFrame.mPsdu[2] = otMacFrameGetSequence(&sRadioTransmitFrame);
106 sRadioAckFrame.mChannel = sRadioTransmitFrame.mChannel;
107
108 otPlatRadioTxDone(aInstance, &sRadioTransmitFrame, &sRadioAckFrame, OT_ERROR_NONE);
109 }
110 else
111 {
112 otPlatRadioTxDone(aInstance, &sRadioTransmitFrame, nullptr, OT_ERROR_NONE);
113 }
114 }
115
116 if (sAlarmMilli.isRunning || sAlarmMicro.isRunning)
117 {
118 uint32_t fire = UINT32_MAX;
119
120 if (sAlarmMilli.isRunning && fire > sAlarmMilli.fire)
121 {
122 fire = sAlarmMilli.fire;
123 }
124
125 if (sAlarmMicro.isRunning && fire > sAlarmMicro.fire)
126 {
127 fire = sAlarmMicro.fire;
128 }
129
130 sAlarmNow = fire;
131
132 if (sAlarmMilli.isRunning && sAlarmNow >= sAlarmMilli.fire)
133 {
134 sAlarmMilli.isRunning = false;
135 otPlatAlarmMilliFired(aInstance);
136 }
137
138 #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
139 if (sAlarmMicro.isRunning && sAlarmNow >= sAlarmMicro.fire)
140 {
141 sAlarmMicro.isRunning = false;
142 otPlatAlarmMicroFired(aInstance);
143 }
144 #endif
145 }
146 }
147
FuzzerPlatformResetWasRequested(void)148 bool FuzzerPlatformResetWasRequested(void) { return sResetWasRequested; }
149
otPlatAlarmMilliGetNow(void)150 uint32_t otPlatAlarmMilliGetNow(void) { return sAlarmNow / 1000; }
151
otPlatAlarmMilliStartAt(otInstance * aInstance,uint32_t aT0,uint32_t aDt)152 void otPlatAlarmMilliStartAt(otInstance *aInstance, uint32_t aT0, uint32_t aDt)
153 {
154 OT_UNUSED_VARIABLE(aInstance);
155
156 sAlarmMilli.fire = (aT0 + aDt) * 1000;
157 sAlarmMilli.isRunning = true;
158 }
159
otPlatAlarmMilliStop(otInstance * aInstance)160 void otPlatAlarmMilliStop(otInstance *aInstance)
161 {
162 OT_UNUSED_VARIABLE(aInstance);
163
164 sAlarmMilli.isRunning = false;
165 }
166
otPlatAlarmMicroGetNow(void)167 uint32_t otPlatAlarmMicroGetNow(void) { return sAlarmNow; }
168
otPlatAlarmMicroStartAt(otInstance * aInstance,uint32_t aT0,uint32_t aDt)169 void otPlatAlarmMicroStartAt(otInstance *aInstance, uint32_t aT0, uint32_t aDt)
170 {
171 OT_UNUSED_VARIABLE(aInstance);
172
173 sAlarmMicro.fire = aT0 + aDt;
174 sAlarmMicro.isRunning = true;
175 }
176
otPlatAlarmMicroStop(otInstance * aInstance)177 void otPlatAlarmMicroStop(otInstance *aInstance)
178 {
179 OT_UNUSED_VARIABLE(aInstance);
180
181 sAlarmMicro.isRunning = false;
182 }
183
otDiagIsEnabled(otInstance * aInstance)184 bool otDiagIsEnabled(otInstance *aInstance)
185 {
186 OT_UNUSED_VARIABLE(aInstance);
187
188 return false;
189 }
190
otDiagProcessCmd(otInstance * aInstance,uint8_t aArgsLength,char * aArgs[],char * aOutput,size_t aOutputMaxLen)191 otError otDiagProcessCmd(otInstance *aInstance, uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen)
192 {
193 OT_UNUSED_VARIABLE(aInstance);
194 OT_UNUSED_VARIABLE(aArgsLength);
195 OT_UNUSED_VARIABLE(aArgs);
196 OT_UNUSED_VARIABLE(aOutput);
197 OT_UNUSED_VARIABLE(aOutputMaxLen);
198
199 return OT_ERROR_NOT_IMPLEMENTED;
200 }
201
otDiagProcessCmdLine(otInstance * aInstance,const char * aString,char * aOutput,size_t aOutputMaxLen)202 otError otDiagProcessCmdLine(otInstance *aInstance, const char *aString, char *aOutput, size_t aOutputMaxLen)
203 {
204 OT_UNUSED_VARIABLE(aInstance);
205 OT_UNUSED_VARIABLE(aString);
206 OT_UNUSED_VARIABLE(aOutput);
207 OT_UNUSED_VARIABLE(aOutputMaxLen);
208
209 return OT_ERROR_NOT_IMPLEMENTED;
210 }
211
otPlatReset(otInstance * aInstance)212 void otPlatReset(otInstance *aInstance)
213 {
214 OT_UNUSED_VARIABLE(aInstance);
215
216 sResetWasRequested = true;
217 }
218
otPlatGetResetReason(otInstance * aInstance)219 otPlatResetReason otPlatGetResetReason(otInstance *aInstance)
220 {
221 OT_UNUSED_VARIABLE(aInstance);
222 return OT_PLAT_RESET_REASON_POWER_ON;
223 }
224
otPlatLog(otLogLevel aLogLevel,otLogRegion aLogRegion,const char * aFormat,...)225 OT_TOOL_WEAK void otPlatLog(otLogLevel aLogLevel, otLogRegion aLogRegion, const char *aFormat, ...)
226 {
227 OT_UNUSED_VARIABLE(aLogLevel);
228 OT_UNUSED_VARIABLE(aLogRegion);
229 OT_UNUSED_VARIABLE(aFormat);
230 }
231
otPlatWakeHost(void)232 void otPlatWakeHost(void) {}
233
otPlatMultipanGetActiveInstance(otInstance **)234 otError otPlatMultipanGetActiveInstance(otInstance **) { return OT_ERROR_NOT_IMPLEMENTED; }
235
otPlatMultipanSetActiveInstance(otInstance *,bool)236 otError otPlatMultipanSetActiveInstance(otInstance *, bool) { return OT_ERROR_NOT_IMPLEMENTED; }
237
otPlatRadioGetIeeeEui64(otInstance * aInstance,uint8_t * aIeeeEui64)238 void otPlatRadioGetIeeeEui64(otInstance *aInstance, uint8_t *aIeeeEui64)
239 {
240 OT_UNUSED_VARIABLE(aInstance);
241 OT_UNUSED_VARIABLE(aIeeeEui64);
242 }
243
otPlatRadioSetPanId(otInstance * aInstance,uint16_t aPanId)244 void otPlatRadioSetPanId(otInstance *aInstance, uint16_t aPanId)
245 {
246 OT_UNUSED_VARIABLE(aInstance);
247 OT_UNUSED_VARIABLE(aPanId);
248 }
249
otPlatRadioSetExtendedAddress(otInstance * aInstance,const otExtAddress * aExtAddr)250 void otPlatRadioSetExtendedAddress(otInstance *aInstance, const otExtAddress *aExtAddr)
251 {
252 OT_UNUSED_VARIABLE(aInstance);
253 OT_UNUSED_VARIABLE(aExtAddr);
254 }
255
otPlatRadioSetShortAddress(otInstance * aInstance,uint16_t aShortAddress)256 void otPlatRadioSetShortAddress(otInstance *aInstance, uint16_t aShortAddress)
257 {
258 OT_UNUSED_VARIABLE(aInstance);
259 OT_UNUSED_VARIABLE(aShortAddress);
260 }
261
otPlatRadioSetPromiscuous(otInstance * aInstance,bool aEnabled)262 void otPlatRadioSetPromiscuous(otInstance *aInstance, bool aEnabled)
263 {
264 OT_UNUSED_VARIABLE(aInstance);
265 OT_UNUSED_VARIABLE(aEnabled);
266 }
267
otPlatRadioSetRxOnWhenIdle(otInstance * aInstance,bool aEnabled)268 void otPlatRadioSetRxOnWhenIdle(otInstance *aInstance, bool aEnabled)
269 {
270 OT_UNUSED_VARIABLE(aInstance);
271 OT_UNUSED_VARIABLE(aEnabled);
272 }
273
otPlatRadioIsEnabled(otInstance * aInstance)274 bool otPlatRadioIsEnabled(otInstance *aInstance)
275 {
276 OT_UNUSED_VARIABLE(aInstance);
277 return true;
278 }
279
otPlatRadioEnable(otInstance * aInstance)280 otError otPlatRadioEnable(otInstance *aInstance)
281 {
282 OT_UNUSED_VARIABLE(aInstance);
283
284 sRadioState = OT_RADIO_STATE_SLEEP;
285
286 return OT_ERROR_NONE;
287 }
288
otPlatRadioDisable(otInstance * aInstance)289 otError otPlatRadioDisable(otInstance *aInstance)
290 {
291 OT_UNUSED_VARIABLE(aInstance);
292
293 sRadioState = OT_RADIO_STATE_DISABLED;
294
295 return OT_ERROR_NONE;
296 }
297
otPlatRadioSleep(otInstance * aInstance)298 otError otPlatRadioSleep(otInstance *aInstance)
299 {
300 OT_UNUSED_VARIABLE(aInstance);
301
302 sRadioState = OT_RADIO_STATE_SLEEP;
303
304 return OT_ERROR_NONE;
305 }
306
otPlatRadioReceive(otInstance * aInstance,uint8_t aChannel)307 otError otPlatRadioReceive(otInstance *aInstance, uint8_t aChannel)
308 {
309 OT_UNUSED_VARIABLE(aInstance);
310 OT_UNUSED_VARIABLE(aChannel);
311
312 sRadioState = OT_RADIO_STATE_RECEIVE;
313
314 return OT_ERROR_NONE;
315 }
316
otPlatRadioTransmit(otInstance * aInstance,otRadioFrame * aFrame)317 otError otPlatRadioTransmit(otInstance *aInstance, otRadioFrame *aFrame)
318 {
319 sRadioState = OT_RADIO_STATE_TRANSMIT;
320
321 otPlatRadioTxStarted(aInstance, aFrame);
322
323 return OT_ERROR_NONE;
324 }
325
otPlatRadioGetTransmitPower(otInstance * aInstance,int8_t * aPower)326 otError otPlatRadioGetTransmitPower(otInstance *aInstance, int8_t *aPower)
327 {
328 OT_UNUSED_VARIABLE(aInstance);
329 OT_UNUSED_VARIABLE(aPower);
330 return OT_ERROR_NONE;
331 }
332
otPlatRadioGetTransmitBuffer(otInstance * aInstance)333 otRadioFrame *otPlatRadioGetTransmitBuffer(otInstance *aInstance)
334 {
335 OT_UNUSED_VARIABLE(aInstance);
336 return &sRadioTransmitFrame;
337 }
338
otPlatRadioGetRssi(otInstance * aInstance)339 int8_t otPlatRadioGetRssi(otInstance *aInstance)
340 {
341 OT_UNUSED_VARIABLE(aInstance);
342 return 0;
343 }
344
otPlatRadioGetCaps(otInstance * aInstance)345 otRadioCaps otPlatRadioGetCaps(otInstance *aInstance)
346 {
347 OT_UNUSED_VARIABLE(aInstance);
348 return OT_RADIO_CAPS_NONE;
349 }
350
otPlatRadioGetPromiscuous(otInstance * aInstance)351 bool otPlatRadioGetPromiscuous(otInstance *aInstance)
352 {
353 OT_UNUSED_VARIABLE(aInstance);
354 return false;
355 }
356
otPlatRadioEnableSrcMatch(otInstance * aInstance,bool aEnable)357 void otPlatRadioEnableSrcMatch(otInstance *aInstance, bool aEnable)
358 {
359 OT_UNUSED_VARIABLE(aInstance);
360 OT_UNUSED_VARIABLE(aEnable);
361 }
362
otPlatRadioAddSrcMatchShortEntry(otInstance * aInstance,uint16_t aShortAddress)363 otError otPlatRadioAddSrcMatchShortEntry(otInstance *aInstance, uint16_t aShortAddress)
364 {
365 OT_UNUSED_VARIABLE(aInstance);
366 OT_UNUSED_VARIABLE(aShortAddress);
367 return OT_ERROR_NONE;
368 }
369
otPlatRadioAddSrcMatchExtEntry(otInstance * aInstance,const otExtAddress * aExtAddress)370 otError otPlatRadioAddSrcMatchExtEntry(otInstance *aInstance, const otExtAddress *aExtAddress)
371 {
372 OT_UNUSED_VARIABLE(aInstance);
373 OT_UNUSED_VARIABLE(aExtAddress);
374 return OT_ERROR_NONE;
375 }
376
otPlatRadioClearSrcMatchShortEntry(otInstance * aInstance,uint16_t aShortAddress)377 otError otPlatRadioClearSrcMatchShortEntry(otInstance *aInstance, uint16_t aShortAddress)
378 {
379 OT_UNUSED_VARIABLE(aInstance);
380 OT_UNUSED_VARIABLE(aShortAddress);
381 return OT_ERROR_NONE;
382 }
383
otPlatRadioClearSrcMatchExtEntry(otInstance * aInstance,const otExtAddress * aExtAddress)384 otError otPlatRadioClearSrcMatchExtEntry(otInstance *aInstance, const otExtAddress *aExtAddress)
385 {
386 OT_UNUSED_VARIABLE(aInstance);
387 OT_UNUSED_VARIABLE(aExtAddress);
388 return OT_ERROR_NONE;
389 }
390
otPlatRadioClearSrcMatchShortEntries(otInstance * aInstance)391 void otPlatRadioClearSrcMatchShortEntries(otInstance *aInstance) { OT_UNUSED_VARIABLE(aInstance); }
392
otPlatRadioClearSrcMatchExtEntries(otInstance * aInstance)393 void otPlatRadioClearSrcMatchExtEntries(otInstance *aInstance) { OT_UNUSED_VARIABLE(aInstance); }
394
otPlatRadioEnergyScan(otInstance * aInstance,uint8_t aScanChannel,uint16_t aScanDuration)395 otError otPlatRadioEnergyScan(otInstance *aInstance, uint8_t aScanChannel, uint16_t aScanDuration)
396 {
397 OT_UNUSED_VARIABLE(aInstance);
398 OT_UNUSED_VARIABLE(aScanChannel);
399 OT_UNUSED_VARIABLE(aScanDuration);
400 return OT_ERROR_NOT_IMPLEMENTED;
401 }
402
otPlatRadioSetTransmitPower(otInstance * aInstance,int8_t aPower)403 otError otPlatRadioSetTransmitPower(otInstance *aInstance, int8_t aPower)
404 {
405 OT_UNUSED_VARIABLE(aInstance);
406 OT_UNUSED_VARIABLE(aPower);
407 return OT_ERROR_NOT_IMPLEMENTED;
408 }
409
otPlatRadioGetCcaEnergyDetectThreshold(otInstance * aInstance,int8_t * aThreshold)410 otError otPlatRadioGetCcaEnergyDetectThreshold(otInstance *aInstance, int8_t *aThreshold)
411 {
412 OT_UNUSED_VARIABLE(aInstance);
413 OT_UNUSED_VARIABLE(aThreshold);
414 return OT_ERROR_NOT_IMPLEMENTED;
415 }
416
otPlatRadioSetCcaEnergyDetectThreshold(otInstance * aInstance,int8_t aThreshold)417 otError otPlatRadioSetCcaEnergyDetectThreshold(otInstance *aInstance, int8_t aThreshold)
418 {
419 OT_UNUSED_VARIABLE(aInstance);
420 OT_UNUSED_VARIABLE(aThreshold);
421 return OT_ERROR_NOT_IMPLEMENTED;
422 }
423
otPlatRadioGetReceiveSensitivity(otInstance * aInstance)424 int8_t otPlatRadioGetReceiveSensitivity(otInstance *aInstance)
425 {
426 OT_UNUSED_VARIABLE(aInstance);
427 return 0;
428 }
429
otPlatEntropyGet(uint8_t * aOutput,uint16_t aOutputLength)430 otError otPlatEntropyGet(uint8_t *aOutput, uint16_t aOutputLength)
431 {
432 for (uint16_t length = 0; length < aOutputLength; length++)
433 {
434 aOutput[length] = (uint8_t)rand();
435 }
436
437 return OT_ERROR_NONE;
438 }
439
otPlatSettingsInit(otInstance * aInstance,const uint16_t * aSensitiveKeys,uint16_t aSensitiveKeysLength)440 void otPlatSettingsInit(otInstance *aInstance, const uint16_t *aSensitiveKeys, uint16_t aSensitiveKeysLength)
441 {
442 OT_UNUSED_VARIABLE(aInstance);
443 OT_UNUSED_VARIABLE(aSensitiveKeys);
444 OT_UNUSED_VARIABLE(aSensitiveKeysLength);
445 }
446
otPlatSettingsDeinit(otInstance * aInstance)447 void otPlatSettingsDeinit(otInstance *aInstance) { OT_UNUSED_VARIABLE(aInstance); }
448
otPlatSettingsGet(otInstance * aInstance,uint16_t aKey,int aIndex,uint8_t * aValue,uint16_t * aValueLength)449 otError otPlatSettingsGet(otInstance *aInstance, uint16_t aKey, int aIndex, uint8_t *aValue, uint16_t *aValueLength)
450 {
451 OT_UNUSED_VARIABLE(aInstance);
452 OT_UNUSED_VARIABLE(aKey);
453 OT_UNUSED_VARIABLE(aIndex);
454 OT_UNUSED_VARIABLE(aValue);
455 OT_UNUSED_VARIABLE(aValueLength);
456 return OT_ERROR_NOT_FOUND;
457 }
458
otPlatSettingsSet(otInstance * aInstance,uint16_t aKey,const uint8_t * aValue,uint16_t aValueLength)459 otError otPlatSettingsSet(otInstance *aInstance, uint16_t aKey, const uint8_t *aValue, uint16_t aValueLength)
460 {
461 OT_UNUSED_VARIABLE(aInstance);
462 OT_UNUSED_VARIABLE(aKey);
463 OT_UNUSED_VARIABLE(aValue);
464 OT_UNUSED_VARIABLE(aValueLength);
465 return OT_ERROR_NONE;
466 }
467
otPlatSettingsAdd(otInstance * aInstance,uint16_t aKey,const uint8_t * aValue,uint16_t aValueLength)468 otError otPlatSettingsAdd(otInstance *aInstance, uint16_t aKey, const uint8_t *aValue, uint16_t aValueLength)
469 {
470 OT_UNUSED_VARIABLE(aInstance);
471 OT_UNUSED_VARIABLE(aKey);
472 OT_UNUSED_VARIABLE(aValue);
473 OT_UNUSED_VARIABLE(aValueLength);
474 return OT_ERROR_NONE;
475 }
476
otPlatSettingsDelete(otInstance * aInstance,uint16_t aKey,int aIndex)477 otError otPlatSettingsDelete(otInstance *aInstance, uint16_t aKey, int aIndex)
478 {
479 OT_UNUSED_VARIABLE(aInstance);
480 OT_UNUSED_VARIABLE(aKey);
481 OT_UNUSED_VARIABLE(aIndex);
482 return OT_ERROR_NONE;
483 }
484
otPlatSettingsWipe(otInstance * aInstance)485 void otPlatSettingsWipe(otInstance *aInstance) { OT_UNUSED_VARIABLE(aInstance); }
486
otPlatDiagProcess(otInstance * aInstance,uint8_t aArgsLength,char * aArgs[],char * aOutput,size_t aOutputMaxLen)487 otError otPlatDiagProcess(otInstance *aInstance,
488 uint8_t aArgsLength,
489 char *aArgs[],
490 char *aOutput,
491 size_t aOutputMaxLen)
492 {
493 OT_UNUSED_VARIABLE(aInstance);
494 OT_UNUSED_VARIABLE(aArgsLength);
495 OT_UNUSED_VARIABLE(aArgs);
496 OT_UNUSED_VARIABLE(aOutput);
497 OT_UNUSED_VARIABLE(aOutputMaxLen);
498
499 return OT_ERROR_INVALID_COMMAND;
500 }
501
otPlatDiagModeSet(bool aMode)502 void otPlatDiagModeSet(bool aMode) { OT_UNUSED_VARIABLE(aMode); }
503
otPlatDiagModeGet(void)504 bool otPlatDiagModeGet(void) { return false; }
505
otPlatDiagChannelSet(uint8_t aChannel)506 void otPlatDiagChannelSet(uint8_t aChannel) { OT_UNUSED_VARIABLE(aChannel); }
507
otPlatDiagTxPowerSet(int8_t aTxPower)508 void otPlatDiagTxPowerSet(int8_t aTxPower) { OT_UNUSED_VARIABLE(aTxPower); }
509
otPlatDiagRadioReceived(otInstance * aInstance,otRadioFrame * aFrame,otError aError)510 void otPlatDiagRadioReceived(otInstance *aInstance, otRadioFrame *aFrame, otError aError)
511 {
512 OT_UNUSED_VARIABLE(aInstance);
513 OT_UNUSED_VARIABLE(aFrame);
514 OT_UNUSED_VARIABLE(aError);
515 }
516
otPlatDiagAlarmCallback(otInstance * aInstance)517 void otPlatDiagAlarmCallback(otInstance *aInstance) { OT_UNUSED_VARIABLE(aInstance); }
518