mirror of
https://github.com/espressif/openthread.git
synced 2026-08-15 15:17:46 +00:00
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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user