From bcc1261749bc21ecc5625378fbbb8cb360117731 Mon Sep 17 00:00:00 2001 From: Jonathan Hui Date: Thu, 8 Sep 2016 08:47:01 -0700 Subject: [PATCH] Clean up mac/radio interaction. (#538) - Remove unnecessary calls to otPlatRadioReceive(). - Allow calls to otPlatRadioReceiveDone() whenever the radio is active. --- examples/platforms/posix/radio.c | 54 ++++++++++++++------------------ src/core/mac/mac.cpp | 3 +- 2 files changed, 24 insertions(+), 33 deletions(-) diff --git a/examples/platforms/posix/radio.c b/examples/platforms/posix/radio.c index 144376a90..9e1924730 100644 --- a/examples/platforms/posix/radio.c +++ b/examples/platforms/posix/radio.c @@ -445,43 +445,35 @@ bool otPlatRadioGetPromiscuous(void) void radioReceive(void) { - if (sState != kStateTransmit || sAckWait) + ssize_t rval = recvfrom(sSockFd, &sReceiveMessage, sizeof(sReceiveMessage), 0, NULL, NULL); + assert(rval >= 0); + + sReceiveFrame.mLength = (uint8_t)(rval - 1); + + if (sAckWait && + sTransmitFrame.mChannel == sReceiveMessage.mChannel && + isFrameTypeAck(sReceiveFrame.mPsdu) && + getDsn(sReceiveFrame.mPsdu) == getDsn(sTransmitFrame.mPsdu)) { - ssize_t rval = recvfrom(sSockFd, &sReceiveMessage, sizeof(sReceiveMessage), 0, NULL, NULL); - assert(rval >= 0); - - sReceiveFrame.mLength = (uint8_t)(rval - 1); - - if (sAckWait && - sTransmitFrame.mChannel == sReceiveMessage.mChannel && - isFrameTypeAck(sReceiveFrame.mPsdu)) - { - uint8_t tx_sequence = getDsn(sTransmitFrame.mPsdu); - uint8_t rx_sequence = getDsn(sReceiveFrame.mPsdu); - - if (tx_sequence == rx_sequence) - { - sState = kStateReceive; - sAckWait = false; + sState = kStateReceive; + sAckWait = false; #if OPENTHREAD_ENABLE_DIAG - if (otPlatDiagModeGet()) - { - otPlatDiagRadioTransmitDone(isFramePending(sReceiveFrame.mPsdu), kThreadError_None); - } - else -#endif - { - otPlatRadioTransmitDone(isFramePending(sReceiveFrame.mPsdu), kThreadError_None); - } - } - } - else if (sState == kStateReceive && - sReceiveFrame.mChannel == sReceiveMessage.mChannel) + if (otPlatDiagModeGet()) { - radioProcessFrame(); + otPlatDiagRadioTransmitDone(isFramePending(sReceiveFrame.mPsdu), kThreadError_None); } + else +#endif + { + otPlatRadioTransmitDone(isFramePending(sReceiveFrame.mPsdu), kThreadError_None); + } + } + else if ((sState == kStateReceive || sState == kStateTransmit) && + (sReceiveFrame.mChannel == sReceiveMessage.mChannel)) + { + radioProcessFrame(); } } diff --git a/src/core/mac/mac.cpp b/src/core/mac/mac.cpp index a9bf95e22..4b0aa30fa 100644 --- a/src/core/mac/mac.cpp +++ b/src/core/mac/mac.cpp @@ -192,6 +192,7 @@ bool Mac::GetRxOnWhenIdle(void) const void Mac::SetRxOnWhenIdle(bool aRxOnWhenIdle) { mRxOnWhenIdle = aRxOnWhenIdle; + NextOperation(); } const ExtAddress *Mac::GetExtAddress(void) const @@ -1019,8 +1020,6 @@ exit: break; } } - - NextOperation(); } ThreadError Mac::HandleMacCommand(Frame &aFrame)