Fix scanning behavior. Change logic around otPlatRadioGetTransmitBuffer. (#942)

* Fix scanning behavior with default channel. Change logic around otPlatRadioGetTransmitBuffer so that the buffer becomes the property of OT post call. The MAC will keep a pointer to the tx buffer and pass it into otPlatRadioTransmit. This change should make the notion of retrying the transmit operation with the same buffer more intuitive.
This commit is contained in:
pvanhorn
2016-11-08 12:21:28 -08:00
committed by Jonathan Hui
parent ea3936a198
commit 67dbbfc402
11 changed files with 64 additions and 41 deletions
+8 -6
View File
@@ -476,12 +476,14 @@ otLwfRadioReceiveFrame(
LogFuncExit(DRIVER_DATA_PATH);
}
ThreadError otPlatRadioTransmit(_In_ otInstance *otCtx)
ThreadError otPlatRadioTransmit(_In_ otInstance *otCtx, _In_ RadioPacket *aPacket)
{
NT_ASSERT(otCtx);
PMS_FILTER pFilter = otCtxToFilter(otCtx);
ThreadError error = kThreadError_Busy;
UNREFERENCED_PARAMETER(aPacket);
LogFuncEntryMsg(DRIVER_DATA_PATH, "Filter: %p", pFilter);
NT_ASSERT(pFilter->otPhyState == kStateReceive);
@@ -576,19 +578,19 @@ otLwfRadioTransmitFrameDone(
POT_NBL_CONTEXT SendNblContext = GetNBLContext(pFilter->SendNetBufferList);
BOOLEAN FramePending = (SendNblContext->Flags & OT_NBL_FLAG_ACK_FRAME_PENDING) != 0 || pFilter->CountPendingRecvNBLs != 0;
otPlatRadioTransmitDone(pFilter->otCtx, FramePending, kThreadError_None);
otPlatRadioTransmitDone(pFilter->otCtx, &pFilter->otTransmitFrame, FramePending, kThreadError_None);
}
else if (STATUS_DEVICE_BUSY == pFilter->SendNetBufferList->Status)
{
otPlatRadioTransmitDone(pFilter->otCtx, false, kThreadError_ChannelAccessFailure);
otPlatRadioTransmitDone(pFilter->otCtx, &pFilter->otTransmitFrame, false, kThreadError_ChannelAccessFailure);
}
else if (STATUS_TIMEOUT == pFilter->SendNetBufferList->Status)
{
otPlatRadioTransmitDone(pFilter->otCtx, false, kThreadError_NoAck);
otPlatRadioTransmitDone(pFilter->otCtx, &pFilter->otTransmitFrame, false, kThreadError_NoAck);
}
else
{
otPlatRadioTransmitDone(pFilter->otCtx, false, kThreadError_Abort);
otPlatRadioTransmitDone(pFilter->otCtx, &pFilter->otTransmitFrame, false, kThreadError_Abort);
}
LogFuncExit(DRIVER_DATA_PATH);
+11 -9
View File
@@ -251,7 +251,7 @@ ThreadError otPlatRadioReceive(otInstance *aInstance, uint8_t aChannel)
return error;
}
ThreadError otPlatRadioTransmit(otInstance *aInstance)
ThreadError otPlatRadioTransmit(otInstance *aInstance, RadioPacket *aPacket)
{
ThreadError error = kThreadError_InvalidState;
(void)aInstance;
@@ -271,15 +271,15 @@ ThreadError otPlatRadioTransmit(otInstance *aInstance)
HWREG(RFCORE_SFR_RFST) = RFCORE_SFR_RFST_INSTR_FLUSHTX;
// frame length
HWREG(RFCORE_SFR_RFDATA) = sTransmitFrame.mLength;
HWREG(RFCORE_SFR_RFDATA) = aPacket->mLength;
// frame data
for (i = 0; i < sTransmitFrame.mLength; i++)
for (i = 0; i < aPacket->mLength; i++)
{
HWREG(RFCORE_SFR_RFDATA) = sTransmitFrame.mPsdu[i];
HWREG(RFCORE_SFR_RFDATA) = aPacket->mPsdu[i];
}
setChannel(sTransmitFrame.mChannel);
setChannel(aPacket->mChannel);
while ((HWREG(RFCORE_XREG_FSMSTAT1) & 1) == 0);
@@ -406,12 +406,12 @@ void cc2538RadioProcess(otInstance *aInstance)
if (otPlatDiagModeGet())
{
otPlatDiagRadioTransmitDone(aInstance, false, sTransmitError);
otPlatDiagRadioTransmitDone(aInstance, &sTransmitFrame, false, sTransmitError);
}
else
#endif
{
otPlatRadioTransmitDone(aInstance, false, sTransmitError);
otPlatRadioTransmitDone(aInstance, &sTransmitFrame, false, sTransmitError);
}
}
else if (sReceiveFrame.mLength == IEEE802154_ACK_LENGTH &&
@@ -424,12 +424,14 @@ void cc2538RadioProcess(otInstance *aInstance)
if (otPlatDiagModeGet())
{
otPlatDiagRadioTransmitDone(aInstance, (sReceiveFrame.mPsdu[0] & IEEE802154_FRAME_PENDING) != 0, sTransmitError);
otPlatDiagRadioTransmitDone(aInstance, &sTransmitFrame, (sReceiveFrame.mPsdu[0] & IEEE802154_FRAME_PENDING) != 0,
sTransmitError);
}
else
#endif
{
otPlatRadioTransmitDone(aInstance, (sReceiveFrame.mPsdu[0] & IEEE802154_FRAME_PENDING) != 0, sTransmitError);
otPlatRadioTransmitDone(aInstance, &sTransmitFrame, (sReceiveFrame.mPsdu[0] & IEEE802154_FRAME_PENDING) != 0,
sTransmitError);
}
}
}
+6 -5
View File
@@ -427,10 +427,11 @@ ThreadError otPlatRadioReceive(otInstance *aInstance, uint8_t aChannel)
return error;
}
ThreadError otPlatRadioTransmit(otInstance *aInstance)
ThreadError otPlatRadioTransmit(otInstance *aInstance, RadioPacket *aPacket)
{
ThreadError error = kThreadError_InvalidState;
(void)aInstance;
(void)aPacket;
if (sState == kStateReceive)
{
@@ -489,12 +490,12 @@ void radioReceive(otInstance *aInstance)
if (otPlatDiagModeGet())
{
otPlatDiagRadioTransmitDone(aInstance, isFramePending(sReceiveFrame.mPsdu), kThreadError_None);
otPlatDiagRadioTransmitDone(aInstance, &sTransmitFrame, isFramePending(sReceiveFrame.mPsdu), kThreadError_None);
}
else
#endif
{
otPlatRadioTransmitDone(aInstance, isFramePending(sReceiveFrame.mPsdu), kThreadError_None);
otPlatRadioTransmitDone(aInstance, &sTransmitFrame, isFramePending(sReceiveFrame.mPsdu), kThreadError_None);
}
}
else if ((sState == kStateReceive || sState == kStateTransmit) &&
@@ -520,12 +521,12 @@ void radioSendMessage(otInstance *aInstance)
if (otPlatDiagModeGet())
{
otPlatDiagRadioTransmitDone(aInstance, false, kThreadError_None);
otPlatDiagRadioTransmitDone(aInstance, &sTransmitFrame, false, kThreadError_None);
}
else
#endif
{
otPlatRadioTransmitDone(aInstance, false, kThreadError_None);
otPlatRadioTransmitDone(aInstance, &sTransmitFrame, false, kThreadError_None);
}
}
}