Skip to content

Commit

Permalink
Issue #1359 - Fixed inconsistent handling of undefined callbacks
Browse files Browse the repository at this point in the history
- 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)
  • Loading branch information
mluis1 committed Oct 13, 2022
1 parent aa2bef8 commit 0341ea7
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 77 deletions.
118 changes: 94 additions & 24 deletions src/apps/LoRaMac/common/LmHandler/LmHandler.c
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,32 @@ static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm );
*/
static void MlmeIndication( MlmeIndication_t *mlmeIndication );

/*!
* Calls the OnClassChange callback to indicate the new active device class
*
* \param [in] deviceClass Active device class
*/
static void OnClassChangeNotify( DeviceClass_t deviceClass )
{
if( LmHandlerCallbacks->OnClassChange != NULL )
{
LmHandlerCallbacks->OnClassChange( deviceClass );
}
}

/*!
* Calls the OnBeaconStatusChange callback to indicate current beacon status
*
* \param [in] params Current beacon parameters
*/
static void OnBeaconStatusChangeNotify( LoRaMacHandlerBeaconParams_t *params )
{
if( LmHandlerCallbacks->OnBeaconStatusChange != NULL )
{
LmHandlerCallbacks->OnBeaconStatusChange( params );
}
}

/*!
* Starts the beacon search
*
Expand Down Expand Up @@ -252,7 +278,7 @@ LmHandlerErrorStatus_t LmHandlerInit( LmHandlerCallbacks_t *handlerCallbacks,
nbNvmData = NvmDataMgmtRestore( );

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

#if( STATIC_DEVICE_ADDRESS != 1 )
// TODO: Remove STATIC_DEVICE_ADDRESS = 0. Up to the application to decide what to do
// Random seed initialization
srand1( LmHandlerCallbacks->GetRandomSeed( ) );
if( LmHandlerCallbacks->GetRandomSeed != NULL )
{
srand1( LmHandlerCallbacks->GetRandomSeed( ) );
}
// Choose a random device address
CommissioningParams.DevAddr = randr( 0, 0x01FFFFFF );
#endif
Expand Down Expand Up @@ -320,7 +350,10 @@ LmHandlerErrorStatus_t LmHandlerInit( LmHandlerCallbacks_t *handlerCallbacks,
{
if( mibReq.Param.NetworkActivation == ACTIVATION_TYPE_NONE )
{
LmHandlerCallbacks->OnNetworkParametersChange( &CommissioningParams );
if( LmHandlerCallbacks->OnNetworkParametersChange != NULL )
{
LmHandlerCallbacks->OnNetworkParametersChange( &CommissioningParams );
}
}
}
return LORAMAC_HANDLER_SUCCESS;
Expand Down Expand Up @@ -365,7 +398,10 @@ void LmHandlerProcess( void )

if( size > 0 )
{
LmHandlerCallbacks->OnNvmDataChange( LORAMAC_HANDLER_NVM_STORE, size );
if( LmHandlerCallbacks->OnNvmDataChange != NULL )
{
LmHandlerCallbacks->OnNvmDataChange( LORAMAC_HANDLER_NVM_STORE, size );
}
}

// Call all packages process functions
Expand Down Expand Up @@ -428,7 +464,11 @@ static void LmHandlerJoinRequest( bool isOtaa )
CommissioningParams.IsOtaaActivation = false;
}
// Starts the join procedure
LmHandlerCallbacks->OnMacMlmeRequest( LoRaMacMlmeRequest( &mlmeReq ), &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
LoRaMacStatus_t status = LoRaMacMlmeRequest( &mlmeReq );
if( LmHandlerCallbacks->OnMacMlmeRequest != NULL )
{
LmHandlerCallbacks->OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
}
DutyCycleWaitTime = mlmeReq.ReqReturn.DutyCycleWaitTime;
}

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

status = LoRaMacMcpsRequest( &mcpsReq );
LmHandlerCallbacks->OnMacMcpsRequest( status, &mcpsReq, mcpsReq.ReqReturn.DutyCycleWaitTime );
if( LmHandlerCallbacks->OnMacMcpsRequest != NULL )
{
LmHandlerCallbacks->OnMacMcpsRequest( status, &mcpsReq, mcpsReq.ReqReturn.DutyCycleWaitTime );
}
DutyCycleWaitTime = mcpsReq.ReqReturn.DutyCycleWaitTime;

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

status = LoRaMacMlmeRequest( &mlmeReq );
LmHandlerCallbacks->OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
if( LmHandlerCallbacks->OnMacMlmeRequest != NULL )
{
LmHandlerCallbacks->OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
}
DutyCycleWaitTime = mlmeReq.ReqReturn.DutyCycleWaitTime;

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

status = LoRaMacMlmeRequest( &mlmeReq );
LmHandlerCallbacks->OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
if( LmHandlerCallbacks->OnMacMlmeRequest != NULL )
{
LmHandlerCallbacks->OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
}
DutyCycleWaitTime = mlmeReq.ReqReturn.DutyCycleWaitTime;

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

status = LoRaMacMlmeRequest( &mlmeReq );
LmHandlerCallbacks->OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
if( LmHandlerCallbacks->OnMacMlmeRequest != NULL )
{
LmHandlerCallbacks->OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
}
DutyCycleWaitTime = mlmeReq.ReqReturn.DutyCycleWaitTime;

if( status == LORAMAC_STATUS_OK )
Expand Down Expand Up @@ -605,7 +657,7 @@ LmHandlerErrorStatus_t LmHandlerRequestClass( DeviceClass_t newClass )
if( LoRaMacMibSetRequestConfirm( &mibReq ) == LORAMAC_STATUS_OK )
{
// Switch is instantaneous
LmHandlerCallbacks->OnClassChange( CLASS_A );
OnClassChangeNotify( CLASS_A );
}
else
{
Expand Down Expand Up @@ -635,7 +687,7 @@ LmHandlerErrorStatus_t LmHandlerRequestClass( DeviceClass_t newClass )
mibReq.Param.Class = CLASS_C;
if( LoRaMacMibSetRequestConfirm( &mibReq ) == LORAMAC_STATUS_OK )
{
LmHandlerCallbacks->OnClassChange( CLASS_C );
OnClassChangeNotify( CLASS_C );
}
else
{
Expand Down Expand Up @@ -704,7 +756,10 @@ static void McpsConfirm( McpsConfirm_t *mcpsConfirm )
TxParams.Channel = mcpsConfirm->Channel;
TxParams.AckReceived = mcpsConfirm->AckReceived;

LmHandlerCallbacks->OnTxData( &TxParams );
if( LmHandlerCallbacks->OnTxData != NULL )
{
LmHandlerCallbacks->OnTxData( &TxParams );
}

LmHandlerPackagesNotify( PACKAGE_MCPS_CONFIRM, mcpsConfirm );
}
Expand All @@ -731,16 +786,22 @@ static void McpsIndication( McpsIndication_t *mcpsIndication )
appData.BufferSize = mcpsIndication->BufferSize;
appData.Buffer = mcpsIndication->Buffer;

LmHandlerCallbacks->OnRxData( &appData, &RxParams );
if( LmHandlerCallbacks->OnRxData != NULL )
{
LmHandlerCallbacks->OnRxData( &appData, &RxParams );
}

if( mcpsIndication->DeviceTimeAnsReceived == true )
{
if( LmHandlerCallbacks->OnSysTimeUpdate != NULL )
{
#if( LMH_SYS_TIME_UPDATE_NEW_API == 1 )
// Provide fix values. DeviceTimeAns is accurate
LmHandlerCallbacks->OnSysTimeUpdate( true, 0 );
// Provide fix values. DeviceTimeAns is accurate
LmHandlerCallbacks->OnSysTimeUpdate( true, 0 );
#else
LmHandlerCallbacks->OnSysTimeUpdate( );
LmHandlerCallbacks->OnSysTimeUpdate( );
#endif
}
}
// Call packages RxProcess function
LmHandlerPackagesNotify( PACKAGE_MCPS_INDICATION, mcpsIndication );
Expand All @@ -757,7 +818,10 @@ static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm )
{
TxParams.IsMcpsConfirm = 0;
TxParams.Status = mlmeConfirm->Status;
LmHandlerCallbacks->OnTxData( &TxParams );
if( LmHandlerCallbacks->OnTxData != NULL )
{
LmHandlerCallbacks->OnTxData( &TxParams );
}

LmHandlerPackagesNotify( PACKAGE_MLME_CONFIRM, mlmeConfirm );

Expand All @@ -782,7 +846,10 @@ static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm )
JoinParams.Status = LORAMAC_HANDLER_ERROR;
}
// Notify upper layer
LmHandlerCallbacks->OnJoinRequest( &JoinParams );
if( LmHandlerCallbacks->OnJoinRequest != NULL )
{
LmHandlerCallbacks->OnJoinRequest( &JoinParams );
}
}
break;
case MLME_LINK_CHECK:
Expand Down Expand Up @@ -826,7 +893,7 @@ static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm )
mibReq.Param.Class = CLASS_B;
LoRaMacMibSetRequestConfirm( &mibReq );
// Notify upper layer
LmHandlerCallbacks->OnClassChange( CLASS_B );
OnClassChangeNotify( CLASS_B );
IsClassBSwitchPending = false;
}
else
Expand All @@ -846,7 +913,10 @@ static void MlmeIndication( MlmeIndication_t *mlmeIndication )
RxParams.Status = mlmeIndication->Status;
if( RxParams.Status != LORAMAC_EVENT_INFO_STATUS_BEACON_LOCKED )
{
LmHandlerCallbacks->OnRxData( NULL, &RxParams );
if( LmHandlerCallbacks->OnRxData != NULL )
{
LmHandlerCallbacks->OnRxData( NULL, &RxParams );
}
}

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

LmHandlerCallbacks->OnClassChange( CLASS_A );
LmHandlerCallbacks->OnBeaconStatusChange( &BeaconParams );
OnClassChangeNotify( CLASS_A );
OnBeaconStatusChangeNotify( &BeaconParams );

LmHandlerDeviceTimeReq( );
}
Expand All @@ -880,14 +950,14 @@ static void MlmeIndication( MlmeIndication_t *mlmeIndication )
BeaconParams.State = LORAMAC_HANDLER_BEACON_RX;
BeaconParams.Info = mlmeIndication->BeaconInfo;

LmHandlerCallbacks->OnBeaconStatusChange( &BeaconParams );
OnBeaconStatusChangeNotify( &BeaconParams );
}
else
{
BeaconParams.State = LORAMAC_HANDLER_BEACON_NRX;
BeaconParams.Info = mlmeIndication->BeaconInfo;

LmHandlerCallbacks->OnBeaconStatusChange( &BeaconParams );
OnBeaconStatusChangeNotify( &BeaconParams );
}
break;
}
Expand Down
7 changes: 5 additions & 2 deletions src/apps/LoRaMac/common/LmHandler/packages/LmhpCompliance.c
Original file line number Diff line number Diff line change
Expand Up @@ -415,8 +415,11 @@ static void LmhpComplianceOnMcpsIndication( McpsIndication_t* mcpsIndication )
MlmeReq_t mlmeReq;
mlmeReq.Type = MLME_LINK_CHECK;

CompliancePackage.OnMacMlmeRequest( LoRaMacMlmeRequest( &mlmeReq ), &mlmeReq,
mlmeReq.ReqReturn.DutyCycleWaitTime );
LoRaMacStatus_t status = LoRaMacMlmeRequest( &mlmeReq );
if( CompliancePackage.OnMacMlmeRequest != NULL )
{
CompliancePackage.OnMacMlmeRequest( status, &mlmeReq, mlmeReq.ReqReturn.DutyCycleWaitTime );
}
break;
}
case COMPLIANCE_DEVICE_TIME_REQ:
Expand Down
Loading

0 comments on commit 0341ea7

Please sign in to comment.