@@ -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