Skip to content

Commit 3c4a2f6

Browse files
Daniel Jaecklemluis1
authored andcommitted
Added the implementation for "A class C device shall send confirmed uplinks after the reception of a JoinAccept frame"
1 parent f4e181e commit 3c4a2f6

File tree

1 file changed

+31
-14
lines changed

1 file changed

+31
-14
lines changed

src/mac/LoRaMac.c

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,10 @@ typedef struct sLoRaMacNvmCtx
180180
* with a link adr request.
181181
*/
182182
bool ChannelsDatarateChangedLinkAdrReq;
183+
/*
184+
* The stack will set this variable to true, if a downlink has been received.
185+
*/
186+
bool DownlinkReceived;
183187
/*
184188
* Aggregated duty cycle management
185189
*/
@@ -1189,7 +1193,6 @@ static void ProcessRadioRxDone( void )
11891193
return;
11901194
}
11911195

1192-
// Frame is valid
11931196
MacCtx.McpsIndication.Status = LORAMAC_EVENT_INFO_STATUS_OK;
11941197
MacCtx.McpsIndication.Multicast = multicast;
11951198
MacCtx.McpsIndication.FramePending = macMsgData.FHDR.FCtrl.Bits.FPending;
@@ -1206,6 +1209,7 @@ static void ProcessRadioRxDone( void )
12061209
( MacCtx.McpsIndication.RxSlot == RX_SLOT_WIN_2 ) )
12071210
{
12081211
MacCtx.NvmCtx->AdrAckCounter = 0;
1212+
MacCtx.NvmCtx->DownlinkReceived = true;
12091213
}
12101214

12111215
// MCPS Indication and ack requested handling
@@ -2749,6 +2753,7 @@ static void ResetMacParameters( void )
27492753
MacCtx.NodeAckRequested = false;
27502754
MacCtx.NvmCtx->SrvAckRequested = false;
27512755
MacCtx.NvmCtx->ChannelsDatarateChangedLinkAdrReq = false;
2756+
MacCtx.NvmCtx->DownlinkReceived = false;
27522757

27532758
// Reset to application defaults
27542759
InitDefaultsParams_t params;
@@ -4749,42 +4754,54 @@ LoRaMacStatus_t LoRaMacMcpsRequest( McpsReq_t* mcpsRequest )
47494754
return LORAMAC_STATUS_BUSY;
47504755
}
47514756

4757+
McpsReq_t request = *mcpsRequest;
4758+
47524759
macHdr.Value = 0;
47534760
memset1( ( uint8_t* ) &MacCtx.McpsConfirm, 0, sizeof( MacCtx.McpsConfirm ) );
47544761
MacCtx.McpsConfirm.Status = LORAMAC_EVENT_INFO_STATUS_ERROR;
47554762

4756-
switch( mcpsRequest->Type )
4763+
// Apply confirmed downlinks, if the device has not received a valid
4764+
// downlink after a join accept.
4765+
if( ( MacCtx.NvmCtx->NetworkActivation == ACTIVATION_TYPE_OTAA ) &&
4766+
( MacCtx.NvmCtx->DeviceClass == CLASS_C ) &&
4767+
( MacCtx.NvmCtx->DownlinkReceived == false ) &&
4768+
( request.Type == MCPS_UNCONFIRMED ) )
4769+
{
4770+
request.Type = MCPS_CONFIRMED;
4771+
}
4772+
4773+
switch( request.Type )
47574774
{
47584775
case MCPS_UNCONFIRMED:
47594776
{
47604777
readyToSend = true;
47614778

47624779
macHdr.Bits.MType = FRAME_TYPE_DATA_UNCONFIRMED_UP;
4763-
fPort = mcpsRequest->Req.Unconfirmed.fPort;
4764-
fBuffer = mcpsRequest->Req.Unconfirmed.fBuffer;
4765-
fBufferSize = mcpsRequest->Req.Unconfirmed.fBufferSize;
4766-
datarate = mcpsRequest->Req.Unconfirmed.Datarate;
4780+
fPort = request.Req.Unconfirmed.fPort;
4781+
fBuffer = request.Req.Unconfirmed.fBuffer;
4782+
fBufferSize = request.Req.Unconfirmed.fBufferSize;
4783+
datarate = request.Req.Unconfirmed.Datarate;
47674784
break;
47684785
}
47694786
case MCPS_CONFIRMED:
47704787
{
47714788
readyToSend = true;
47724789

47734790
macHdr.Bits.MType = FRAME_TYPE_DATA_CONFIRMED_UP;
4774-
fPort = mcpsRequest->Req.Confirmed.fPort;
4775-
fBuffer = mcpsRequest->Req.Confirmed.fBuffer;
4776-
fBufferSize = mcpsRequest->Req.Confirmed.fBufferSize;
4777-
datarate = mcpsRequest->Req.Confirmed.Datarate;
4791+
fPort = request.Req.Confirmed.fPort;
4792+
fBuffer = request.Req.Confirmed.fBuffer;
4793+
fBufferSize = request.Req.Confirmed.fBufferSize;
4794+
datarate = request.Req.Confirmed.Datarate;
47784795
break;
47794796
}
47804797
case MCPS_PROPRIETARY:
47814798
{
47824799
readyToSend = true;
47834800

47844801
macHdr.Bits.MType = FRAME_TYPE_PROPRIETARY;
4785-
fBuffer = mcpsRequest->Req.Proprietary.fBuffer;
4786-
fBufferSize = mcpsRequest->Req.Proprietary.fBufferSize;
4787-
datarate = mcpsRequest->Req.Proprietary.Datarate;
4802+
fBuffer = request.Req.Proprietary.fBuffer;
4803+
fBufferSize = request.Req.Proprietary.fBufferSize;
4804+
datarate = request.Req.Proprietary.Datarate;
47884805
break;
47894806
}
47904807
default:
@@ -4829,7 +4846,7 @@ LoRaMacStatus_t LoRaMacMcpsRequest( McpsReq_t* mcpsRequest )
48294846
status = Send( &macHdr, fPort, fBuffer, fBufferSize );
48304847
if( status == LORAMAC_STATUS_OK )
48314848
{
4832-
MacCtx.McpsConfirm.McpsRequest = mcpsRequest->Type;
4849+
MacCtx.McpsConfirm.McpsRequest = request.Type;
48334850
MacCtx.MacFlags.Bits.McpsReq = 1;
48344851
}
48354852
else

0 commit comments

Comments
 (0)