[radio-spinel] determine presence of Ack from spinel TxDone frame (#3313)

This commit changes `RadioSpinel` to determine if Ack is present
directly from the received spinel TxDone frame (i.e. check the
remaining unparsed length of spinel frame to determine if ack frame is
included by Radio Co-Processor (RCP)). This change helps simplify the
code by removing the requirement for `RadioSpinel` as the layer
between OpenThread core and RCP to parse the 15.4 frame.
This commit is contained in:
Abtin Keshavarzian
2018-11-27 10:05:18 -08:00
committed by Jonathan Hui
parent 2a3384c650
commit 5d6dccf35c
2 changed files with 9 additions and 55 deletions
+9 -54
View File
@@ -54,55 +54,8 @@
#include <openthread/platform/diag.h>
#include <openthread/platform/radio.h>
enum
{
IEEE802154_MIN_LENGTH = 5,
IEEE802154_MAX_LENGTH = 127,
IEEE802154_ACK_LENGTH = 5,
IEEE802154_BROADCAST = 0xffff,
IEEE802154_FRAME_TYPE_ACK = 2 << 0,
IEEE802154_FRAME_TYPE_MACCMD = 3 << 0,
IEEE802154_FRAME_TYPE_MASK = 7 << 0,
IEEE802154_SECURITY_ENABLED = 1 << 3,
IEEE802154_FRAME_PENDING = 1 << 4,
IEEE802154_ACK_REQUEST = 1 << 5,
IEEE802154_PANID_COMPRESSION = 1 << 6,
IEEE802154_DST_ADDR_NONE = 0 << 2,
IEEE802154_DST_ADDR_SHORT = 2 << 2,
IEEE802154_DST_ADDR_EXT = 3 << 2,
IEEE802154_DST_ADDR_MASK = 3 << 2,
IEEE802154_SRC_ADDR_NONE = 0 << 6,
IEEE802154_SRC_ADDR_SHORT = 2 << 6,
IEEE802154_SRC_ADDR_EXT = 3 << 6,
IEEE802154_SRC_ADDR_MASK = 3 << 6,
IEEE802154_DSN_OFFSET = 2,
IEEE802154_DSTPAN_OFFSET = 3,
IEEE802154_DSTADDR_OFFSET = 5,
IEEE802154_SEC_LEVEL_MASK = 7 << 0,
IEEE802154_KEY_ID_MODE_0 = 0 << 3,
IEEE802154_KEY_ID_MODE_1 = 1 << 3,
IEEE802154_KEY_ID_MODE_2 = 2 << 3,
IEEE802154_KEY_ID_MODE_3 = 3 << 3,
IEEE802154_KEY_ID_MODE_MASK = 3 << 3,
IEEE802154_MACCMD_DATA_REQ = 4,
};
static ot::PosixApp::RadioSpinel sRadioSpinel;
static inline bool isAckRequested(const uint8_t *frame)
{
return (frame[0] & IEEE802154_ACK_REQUEST) != 0;
}
namespace ot {
namespace PosixApp {
@@ -206,7 +159,6 @@ RadioSpinel::RadioSpinel(void)
, mWaitingKey(SPINEL_PROP_LAST_STATUS)
, mRxSensitivity(0)
, mState(kStateDisabled)
, mIsAckRequested(false)
, mIsPromiscuous(false)
, mIsReady(false)
, mSupportsLogStream(false)
@@ -725,7 +677,8 @@ void RadioSpinel::Process(const fd_set &aReadFdSet, const fd_set &aWriteFdSet)
else
#endif
{
otPlatRadioTxDone(mInstance, mTransmitFrame, (mIsAckRequested ? &mAckRadioFrame : NULL), mTxError);
otPlatRadioTxDone(mInstance, mTransmitFrame, (mAckRadioFrame.mLength != 0) ? &mAckRadioFrame : NULL,
mTxError);
}
}
@@ -1043,8 +996,6 @@ void RadioSpinel::RadioTransmit(void)
otPlatRadioTxStarted(mInstance, mTransmitFrame);
assert(mState == kStateTransmitPending);
mIsAckRequested = isAckRequested(mTransmitFrame->mPsdu) && !mIsPromiscuous;
error = Request(true, SPINEL_CMD_PROP_VALUE_SET, SPINEL_PROP_STREAM_RAW,
SPINEL_DATATYPE_DATA_WLEN_S SPINEL_DATATYPE_UINT8_S SPINEL_DATATYPE_INT8_S, mTransmitFrame->mPsdu,
mTransmitFrame->mLength, mTransmitFrame->mChannel, mTransmitFrame->mInfo.mRxInfo.mRssi);
@@ -1189,11 +1140,14 @@ void RadioSpinel::HandleTransmitDone(uint32_t aCommand,
aBuffer += unpacked;
aLength -= static_cast<spinel_size_t>(unpacked);
if (mIsAckRequested)
if (aLength > 0)
{
VerifyOrExit(aLength > 0, error = OT_ERROR_FAILED);
SuccessOrExit(error = ParseRadioFrame(mAckRadioFrame, aBuffer, aLength));
}
else
{
mAckRadioFrame.mLength = 0;
}
}
else
{
@@ -1567,7 +1521,8 @@ void ot::PosixApp::RadioSpinel::Process(const Event &aEvent)
else
#endif
{
otPlatRadioTxDone(mInstance, mTransmitFrame, (mIsAckRequested ? &mAckRadioFrame : NULL), mTxError);
otPlatRadioTxDone(mInstance, mTransmitFrame, (mAckRadioFrame.mLength != 0) ? &mAckRadioFrame : NULL,
mTxError);
}
}
-1
View File
@@ -609,7 +609,6 @@ private:
char mVersion[kVersionStringSize];
State mState;
bool mIsAckRequested : 1; ///< Ack requested.
bool mIsPromiscuous : 1; ///< Promiscuous mode.
bool mIsReady : 1; ///< NCP ready.
bool mSupportsLogStream : 1; ///< RCP supports `LOG_STREAM` property with OpenThread log meta-data format.