Addressed feedback on CSMA implementation
This commit is contained in:
parent
da57f1cdef
commit
d5c80b0163
2 changed files with 35 additions and 10 deletions
|
@ -37,6 +37,10 @@ LoRaWANNode::LoRaWANNode(PhysicalLayer* phy, const LoRaWANBand_t* band) {
|
|||
this->startChannel = -1;
|
||||
this->numChannels = -1;
|
||||
this->backupFreq = this->band->backupChannel.freqStart;
|
||||
this->difsSlots = 2;
|
||||
this->backoffMax = 6;
|
||||
this->enableCSMA = false;
|
||||
|
||||
}
|
||||
|
||||
void LoRaWANNode::wipe() {
|
||||
|
@ -44,6 +48,13 @@ void LoRaWANNode::wipe() {
|
|||
mod->hal->wipePersistentStorage();
|
||||
}
|
||||
|
||||
void LoRaWANNode::setCSMA(uint8_t backoffMax, uint8_t difsSlots, bool enableCSMA) {
|
||||
this->backoffMax = backoffMax;
|
||||
this->difsSlots = difsSlots;
|
||||
this->enableCSMA = enableCSMA;
|
||||
}
|
||||
|
||||
|
||||
int16_t LoRaWANNode::restoreOTAA() {
|
||||
int16_t state = this->setPhyProperties();
|
||||
RADIOLIB_ASSERT(state);
|
||||
|
@ -638,7 +649,7 @@ int16_t LoRaWANNode::uplink(uint8_t* data, size_t len, uint8_t port) {
|
|||
}
|
||||
|
||||
// perform CSMA if enabled.
|
||||
if (CSMA_ENABLE) {
|
||||
if (enableCSMA) {
|
||||
performCSMA();
|
||||
}
|
||||
|
||||
|
@ -1767,19 +1778,20 @@ void LoRaWANNode::hton(uint8_t* buff, T val, size_t size) {
|
|||
}
|
||||
}
|
||||
|
||||
// The following function enables LMAC, a CSMA scheme for LoRa as specified in the LoRa Alliance Technical Reccomendation #13.
|
||||
// The following function enables LMAC, a CSMA scheme for LoRa as specified
|
||||
// in the LoRa Alliance Technical Recommendation #13.
|
||||
// A user may enable CSMA to provide frames an additional layer of protection from interference.
|
||||
// https://resources.lora-alliance.org/technical-recommendations/tr013-1-0-0-csma
|
||||
void LoRaWANNode::performCSMA() {
|
||||
|
||||
// Compute initial random back-off.
|
||||
// When BO is reduced to zero, the function returns and the frame is transmitted.
|
||||
uint32_t BO = random(1, BO_MAX + 1);
|
||||
uint32_t BO = this->phyLayer->random(1, this->backoffMax + 1);
|
||||
|
||||
while (BO > 0) {
|
||||
// DIFS: Check channel for DIFS_slots
|
||||
bool channelFreeDuringDIFS = true;
|
||||
for (uint8_t i = 0; i < DIFS_SLOTS; i++) {
|
||||
for (uint8_t i = 0; i < this->difsSlots; i++) {
|
||||
if (performCAD()) {
|
||||
RADIOLIB_DEBUG_PRINTLN("OCCUPIED CHANNEL DURING DIFS");
|
||||
channelFreeDuringDIFS = false;
|
||||
|
@ -1805,7 +1817,6 @@ void LoRaWANNode::performCSMA() {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
bool LoRaWANNode::performCAD() {
|
||||
int16_t state = this->phyLayer->scanChannel();
|
||||
|
||||
|
|
|
@ -176,11 +176,6 @@
|
|||
// the maximum number of simultaneously available channels
|
||||
#define RADIOLIB_LORAWAN_NUM_AVAILABLE_CHANNELS (8)
|
||||
|
||||
// CSMA definitions
|
||||
#define DIFS_SLOTS (2) // Number of CADs to estimate a clear channel.
|
||||
#define BO_MAX (6) // Number of maximum CADs to back-off. Set to 0 to disable.
|
||||
#define CSMA_ENABLE (true) // Enables/disables CSMA functionality.
|
||||
|
||||
/*!
|
||||
\struct LoRaWANChannelSpan_t
|
||||
\brief Structure to save information about LoRaWAN channels.
|
||||
|
@ -301,6 +296,17 @@ class LoRaWANNode {
|
|||
(e.g. 8 for US915 FSB2 used by TTN). By default -1 (no channel offset). */
|
||||
int8_t numChannels;
|
||||
|
||||
/*! \brief Num of Back Off(BO) slots to be decremented after DIFS phase. 0 to disable BO.
|
||||
A random BO avoids collisions in the case where two or more nodes start the CSMA
|
||||
process at the same time. */
|
||||
uint8_t backoffMax;
|
||||
|
||||
/*! \brief Num of CADs to estimate a clear CH. */
|
||||
uint8_t difsSlots;
|
||||
|
||||
/*! \brief enable/disable CSMA for LoRaWAN. */
|
||||
bool enableCSMA;
|
||||
|
||||
/*!
|
||||
\brief Default constructor.
|
||||
\param phy Pointer to the PhysicalLayer radio module.
|
||||
|
@ -314,6 +320,14 @@ class LoRaWANNode {
|
|||
*/
|
||||
void wipe();
|
||||
|
||||
/*!
|
||||
\brief Configures CSMA for LoRaWAN as per TR-13, LoRa Alliance.
|
||||
\param backoffMax Num of BO slots to be decremented after DIFS phase. 0 to disable BO.
|
||||
\param difsSlots Num of CADs to estimate a clear CH.
|
||||
\param enableCSMA enable/disable CSMA for LoRaWAN.
|
||||
*/
|
||||
void setCSMA(uint8_t backoffMax, uint8_t difsSlots, bool enableCSMA = false);
|
||||
|
||||
/*!
|
||||
\brief Restore OTAA session by loading information from persistent storage.
|
||||
\returns \ref status_codes
|
||||
|
|
Loading…
Add table
Reference in a new issue