From afe57bf36d9c4bc003227aac0a014f44ae838a68 Mon Sep 17 00:00:00 2001 From: Jonathan Hui Date: Mon, 2 Mar 2020 11:42:15 -0800 Subject: [PATCH] [fuzz] implement transmit radio callbacks (#4625) - otPlatRadioTxStarted - otPlatRadioTxDone --- tests/fuzz/fuzzer_platform.cpp | 52 ++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/tests/fuzz/fuzzer_platform.cpp b/tests/fuzz/fuzzer_platform.cpp index 5402ee03f..c610f2d8c 100644 --- a/tests/fuzz/fuzzer_platform.cpp +++ b/tests/fuzz/fuzzer_platform.cpp @@ -42,19 +42,43 @@ #include #include +#include "mac/mac_frame.hpp" + +using namespace ot; + typedef struct AlarmState { uint32_t fire; bool isRunning; } AlarmState; +enum +{ + IEEE802154_ACK_LENGTH = 5, + + IEEE802154_FRAME_TYPE_ACK = 2 << 0, +}; + static uint32_t sAlarmNow; static AlarmState sAlarmMilli; static AlarmState sAlarmMicro; static uint32_t sRandomState = 1; static uint8_t sRadioTransmitPsdu[OT_RADIO_FRAME_MAX_SIZE]; static otRadioFrame sRadioTransmitFrame = {.mPsdu = sRadioTransmitPsdu}; -static bool sResetWasRequested = false; +static uint8_t sRadioAckPsdu[OT_RADIO_FRAME_MAX_SIZE]; +static otRadioFrame sRadioAckFrame = {.mPsdu = sRadioAckPsdu}; +static bool sResetWasRequested = false; +static otRadioState sRadioState = OT_RADIO_STATE_DISABLED; + +bool otMacFrameIsAckRequested(const otRadioFrame *aFrame) +{ + return static_cast(aFrame)->GetAckRequest(); +} + +uint8_t otMacFrameGetSequence(const otRadioFrame *aFrame) +{ + return static_cast(aFrame)->GetSequence(); +} void FuzzerPlatformInit(void) { @@ -66,6 +90,26 @@ void FuzzerPlatformInit(void) void FuzzerPlatformProcess(otInstance *aInstance) { + if (sRadioState == OT_RADIO_STATE_TRANSMIT) + { + sRadioState = OT_RADIO_STATE_RECEIVE; + + if (otMacFrameIsAckRequested(&sRadioTransmitFrame)) + { + sRadioAckFrame.mLength = IEEE802154_ACK_LENGTH; + sRadioAckFrame.mPsdu[0] = IEEE802154_FRAME_TYPE_ACK; + sRadioAckFrame.mPsdu[1] = 0; + sRadioAckFrame.mPsdu[2] = otMacFrameGetSequence(&sRadioTransmitFrame); + sRadioAckFrame.mChannel = sRadioTransmitFrame.mChannel; + + otPlatRadioTxDone(aInstance, &sRadioTransmitFrame, &sRadioAckFrame, OT_ERROR_NONE); + } + else + { + otPlatRadioTxDone(aInstance, &sRadioTransmitFrame, NULL, OT_ERROR_NONE); + } + } + if (sAlarmMilli.isRunning || sAlarmMicro.isRunning) { uint32_t fire = UINT32_MAX; @@ -256,8 +300,10 @@ otError otPlatRadioReceive(otInstance *aInstance, uint8_t aChannel) otError otPlatRadioTransmit(otInstance *aInstance, otRadioFrame *aFrame) { - OT_UNUSED_VARIABLE(aInstance); - OT_UNUSED_VARIABLE(aFrame); + sRadioState = OT_RADIO_STATE_TRANSMIT; + + otPlatRadioTxStarted(aInstance, aFrame); + return OT_ERROR_NONE; }