[link-raw] split software retransmit to retransmit and backoff (#2840)

This commit is contained in:
Kamil Sroka
2018-06-28 09:56:28 -07:00
committed by Jonathan Hui
parent 8ccf1386de
commit c925b42941
11 changed files with 137 additions and 24 deletions
@@ -58,6 +58,14 @@
*/
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT 1
/**
* @def OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
*
* Define to 1 if you want to enable software CSMA-CA backoff logic.
*
*/
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF 1
/**
* @def OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ENERGY_SCAN
*
@@ -73,6 +73,14 @@
*/
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT 0
/**
* @def OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
*
* Define to 1 if you want to enable software CSMA-CA backoff logic.
*
*/
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF 0
/**
* @def OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ENERGY_SCAN
*
@@ -60,6 +60,14 @@
*/
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT 1
/**
* @def OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
*
* Define to 1 if you want to enable software CSMA-CA backoff logic.
*
*/
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF 1
/**
* @def OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ENERGY_SCAN
*
@@ -67,6 +67,14 @@
*/
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT 0
/**
* @def OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
*
* Define to 1 if you want to enable software CSMA-CA backoff logic.
*
*/
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF 0
/**
* @def OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ENERGY_SCAN
*
@@ -92,4 +92,12 @@
*/
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT 1
/**
* @def OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
*
* Define to 1 if you want to enable software CSMA-CA backoff logic.
*
*/
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF 1
#endif // OPENTHREAD_CORE_KW41Z_CONFIG_H_
@@ -100,7 +100,7 @@
* Define to 1 if you want to enable software ACK timeout logic.
*
*/
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ACK_TIMEOUT 1
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ACK_TIMEOUT 0
/**
* @def OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT
@@ -110,6 +110,14 @@
*/
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT 1
/**
* @def OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
*
* Define to 1 if you want to enable software CSMA-CA backoff logic.
*
*/
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF 0
/**
* @def OPENTHREAD_CONFIG_ENABLE_PLATFORM_USEC_TIMER
*
@@ -71,6 +71,16 @@
*
*/
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT 1
/**
* @def OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
*
* Define to 1 if you want to enable software CSMA-CA backoff logic.
*
* Applicable only if raw link layer API is enabled (i.e., `OPENTHREAD_ENABLE_RAW_LINK_API` is set).
*
*/
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF 1
#endif // OPENTHREAD_RADIO
/**
+7 -3
View File
@@ -40,7 +40,7 @@
#include "common/timer.hpp"
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ACK_TIMEOUT || OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT || \
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ACK_TIMEOUT || OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF || \
OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ENERGY_SCAN
#define OPENTHREAD_LINKRAW_TIMER_REQUIRED 1
#else
@@ -246,7 +246,7 @@ private:
{
kTimerReasonNone,
kTimerReasonAckTimeout,
kTimerReasonRetransmitTimeout,
kTimerReasonCsmaBackoffComplete,
kTimerReasonEnergyScanComplete,
};
@@ -266,9 +266,13 @@ private:
uint8_t mTransmitAttempts;
uint8_t mCsmaAttempts;
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
void StartCsmaBackoff(void);
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ENERGY_SCAN
+49 -20
View File
@@ -51,7 +51,7 @@ LinkRaw::LinkRaw(Instance &aInstance)
, mTimerReason(kTimerReasonNone)
#if OPENTHREAD_CONFIG_ENABLE_PLATFORM_USEC_TIMER
, mTimerMicro(aInstance, &LinkRaw::HandleTimer, this)
#endif
#endif // OPENTHREAD_CONFIG_ENABLE_PLATFORM_USEC_TIMER
#endif // OPENTHREAD_LINKRAW_TIMER_REQUIRED
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ENERGY_SCAN
, mEnergyScanTask(aInstance, &LinkRaw::HandleEnergyScanTask, this)
@@ -73,7 +73,7 @@ otError LinkRaw::SetEnabled(bool aEnabled)
#if OPENTHREAD_MTD || OPENTHREAD_FTD
VerifyOrExit(!static_cast<Instance &>(mInstance).GetThreadNetif().IsUp(), error = OT_ERROR_INVALID_STATE);
#endif
#endif // OPENTHREAD_MTD || OPENTHREAD_FTD
if (aEnabled)
{
@@ -88,7 +88,7 @@ otError LinkRaw::SetEnabled(bool aEnabled)
#if OPENTHREAD_MTD || OPENTHREAD_FTD
exit:
#endif
#endif // OPENTHREAD_MTD || OPENTHREAD_FTD
return error;
}
@@ -170,6 +170,13 @@ otRadioCaps LinkRaw::GetCaps(void) const
}
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
if ((RadioCaps & OT_RADIO_CAPS_CSMA_BACKOFF) == 0)
{
RadioCaps = static_cast<otRadioCaps>(RadioCaps | OT_RADIO_CAPS_CSMA_BACKOFF);
}
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ENERGY_SCAN
if ((RadioCaps & OT_RADIO_CAPS_ENERGY_SCAN) == 0)
{
@@ -218,22 +225,24 @@ otError LinkRaw::Transmit(otRadioFrame *aFrame, otLinkRawTransmitDone aCallback)
mTransmitDoneCallback = aCallback;
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT
mTransmitAttempts = 0;
mCsmaAttempts = 0;
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
if (aFrame->mInfo.mTxInfo.mIsCcaEnabled)
{
mTransmitAttempts = 0;
mCsmaAttempts = 0;
// Start the transmission backoff logic
StartCsmaBackoff();
error = OT_ERROR_NONE;
}
else
{
#endif
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
error = otPlatRadioTransmit(&mInstance, aFrame);
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
}
#endif
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
}
return error;
@@ -245,7 +254,7 @@ void LinkRaw::InvokeTransmitDone(otRadioFrame *aFrame, otRadioFrame *aAckFrame,
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ACK_TIMEOUT
mTimer.Stop();
#endif
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ACK_TIMEOUT
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT
@@ -254,7 +263,17 @@ void LinkRaw::InvokeTransmitDone(otRadioFrame *aFrame, otRadioFrame *aAckFrame,
if (mCsmaAttempts < Mac::kMaxCSMABackoffs)
{
mCsmaAttempts++;
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
StartCsmaBackoff();
#else
// Start the transmit now
otError error = otPlatRadioTransmit(&mInstance, aFrame);
if (error != OT_ERROR_NONE)
{
InvokeTransmitDone(aFrame, NULL, error);
}
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
goto exit;
}
}
@@ -268,12 +287,22 @@ void LinkRaw::InvokeTransmitDone(otRadioFrame *aFrame, otRadioFrame *aAckFrame,
if (mTransmitAttempts < aFrame->mInfo.mTxInfo.mMaxTxAttempts)
{
mTransmitAttempts++;
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
StartCsmaBackoff();
#else
// Start the transmit now
otError error = otPlatRadioTransmit(&mInstance, aFrame);
if (error != OT_ERROR_NONE)
{
InvokeTransmitDone(aFrame, NULL, error);
}
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
goto exit;
}
}
#endif
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT
// Transition back to receive state on previous channel
otPlatRadioReceive(&mInstance, mReceiveChannel);
@@ -296,7 +325,7 @@ void LinkRaw::InvokeTransmitDone(otRadioFrame *aFrame, otRadioFrame *aAckFrame,
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT
exit:
return;
#endif
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT
}
otError LinkRaw::EnergyScan(uint8_t aScanChannel, uint16_t aScanDuration, otLinkRawEnergyScanDone aCallback)
@@ -319,7 +348,7 @@ otError LinkRaw::EnergyScan(uint8_t aScanChannel, uint16_t aScanDuration, otLink
#else
// Do the HW offloaded energy scan
error = otPlatRadioEnergyScan(&mInstance, aScanChannel, aScanDuration);
#endif
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ENERGY_SCAN
}
return error;
@@ -350,7 +379,7 @@ void LinkRaw::TransmitStarted(otRadioFrame *aFrame)
#else
OT_UNUSED_VARIABLE(aFrame);
#endif
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ACK_TIMEOUT
}
#if OPENTHREAD_LINKRAW_TIMER_REQUIRED
@@ -381,9 +410,9 @@ void LinkRaw::HandleTimer(void)
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ACK_TIMEOUT
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
case kTimerReasonRetransmitTimeout:
case kTimerReasonCsmaBackoffComplete:
{
otRadioFrame *aFrame = otPlatRadioGetTransmitBuffer(&mInstance);
@@ -398,7 +427,7 @@ void LinkRaw::HandleTimer(void)
break;
}
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ENERGY_SCAN
@@ -418,7 +447,7 @@ void LinkRaw::HandleTimer(void)
#endif // OPENTHREAD_LINKRAW_TIMER_REQUIRED
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
void LinkRaw::StartCsmaBackoff(void)
{
@@ -434,7 +463,7 @@ void LinkRaw::StartCsmaBackoff(void)
backoff *= (static_cast<uint32_t>(Mac::kUnitBackoffPeriod) * OT_RADIO_SYMBOL_TIME);
otLogDebgPlat(&mInstance, "LinkRaw Starting RetransmitTimeout Timer (%d ms)", backoff);
mTimerReason = kTimerReasonRetransmitTimeout;
mTimerReason = kTimerReasonCsmaBackoffComplete;
#if OPENTHREAD_CONFIG_ENABLE_PLATFORM_USEC_TIMER
mTimerMicro.Start(backoff);
@@ -443,7 +472,7 @@ void LinkRaw::StartCsmaBackoff(void)
#endif // OPENTHREAD_CONFIG_ENABLE_PLATFORM_USEC_TIMER
}
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT
#endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
#if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ENERGY_SCAN
+12
View File
@@ -948,6 +948,18 @@
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT 0
#endif
/**
* @def OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
*
* Define to 1 if you want to enable software CSMA-CA backoff logic.
*
* Applicable only if raw link layer API is enabled (i.e., `OPENTHREAD_ENABLE_RAW_LINK_API` is set).
*
*/
#ifndef OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF 0
#endif
/**
* @def OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ENERGY_SCAN
*
@@ -71,6 +71,16 @@
*
*/
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT 1
/**
* @def OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF
*
* Define to 1 if you want to enable software CSMA-CA backoff logic.
*
* Applicable only if raw link layer API is enabled (i.e., `OPENTHREAD_ENABLE_RAW_LINK_API` is set).
*
*/
#define OPENTHREAD_CONFIG_ENABLE_SOFTWARE_CSMA_BACKOFF 1
#endif // OPENTHREAD_RADIO
/**