From 4dc80ee3570cb6d65303e2f445b6df7758db357d Mon Sep 17 00:00:00 2001 From: Buke Po Date: Thu, 27 Jul 2017 00:11:46 +0800 Subject: [PATCH] [radio] remove deprecated transmit done api (#2020) This commit removes the deprecated API otPlatRadioTransmitDone() to prevent new platforms using this API. Some platforms still uses the deprecated API. This commit generates ACK frame according to the Frame Pending flag and the sent frame. This commit does not define an API for generating ACK frame because the frame should not be generated by sender. Platforms not passing the received ACK frame should remove the code generating ACK frame soon. This commit also fixes the build failures on the gp712 platform. --- .../cc2650/openthread-core-cc2650-config.h | 8 -- examples/platforms/cc2650/radio.c | 19 +++- .../cc2652/openthread-core-cc2652-config.h | 8 -- examples/platforms/cc2652/radio.c | 19 +++- examples/platforms/gp712/Makefile.am | 13 +-- examples/platforms/gp712/alarm.c | 10 +- examples/platforms/gp712/diag.c | 2 +- .../gp712/openthread-core-gp712-config.h | 9 -- examples/platforms/gp712/radio.c | 18 ++- examples/platforms/posix/radio.c | 12 +- include/openthread/platform/radio.h | 16 --- src/core/mac/mac.cpp | 103 ------------------ src/core/mac/mac.hpp | 16 --- 13 files changed, 70 insertions(+), 183 deletions(-) diff --git a/examples/platforms/cc2650/openthread-core-cc2650-config.h b/examples/platforms/cc2650/openthread-core-cc2650-config.h index c03f7b957..ebeeeee48 100644 --- a/examples/platforms/cc2650/openthread-core-cc2650-config.h +++ b/examples/platforms/cc2650/openthread-core-cc2650-config.h @@ -36,13 +36,5 @@ */ #define OPENTHREAD_CONFIG_NUM_MESSAGE_BUFFERS 32 -/** - * @def OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE - * - * Define to 1 if you want use legacy transmit done. - * - */ -#define OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE 1 - #endif /* OPENTHREAD_CORE_CC2650_CONFIG_H_ */ diff --git a/examples/platforms/cc2650/radio.c b/examples/platforms/cc2650/radio.c index 5b15dca5d..fd4a2589d 100644 --- a/examples/platforms/cc2650/radio.c +++ b/examples/platforms/cc2650/radio.c @@ -51,6 +51,7 @@ enum { + IEEE802154_ACK_LENGTH = 5, CC2650_RECEIVE_SENSITIVITY = -100, // dBm }; @@ -1840,7 +1841,23 @@ void cc2650RadioProcess(otInstance *aInstance) else #endif /* OPENTHREAD_ENABLE_DIAG */ { - otPlatRadioTransmitDone(aInstance, &sTransmitFrame, sReceivedAckPendingBit, sTransmitError); + // TODO: pass received ACK frame instead of generating one. + otRadioFrame ackFrame; + uint8_t psdu[IEEE802154_ACK_LENGTH]; + + ackFrame.mPsdu = psdu; + ackFrame.mLength = IEEE802154_ACK_LENGTH; + ackFrame.mPsdu[0] = IEEE802154_FRAME_TYPE_ACK; + + if (sReceivedAckPendingBit) + { + ackFrame.mPsdu[0] |= IEEE802154_FRAME_PENDING; + } + + ackFrame.mPsdu[1] = 0; + ackFrame.mPsdu[2] = sTransmitFrame.mPsdu[IEEE802154_DSN_OFFSET]; + + otPlatRadioTxDone(aInstance, &sTransmitFrame, &ackFrame, sTransmitError); } } diff --git a/examples/platforms/cc2652/openthread-core-cc2652-config.h b/examples/platforms/cc2652/openthread-core-cc2652-config.h index 71dde962e..baffdad0b 100644 --- a/examples/platforms/cc2652/openthread-core-cc2652-config.h +++ b/examples/platforms/cc2652/openthread-core-cc2652-config.h @@ -60,13 +60,5 @@ */ #define OPENTHREAD_CONFIG_ENABLE_DEFAULT_LOG_OUTPUT 1 -/** - * @def OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE - * - * Define to 1 if you want use legacy transmit done. - * - */ -#define OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE 1 - #endif /* OPENTHREAD_CORE_CC2650_CONFIG_H_ */ diff --git a/examples/platforms/cc2652/radio.c b/examples/platforms/cc2652/radio.c index b5721a2f0..c6c7aa0a1 100644 --- a/examples/platforms/cc2652/radio.c +++ b/examples/platforms/cc2652/radio.c @@ -61,6 +61,7 @@ enum { + IEEE802154_ACK_LENGTH = 5, CC2652_RECEIVE_SENSITIVITY = -100, // dBm }; @@ -1838,7 +1839,23 @@ void cc2652RadioProcess(otInstance *aInstance) else #endif /* OPENTHREAD_ENABLE_DIAG */ { - otPlatRadioTransmitDone(aInstance, &sTransmitFrame, sReceivedAckPendingBit, sTransmitError); + // TODO: pass received ACK frame instead of generating one. + otRadioFrame ackFrame; + uint8_t psdu[IEEE802154_ACK_LENGTH]; + + ackFrame.mPsdu = psdu; + ackFrame.mLength = IEEE802154_ACK_LENGTH; + ackFrame.mPsdu[0] = IEEE802154_FRAME_TYPE_ACK; + + if (sReceivedAckPendingBit) + { + ackFrame.mPsdu[0] |= IEEE802154_FRAME_PENDING; + } + + ackFrame.mPsdu[1] = 0; + ackFrame.mPsdu[2] = sTransmitFrame.mPsdu[IEEE802154_DSN_OFFSET]; + + otPlatRadioTxDone(aInstance, &sTransmitFrame, &ackFrame, sTransmitError); } } diff --git a/examples/platforms/gp712/Makefile.am b/examples/platforms/gp712/Makefile.am index 9d7ced4f3..666fa55f9 100644 --- a/examples/platforms/gp712/Makefile.am +++ b/examples/platforms/gp712/Makefile.am @@ -30,19 +30,17 @@ include $(abs_top_nlbuild_autotools_dir)/automake/pre.am lib_LIBRARIES = libopenthread-gp712.a -libopenthread_gp712_a_CPPFLAGS = \ +libopenthread_gp712_a_CPPFLAGS = \ -I$(top_srcdir)/include \ -I$(top_srcdir)/examples/platforms \ - -I$(top_srcdir)/examples/platforms/utils\ -I$(top_srcdir)/src/core \ -lrt \ -lpthread \ $(NULL) -libopenthread_gp712_settings.cpp: $(srcdir)/../utils/settings.cpp - cp $? $@ - -CLEANFILES = libopenthread_gp712_settings.cpp +Dash = - +libopenthread_gp712_a_LIBADD = \ + $(shell find $(top_builddir)/examples/platforms/utils $(Dash)type f $(Dash)name "*.o") libopenthread_gp712_a_SOURCES = \ alarm.c \ @@ -53,7 +51,6 @@ libopenthread_gp712_a_SOURCES = \ random.c \ uart-posix.c \ flash.c \ - libopenthread_gp712_settings.cpp \ $(NULL) # uart-socket.c \ @@ -67,7 +64,7 @@ endif if OPENTHREAD_BUILD_COVERAGE -CLEANFILES += $(wildcard *.gcda *.gcno) +CLEANFILES = $(wildcard *.gcda *.gcno) endif # OPENTHREAD_BUILD_COVERAGE include $(abs_top_nlbuild_autotools_dir)/automake/post.am diff --git a/examples/platforms/gp712/alarm.c b/examples/platforms/gp712/alarm.c index 900352a3f..d117e048c 100644 --- a/examples/platforms/gp712/alarm.c +++ b/examples/platforms/gp712/alarm.c @@ -38,7 +38,7 @@ #include #include -#include +#include #include #include "alarm_qorvo.h" @@ -46,24 +46,24 @@ void qorvoAlarmInit(void) { } -uint32_t otPlatAlarmGetNow(void) +uint32_t otPlatAlarmMilliGetNow(void) { return qorvoAlarmGetTimeMs(); } static void qorvoAlarmFired(void *aInstance) { - otPlatAlarmFired((otInstance *)aInstance); + otPlatAlarmMilliFired((otInstance *)aInstance); } -void otPlatAlarmStartAt(otInstance *aInstance, uint32_t t0, uint32_t dt) +void otPlatAlarmMilliStartAt(otInstance *aInstance, uint32_t t0, uint32_t dt) { (void)t0; qorvoAlarmUnScheduleEventArg((qorvoAlarmCallback_t)qorvoAlarmFired, aInstance); qorvoAlarmScheduleEventArg(dt * 1000, qorvoAlarmFired, aInstance); } -void otPlatAlarmStop(otInstance *aInstance) +void otPlatAlarmMilliStop(otInstance *aInstance) { qorvoAlarmUnScheduleEventArg((qorvoAlarmCallback_t)qorvoAlarmFired, aInstance); } diff --git a/examples/platforms/gp712/diag.c b/examples/platforms/gp712/diag.c index 268ff6e45..a70c5b200 100644 --- a/examples/platforms/gp712/diag.c +++ b/examples/platforms/gp712/diag.c @@ -33,7 +33,7 @@ #include #include -#include +#include #include /** diff --git a/examples/platforms/gp712/openthread-core-gp712-config.h b/examples/platforms/gp712/openthread-core-gp712-config.h index d9c7ba8a0..933b3652f 100644 --- a/examples/platforms/gp712/openthread-core-gp712-config.h +++ b/examples/platforms/gp712/openthread-core-gp712-config.h @@ -34,13 +34,4 @@ #ifndef OPENTHREAD_CORE_GP712_CONFIG_H_ #define OPENTHREAD_CORE_GP712_CONFIG_H_ -/** - * @def OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE - * - * Define to 1 if you want use legacy transmit done. - * - */ -#define OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE 1 - - #endif // OPENTHREAD_CORE_GP712_CONFIG_H_ diff --git a/examples/platforms/gp712/radio.c b/examples/platforms/gp712/radio.c index dc473b808..c5327914b 100644 --- a/examples/platforms/gp712/radio.c +++ b/examples/platforms/gp712/radio.c @@ -196,7 +196,23 @@ exit: void cbQorvoRadioTransmitDone(otRadioFrame *aPacket, bool aFramePending, otError aError) { - otPlatRadioTransmitDone(pQorvoInstance, aPacket, aFramePending, aError); + // TODO: pass received ACK frame instead of generating one. + otRadioFrame ackFrame; + uint8_t psdu[IEEE802154_ACK_LENGTH]; + + ackFrame.mPsdu = psdu; + ackFrame.mLength = IEEE802154_ACK_LENGTH; + ackFrame.mPsdu[0] = IEEE802154_FRAME_TYPE_ACK; + + if (aFramePending) + { + ackFrame.mPsdu[0] |= IEEE802154_FRAME_PENDING; + } + + ackFrame.mPsdu[1] = 0; + ackFrame.mPsdu[2] = aPacket->mPsdu[IEEE802154_DSN_OFFSET]; + + otPlatRadioTxDone(pQorvoInstance, aPacket, &ackFrame, aError); } void cbQorvoRadioReceiveDone(otRadioFrame *aPacket, otError aError) diff --git a/examples/platforms/posix/radio.c b/examples/platforms/posix/radio.c index 56f786d44..c9a4becab 100644 --- a/examples/platforms/posix/radio.c +++ b/examples/platforms/posix/radio.c @@ -588,21 +588,21 @@ void platformRadioProcess(otInstance *aInstance) } } -void radioTransmit(struct RadioMessage *msg, const struct otRadioFrame *pkt) +void radioTransmit(struct RadioMessage *aMessage, const struct otRadioFrame *aFrame) { uint32_t i; struct sockaddr_in sockaddr; uint16_t crc = 0; - uint16_t crc_offset = pkt->mLength - sizeof(uint16_t); + uint16_t crc_offset = aFrame->mLength - sizeof(uint16_t); for (i = 0; i < crc_offset; i++) { - crc = crc16_citt(crc, msg->mPsdu[i]); + crc = crc16_citt(crc, aMessage->mPsdu[i]); } - msg->mPsdu[crc_offset] = crc & 0xff; - msg->mPsdu[crc_offset + 1] = crc >> 8; + aMessage->mPsdu[crc_offset] = crc & 0xff; + aMessage->mPsdu[crc_offset + 1] = crc >> 8; memset(&sockaddr, 0, sizeof(sockaddr)); sockaddr.sin_family = AF_INET; @@ -618,7 +618,7 @@ void radioTransmit(struct RadioMessage *msg, const struct otRadioFrame *pkt) } sockaddr.sin_port = htons(9000 + sPortOffset + i); - rval = sendto(sSockFd, (const char *)msg, 1 + pkt->mLength, + rval = sendto(sSockFd, (const char *)aMessage, 1 + aFrame->mLength, 0, (struct sockaddr *)&sockaddr, sizeof(sockaddr)); if (rval < 0) diff --git a/include/openthread/platform/radio.h b/include/openthread/platform/radio.h index 3430b829b..7032cd1d9 100644 --- a/include/openthread/platform/radio.h +++ b/include/openthread/platform/radio.h @@ -420,22 +420,6 @@ extern void otPlatRadioTxStarted(otInstance *aInstance, otRadioFrame *aFrame); extern void otPlatRadioTxDone(otInstance *aInstance, otRadioFrame *aFrame, otRadioFrame *aAckFrame, otError aError); -/** - * The radio driver calls this method to notify OpenThread that the transmission has completed, - * this function is going to be deprecated, new add platfroms should not use this callback function. - * - * @param[in] aInstance The OpenThread instance structure. - * @param[in] aFrame A pointer to the frame that was transmitted. - * @param[in] aFramePending TRUE if an ACK frame was received and the Frame Pending bit was set. - * @param[in] aError OT_ERROR_NONE when the frame was transmitted, OT_ERROR_NO_ACK when the frame was - * transmitted but no ACK was received, OT_ERROR_CHANNEL_ACCESS_FAILURE when the transmission - * could not take place due to activity on the channel, OT_ERROR_ABORT when transmission was - * aborted for other reasons. - * - */ -extern void otPlatRadioTransmitDone(otInstance *aInstance, otRadioFrame *aFrame, bool aFramePending, - otError aError); - /** * Get the most recent RSSI measurement. * diff --git a/src/core/mac/mac.cpp b/src/core/mac/mac.cpp index 4d58acef8..0ee80de77 100644 --- a/src/core/mac/mac.cpp +++ b/src/core/mac/mac.cpp @@ -849,11 +849,7 @@ exit: if (error != OT_ERROR_NONE) { -#if OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE - TransmitDoneTask(mTxFrame, false, OT_ERROR_ABORT); -#else TransmitDoneTask(mTxFrame, NULL, OT_ERROR_ABORT); -#endif } } @@ -877,103 +873,6 @@ void Mac::TransmitStartedTask(otRadioFrame *aFrame) } } -#if OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE -extern "C" void otPlatRadioTransmitDone(otInstance *aInstance, otRadioFrame *aFrame, bool aRxPending, - otError aError) -{ - otLogFuncEntryMsg("%!otError!, aRxPending=%u", aError, aRxPending ? 1 : 0); - VerifyOrExit(otInstanceIsInitialized(aInstance)); - -#if OPENTHREAD_ENABLE_RAW_LINK_API - - if (aInstance->mLinkRaw.IsEnabled()) - { - aInstance->mLinkRaw.InvokeTransmitDone(aFrame, aRxPending, aError); - } - else -#endif // OPENTHREAD_ENABLE_RAW_LINK_API - { - aInstance->mThreadNetif.GetMac().TransmitDoneTask(aFrame, aRxPending, aError); - } - -exit: - otLogFuncExit(); -} - -void Mac::TransmitDoneTask(otRadioFrame *aFrame, bool aRxPending, otError aError) -{ - mMacTimer.Stop(); - - mCounters.mTxTotal++; - - Frame *frame = static_cast(aFrame); - Address addr; - frame->GetDstAddr(addr); - - if (addr.mShortAddress == kShortAddrBroadcast) - { - // Broadcast frame - mCounters.mTxBroadcast++; - } - else - { - // Unicast frame - mCounters.mTxUnicast++; - } - - if (aError == OT_ERROR_ABORT) - { - mCounters.mTxErrAbort++; - } - - if (aError == OT_ERROR_CHANNEL_ACCESS_FAILURE) - { - mCounters.mTxErrCca++; - } - - if (!RadioSupportsCsmaBackoff() && - aError == OT_ERROR_CHANNEL_ACCESS_FAILURE && - mCsmaAttempts < kMaxCSMABackoffs) - { - mCsmaAttempts++; - StartCsmaBackoff(); - - ExitNow(); - } - - mCsmaAttempts = 0; - - switch (mState) - { - case kStateTransmitData: - { - uint8_t commandId; - - if ((frame->GetType() == Frame::kFcfFrameMacCmd) && (frame->GetCommandId(commandId) == OT_ERROR_NONE) && - (commandId == Frame::kMacCmdDataRequest) && (aRxPending)) - { - mWaitingForData = true; - mReceiveTimer.Start(kDataPollTimeout); - } - } - - // fall through - - case kStateActiveScan: - case kStateTransmitBeacon: - SentFrame(aError); - break; - - default: - assert(false); - break; - } - -exit: - return; -} - -#else // #if OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE extern "C" void otPlatRadioTxDone(otInstance *aInstance, otRadioFrame *aFrame, otRadioFrame *aAckFrame, otError aError) { @@ -1085,8 +984,6 @@ exit: return; } -#endif // OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE - otError Mac::RadioTransmit(Frame *aSendFrame) { #if OPENTHREAD_CONFIG_STAY_AWAKE_BETWEEN_FRAGMENTS diff --git a/src/core/mac/mac.hpp b/src/core/mac/mac.hpp index 165dd684e..b08d07018 100644 --- a/src/core/mac/mac.hpp +++ b/src/core/mac/mac.hpp @@ -508,21 +508,6 @@ public: */ void TransmitStartedTask(otRadioFrame *aFrame); -#if OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE - /** - * This method is called to handle transmit events. - * - * @param[in] aFrame A pointer to the frame that was transmitted. - * @param[in] aFramePending TRUE if an ACK frame was received and the Frame Pending bit was set. - * @param[in] aError OT_ERROR_NONE when the frame was transmitted, OT_ERROR_NO_ACK when the frame was - * transmitted but no ACK was received, OT_ERROR_CHANNEL_ACCESS_FAILURE when the - * transmission could not take place due to activity on the channel, OT_ERROR_ABORT when - * transmission was aborted for other reasons. - * - */ - void TransmitDoneTask(otRadioFrame *aFrame, bool aRxPending, otError aError); - -#else // #if OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE /** * This method is called to handle transmit events. * @@ -535,7 +520,6 @@ public: * */ void TransmitDoneTask(otRadioFrame *aFrame, otRadioFrame *aAckFrame, otError aError); -#endif // OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE /** * This method returns if an active scan is in progress.