Skip to content

Commit 0341ea7

Browse files
committed
Issue #1359 - Fixed inconsistent handling of undefined callbacks
- Ensured that every MacProcessNotify callback call has a guard (LoRaMac.c, LoRaMacClassB.c) - Added a guard to GetRandomSeed callback call (LmHandler.c) - Added a guard to OnNvmDataChange callback call (LmHandler.c) - Added a guard to OnNetworkParametersChange callback call (LmHandler.c) - Added a guard to OnMacMcpsRequest, OnMacMlmeRequest, OnJoinRequest, OnTxData, OnRxData, OnClassChange, OnBeaconStatusChange, and OnSysTimeUpdate callback calls (LmHandler.c, LmhpCompliance.c)
1 parent aa2bef8 commit 0341ea7

File tree

4 files changed

+135
-77
lines changed

4 files changed

+135
-77
lines changed

src/apps/LoRaMac/common/LmHandler/LmHandler.c

Lines changed: 94 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,32 @@ static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm );
186186
*/
187187
static void MlmeIndication( MlmeIndication_t *mlmeIndication );
188188

189+
/*!
190+
* Calls the OnClassChange callback to indicate the new active device class
191+
*
192+
* \param [in] deviceClass Active device class
193+
*/
194+
static void OnClassChangeNotify( DeviceClass_t deviceClass )
195+
{
196+
if( LmHandlerCallbacks->OnClassChange != NULL )
197+
{
198+
LmHandlerCallbacks->OnClassChange( deviceClass );
199+
}
200+
}
201+
202+
/*!
203+
* Calls the OnBeaconStatusChange callback to indicate current beacon status
204+
*
205+
* \param [in] params Current beacon parameters
206+
*/
207+
static void OnBeaconStatusChangeNotify( LoRaMacHandlerBeaconParams_t *params )
208+
{
209+
if( LmHandlerCallbacks->OnBeaconStatusChange != NULL )
210+
{
211+
LmHandlerCallbacks->OnBeaconStatusChange( params );
212+
}
213+
}
214+
189215
/*!
190216
* Starts the beacon search
191217
*
@@ -252,7 +278,7 @@ LmHandlerErrorStatus_t LmHandlerInit( LmHandlerCallbacks_t *handlerCallbacks,
252278
nbNvmData = NvmDataMgmtRestore( );
253279

254280
// Try to restore from NVM and query the mac if possible.
255-
if( nbNvmData > 0 )
281+
if( ( LmHandlerCallbacks->OnNvmDataChange != NULL ) && ( nbNvmData > 0 ) )
256282
{
257283
LmHandlerCallbacks->OnNvmDataChange( LORAMAC_HANDLER_NVM_RESTORE, nbNvmData );
258284
}
@@ -278,8 +304,12 @@ LmHandlerErrorStatus_t LmHandlerInit( LmHandlerCallbacks_t *handlerCallbacks,
278304
LoRaMacMibSetRequestConfirm( &mibReq );
279305

280306
#if( STATIC_DEVICE_ADDRESS != 1 )
307+
// TODO: Remove STATIC_DEVICE_ADDRESS = 0. Up to the application to decide what to do
281308
// Random seed initialization
282-
srand1( LmHandlerCallbacks->GetRandomSeed( ) );
309+
if( LmHandlerCallbacks->GetRandomSeed != NULL )
310+
{
311+
srand1( LmHandlerCallbacks->GetRandomSeed( ) );
312+
}
283313
// Choose a random device address
284314
CommissioningParams.DevAddr = randr( 0, 0x01FFFFFF );
285315
#endif
@@ -320,7 +350,10 @@ LmHandlerErrorStatus_t LmHandlerInit( LmHandlerCallbacks_t *handlerCallbacks,
320350
{
321351
if( mibReq.Param.NetworkActivation == ACTIVATION_TYPE_NONE )
322352
{
323-
LmHandlerCallbacks->OnNetworkParametersChange( &CommissioningParams );
353+
if( LmHandlerCallbacks->OnNetworkParametersChange != NULL )
354+
{
355+
LmHandlerCallbacks->OnNetworkParametersChange( &CommissioningParams );
356+
}
324357
}
325358
}
326359
return LORAMAC_HANDLER_SUCCESS;
@@ -365,7 +398,10 @@ void LmHandlerProcess( void )
365398

366399
if( size > 0 )
367400
{
368-
LmHandlerCallbacks->OnNvmDataChange( LORAMAC_HANDLER_NVM_STORE, size );
401+
if( LmHandlerCallbacks->OnNvmDataChange != NULL )
402+
{
403+
LmHandlerCallbacks->OnNvmDataChange( LORAMAC_HANDLER_NVM_STORE, size );
404+
}
369405
}
370406

371407
// Call all packages process functions
@@ -428,7 +464,11 @@ static void LmHandlerJoinRequest( bool isOtaa )
428464
CommissioningParams.IsOtaaActivation = false;
429465
}
430466
// Starts the join procedure
431-
LmHandlerCallbacks->OnMacMlmeRequest( LoRaMacMlmeRequest( &mlmeReq ), &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
467+
LoRaMacStatus_t status = LoRaMacMlmeRequest( &mlmeReq );
468+
if( LmHandlerCallbacks->OnMacMlmeRequest != NULL )
469+
{
470+
LmHandlerCallbacks->OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
471+
}
432472
DutyCycleWaitTime = mlmeReq.ReqReturn.DutyCycleWaitTime;
433473
}
434474

@@ -496,7 +536,10 @@ LmHandlerErrorStatus_t LmHandlerSend( LmHandlerAppData_t *appData, LmHandlerMsgT
496536
TxParams.Datarate = LmHandlerParams->TxDatarate;
497537

498538
status = LoRaMacMcpsRequest( &mcpsReq );
499-
LmHandlerCallbacks->OnMacMcpsRequest( status, &mcpsReq, mcpsReq.ReqReturn.DutyCycleWaitTime );
539+
if( LmHandlerCallbacks->OnMacMcpsRequest != NULL )
540+
{
541+
LmHandlerCallbacks->OnMacMcpsRequest( status, &mcpsReq, mcpsReq.ReqReturn.DutyCycleWaitTime );
542+
}
500543
DutyCycleWaitTime = mcpsReq.ReqReturn.DutyCycleWaitTime;
501544

502545
if( status == LORAMAC_STATUS_OK )
@@ -518,7 +561,10 @@ LmHandlerErrorStatus_t LmHandlerDeviceTimeReq( void )
518561
mlmeReq.Type = MLME_DEVICE_TIME;
519562

520563
status = LoRaMacMlmeRequest( &mlmeReq );
521-
LmHandlerCallbacks->OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
564+
if( LmHandlerCallbacks->OnMacMlmeRequest != NULL )
565+
{
566+
LmHandlerCallbacks->OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
567+
}
522568
DutyCycleWaitTime = mlmeReq.ReqReturn.DutyCycleWaitTime;
523569

524570
if( status == LORAMAC_STATUS_OK )
@@ -539,7 +585,10 @@ static LmHandlerErrorStatus_t LmHandlerBeaconReq( void )
539585
mlmeReq.Type = MLME_BEACON_ACQUISITION;
540586

541587
status = LoRaMacMlmeRequest( &mlmeReq );
542-
LmHandlerCallbacks->OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
588+
if( LmHandlerCallbacks->OnMacMlmeRequest != NULL )
589+
{
590+
LmHandlerCallbacks->OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
591+
}
543592
DutyCycleWaitTime = mlmeReq.ReqReturn.DutyCycleWaitTime;
544593

545594
if( status == LORAMAC_STATUS_OK )
@@ -562,7 +611,10 @@ LmHandlerErrorStatus_t LmHandlerPingSlotReq( uint8_t periodicity )
562611
mlmeReq.Req.PingSlotInfo.PingSlot.Fields.RFU = 0;
563612

564613
status = LoRaMacMlmeRequest( &mlmeReq );
565-
LmHandlerCallbacks->OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
614+
if( LmHandlerCallbacks->OnMacMlmeRequest != NULL )
615+
{
616+
LmHandlerCallbacks->OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
617+
}
566618
DutyCycleWaitTime = mlmeReq.ReqReturn.DutyCycleWaitTime;
567619

568620
if( status == LORAMAC_STATUS_OK )
@@ -605,7 +657,7 @@ LmHandlerErrorStatus_t LmHandlerRequestClass( DeviceClass_t newClass )
605657
if( LoRaMacMibSetRequestConfirm( &mibReq ) == LORAMAC_STATUS_OK )
606658
{
607659
// Switch is instantaneous
608-
LmHandlerCallbacks->OnClassChange( CLASS_A );
660+
OnClassChangeNotify( CLASS_A );
609661
}
610662
else
611663
{
@@ -635,7 +687,7 @@ LmHandlerErrorStatus_t LmHandlerRequestClass( DeviceClass_t newClass )
635687
mibReq.Param.Class = CLASS_C;
636688
if( LoRaMacMibSetRequestConfirm( &mibReq ) == LORAMAC_STATUS_OK )
637689
{
638-
LmHandlerCallbacks->OnClassChange( CLASS_C );
690+
OnClassChangeNotify( CLASS_C );
639691
}
640692
else
641693
{
@@ -704,7 +756,10 @@ static void McpsConfirm( McpsConfirm_t *mcpsConfirm )
704756
TxParams.Channel = mcpsConfirm->Channel;
705757
TxParams.AckReceived = mcpsConfirm->AckReceived;
706758

707-
LmHandlerCallbacks->OnTxData( &TxParams );
759+
if( LmHandlerCallbacks->OnTxData != NULL )
760+
{
761+
LmHandlerCallbacks->OnTxData( &TxParams );
762+
}
708763

709764
LmHandlerPackagesNotify( PACKAGE_MCPS_CONFIRM, mcpsConfirm );
710765
}
@@ -731,16 +786,22 @@ static void McpsIndication( McpsIndication_t *mcpsIndication )
731786
appData.BufferSize = mcpsIndication->BufferSize;
732787
appData.Buffer = mcpsIndication->Buffer;
733788

734-
LmHandlerCallbacks->OnRxData( &appData, &RxParams );
789+
if( LmHandlerCallbacks->OnRxData != NULL )
790+
{
791+
LmHandlerCallbacks->OnRxData( &appData, &RxParams );
792+
}
735793

736794
if( mcpsIndication->DeviceTimeAnsReceived == true )
737795
{
796+
if( LmHandlerCallbacks->OnSysTimeUpdate != NULL )
797+
{
738798
#if( LMH_SYS_TIME_UPDATE_NEW_API == 1 )
739-
// Provide fix values. DeviceTimeAns is accurate
740-
LmHandlerCallbacks->OnSysTimeUpdate( true, 0 );
799+
// Provide fix values. DeviceTimeAns is accurate
800+
LmHandlerCallbacks->OnSysTimeUpdate( true, 0 );
741801
#else
742-
LmHandlerCallbacks->OnSysTimeUpdate( );
802+
LmHandlerCallbacks->OnSysTimeUpdate( );
743803
#endif
804+
}
744805
}
745806
// Call packages RxProcess function
746807
LmHandlerPackagesNotify( PACKAGE_MCPS_INDICATION, mcpsIndication );
@@ -757,7 +818,10 @@ static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm )
757818
{
758819
TxParams.IsMcpsConfirm = 0;
759820
TxParams.Status = mlmeConfirm->Status;
760-
LmHandlerCallbacks->OnTxData( &TxParams );
821+
if( LmHandlerCallbacks->OnTxData != NULL )
822+
{
823+
LmHandlerCallbacks->OnTxData( &TxParams );
824+
}
761825

762826
LmHandlerPackagesNotify( PACKAGE_MLME_CONFIRM, mlmeConfirm );
763827

@@ -782,7 +846,10 @@ static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm )
782846
JoinParams.Status = LORAMAC_HANDLER_ERROR;
783847
}
784848
// Notify upper layer
785-
LmHandlerCallbacks->OnJoinRequest( &JoinParams );
849+
if( LmHandlerCallbacks->OnJoinRequest != NULL )
850+
{
851+
LmHandlerCallbacks->OnJoinRequest( &JoinParams );
852+
}
786853
}
787854
break;
788855
case MLME_LINK_CHECK:
@@ -826,7 +893,7 @@ static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm )
826893
mibReq.Param.Class = CLASS_B;
827894
LoRaMacMibSetRequestConfirm( &mibReq );
828895
// Notify upper layer
829-
LmHandlerCallbacks->OnClassChange( CLASS_B );
896+
OnClassChangeNotify( CLASS_B );
830897
IsClassBSwitchPending = false;
831898
}
832899
else
@@ -846,7 +913,10 @@ static void MlmeIndication( MlmeIndication_t *mlmeIndication )
846913
RxParams.Status = mlmeIndication->Status;
847914
if( RxParams.Status != LORAMAC_EVENT_INFO_STATUS_BEACON_LOCKED )
848915
{
849-
LmHandlerCallbacks->OnRxData( NULL, &RxParams );
916+
if( LmHandlerCallbacks->OnRxData != NULL )
917+
{
918+
LmHandlerCallbacks->OnRxData( NULL, &RxParams );
919+
}
850920
}
851921

852922
// Call packages RxProcess function
@@ -867,8 +937,8 @@ static void MlmeIndication( MlmeIndication_t *mlmeIndication )
867937
BeaconParams.Info.GwSpecific.InfoDesc = 0;
868938
memset1( BeaconParams.Info.GwSpecific.Info, 0, 6 );
869939

870-
LmHandlerCallbacks->OnClassChange( CLASS_A );
871-
LmHandlerCallbacks->OnBeaconStatusChange( &BeaconParams );
940+
OnClassChangeNotify( CLASS_A );
941+
OnBeaconStatusChangeNotify( &BeaconParams );
872942

873943
LmHandlerDeviceTimeReq( );
874944
}
@@ -880,14 +950,14 @@ static void MlmeIndication( MlmeIndication_t *mlmeIndication )
880950
BeaconParams.State = LORAMAC_HANDLER_BEACON_RX;
881951
BeaconParams.Info = mlmeIndication->BeaconInfo;
882952

883-
LmHandlerCallbacks->OnBeaconStatusChange( &BeaconParams );
953+
OnBeaconStatusChangeNotify( &BeaconParams );
884954
}
885955
else
886956
{
887957
BeaconParams.State = LORAMAC_HANDLER_BEACON_NRX;
888958
BeaconParams.Info = mlmeIndication->BeaconInfo;
889959

890-
LmHandlerCallbacks->OnBeaconStatusChange( &BeaconParams );
960+
OnBeaconStatusChangeNotify( &BeaconParams );
891961
}
892962
break;
893963
}

src/apps/LoRaMac/common/LmHandler/packages/LmhpCompliance.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -415,8 +415,11 @@ static void LmhpComplianceOnMcpsIndication( McpsIndication_t* mcpsIndication )
415415
MlmeReq_t mlmeReq;
416416
mlmeReq.Type = MLME_LINK_CHECK;
417417

418-
CompliancePackage.OnMacMlmeRequest( LoRaMacMlmeRequest( &mlmeReq ), &mlmeReq,
419-
mlmeReq.ReqReturn.DutyCycleWaitTime );
418+
LoRaMacStatus_t status = LoRaMacMlmeRequest( &mlmeReq );
419+
if( CompliancePackage.OnMacMlmeRequest != NULL )
420+
{
421+
CompliancePackage.OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
422+
}
420423
break;
421424
}
422425
case COMPLIANCE_DEVICE_TIME_REQ:

0 commit comments

Comments
 (0)