Skip to content

Commit bc2f3bc

Browse files
authored
Move AdrAckLimit and AdrAckDelay to NVM MacGroup2 (#1342)
* Teach the MIB to get/set ADR Ack limit value It would be useful for the application to have access to the ADR Ack limit value so that the default value obtained from regional parameters could be overriden. * Teach the MIB to get/set ADR Ack delay value Some applications benefit from begin able to customize the ADR Ack parameter default values initialized from the regional parameters. * Move AdrAckLimit and AdrAckDelay to NVM Those two parameters can be remotely updated by the network server via ADR and thus should probably be backed by the NVM to make sure the configured values survive reboots. This patch moves the two parameters to NVM.MacGroup2.MacParameters. * Teach the MIB to get/set ADR Ack default values This patch adds two new MIB types: MIB_ADR_ACK_DEFAULT_LIMIT and MIB_ADR_ACK_DEFAULT_DELAY. The new types can be used to configure the default values for these parameters, i.e., the values unaffected by ADR. These values are initially obtained from the regional parameters upon region change. * Reset AdrAck{Limit,Delay} in RsetMacParameters Since the two parameters can be set by the network server via ADR, they need to be reset in the function ResetMacParameters() so that there is a means to revert to the pre-ADR values, e.g., before OTAA Join.
1 parent a8a6ebd commit bc2f3bc

File tree

2 files changed

+93
-18
lines changed

2 files changed

+93
-18
lines changed

src/mac/LoRaMac.c

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -167,15 +167,6 @@ typedef struct sLoRaMacCtx
167167
RxConfigParams_t RxWindow1Config;
168168
RxConfigParams_t RxWindow2Config;
169169
RxConfigParams_t RxWindowCConfig;
170-
/*
171-
* Limit of uplinks without any donwlink response before the ADRACKReq bit will be set.
172-
*/
173-
uint16_t AdrAckLimit;
174-
/*
175-
* Limit of uplinks without any donwlink response after a the first frame with set ADRACKReq bit
176-
* before the trying to regain the connectivity.
177-
*/
178-
uint16_t AdrAckDelay;
179170
/*
180171
* Acknowledge timeout timer. Used for packet retransmissions.
181172
*/
@@ -2383,10 +2374,10 @@ static void ProcessMacCommands( uint8_t *payload, uint8_t macIndex, uint8_t comm
23832374
macIndex++;
23842375

23852376
// ADR_ACK_ DELAY = 2^Delay_exp
2386-
MacCtx.AdrAckDelay = 0x01 << delayExp;
2377+
Nvm.MacGroup2.MacParams.AdrAckDelay = 0x01 << delayExp;
23872378

23882379
// ADR_ACK_LIMIT = 2^Limit_exp
2389-
MacCtx.AdrAckLimit = 0x01 << limitExp;
2380+
Nvm.MacGroup2.MacParams.AdrAckLimit = 0x01 << limitExp;
23902381

23912382
LoRaMacCommandsAddCmd( MOTE_MAC_ADR_PARAM_SETUP_ANS, macCmdPayload, 0 );
23922383
break;
@@ -2625,8 +2616,8 @@ LoRaMacStatus_t Send( LoRaMacHeader_t* macHdr, uint8_t fPort, void* fBuffer, uin
26252616
adrNext.UpdateChanMask = true;
26262617
adrNext.AdrEnabled = fCtrl.Bits.Adr;
26272618
adrNext.AdrAckCounter = Nvm.MacGroup1.AdrAckCounter;
2628-
adrNext.AdrAckLimit = MacCtx.AdrAckLimit;
2629-
adrNext.AdrAckDelay = MacCtx.AdrAckDelay;
2619+
adrNext.AdrAckLimit = Nvm.MacGroup2.MacParams.AdrAckLimit;
2620+
adrNext.AdrAckDelay = Nvm.MacGroup2.MacParams.AdrAckDelay;
26302621
adrNext.Datarate = Nvm.MacGroup1.ChannelsDatarate;
26312622
adrNext.TxPower = Nvm.MacGroup1.ChannelsTxPower;
26322623
adrNext.NbTrans = Nvm.MacGroup2.MacParams.ChannelsNbTrans;
@@ -3060,6 +3051,8 @@ static void ResetMacParameters( void )
30603051
Nvm.MacGroup2.MacParams.DownlinkDwellTime = Nvm.MacGroup2.MacParamsDefaults.DownlinkDwellTime;
30613052
Nvm.MacGroup2.MacParams.MaxEirp = Nvm.MacGroup2.MacParamsDefaults.MaxEirp;
30623053
Nvm.MacGroup2.MacParams.AntennaGain = Nvm.MacGroup2.MacParamsDefaults.AntennaGain;
3054+
Nvm.MacGroup2.MacParams.AdrAckLimit = Nvm.MacGroup2.MacParamsDefaults.AdrAckLimit;
3055+
Nvm.MacGroup2.MacParams.AdrAckDelay = Nvm.MacGroup2.MacParamsDefaults.AdrAckDelay;
30633056

30643057
MacCtx.NodeAckRequested = false;
30653058
Nvm.MacGroup1.SrvAckRequested = false;
@@ -3575,7 +3568,7 @@ static bool StopRetransmission( void )
35753568
* If the device has not received a RekeyConf within
35763569
* the first ADR_ACK_LIMIT uplinks it SHALL revert to the Join state.
35773570
*/
3578-
if( Nvm.MacGroup1.RekeyIndUplinksCounter == MacCtx.AdrAckLimit )
3571+
if( Nvm.MacGroup1.RekeyIndUplinksCounter == Nvm.MacGroup2.MacParams.AdrAckLimit )
35793572
{
35803573
Nvm.MacGroup2.NetworkActivation = ACTIVATION_TYPE_NONE;
35813574
MacCtx.MacFlags.Bits.MlmeInd = 1;
@@ -3732,11 +3725,11 @@ LoRaMacStatus_t LoRaMacInitialization( LoRaMacPrimitives_t* primitives, LoRaMacC
37323725

37333726
getPhy.Attribute = PHY_DEF_ADR_ACK_LIMIT;
37343727
phyParam = RegionGetPhyParam( Nvm.MacGroup2.Region, &getPhy );
3735-
MacCtx.AdrAckLimit = phyParam.Value;
3728+
Nvm.MacGroup2.MacParamsDefaults.AdrAckLimit = phyParam.Value;
37363729

37373730
getPhy.Attribute = PHY_DEF_ADR_ACK_DELAY;
37383731
phyParam = RegionGetPhyParam( Nvm.MacGroup2.Region, &getPhy );
3739-
MacCtx.AdrAckDelay = phyParam.Value;
3732+
Nvm.MacGroup2.MacParamsDefaults.AdrAckDelay = phyParam.Value;
37403733

37413734
// Init parameters which are not set in function ResetMacParameters
37423735
Nvm.MacGroup2.MacParamsDefaults.ChannelsNbTrans = 1;
@@ -3870,8 +3863,8 @@ LoRaMacStatus_t LoRaMacQueryTxPossible( uint8_t size, LoRaMacTxInfo_t* txInfo )
38703863
adrNext.UpdateChanMask = false;
38713864
adrNext.AdrEnabled = Nvm.MacGroup2.AdrCtrlOn;
38723865
adrNext.AdrAckCounter = Nvm.MacGroup1.AdrAckCounter;
3873-
adrNext.AdrAckLimit = MacCtx.AdrAckLimit;
3874-
adrNext.AdrAckDelay = MacCtx.AdrAckDelay;
3866+
adrNext.AdrAckLimit = Nvm.MacGroup2.MacParams.AdrAckLimit;
3867+
adrNext.AdrAckDelay = Nvm.MacGroup2.MacParams.AdrAckDelay;
38753868
adrNext.Datarate = Nvm.MacGroup1.ChannelsDatarate;
38763869
adrNext.TxPower = Nvm.MacGroup1.ChannelsTxPower;
38773870
adrNext.NbTrans = MacCtx.ChannelsNbTransCounter;
@@ -4123,6 +4116,26 @@ LoRaMacStatus_t LoRaMacMibGetRequestConfirm( MibRequestConfirm_t* mibGet )
41234116
mibGet->Param.Rejoin2CycleInSec = Nvm.MacGroup2.Rejoin2CycleInSec;
41244117
break;
41254118
}
4119+
case MIB_ADR_ACK_LIMIT:
4120+
{
4121+
mibGet->Param.AdrAckLimit = Nvm.MacGroup2.MacParams.AdrAckLimit;
4122+
break;
4123+
}
4124+
case MIB_ADR_ACK_DELAY:
4125+
{
4126+
mibGet->Param.AdrAckDelay = Nvm.MacGroup2.MacParams.AdrAckDelay;
4127+
break;
4128+
}
4129+
case MIB_ADR_ACK_DEFAULT_LIMIT:
4130+
{
4131+
mibGet->Param.AdrAckLimit = Nvm.MacGroup2.MacParamsDefaults.AdrAckLimit;
4132+
break;
4133+
}
4134+
case MIB_ADR_ACK_DEFAULT_DELAY:
4135+
{
4136+
mibGet->Param.AdrAckDelay = Nvm.MacGroup2.MacParamsDefaults.AdrAckDelay;
4137+
break;
4138+
}
41264139
case MIB_RSSI_FREE_THRESHOLD:
41274140
{
41284141
#if defined(REGION_KR920) || defined(REGION_AS923)
@@ -4826,6 +4839,26 @@ LoRaMacStatus_t LoRaMacMibSetRequestConfirm( MibRequestConfirm_t* mibSet )
48264839
}
48274840
break;
48284841
}
4842+
case MIB_ADR_ACK_LIMIT:
4843+
{
4844+
Nvm.MacGroup2.MacParams.AdrAckLimit = mibSet->Param.AdrAckLimit;
4845+
break;
4846+
}
4847+
case MIB_ADR_ACK_DELAY:
4848+
{
4849+
Nvm.MacGroup2.MacParams.AdrAckDelay = mibSet->Param.AdrAckDelay;
4850+
break;
4851+
}
4852+
case MIB_ADR_ACK_DEFAULT_LIMIT:
4853+
{
4854+
Nvm.MacGroup2.MacParamsDefaults.AdrAckLimit = mibSet->Param.AdrAckLimit;
4855+
break;
4856+
}
4857+
case MIB_ADR_ACK_DEFAULT_DELAY:
4858+
{
4859+
Nvm.MacGroup2.MacParamsDefaults.AdrAckDelay = mibSet->Param.AdrAckDelay;
4860+
break;
4861+
}
48294862
case MIB_RSSI_FREE_THRESHOLD:
48304863
{
48314864
#if defined(REGION_KR920) || defined(REGION_AS923)

src/mac/LoRaMac.h

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,16 @@ typedef struct sLoRaMacParams
312312
* Antenna gain of the node
313313
*/
314314
float AntennaGain;
315+
/*!
316+
* Limit of uplinks without any donwlink response before the ADRACKReq bit
317+
* will be set.
318+
*/
319+
uint16_t AdrAckLimit;
320+
/*!
321+
* Limit of uplinks without any donwlink response after a the first frame
322+
* with set ADRACKReq bit before the trying to regain the connectivity.
323+
*/
324+
uint16_t AdrAckDelay;
315325
}LoRaMacParams_t;
316326

317327
/*!
@@ -1437,6 +1447,10 @@ typedef struct sMlmeIndication
14371447
* \ref MIB_REJOIN_0_CYCLE | YES | YES
14381448
* \ref MIB_REJOIN_1_CYCLE | YES | YES
14391449
* \ref MIB_REJOIN_2_CYCLE | YES | NO
1450+
* \ref MIB_ADR_ACK_LIMIT | YES | YES
1451+
* \ref MIB_ADR_ACK_DELAY | YES | YES
1452+
* \ref MIB_ADR_ACK_DEFAULT_LIMIT | YES | YES
1453+
* \ref MIB_ADR_ACK_DEFAULT_DELAY | YES | YES
14401454
* \ref MIB_RSSI_FREE_THRESHOLD | YES | YES
14411455
* \ref MIB_CARRIER_SENSE_TIME | YES | YES
14421456
*
@@ -1871,6 +1885,22 @@ typedef enum eMib
18711885
* LoRaWAN certification FPort handling state (ON/OFF)
18721886
*/
18731887
MIB_IS_CERT_FPORT_ON,
1888+
/*!
1889+
* ADR ack limit value
1890+
*/
1891+
MIB_ADR_ACK_LIMIT,
1892+
/*!
1893+
* ADR ack delay value
1894+
*/
1895+
MIB_ADR_ACK_DELAY,
1896+
/*!
1897+
* ADR ack default limit value
1898+
*/
1899+
MIB_ADR_ACK_DEFAULT_LIMIT,
1900+
/*!
1901+
* ADR ack default delay value
1902+
*/
1903+
MIB_ADR_ACK_DEFAULT_DELAY,
18741904
/*!
18751905
* RSSI free channel threshold value (KR920 and AS923 only)
18761906
*/
@@ -2325,6 +2355,18 @@ typedef union uMibParam
23252355
* Related MIB type: \ref MIB_IS_CERT_FPORT_ON
23262356
*/
23272357
bool IsCertPortOn;
2358+
/*!
2359+
* ADR ack limit value
2360+
*
2361+
* Related MIB types: \ref MIB_ADR_ACK_LIMIT, MIB_ADR_ACK_DEFAULT_LIMIT
2362+
*/
2363+
uint16_t AdrAckLimit;
2364+
/*!
2365+
* ADR ack delay value
2366+
*
2367+
* Related MIB types: \ref MIB_ADR_ACK_DELAY, MIB_ADR_ACK_DEFAULT_DELAY
2368+
*/
2369+
uint16_t AdrAckDelay;
23282370
/*!
23292371
* RSSI free channel threshold (KR920 and AS923 only)
23302372
*

0 commit comments

Comments
 (0)