[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.
This commit is contained in:
Buke Po
2017-07-26 09:11:46 -07:00
committed by Jonathan Hui
parent fc72e4e719
commit 4dc80ee357
13 changed files with 70 additions and 183 deletions
@@ -36,13 +36,5 @@
*/ */
#define OPENTHREAD_CONFIG_NUM_MESSAGE_BUFFERS 32 #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_ */ #endif /* OPENTHREAD_CORE_CC2650_CONFIG_H_ */
+18 -1
View File
@@ -51,6 +51,7 @@
enum enum
{ {
IEEE802154_ACK_LENGTH = 5,
CC2650_RECEIVE_SENSITIVITY = -100, // dBm CC2650_RECEIVE_SENSITIVITY = -100, // dBm
}; };
@@ -1840,7 +1841,23 @@ void cc2650RadioProcess(otInstance *aInstance)
else else
#endif /* OPENTHREAD_ENABLE_DIAG */ #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);
} }
} }
@@ -60,13 +60,5 @@
*/ */
#define OPENTHREAD_CONFIG_ENABLE_DEFAULT_LOG_OUTPUT 1 #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_ */ #endif /* OPENTHREAD_CORE_CC2650_CONFIG_H_ */
+18 -1
View File
@@ -61,6 +61,7 @@
enum enum
{ {
IEEE802154_ACK_LENGTH = 5,
CC2652_RECEIVE_SENSITIVITY = -100, // dBm CC2652_RECEIVE_SENSITIVITY = -100, // dBm
}; };
@@ -1838,7 +1839,23 @@ void cc2652RadioProcess(otInstance *aInstance)
else else
#endif /* OPENTHREAD_ENABLE_DIAG */ #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);
} }
} }
+5 -8
View File
@@ -30,19 +30,17 @@ include $(abs_top_nlbuild_autotools_dir)/automake/pre.am
lib_LIBRARIES = libopenthread-gp712.a lib_LIBRARIES = libopenthread-gp712.a
libopenthread_gp712_a_CPPFLAGS = \ libopenthread_gp712_a_CPPFLAGS = \
-I$(top_srcdir)/include \ -I$(top_srcdir)/include \
-I$(top_srcdir)/examples/platforms \ -I$(top_srcdir)/examples/platforms \
-I$(top_srcdir)/examples/platforms/utils\
-I$(top_srcdir)/src/core \ -I$(top_srcdir)/src/core \
-lrt \ -lrt \
-lpthread \ -lpthread \
$(NULL) $(NULL)
libopenthread_gp712_settings.cpp: $(srcdir)/../utils/settings.cpp Dash = -
cp $? $@ libopenthread_gp712_a_LIBADD = \
$(shell find $(top_builddir)/examples/platforms/utils $(Dash)type f $(Dash)name "*.o")
CLEANFILES = libopenthread_gp712_settings.cpp
libopenthread_gp712_a_SOURCES = \ libopenthread_gp712_a_SOURCES = \
alarm.c \ alarm.c \
@@ -53,7 +51,6 @@ libopenthread_gp712_a_SOURCES = \
random.c \ random.c \
uart-posix.c \ uart-posix.c \
flash.c \ flash.c \
libopenthread_gp712_settings.cpp \
$(NULL) $(NULL)
# uart-socket.c \ # uart-socket.c \
@@ -67,7 +64,7 @@ endif
if OPENTHREAD_BUILD_COVERAGE if OPENTHREAD_BUILD_COVERAGE
CLEANFILES += $(wildcard *.gcda *.gcno) CLEANFILES = $(wildcard *.gcda *.gcno)
endif # OPENTHREAD_BUILD_COVERAGE endif # OPENTHREAD_BUILD_COVERAGE
include $(abs_top_nlbuild_autotools_dir)/automake/post.am include $(abs_top_nlbuild_autotools_dir)/automake/post.am
+5 -5
View File
@@ -38,7 +38,7 @@
#include <openthread/openthread.h> #include <openthread/openthread.h>
#include <openthread/platform/platform.h> #include <openthread/platform/platform.h>
#include <openthread/platform/alarm.h> #include <openthread/platform/alarm-milli.h>
#include <openthread/platform/diag.h> #include <openthread/platform/diag.h>
#include "alarm_qorvo.h" #include "alarm_qorvo.h"
@@ -46,24 +46,24 @@ void qorvoAlarmInit(void)
{ {
} }
uint32_t otPlatAlarmGetNow(void) uint32_t otPlatAlarmMilliGetNow(void)
{ {
return qorvoAlarmGetTimeMs(); return qorvoAlarmGetTimeMs();
} }
static void qorvoAlarmFired(void *aInstance) 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; (void)t0;
qorvoAlarmUnScheduleEventArg((qorvoAlarmCallback_t)qorvoAlarmFired, aInstance); qorvoAlarmUnScheduleEventArg((qorvoAlarmCallback_t)qorvoAlarmFired, aInstance);
qorvoAlarmScheduleEventArg(dt * 1000, qorvoAlarmFired, aInstance); qorvoAlarmScheduleEventArg(dt * 1000, qorvoAlarmFired, aInstance);
} }
void otPlatAlarmStop(otInstance *aInstance) void otPlatAlarmMilliStop(otInstance *aInstance)
{ {
qorvoAlarmUnScheduleEventArg((qorvoAlarmCallback_t)qorvoAlarmFired, aInstance); qorvoAlarmUnScheduleEventArg((qorvoAlarmCallback_t)qorvoAlarmFired, aInstance);
} }
+1 -1
View File
@@ -33,7 +33,7 @@
#include <openthread/config.h> #include <openthread/config.h>
#include <openthread/openthread.h> #include <openthread/openthread.h>
#include <openthread/platform/alarm.h> #include <openthread/platform/alarm-milli.h>
#include <openthread/platform/radio.h> #include <openthread/platform/radio.h>
/** /**
@@ -34,13 +34,4 @@
#ifndef OPENTHREAD_CORE_GP712_CONFIG_H_ #ifndef OPENTHREAD_CORE_GP712_CONFIG_H_
#define 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_ #endif // OPENTHREAD_CORE_GP712_CONFIG_H_
+17 -1
View File
@@ -196,7 +196,23 @@ exit:
void cbQorvoRadioTransmitDone(otRadioFrame *aPacket, bool aFramePending, otError aError) 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) void cbQorvoRadioReceiveDone(otRadioFrame *aPacket, otError aError)
+6 -6
View File
@@ -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; uint32_t i;
struct sockaddr_in sockaddr; struct sockaddr_in sockaddr;
uint16_t crc = 0; 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++) 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; aMessage->mPsdu[crc_offset] = crc & 0xff;
msg->mPsdu[crc_offset + 1] = crc >> 8; aMessage->mPsdu[crc_offset + 1] = crc >> 8;
memset(&sockaddr, 0, sizeof(sockaddr)); memset(&sockaddr, 0, sizeof(sockaddr));
sockaddr.sin_family = AF_INET; 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); 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)); 0, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
if (rval < 0) if (rval < 0)
-16
View File
@@ -420,22 +420,6 @@ extern void otPlatRadioTxStarted(otInstance *aInstance, otRadioFrame *aFrame);
extern void otPlatRadioTxDone(otInstance *aInstance, otRadioFrame *aFrame, otRadioFrame *aAckFrame, extern void otPlatRadioTxDone(otInstance *aInstance, otRadioFrame *aFrame, otRadioFrame *aAckFrame,
otError aError); 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. * Get the most recent RSSI measurement.
* *
-103
View File
@@ -849,11 +849,7 @@ exit:
if (error != OT_ERROR_NONE) if (error != OT_ERROR_NONE)
{ {
#if OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE
TransmitDoneTask(mTxFrame, false, OT_ERROR_ABORT);
#else
TransmitDoneTask(mTxFrame, NULL, OT_ERROR_ABORT); 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<Frame *>(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, extern "C" void otPlatRadioTxDone(otInstance *aInstance, otRadioFrame *aFrame, otRadioFrame *aAckFrame,
otError aError) otError aError)
{ {
@@ -1085,8 +984,6 @@ exit:
return; return;
} }
#endif // OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE
otError Mac::RadioTransmit(Frame *aSendFrame) otError Mac::RadioTransmit(Frame *aSendFrame)
{ {
#if OPENTHREAD_CONFIG_STAY_AWAKE_BETWEEN_FRAGMENTS #if OPENTHREAD_CONFIG_STAY_AWAKE_BETWEEN_FRAGMENTS
-16
View File
@@ -508,21 +508,6 @@ public:
*/ */
void TransmitStartedTask(otRadioFrame *aFrame); 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. * This method is called to handle transmit events.
* *
@@ -535,7 +520,6 @@ public:
* *
*/ */
void TransmitDoneTask(otRadioFrame *aFrame, otRadioFrame *aAckFrame, otError aError); void TransmitDoneTask(otRadioFrame *aFrame, otRadioFrame *aAckFrame, otError aError);
#endif // OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE
/** /**
* This method returns if an active scan is in progress. * This method returns if an active scan is in progress.