From 2a17ed2730f81b8915e8ed1966b51d24a17e14e2 Mon Sep 17 00:00:00 2001 From: Chris Knight Date: Fri, 26 Jun 2020 14:26:23 -0700 Subject: [PATCH 1/2] fix #759 - removes GetLastSenderId() --- docs/cFE Application Developers Guide.md | 11 --- docs/src/cfe_api.dox | 1 - fsw/cfe-core/src/inc/cfe_sb.h | 41 -------- fsw/cfe-core/src/sb/cfe_sb_api.c | 73 -------------- fsw/cfe-core/src/sb/cfe_sb_priv.h | 1 - fsw/cfe-core/unit-test/sb_UT.c | 116 ----------------------- fsw/cfe-core/unit-test/sb_UT.h | 109 +-------------------- 7 files changed, 1 insertion(+), 351 deletions(-) diff --git a/docs/cFE Application Developers Guide.md b/docs/cFE Application Developers Guide.md index 329cff100..81ec9770b 100644 --- a/docs/cFE Application Developers Guide.md +++ b/docs/cFE Application Developers Guide.md @@ -1769,7 +1769,6 @@ for extracting that field from the header: | Total Message Length | CFE_SB_GetTotalMsgLength | Command & Telemetry | | User Data Message Length | CFE_SB_GetUserDataLength | Command & Telemetry | | Command Code | CFE_SB_GetCmdCode | Command Only | -| Sender ID | CFE_SB_GetLastSenderId | Command & Telemetry | | Checksum | CFE_SB_GetChecksum | Command Only | In addition to the function for reading the checksum field, there is @@ -1778,15 +1777,6 @@ and compares it to the checksum in the header. The API is called CFE_SB_ValidateChecksum() and it simply returns a success or failure indication. -It should be noted that the function, CFE_SB_GetLastSendId, is ideal -for verifying that critical commands are arriving from a legitimate -source. This function allows the Developer(s) to define a strict ICD -between two or more Applications to ensure that an erroneous Application -does not accidentally issue a critical command. However, its use for -routine command verification is discouraged since it would increase the -cross-coupling between Applications and require multiple Applications to -be modified if a command's source changes. - If the Application's data structure definitions don't include the header information, then the CFE_SB_GetUserData API could be used to obtain the start address of the SB Message data. @@ -1880,7 +1870,6 @@ After a message is received, the SB Message Header accessor functions (as described in Section 6.5.3) should be used to identify the message so that the application can react to it appropriately. - #### 6.8 Improving Message Transfer Performance for Large SB Messages Occasionally, there is a need for large quantities of data to be passed diff --git a/docs/src/cfe_api.dox b/docs/src/cfe_api.dox index 7a5113cb7..2a0278383 100644 --- a/docs/src/cfe_api.dox +++ b/docs/src/cfe_api.dox @@ -169,7 +169,6 @@
  • #CFE_SB_GetTotalMsgLength - \copybrief CFE_SB_GetTotalMsgLength
  • #CFE_SB_GetMsgTime - \copybrief CFE_SB_GetMsgTime
  • #CFE_SB_GetCmdCode - \copybrief CFE_SB_GetCmdCode -
  • #CFE_SB_GetLastSenderId - \copybrief CFE_SB_GetLastSenderId
  • #CFE_SB_MessageStringGet - \copybrief CFE_SB_MessageStringGet
  • \ref CFEAPISBChecksum diff --git a/fsw/cfe-core/src/inc/cfe_sb.h b/fsw/cfe-core/src/inc/cfe_sb.h index 7f92c3794..403cca07c 100644 --- a/fsw/cfe-core/src/inc/cfe_sb.h +++ b/fsw/cfe-core/src/inc/cfe_sb.h @@ -208,16 +208,6 @@ typedef struct { extern CFE_SB_Qos_t CFE_SB_Default_Qos;/**< \brief Defines a default priority and reliabilty for off-board routing */ -/** \brief Message Sender Identification Type Definition -** -** Parameter used in #CFE_SB_GetLastSenderId API which allows the receiver of a message -** to validate the sender of the message. -**/ -typedef struct { - uint32 ProcessorId;/**< \brief Processor Id from which the message was sent */ - char AppName[OS_MAX_API_NAME];/**< \brief Application that sent the message */ -} CFE_SB_SenderId_t; - /****************** Function Prototypes **********************/ /** @defgroup CFEAPISBPipe cFE Pipe Management APIs @@ -1173,37 +1163,6 @@ uint16 CFE_SB_GetCmdCode(CFE_SB_MsgPtr_t MsgPtr); **/ CFE_TIME_SysTime_t CFE_SB_GetMsgTime(CFE_SB_MsgPtr_t MsgPtr); -/*****************************************************************************/ -/** -** \brief Retrieve the application Info of the sender for the last message. -** -** \par Description -** This routine can be used after a successful #CFE_SB_RcvMsg call -** to find out which application sent the message that was received. -** -** \par Assumptions, External Events, and Notes: -** Note - If an error occurs in this API, the *Ptr value may be NULL or -** random. Therefore, it is recommended that the return code be tested -** for CFE_SUCCESS before reading the sender information. -** -** \param[in] Ptr A pointer to a local variable of type #CFE_SB_SenderId_t. -** Typically a caller declares a ptr of type CFE_SB_SenderId_t -** (i.e. CFE_SB_SenderId_t *Ptr) then gives the address of that -** pointer (&Ptr) for this parameter. After a successful call -** to this API, *Ptr will point to the first byte of the -** CFE_SB_SenderId_t structure containing the sender information -** for the last message received on the given pipe. This should -** be used as a read-only pointer (in systems with an MMU, writes -** to this pointer may cause a memory protection fault). The *Ptr -** is valid only until the next call to CFE_SB_RcvMsg for the -** same pipe. -** -** \param[in] PipeId The pipe ID of the pipe the message was taken from. -** -** \return The last sender's application ID -**/ -uint32 CFE_SB_GetLastSenderId(CFE_SB_SenderId_t **Ptr,CFE_SB_PipeId_t PipeId); - /******************************************************************************/ /** ** \brief Copies a string out of a software bus message diff --git a/fsw/cfe-core/src/sb/cfe_sb_api.c b/fsw/cfe-core/src/sb/cfe_sb_api.c index 7ae142532..b257475e6 100644 --- a/fsw/cfe-core/src/sb/cfe_sb_api.c +++ b/fsw/cfe-core/src/sb/cfe_sb_api.c @@ -1320,13 +1320,6 @@ int32 CFE_SB_SendMsgFull(CFE_SB_Msg_t *MsgPtr, RtgTblPtr->SeqCnt); }/* end if */ - /* store the sender information */ - if(CFE_SB.SenderReporting != 0) - { - BufDscPtr->Sender.ProcessorId = CFE_PSP_GetProcessorId(); - strncpy(&BufDscPtr->Sender.AppName[0],CFE_SB_GetAppTskName(TskId,FullName),OS_MAX_API_NAME); - } - /* At this point there must be at least one destination for pkt */ /* Send the packet to all destinations */ @@ -1620,72 +1613,6 @@ int32 CFE_SB_RcvMsg(CFE_SB_MsgPtr_t *BufPtr, }/* end CFE_SB_RcvMsg */ -/* - * Function: CFE_SB_GetLastSenderId - See API and header file for details - */ -uint32 CFE_SB_GetLastSenderId(CFE_SB_SenderId_t **Ptr,CFE_SB_PipeId_t PipeId) -{ - - CFE_SB_BufferD_t *Ptr2BufDescriptor; - uint32 TskId = 0; - uint32 AppId = 0xFFFFFFFF; - char FullName[(OS_MAX_API_NAME * 2)]; - - TskId = OS_TaskGetId(); - - /* validate ptr - note: must validate ptr before pipe id validation */ - /* because an invalid pipe id sets the callers pointer to NULL */ - if(Ptr == NULL){ - CFE_EVS_SendEventWithAppID(CFE_SB_LSTSNDER_ERR1_EID,CFE_EVS_EventType_ERROR,CFE_SB.AppId, - "SB GetLastSender Err:Rcvd Null Ptr,Pipe=%d,App=%s", - (int)PipeId,CFE_SB_GetAppTskName(TskId,FullName)); - return CFE_SB_BAD_ARGUMENT; - }/* end if */ - - /* validate pipe id */ - if(CFE_SB_ValidatePipeId(PipeId)!=CFE_SUCCESS){ - *Ptr = NULL; - CFE_EVS_SendEventWithAppID(CFE_SB_LSTSNDER_ERR2_EID,CFE_EVS_EventType_ERROR,CFE_SB.AppId, - "SB GetLastSender Err:Rcvd Invalid Pipe=%d,App=%s", - (int)PipeId,CFE_SB_GetAppTskName(TskId,FullName)); - return CFE_SB_BAD_ARGUMENT; - }/* end if */ - - CFE_ES_GetAppID(&AppId); - - CFE_SB_LockSharedData(__func__,__LINE__); - - /* verify requestor is owner of pipe */ - if(CFE_SB.PipeTbl[PipeId].AppId != AppId){ - *Ptr = NULL; - CFE_SB_UnlockSharedData(__func__,__LINE__); - CFE_EVS_SendEventWithAppID(CFE_SB_GLS_INV_CALLER_EID,CFE_EVS_EventType_ERROR,CFE_SB.AppId, - "SB GetLastSender Err:Caller(%s) is not the owner of pipe %d", - CFE_SB_GetAppTskName(TskId,FullName),(int)PipeId); - return CFE_SB_BAD_ARGUMENT; - }/* end if */ - - /* Get ptr to buffer descriptor for the last msg received on the given pipe */ - Ptr2BufDescriptor = CFE_SB.PipeTbl[PipeId].CurrentBuff; - - if ( Ptr2BufDescriptor == NULL ) - { - *Ptr = NULL; - CFE_SB.PipeTbl[PipeId].LastSender = CFE_SB_INVALID_MSG_ID; - CFE_SB_UnlockSharedData(__func__,__LINE__); - return CFE_SB_NO_MSG_RECV; - } - else - { - /* Set the receivers pointer to the adr of 'Sender' struct in buf descriptor */ - *Ptr = (CFE_SB_SenderId_t *) &Ptr2BufDescriptor -> Sender; - CFE_SB_UnlockSharedData(__func__,__LINE__); - return CFE_SUCCESS; - } - -}/* end CFE_SB_GetLastSenderId */ - - /* * Function: CFE_SB_ZeroCopyGetPtr - See API and header file for details */ diff --git a/fsw/cfe-core/src/sb/cfe_sb_priv.h b/fsw/cfe-core/src/sb/cfe_sb_priv.h index 3aca3f347..95c252979 100644 --- a/fsw/cfe-core/src/sb/cfe_sb_priv.h +++ b/fsw/cfe-core/src/sb/cfe_sb_priv.h @@ -172,7 +172,6 @@ typedef struct { uint16 UseCount; uint32 Size; void *Buffer; - CFE_SB_SenderId_t Sender; } CFE_SB_BufferD_t; diff --git a/fsw/cfe-core/unit-test/sb_UT.c b/fsw/cfe-core/unit-test/sb_UT.c index 2f2ffcf1a..16a4ed279 100644 --- a/fsw/cfe-core/unit-test/sb_UT.c +++ b/fsw/cfe-core/unit-test/sb_UT.c @@ -3332,11 +3332,6 @@ void Test_RcvMsg_API(void) SB_UT_ADD_SUBTEST(Test_RcvMsg_InvalidPipeId); SB_UT_ADD_SUBTEST(Test_RcvMsg_InvalidTimeout); SB_UT_ADD_SUBTEST(Test_RcvMsg_Poll); - SB_UT_ADD_SUBTEST(Test_RcvMsg_GetLastSenderNull); - SB_UT_ADD_SUBTEST(Test_RcvMsg_GetLastSenderInvalidPipe); - SB_UT_ADD_SUBTEST(Test_RcvMsg_GetLastSenderInvalidCaller); - SB_UT_ADD_SUBTEST(Test_RcvMsg_GetLastSenderNoValidSender); - SB_UT_ADD_SUBTEST(Test_RcvMsg_GetLastSenderSuccess); SB_UT_ADD_SUBTEST(Test_RcvMsg_Timeout); SB_UT_ADD_SUBTEST(Test_RcvMsg_PipeReadError); SB_UT_ADD_SUBTEST(Test_RcvMsg_PendForever); @@ -3405,117 +3400,6 @@ void Test_RcvMsg_Poll(void) } /* end Test_RcvMsg_Poll */ -/* -** Test receive last message response to a null sender ID -*/ -void Test_RcvMsg_GetLastSenderNull(void) -{ - CFE_SB_PipeId_t PipeId; - uint32 PipeDepth = 10; - - SETUP(CFE_SB_CreatePipe(&PipeId, PipeDepth, "RcvMsgTestPipe")); - - ASSERT_EQ(CFE_SB_GetLastSenderId(NULL, PipeId), CFE_SB_BAD_ARGUMENT); - - EVTCNT(2); - - EVTSENT(CFE_SB_LSTSNDER_ERR1_EID); - - TEARDOWN(CFE_SB_DeletePipe(PipeId)); - -} /* end Test_RcvMsg_GetLastSenderNull */ - -/* -** Test receive last message response to an invalid pipe ID -*/ -void Test_RcvMsg_GetLastSenderInvalidPipe(void) -{ - CFE_SB_PipeId_t PipeId; - CFE_SB_PipeId_t InvalidPipeId = 250; - CFE_SB_SenderId_t *GLSPtr; - uint32 PipeDepth = 10; - - SETUP(CFE_SB_CreatePipe(&PipeId, PipeDepth, "RcvMsgTestPipe")); - - ASSERT_EQ(CFE_SB_GetLastSenderId(&GLSPtr, InvalidPipeId), CFE_SB_BAD_ARGUMENT); - - EVTCNT(2); - - EVTSENT(CFE_SB_LSTSNDER_ERR2_EID); - - TEARDOWN(CFE_SB_DeletePipe(PipeId)); - -} /* end Test_RcvMsg_GetLastSenderInvalidPipe */ - -/* -** Test receive last message response to an invalid owner ID -*/ -void Test_RcvMsg_GetLastSenderInvalidCaller(void) -{ - CFE_SB_PipeId_t PipeId; - CFE_SB_SenderId_t *GLSPtr; - uint32 PipeDepth = 10; - uint32 OrigPipeOwner; - - SETUP(CFE_SB_CreatePipe(&PipeId, PipeDepth, "RcvMsgTestPipe")); - - /* Change pipe owner ID to execute 'invalid caller' code */ - OrigPipeOwner = CFE_SB.PipeTbl[PipeId].AppId; - CFE_SB.PipeTbl[PipeId].AppId = OrigPipeOwner + 1; - ASSERT_EQ(CFE_SB_GetLastSenderId(&GLSPtr, PipeId), CFE_SB_BAD_ARGUMENT); - - EVTCNT(2); - - EVTSENT(CFE_SB_GLS_INV_CALLER_EID); - - /* Restore original pipe owner apid */ - CFE_SB.PipeTbl[PipeId].AppId = OrigPipeOwner; - TEARDOWN(CFE_SB_DeletePipe(PipeId)); - -} /* end Test_RcvMsg_GetLastSenderInvalidCaller */ - - -void Test_RcvMsg_GetLastSenderNoValidSender(void) -{ - CFE_SB_PipeId_t PipeId; - CFE_SB_SenderId_t *GLSPtr; - uint32 PipeDepth = 10; - - SETUP(CFE_SB_CreatePipe(&PipeId, PipeDepth, "RcvMsgTestPipe")); - ASSERT_EQ(CFE_SB_GetLastSenderId(&GLSPtr, PipeId), CFE_SB_NO_MSG_RECV); - - EVTCNT(1); - - TEARDOWN(CFE_SB_DeletePipe(PipeId)); - -} /* end Test_RcvMsg_GetLastSenderNoValidSender */ - - -/* -** Test successful receive last message request -*/ -void Test_RcvMsg_GetLastSenderSuccess(void) -{ - CFE_SB_PipeId_t PipeId; - CFE_SB_SenderId_t *GLSPtr; - SB_UT_Test_Tlm_t TlmPkt; - CFE_SB_MsgPtr_t TlmPktPtr = (CFE_SB_MsgPtr_t) &TlmPkt; - CFE_SB_MsgPtr_t PtrToMsg; - uint32 PipeDepth = 10; - - SETUP(CFE_SB_CreatePipe(&PipeId, PipeDepth, "RcvMsgTestPipe")); - CFE_SB_InitMsg(&TlmPkt, SB_UT_TLM_MID, sizeof(TlmPkt), true); - SETUP(CFE_SB_Subscribe(SB_UT_TLM_MID, PipeId)); - SETUP(CFE_SB_SendMsg(TlmPktPtr)); - SETUP(CFE_SB_RcvMsg(&PtrToMsg, PipeId,CFE_SB_PEND_FOREVER)); - ASSERT(CFE_SB_GetLastSenderId(&GLSPtr, PipeId)); - - EVTCNT(3); - - TEARDOWN(CFE_SB_DeletePipe(PipeId)); - -} /* end Test_RcvMsg_GetLastSenderSuccess */ - /* ** Test receiving a message response to a timeout */ diff --git a/fsw/cfe-core/unit-test/sb_UT.h b/fsw/cfe-core/unit-test/sb_UT.h index 0ec5effef..b62fca00b 100644 --- a/fsw/cfe-core/unit-test/sb_UT.h +++ b/fsw/cfe-core/unit-test/sb_UT.h @@ -2825,10 +2825,7 @@ void Test_SendMsg_MaxMsgSizePlusOne_ZeroCopy(void); ** This function does not return a value. ** ** \sa #UT_Text, #Test_RcvMsg_InvalidPipeId, #Test_RcvMsg_InvalidTimeout, -** \sa #Test_RcvMsg_Poll, #Test_RcvMsg_GetLastSenderNull, -** \sa #Test_RcvMsg_GetLastSenderInvalidPipe, -** \sa #Test_RcvMsg_GetLastSenderInvalidCaller, -** \sa #Test_RcvMsg_GetLastSenderSuccess, #Test_RcvMsg_Timeout, +** \sa #Test_RcvMsg_Poll, #Test_RcvMsg_Timeout, ** \sa #Test_RcvMsg_PipeReadError, #Test_RcvMsg_PendForever ** ******************************************************************************/ @@ -2898,110 +2895,6 @@ void Test_RcvMsg_InvalidTimeout(void); ******************************************************************************/ void Test_RcvMsg_Poll(void); -/*****************************************************************************/ -/** -** \brief Test receive last message response to a null sender ID -** -** \par Description -** This function tests the receive last message response to a null -** sender ID. -** -** \par Assumptions, External Events, and Notes: -** None -** -** \returns -** This function does not return a value. -** -** \sa #UT_Text, #SB_ResetUnitTest, #CFE_SB_CreatePipe, -** \sa #CFE_SB_GetLastSenderId, #UT_GetNumEventsSent, #UT_EventIsInHistory, -** \sa #CFE_SB_DeletePipe, #UT_Report -** -******************************************************************************/ -void Test_RcvMsg_GetLastSenderNull(void); - -/*****************************************************************************/ -/** -** \brief Test receive last message response to an invalid pipe ID -** -** \par Description -** This function tests the receive last message response to an invalid -** pipe ID. -** -** \par Assumptions, External Events, and Notes: -** None -** -** \returns -** This function does not return a value. -** -** \sa #UT_Text, #SB_ResetUnitTest, #CFE_SB_CreatePipe, -** \sa #CFE_SB_GetLastSenderId, #UT_GetNumEventsSent, #UT_EventIsInHistory, -** \sa #CFE_SB_DeletePipe, #UT_Report -** -******************************************************************************/ -void Test_RcvMsg_GetLastSenderInvalidPipe(void); - -/*****************************************************************************/ -/** -** \brief Test receive last message response to an invalid owner ID -** -** \par Description -** This function tests the receive last message response to an invalid -** owner ID. -** -** \par Assumptions, External Events, and Notes: -** None -** -** \returns -** This function does not return a value. -** -** \sa #UT_Text, #SB_ResetUnitTest, #CFE_SB_CreatePipe, -** \sa #CFE_SB_GetLastSenderId, #UT_GetNumEventsSent, #UT_EventIsInHistory, -** \sa #CFE_SB_DeletePipe, #UT_Report -** -******************************************************************************/ -void Test_RcvMsg_GetLastSenderInvalidCaller(void); - -/*****************************************************************************/ -/** -** \brief Test receive last message response when there is no last sender -** -** \par Description -** This function tests the receive last message response when no last -** sender. -** -** \par Assumptions, External Events, and Notes: -** None -** -** \returns -** This function does not return a value. -** -** \sa #UT_Text, #SB_ResetUnitTest, #CFE_SB_CreatePipe, -** \sa #CFE_SB_GetLastSenderId, #UT_GetNumEventsSent, #UT_EventIsInHistory, -** \sa #CFE_SB_DeletePipe, #UT_Report -** -******************************************************************************/ -void Test_RcvMsg_GetLastSenderNoValidSender(void); - -/*****************************************************************************/ -/** -** \brief Test successful receive last message request -** -** \par Description -** This function tests the successful receive last message request. -** -** \par Assumptions, External Events, and Notes: -** None -** -** \returns -** This function does not return a value. -** -** \sa #UT_Text, #SB_ResetUnitTest, #CFE_SB_CreatePipe, -** \sa #CFE_SB_GetLastSenderId, #UT_GetNumEventsSent, #CFE_SB_DeletePipe, -** \sa #UT_Report -** -******************************************************************************/ -void Test_RcvMsg_GetLastSenderSuccess(void); - /*****************************************************************************/ /** ** \brief Test receiving a message response to a timeout From 1e2177a948969f742c6249032b9b9677bc0af9e2 Mon Sep 17 00:00:00 2001 From: Chris Knight Date: Tue, 30 Jun 2020 06:58:03 -0700 Subject: [PATCH 2/2] remove fn reqt --- docs/cFE_FunctionalRequirements.csv | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/cFE_FunctionalRequirements.csv b/docs/cFE_FunctionalRequirements.csv index dac2c9181..c6a47003f 100644 --- a/docs/cFE_FunctionalRequirements.csv +++ b/docs/cFE_FunctionalRequirements.csv @@ -399,7 +399,6 @@ SB: Receive Message No Timeout,cSB4306,"Upon receipt of a Request to receive a S SB: Receive Message With Timeout,cSB4307,"Upon receipt of a Request to receive a SB Message from a Pipe with a pending timeout, the cFE shall suspend execution of the Application until a SB Message is present on the Pipe or the timeout has expired.","A receive Request with a suspension timeout provides a blocking method of retrieving SB messages. This is useful for data driven Applications and has been used on all heritage missions with a SB. The timeout is useful for fault recovery for Applications that always expect data to arrive or to allow periodic processing for Applications that are not purely data driven. If a SB Message is queued on the Pipe then the SB Message will be provided to the Application and the Application’s execution will not be suspended. Tasks that process telemetry packets often receive many types of packets from different sources. There should be a mechanism that allows a task to wait for many different types of messages simultaneously. Heritage implementations of SB do this by directing the messages into one queue (or several queues, to implement priority levels). " SB: Receive Message Infinite Timeout,cSB4308,"Upon receipt of a Request to receive a SB Message from a Pipe with an infinite timeout, the cFE shall suspend execution of the Application until a SB Message is present on the Pipe.",This mode of receiving has been the most commonly used mode on the heritage SB. -SB: Last Message Sender Info,cSB4309,"Upon receipt of a Request, the cFE shall provide sender information for the last message received on an Application's Pipe.","Heritage SB did a 'valid senders check' before delivering a packet to a pipe. Since the cFE supports a dynamic environment and the sender of a packet is somewhat unknown, the cFE must provide a means for the application to do the 'valid sender check'." SB: Free App Resources,cSB4310,[DELETED]Upon receipt of Request the cFE shall free resources allocation for the specified Application.,"Need to be able to remove all resources associated with an application when Deleting, Restarting or Reloading an Application. In addition, this is required as part of a Processor Reset." SB: Get Message ID,cSB4311,"Upon receipt of a Request, the cFE shall provide the message ID of the requested message.",Message management utility. SB: Set Message ID,cSB4312,"Upon receipt of a Request, the cFE shall set the received message with the received message ID.",Message management utility.