diff --git a/source/FreeRTOS_DHCP.c b/source/FreeRTOS_DHCP.c index 4230a9459a..0312c2c25b 100644 --- a/source/FreeRTOS_DHCP.c +++ b/source/FreeRTOS_DHCP.c @@ -224,6 +224,13 @@ { FreeRTOS_printf( ( "vDHCPProcess: FreeRTOS_recvfrom returns %d\n", ( int ) lBytes ) ); } + else if( lBytes >= 0 ) + { + vReleaseSinglePacketFromUDPSocket( EP_DHCPData.xDHCPSocket ); + } + else + { + } break; } diff --git a/source/FreeRTOS_DHCPv6.c b/source/FreeRTOS_DHCPv6.c index 978fa395d3..925766afb4 100644 --- a/source/FreeRTOS_DHCPv6.c +++ b/source/FreeRTOS_DHCPv6.c @@ -436,6 +436,13 @@ void vDHCPv6Process( BaseType_t xReset, { FreeRTOS_printf( ( "vDHCPProcess: FreeRTOS_recvfrom returns %d\n", ( int ) lBytes ) ); } + else if( lBytes == 0 ) + { + vReleaseSinglePacketFromUDPSocket( EP_DHCPData.xDHCPSocket ); + } + else + { + } break; } @@ -450,6 +457,8 @@ void vDHCPv6Process( BaseType_t xReset, { xDoProcess = xDHCPv6Process_PassReplyToEndPoint( pxEndPoint ); } + + FreeRTOS_ReleaseUDPPayloadBuffer( pucUDPPayload ); } } diff --git a/source/FreeRTOS_IP_Utils.c b/source/FreeRTOS_IP_Utils.c index 07d1bc253e..25b67a61fb 100644 --- a/source/FreeRTOS_IP_Utils.c +++ b/source/FreeRTOS_IP_Utils.c @@ -1825,6 +1825,27 @@ uint32_t FreeRTOS_round_down( uint32_t a, } /*-----------------------------------------------------------*/ +/** + * @brief Release single UDP packet from a given socket + * @param[in] xSocket UDP Socket from which the packet should be released. + */ +void vReleaseSinglePacketFromUDPSocket( const ConstSocket_t xSocket ) +{ + uint8_t * pucUDPPayload = NULL; + int32_t lBytes; + + /* Passing the address of a pointer (pucUDPPayload) because FREERTOS_ZERO_COPY is used. */ + lBytes = FreeRTOS_recvfrom( xSocket, &pucUDPPayload, 0U, FREERTOS_ZERO_COPY, NULL, NULL ); + + ( void ) lBytes; + + if( pucUDPPayload != NULL ) + { + FreeRTOS_ReleaseUDPPayloadBuffer( pucUDPPayload ); + } +} +/*-----------------------------------------------------------*/ + /** * @brief Convert character array (of size 4) to equivalent 32-bit value. * @param[in] pucPtr The character array. diff --git a/source/include/FreeRTOS_IP_Utils.h b/source/include/FreeRTOS_IP_Utils.h index 6f8cd07b67..708d3e70de 100644 --- a/source/include/FreeRTOS_IP_Utils.h +++ b/source/include/FreeRTOS_IP_Utils.h @@ -109,6 +109,10 @@ void vPreCheckConfigs( void ); */ void prvProcessNetworkDownEvent( struct xNetworkInterface * pxInterface ); +/** + * @brief Release single UDP packet from a given socket + */ +void vReleaseSinglePacketFromUDPSocket( const ConstSocket_t xSocket ); /* *INDENT-OFF* */ #ifdef __cplusplus diff --git a/test/cbmc/proofs/DHCPv6/DHCPv6Process/DHCPv6Process_harness.c b/test/cbmc/proofs/DHCPv6/DHCPv6Process/DHCPv6Process_harness.c index 980c620853..1e988a2fd7 100644 --- a/test/cbmc/proofs/DHCPv6/DHCPv6Process/DHCPv6Process_harness.c +++ b/test/cbmc/proofs/DHCPv6/DHCPv6Process/DHCPv6Process_harness.c @@ -153,6 +153,16 @@ int32_t FreeRTOS_recvfrom( Socket_t xSocket, return retVal; } +/* For the purpose of this proof we stub the + * implementation of FreeRTOS_ReleaseUDPPayloadBuffer here, but make sure that + * the pvBuffer is not NULL, its not verified here if the pointer is a valid + * payload buffer as its proved in other proofs */ +void FreeRTOS_ReleaseUDPPayloadBuffer( void * pvBuffer ) +{ + __CPROVER_assert( pvBuffer != NULL, + "FreeRTOS precondition: pvBuffer != NULL" ); +} + void harness() { BaseType_t xReset; diff --git a/test/cbmc/proofs/DHCPv6/DHCPv6Process/Makefile.json b/test/cbmc/proofs/DHCPv6/DHCPv6Process/Makefile.json index 5a2d345cb4..af189b335a 100644 --- a/test/cbmc/proofs/DHCPv6/DHCPv6Process/Makefile.json +++ b/test/cbmc/proofs/DHCPv6/DHCPv6Process/Makefile.json @@ -5,6 +5,7 @@ "CBMCFLAGS": [ "--unwind {LOOP_UNWIND_COUNT}", + "--unwindset memcmp.0:17", "--nondet-static --flush" ], "OPT": diff --git a/test/unit-test/FreeRTOS_DHCP/FreeRTOS_DHCP_utest.c b/test/unit-test/FreeRTOS_DHCP/FreeRTOS_DHCP_utest.c index f3b8f80711..9d3a0673f0 100644 --- a/test/unit-test/FreeRTOS_DHCP/FreeRTOS_DHCP_utest.c +++ b/test/unit-test/FreeRTOS_DHCP/FreeRTOS_DHCP_utest.c @@ -16,6 +16,7 @@ #include "mock_NetworkBufferManagement.h" #include "mock_FreeRTOS_DHCP_mock.h" #include "mock_FreeRTOS_IP_Common.h" +#include "mock_FreeRTOS_IP_Utils.h" #include "FreeRTOS_DHCP.h" @@ -343,6 +344,7 @@ void test_vDHCPProcess_ResetAndIncorrectStateWithSocketAlreadyCreated( void ) FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 ); /* Ignore the buffer argument though. */ FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket ); /* Make random number generation pass. */ xApplicationGetRandomNumber_ExpectAndReturn( &( pxEndPoint->xDHCPData.ulTransactionId ), pdTRUE ); /* See if the timer is reloaded. */ @@ -365,6 +367,76 @@ void test_vDHCPProcess_ResetAndIncorrectStateWithSocketAlreadyCreated( void ) } } +/* Verify the control flow when FreeRTOS_recvfrom with DHCP socket returns timeout. */ +void test_vDHCPProcess_RecvFromReturnsTimeout( void ) +{ + struct xSOCKET xTestSocket; + NetworkEndPoint_t xEndPoint = { 0 }, * pxEndPoint = &xEndPoint; + + /* This should remain unchanged. */ + xDHCPv4Socket = &xTestSocket; + xDHCPSocketUserCount = 1; + pxEndPoint->xDHCPData.xDHCPSocket = &xTestSocket; + /* Put any state. */ + pxEndPoint->xDHCPData.eDHCPState = eSendDHCPRequest; + pxEndPoint->xDHCPData.eExpectedState = eSendDHCPRequest; + /* This should be reset to 0. */ + pxEndPoint->xDHCPData.xUseBroadcast = 1; + /* This should be reset as well */ + pxEndPoint->xDHCPData.ulOfferedIPAddress = 0xAAAAAAAA; + /* And this too. */ + pxEndPoint->xDHCPData.ulDHCPServerAddress = 0xABABABAB; + /* And this should be updated. */ + pxEndPoint->xDHCPData.xDHCPTxPeriod = 0; + + /* Expect these arguments. */ + FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, -pdFREERTOS_ERRNO_EAGAIN ); + /* Ignore the buffer argument though. */ + FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + + /* Make random number generation pass. */ + xApplicationGetRandomNumber_ExpectAndReturn( &( pxEndPoint->xDHCPData.ulTransactionId ), pdTRUE ); + /* See if the timer is reloaded. */ + vDHCP_RATimerReload_Expect( &xEndPoint, dhcpINITIAL_TIMER_PERIOD ); + + vDHCPProcess( pdTRUE, pxEndPoint ); +} + +/* Verify the control flow when FreeRTOS_recvfrom with DHCP socket returns IO error/any other error. */ +void test_vDHCPProcess_RecvFromReturnsIOError( void ) +{ + struct xSOCKET xTestSocket; + NetworkEndPoint_t xEndPoint = { 0 }, * pxEndPoint = &xEndPoint; + + /* This should remain unchanged. */ + xDHCPv4Socket = &xTestSocket; + xDHCPSocketUserCount = 1; + pxEndPoint->xDHCPData.xDHCPSocket = &xTestSocket; + /* Put any state. */ + pxEndPoint->xDHCPData.eDHCPState = eSendDHCPRequest; + pxEndPoint->xDHCPData.eExpectedState = eSendDHCPRequest; + /* This should be reset to 0. */ + pxEndPoint->xDHCPData.xUseBroadcast = 1; + /* This should be reset as well */ + pxEndPoint->xDHCPData.ulOfferedIPAddress = 0xAAAAAAAA; + /* And this too. */ + pxEndPoint->xDHCPData.ulDHCPServerAddress = 0xABABABAB; + /* And this should be updated. */ + pxEndPoint->xDHCPData.xDHCPTxPeriod = 0; + + /* Expect these arguments. */ + FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, -pdFREERTOS_ERRNO_EIO ); + /* Ignore the buffer argument though. */ + FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + + /* Make random number generation pass. */ + xApplicationGetRandomNumber_ExpectAndReturn( &( pxEndPoint->xDHCPData.ulTransactionId ), pdTRUE ); + /* See if the timer is reloaded. */ + vDHCP_RATimerReload_Expect( &xEndPoint, dhcpINITIAL_TIMER_PERIOD ); + + vDHCPProcess( pdTRUE, pxEndPoint ); +} + void test_vDHCPProcess_CorrectStateDHCPHookFailsDHCPSocketNULL( void ) { NetworkEndPoint_t xEndPoint = { 0 }, * pxEndPoint = &xEndPoint; @@ -422,6 +494,7 @@ void test_vDHCPProcess_CorrectStateDHCPHookFailsDHCPSocketNonNULL( void ) FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 ); /* Ignore the buffer argument though. */ FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket ); /* Make sure that the user indicates anything else than the desired options. */ eStubExpectedDHCPPhase = eDHCPPhasePreDiscover; pxStubExpectedEndPoint = pxEndPoint; @@ -469,6 +542,7 @@ void test_vDHCPProcess_CorrectStateDHCPHookDefaultReturn( void ) FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 ); /* Ignore the buffer argument though. */ FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket ); /* Make sure that the user indicates anything else than the desired options. */ eStubExpectedDHCPPhase = eDHCPPhasePreDiscover; pxStubExpectedEndPoint = pxEndPoint; @@ -513,6 +587,7 @@ void test_vDHCPProcess_CorrectStateDHCPHookContinueReturnDHCPSocketNotNULLButGNW FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 ); /* Ignore the buffer argument though. */ FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket ); /* Make sure that the user indicates anything else than the desired options. */ eStubExpectedDHCPPhase = eDHCPPhasePreDiscover; pxStubExpectedEndPoint = pxEndPoint; @@ -551,6 +626,7 @@ void test_vDHCPProcess_CorrectStateDHCPHookContinueReturnDHCPSocketNotNULLButHos FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 ); /* Ignore the buffer argument though. */ FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket ); /* Make sure that the user indicates anything else than the desired options. */ eStubExpectedDHCPPhase = eDHCPPhasePreDiscover; pxStubExpectedEndPoint = pxEndPoint; @@ -623,6 +699,7 @@ void test_vDHCPProcess_CorrectStateDHCPHookContinueReturnSendFailsNoBroadcast( v FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 ); /* Ignore the buffer argument though. */ FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket ); /* Make sure that the user indicates anything else than the desired options. */ eStubExpectedDHCPPhase = eDHCPPhasePreDiscover; pxStubExpectedEndPoint = pxEndPoint; @@ -671,6 +748,7 @@ void test_vDHCPProcess_CorrectStateDHCPHookContinueReturnSendFailsNoBroadcast_NU FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 ); /* Ignore the buffer argument though. */ FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket ); /* Make sure that the user indicates anything else than the desired options. */ eStubExpectedDHCPPhase = eDHCPPhasePreDiscover; pxStubExpectedEndPoint = pxEndPoint; @@ -720,6 +798,7 @@ void test_vDHCPProcess_CorrectStateDHCPHookContinueReturnSendFailsUseBroadCast( FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 ); /* Ignore the buffer argument though. */ FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket ); /* Make sure that the user indicates anything else than the desired options. */ eStubExpectedDHCPPhase = eDHCPPhasePreDiscover; pxStubExpectedEndPoint = pxEndPoint; @@ -770,6 +849,7 @@ void test_vDHCPProcess_CorrectStateDHCPHookContinueReturnSendSucceedsUseBroadCas FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 ); /* Ignore the buffer argument though. */ FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket ); /* Make sure that the user indicates anything else than the desired options. */ eStubExpectedDHCPPhase = eDHCPPhasePreDiscover; pxStubExpectedEndPoint = pxEndPoint; @@ -821,6 +901,7 @@ void test_vDHCPProcess_CorrectStateDHCPHookContinueReturnSendSucceedsUseBroadCas FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 ); /* Ignore the buffer argument though. */ FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket ); /* Make sure that the user indicates anything else than the desired options. */ eStubExpectedDHCPPhase = eDHCPPhasePreDiscover; pxStubExpectedEndPoint = pxEndPoint; @@ -868,6 +949,7 @@ void test_vDHCPProcess_eSendDHCPRequestCorrectStateGNWFails( void ) FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 ); /* Ignore the buffer argument though. */ FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket ); /* Get the hostname. */ pcApplicationHostnameHook_ExpectAndReturn( pcHostName ); /* Return NULL network buffer. */ @@ -900,6 +982,7 @@ void test_vDHCPProcess_eSendDHCPRequestCorrectStateGNWSucceedsSendFails( void ) FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 ); /* Ignore the buffer argument though. */ FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket ); /* Get the hostname. */ pcApplicationHostnameHook_ExpectAndReturn( pcHostName ); /* Returning a proper network buffer. */ @@ -938,6 +1021,7 @@ void test_vDHCPProcess_eSendDHCPRequestCorrectStateGNWSucceedsSendSucceeds( void FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 ); /* Ignore the buffer argument though. */ FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket ); /* Get the hostname. */ pcApplicationHostnameHook_ExpectAndReturn( pcHostName ); /* Returning a proper network buffer. */ @@ -980,6 +1064,7 @@ void test_vDHCPProcess_eWaitingOfferRecvfromFailsNoTimeout( void ) FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 ); /* Ignore the buffer argument though. */ FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket ); /* Make sure that there is no timeout. The expression is: xTaskGetTickCount() - pxEndPoint->xDHCPData.xDHCPTxTime ) > pxEndPoint->xDHCPData.xDHCPTxPeriod */ /* Return a value which makes the difference just equal to the period. */ @@ -1016,6 +1101,7 @@ void test_vDHCPProcess_eWaitingOfferRecvfromFailsTimeoutGiveUp( void ) /* prvClo FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 ); /* Ignore the buffer argument though. */ FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket ); /* Make sure that there is timeout. The expression is: xTaskGetTickCount() - pxEndPoint->xDHCPData.xDHCPTxTime ) > pxEndPoint->xDHCPData.xDHCPTxPeriod */ /* Return a value which makes the difference greater than the period. */ @@ -1068,6 +1154,7 @@ void test_vDHCPProcess_eWaitingOfferRecvfromFailsTimeoutDontGiveUpRNGFail( void FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 ); /* Ignore the buffer argument though. */ FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket ); /* Make sure that there is timeout. The expression is: xTaskGetTickCount() - pxEndPoint->xDHCPData.xDHCPTxTime ) > pxEndPoint->xDHCPData.xDHCPTxPeriod */ /* Return a value which makes the difference greater than the period. */ @@ -1111,6 +1198,7 @@ void test_vDHCPProcess_eWaitingOfferRecvfromFailsTimeoutDontGiveUpRNGPassUseBroa FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 ); /* Ignore the buffer argument though. */ FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket ); /* Make sure that there is timeout. The expression is: xTaskGetTickCount() - pxEndPoint->xDHCPData.xDHCPTxTime ) > pxEndPoint->xDHCPData.xDHCPTxPeriod */ /* Return a value which makes the difference greater than the period. */ @@ -1164,6 +1252,7 @@ void test_vDHCPProcess_eWaitingOfferRecvfromFailsTimeoutDontGiveUpRNGPassNoBroad FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 ); /* Ignore the buffer argument though. */ FreeRTOS_recvfrom_IgnoreArg_pvBuffer(); + vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket ); /* Make sure that there is timeout. The expression is: xTaskGetTickCount() - pxEndPoint->xDHCPData.xDHCPTxTime ) > pxEndPoint->xDHCPData.xDHCPTxPeriod */ /* Return a value which makes the difference greater than the period. */ @@ -1238,7 +1327,7 @@ void test_vDHCPProcess_eLeasedAddress_CorrectState_ValidBytesInMessage( void ) /** *@brief This test function ensures that when the DHCP states are mismatching after * initial parsing of response from DHCP server, if a new response from a different DHCP - * server will cause a infinite loop inside the vDHCPProcess. + * server will not cause a infinite loop inside the vDHCPProcess. */ void test_vDHCPProcess_eLeasedAddress_InCorrectState_Loop( void ) { @@ -1272,6 +1361,7 @@ void test_vDHCPProcess_eLeasedAddress_InCorrectState_Loop( void ) FreeRTOS_IsEndPointUp_IgnoreAndReturn( pdFALSE ); FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); + vReleaseSinglePacketFromUDPSocket_Ignore(); vDHCPProcess( pdFALSE, pxEndPoint ); diff --git a/test/unit-test/FreeRTOS_DHCP/ut.cmake b/test/unit-test/FreeRTOS_DHCP/ut.cmake index 1d08984f0a..6bfa552a5d 100644 --- a/test/unit-test/FreeRTOS_DHCP/ut.cmake +++ b/test/unit-test/FreeRTOS_DHCP/ut.cmake @@ -17,6 +17,7 @@ list(APPEND mock_list "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_Routing.h" "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_IP_Private.h" "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_IP_Common.h" + "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_IP_Utils.h" "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_IP_Timers.h" "${CMAKE_BINARY_DIR}/Annexed_TCP/NetworkBufferManagement.h" "${MODULE_ROOT_DIR}/test/unit-test/${project_name}/FreeRTOS_DHCP_mock.h" diff --git a/test/unit-test/FreeRTOS_DHCPv6/FreeRTOS_DHCPv6_utest.c b/test/unit-test/FreeRTOS_DHCPv6/FreeRTOS_DHCPv6_utest.c index aa44055356..5feb170b5c 100644 --- a/test/unit-test/FreeRTOS_DHCPv6/FreeRTOS_DHCPv6_utest.c +++ b/test/unit-test/FreeRTOS_DHCPv6/FreeRTOS_DHCPv6_utest.c @@ -43,6 +43,7 @@ #include "mock_FreeRTOS_BitConfig.h" #include "mock_FreeRTOS_Sockets.h" #include "mock_FreeRTOS_DHCP.h" +#include "mock_FreeRTOS_IP_Utils.h" /*#include "FreeRTOS_IP_stubs.c" */ #include "catch_assert.h" @@ -1521,6 +1522,7 @@ void test_vDHCPv6Process_SolicitationHappyPath() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); xApplicationGetRandomNumber_Stub( xStubxApplicationGetRandomNumber ); FreeRTOS_inet_pton6_IgnoreAndReturn( pdTRUE ); @@ -1562,6 +1564,7 @@ void test_vDHCPv6Process_SolicitationDifferentState() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); vDHCPv6Process( pdFALSE, &xEndPoint ); @@ -1598,7 +1601,9 @@ void test_vDHCPv6Process_AdvertiseHappyPath() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 144 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareAdvertise(); @@ -1646,7 +1651,9 @@ void test_vDHCPv6Process_AdvertiseIATA() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 93 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareAdvertiseIATA(); @@ -1694,6 +1701,7 @@ void test_vDHCPv6Process_ReplyHappyPath() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 102 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); xTaskGetTickCount_IgnoreAndReturn( 0 ); @@ -1702,6 +1710,8 @@ void test_vDHCPv6Process_ReplyHappyPath() vDHCP_RATimerReload_Expect( &xEndPoint, dhcpv6DEFAULT_LEASE_TIME ); vIPNetworkUpCalls_Expect( &xEndPoint ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); + vDHCPv6Process( pdFALSE, &xEndPoint ); /* Check if the IP address provided in reply is set to endpoint properly. */ @@ -1747,6 +1757,7 @@ void test_vDHCPv6Process_DHCPLeaseTimeout() memcpy( xDHCPMessage.xServerID.pucID, ucTestDHCPv6OptionServerID, sizeof( ucTestDHCPv6OptionServerID ) ); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); xApplicationGetRandomNumber_Stub( xStubxApplicationGetRandomNumber ); FreeRTOS_inet_pton6_IgnoreAndReturn( pdTRUE ); @@ -1838,6 +1849,7 @@ void test_vDHCPv6Process_WaitReplyTimeout() memcpy( xDHCPMessage.xServerID.pucID, ucTestDHCPv6OptionServerID, sizeof( ucTestDHCPv6OptionServerID ) ); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Ignore(); /* 1st timeout at 5001ms. */ xTaskGetTickCount_IgnoreAndReturn( pdMS_TO_TICKS( 5001 ) ); /* Update tx time to 5001ms. And the tx period is updated to 10000ms. */ @@ -1904,7 +1916,9 @@ void test_vDHCPv6Process_prvDHCPv6Analyse_UnknownMsgType() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 144 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareUnknownMsgType(); @@ -1944,7 +1958,9 @@ void test_vDHCPv6Process_prvDHCPv6Analyse_WrongTransactionID() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 144 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareWrongTransactionID(); @@ -1984,7 +2000,9 @@ void test_vDHCPv6Process_prvDHCPv6Analyse_ReadTransactionIDError() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 144 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareErrorTransactionID(); @@ -2024,7 +2042,9 @@ void test_vDHCPv6Process_prvDHCPv6Analyse_ReadOptionError() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 144 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareErrorOption(); @@ -2064,7 +2084,9 @@ void test_vDHCPv6Process_prvDHCPv6Analyse_LackServerID() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 126 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareAdvertiseNoServerID(); @@ -2104,7 +2126,9 @@ void test_vDHCPv6Process_prvDHCPv6Analyse_ExtraOptionValue32() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 150 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareAdvertiseExtraOptionValue32(); @@ -2152,7 +2176,9 @@ void test_vDHCPv6Process_prvDHCPv6Analyse_BitConfigInitError() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 126 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); xBitConfig_init_IgnoreAndReturn( pdFAIL ); @@ -2191,7 +2217,9 @@ void test_vDHCPv6Process_prvIsOptionLengthValid_OptionLessThanMinLength() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 500 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareAdvertiseStatusCodeLengthTooSmall(); @@ -2231,7 +2259,9 @@ void test_vDHCPv6Process_prvIsOptionLengthValid_OptionLargerThanMaxLength() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 500 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareAdvertiseStatusCodeLengthTooBig(); @@ -2271,7 +2301,9 @@ void test_vDHCPv6Process_prvDHCPv6_handleStatusCode_MessageTooLong() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 71 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareAdvertiseStatusCodeLongMessage(); @@ -2309,7 +2341,9 @@ void test_vDHCPv6Process_xDHCPv6Process_PassReplyToEndPoint_EmptyEndpointList() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 144 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareAdvertise(); @@ -2397,7 +2431,9 @@ void test_vDHCPv6Process_xDHCPv6Process_PassReplyToEndPoint_MultipleEndpoints() memcpy( xDHCPMessage.xServerID.pucID, ucTestDHCPv6OptionServerID, sizeof( ucTestDHCPv6OptionServerID ) ); FreeRTOS_recvfrom_IgnoreAndReturn( 144 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareAdvertise(); @@ -2446,9 +2482,10 @@ void test_vDHCPv6Process_xDHCPv6Process_PassReplyToEndPoint_DifferentServerDUIDT memcpy( xDHCPMessage.xServerID.pucID, ucTestDHCPv6OptionServerID, sizeof( ucTestDHCPv6OptionServerID ) ); FreeRTOS_recvfrom_IgnoreAndReturn( 102 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); - prvPrepareReplyDifferentServerDUIDType(); vDHCPv6Process( pdFALSE, &xEndPoint ); @@ -2489,7 +2526,9 @@ void test_vDHCPv6Process_xDHCPv6Process_PassReplyToEndPoint_DifferentServerLengt memcpy( xDHCPMessage.xServerID.pucID, ucTestDHCPv6OptionServerID, sizeof( ucTestDHCPv6OptionServerID ) ); FreeRTOS_recvfrom_IgnoreAndReturn( 100 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareReplyDifferentServerLength(); @@ -2532,7 +2571,9 @@ void test_vDHCPv6Process_xDHCPv6Process_PassReplyToEndPoint_DifferentServerLengt memcpy( xDHCPMessage.xServerID.pucID, ucTestDHCPv6OptionServerID, sizeof( ucTestDHCPv6OptionServerID ) ); FreeRTOS_recvfrom_IgnoreAndReturn( 100 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareReplyDifferentServerLength(); @@ -2576,7 +2617,9 @@ void test_vDHCPv6Process_xDHCPv6Process_PassReplyToEndPoint_DifferentServerDUID( memcpy( xDHCPMessage.xServerID.pucID, ucTestDHCPv6OptionServerID, sizeof( ucTestDHCPv6OptionServerID ) ); FreeRTOS_recvfrom_IgnoreAndReturn( 102 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareReplyDifferentServerDUID(); @@ -2630,6 +2673,7 @@ void test_vDHCPv6Process_xDHCPv6Process_PassReplyToEndPoint_DifferentEndpoint() memcpy( xDHCPMessage.xServerID.pucID, ucTestDHCPv6OptionServerID, sizeof( ucTestDHCPv6OptionServerID ) ); FreeRTOS_recvfrom_IgnoreAndReturn( 102 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); xTaskGetTickCount_IgnoreAndReturn( 0 ); @@ -2638,6 +2682,7 @@ void test_vDHCPv6Process_xDHCPv6Process_PassReplyToEndPoint_DifferentEndpoint() /* These are happened on different endpoint */ vDHCP_RATimerReload_Expect( &xEndPoint, dhcpv6DEFAULT_LEASE_TIME ); vIPNetworkUpCalls_Expect( &xEndPoint ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); vDHCPv6Process( pdFALSE, &xDifferentEndPoint ); @@ -2779,6 +2824,7 @@ void test_vDHCPv6Process_vDHCPv6ProcessEndPoint_HandleReply_WithDNS() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 122 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); xTaskGetTickCount_IgnoreAndReturn( 0 ); @@ -2786,6 +2832,7 @@ void test_vDHCPv6Process_vDHCPv6ProcessEndPoint_HandleReply_WithDNS() vDHCP_RATimerReload_Expect( &xEndPoint, dhcpv6DEFAULT_LEASE_TIME ); vIPNetworkUpCalls_Expect( &xEndPoint ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); vDHCPv6Process( pdFALSE, &xEndPoint ); @@ -2823,6 +2870,7 @@ void test_vDHCPv6Process_vDHCPv6ProcessEndPoint_HandleReply_ManyDNS() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 154 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); xTaskGetTickCount_IgnoreAndReturn( 0 ); @@ -2830,6 +2878,7 @@ void test_vDHCPv6Process_vDHCPv6ProcessEndPoint_HandleReply_ManyDNS() vDHCP_RATimerReload_Expect( &xEndPoint, dhcpv6DEFAULT_LEASE_TIME ); vIPNetworkUpCalls_Expect( &xEndPoint ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); vDHCPv6Process( pdFALSE, &xEndPoint ); @@ -2868,6 +2917,7 @@ void test_vDHCPv6Process_vDHCPv6ProcessEndPoint_HandleReply_ShortLeaseTime() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 102 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); xTaskGetTickCount_IgnoreAndReturn( 0 ); @@ -2875,6 +2925,7 @@ void test_vDHCPv6Process_vDHCPv6ProcessEndPoint_HandleReply_ShortLeaseTime() vDHCP_RATimerReload_Expect( &xEndPoint, dhcpv6MINIMUM_LEASE_TIME ); vIPNetworkUpCalls_Expect( &xEndPoint ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); vDHCPv6Process( pdFALSE, &xEndPoint ); @@ -2913,6 +2964,7 @@ void test_vDHCPv6Process_vDHCPv6ProcessEndPoint_HandleReply_CustomLeaseTime() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 102 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); xTaskGetTickCount_IgnoreAndReturn( 0 ); @@ -2920,7 +2972,7 @@ void test_vDHCPv6Process_vDHCPv6ProcessEndPoint_HandleReply_CustomLeaseTime() vDHCP_RATimerReload_Expect( &xEndPoint, dhcpv6MINIMUM_LEASE_TIME + 1 ); vIPNetworkUpCalls_Expect( &xEndPoint ); - + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); vDHCPv6Process( pdFALSE, &xEndPoint ); /* Check if the IP address provided in reply is set to endpoint properly. */ @@ -2957,11 +3009,12 @@ void test_vDHCPv6Process_xDHCPv6ProcessEndPoint_HandleAdvertise_HookFailure() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 144 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); vAddStubsOperation( eTestStubsHookFail ); vIPSetDHCP_RATimerEnableState_Expect( &xEndPoint, pdFALSE ); vIPNetworkUpCalls_Expect( &xEndPoint ); - + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); prvPrepareAdvertise(); vDHCPv6Process( pdFALSE, &xEndPoint ); @@ -2999,11 +3052,12 @@ void test_vDHCPv6Process_xDHCPv6ProcessEndPoint_HandleAdvertise_HookDefault() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 144 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); vAddStubsOperation( eTestStubsHookUseDefault ); vIPSetDHCP_RATimerEnableState_Expect( &xEndPoint, pdFALSE ); vIPNetworkUpCalls_Expect( &xEndPoint ); - + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); prvPrepareAdvertise(); vDHCPv6Process( pdFALSE, &xEndPoint ); @@ -3040,7 +3094,7 @@ void test_vDHCPv6Process_xDHCPv6ProcessEndPoint_HandleState_NullMessage() xEndPoint.pxDHCPMessage = NULL; FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); - + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); catch_assert( vDHCPv6Process( pdFALSE, &xEndPoint ) ); TEST_ASSERT_EQUAL( eWaitingOffer, xEndPoint.xDHCPData.eDHCPState ); @@ -3073,6 +3127,7 @@ void test_vDHCPv6Process_xDHCPv6ProcessEndPoint_HandleState_HookFailure() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); vAddStubsOperation( eTestStubsHookFail ); vIPSetDHCP_RATimerEnableState_Expect( &xEndPoint, pdFALSE ); vIPNetworkUpCalls_Expect( &xEndPoint ); @@ -3153,6 +3208,7 @@ void test_vDHCPv6Process_WaitAdvertiseTimeout() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Ignore(); /* 1st timeout at 5001ms. */ xTaskGetTickCount_IgnoreAndReturn( pdMS_TO_TICKS( 5001 ) ); /* Update tx time to 5001ms. And the tx period is updated to 10000ms. */ @@ -3218,6 +3274,7 @@ void test_vDHCPv6Process_xDHCPv6ProcessEndPoint_HandleState_NotUsingLeasedAddres xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Ignore(); vIPSetDHCP_RATimerEnableState_Expect( &xEndPoint, pdFALSE ); vDHCPv6Process( pdFALSE, &xEndPoint ); @@ -3252,6 +3309,7 @@ void test_vDHCPv6Process_xDHCPv6ProcessEndPoint_HandleState_UnknownState() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Ignore(); vDHCPv6Process( pdFALSE, &xEndPoint ); @@ -3323,6 +3381,7 @@ void test_vDHCPv6Process_prvCloseDHCPv6Socket_MultipleEndpointsCloseSockets() /* Process 1st endpoint again but got failure at DHCP hook callback. */ xEndPoint[ 0 ].xDHCPData.eExpectedState = eWaitingSendFirstDiscover; FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Ignore(); vAddStubsOperation( eTestStubsHookFail ); vIPSetDHCP_RATimerEnableState_Expect( &xEndPoint[ 0 ], pdFALSE ); vIPNetworkUpCalls_Expect( &xEndPoint[ 0 ] ); @@ -3332,6 +3391,7 @@ void test_vDHCPv6Process_prvCloseDHCPv6Socket_MultipleEndpointsCloseSockets() /* Process 2nd endpoint again but got failure at DHCP hook callback. Trigger socket close flow */ xEndPoint[ 1 ].xDHCPData.eExpectedState = eWaitingSendFirstDiscover; FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Ignore(); vAddStubsOperation( eTestStubsHookFail ); vIPSetDHCP_RATimerEnableState_Expect( &xEndPoint[ 1 ], pdFALSE ); vSocketClose_ExpectAndReturn( &xLocalDHCPv6Socket[ 0 ], NULL ); @@ -3473,6 +3533,7 @@ void test_vDHCPv6Process_prvSendDHCPMessage_RandomFail() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Ignore(); xTaskGetTickCount_IgnoreAndReturn( 0 ); xApplicationGetRandomNumber_IgnoreAndReturn( pdFAIL ); @@ -3503,6 +3564,7 @@ void test_vDHCPv6Process_prvSendDHCPMessage_NullSocket() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Ignore(); xTaskGetTickCount_IgnoreAndReturn( 1 ); xTaskGetTickCount_IgnoreAndReturn( 1 ); xApplicationGetRandomNumber_IgnoreAndReturn( pdPASS ); @@ -3536,6 +3598,7 @@ void test_vDHCPv6Process_prvSendDHCPMessage_BitConfigInitFail() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Ignore(); xTaskGetTickCount_IgnoreAndReturn( 1 ); xTaskGetTickCount_IgnoreAndReturn( 1 ); xApplicationGetRandomNumber_IgnoreAndReturn( pdPASS ); @@ -3605,11 +3668,12 @@ void test_vDHCPv6Process_ReplyInvalidLengthIANA() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 102 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareReplyInvalidIA_NA(); - + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); vDHCPv6Process( pdFALSE, &xEndPoint ); TEST_ASSERT_EQUAL( eWaitingAcknowledge, xEndPoint.xDHCPData.eDHCPState ); @@ -3645,11 +3709,12 @@ void test_vDHCPv6Process_ReplyInvalidLengthIAPD() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 102 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareReplyInvalidIA_PD(); - + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); vDHCPv6Process( pdFALSE, &xEndPoint ); TEST_ASSERT_EQUAL( eWaitingAcknowledge, xEndPoint.xDHCPData.eDHCPState ); @@ -3685,11 +3750,12 @@ void test_vDHCPv6Process_ReplyInvalidSubOptionIANA() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 256 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareReplyInvalidIA_NASubOption(); - + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); vDHCPv6Process( pdFALSE, &xEndPoint ); TEST_ASSERT_EQUAL( eWaitingAcknowledge, xEndPoint.xDHCPData.eDHCPState ); @@ -3725,11 +3791,12 @@ void test_vDHCPv6Process_prvDHCPv6_handleOption_ClientLengthTooSmall() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 256 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareReplyClientIDTooSmall(); - + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); vDHCPv6Process( pdFALSE, &xEndPoint ); TEST_ASSERT_EQUAL( eWaitingAcknowledge, xEndPoint.xDHCPData.eDHCPState ); @@ -3765,11 +3832,12 @@ void test_vDHCPv6Process_prvDHCPv6_handleOption_ClientLengthTooBig() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 512 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareReplyClientIDTooBig(); - + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); vDHCPv6Process( pdFALSE, &xEndPoint ); TEST_ASSERT_EQUAL( eWaitingAcknowledge, xEndPoint.xDHCPData.eDHCPState ); @@ -3805,21 +3873,27 @@ void test_vDHCPv6Process_prvDHCPv6_handleOption_WrongClientID() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 512 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareReplyClientIDLengthWrong(); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); vDHCPv6Process( pdFALSE, &xEndPoint ); FreeRTOS_recvfrom_IgnoreAndReturn( 512 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareReplyClientIDPeekFalse(); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); vDHCPv6Process( pdFALSE, &xEndPoint ); FreeRTOS_recvfrom_IgnoreAndReturn( 512 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareReplyClientIDContentWrong(); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); vDHCPv6Process( pdFALSE, &xEndPoint ); TEST_ASSERT_EQUAL( eWaitingAcknowledge, xEndPoint.xDHCPData.eDHCPState ); @@ -3855,7 +3929,9 @@ void test_vDHCPv6Process_prvDHCPv6_handleOption_ServerLengthTooSmall() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 256 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareReplyServerIDTooSmall(); @@ -3895,7 +3971,9 @@ void test_vDHCPv6Process_prvDHCPv6_handleOption_ServerLengthTooBig() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 512 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareReplyServerIDTooBig(); @@ -3935,19 +4013,22 @@ void test_vDHCPv6Process_prvDHCPv6_handleOption_InvalidDNSLength() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 512 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); + xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareReplyDNSLengthZero(); - + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); vDHCPv6Process( pdFALSE, &xEndPoint ); FreeRTOS_recvfrom_IgnoreAndReturn( 512 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); xTaskGetTickCount_IgnoreAndReturn( 0 ); prvPrepareReplyDNSLengthNotAllow(); - + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); vDHCPv6Process( pdFALSE, &xEndPoint ); TEST_ASSERT_EQUAL( eWaitingAcknowledge, xEndPoint.xDHCPData.eDHCPState ); @@ -3983,6 +4064,7 @@ void test_vDHCPv6Process_prvDHCPv6_handleOption_DomainSearchList() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 108 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); xTaskGetTickCount_IgnoreAndReturn( 0 ); @@ -3990,7 +4072,7 @@ void test_vDHCPv6Process_prvDHCPv6_handleOption_DomainSearchList() vDHCP_RATimerReload_Expect( &xEndPoint, dhcpv6DEFAULT_LEASE_TIME ); vIPNetworkUpCalls_Expect( &xEndPoint ); - + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); vDHCPv6Process( pdFALSE, &xEndPoint ); /* Check if the IP address provided in reply is set to endpoint properly. */ @@ -4058,6 +4140,7 @@ void test_vDHCPv6Process_AdvertiseStatusFail() xEndPoint.pxDHCPMessage = &xDHCPMessage; FreeRTOS_recvfrom_IgnoreAndReturn( 123 ); + FreeRTOS_ReleaseUDPPayloadBuffer_Ignore(); FreeRTOS_recvfrom_IgnoreAndReturn( 0 ); xTaskGetTickCount_IgnoreAndReturn( 0 ); @@ -4066,7 +4149,7 @@ void test_vDHCPv6Process_AdvertiseStatusFail() xApplicationGetRandomNumber_Stub( xStubxApplicationGetRandomNumber ); FreeRTOS_inet_pton6_IgnoreAndReturn( pdTRUE ); FreeRTOS_sendto_IgnoreAndReturn( 0 ); - + vReleaseSinglePacketFromUDPSocket_Expect( &xLocalDHCPv6Socket ); vDHCPv6Process( pdFALSE, &xEndPoint ); /* The endpoint receives the DHCPv6 Advertise message from DHCPv6 server. diff --git a/test/unit-test/FreeRTOS_DHCPv6/ut.cmake b/test/unit-test/FreeRTOS_DHCPv6/ut.cmake index 3fd0c74dbd..d870cfd53f 100644 --- a/test/unit-test/FreeRTOS_DHCPv6/ut.cmake +++ b/test/unit-test/FreeRTOS_DHCPv6/ut.cmake @@ -22,6 +22,7 @@ list(APPEND mock_list "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_IP_Timers.h" "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_IP_Private.h" "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_Routing.h" + "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_IP_Utils.h" "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_Sockets.h" "${CMAKE_BINARY_DIR}/Annexed_TCP/NetworkBufferManagement.h" ) diff --git a/test/unit-test/FreeRTOS_IP_Utils/FreeRTOS_IP_Utils_stubs.c b/test/unit-test/FreeRTOS_IP_Utils/FreeRTOS_IP_Utils_stubs.c index 36bc696f2b..9bbcb5ac45 100644 --- a/test/unit-test/FreeRTOS_IP_Utils/FreeRTOS_IP_Utils_stubs.c +++ b/test/unit-test/FreeRTOS_IP_Utils/FreeRTOS_IP_Utils_stubs.c @@ -42,6 +42,9 @@ /* =========================== EXTERN VARIABLES =========================== */ +#define RELEASE_UDP_SOCKET_NETWORK_BUFFER_ADDRESS ( ( uint8_t * ) 0xABCD1234 ) +#define RELEASE_UDP_SOCKET_NETWORK_BUFFER_SIZE 256 + NetworkInterface_t xInterfaces[ 1 ]; BaseType_t xCallEventHook; @@ -145,3 +148,43 @@ BaseType_t prvChecksumIPv4Checks_InvalidLength( uint8_t * pucEthernetBuffer, return xReturn; } + +static int32_t FreeRTOS_recvfrom_StubHappyPath( const ConstSocket_t xSocket, + void * pvBuffer, + size_t uxBufferLength, + BaseType_t xFlags, + struct freertos_sockaddr * pxSourceAddress, + socklen_t * pxSourceAddressLength, + int callbacks ) +{ + configASSERT( uxBufferLength == 0 ); + configASSERT( xFlags == FREERTOS_ZERO_COPY ); + configASSERT( pxSourceAddress == NULL ); + configASSERT( pxSourceAddressLength == NULL ); + + ( void ) callbacks; + + *( ( uint8_t ** ) pvBuffer ) = RELEASE_UDP_SOCKET_NETWORK_BUFFER_ADDRESS; + + return RELEASE_UDP_SOCKET_NETWORK_BUFFER_SIZE; +} + +static int32_t FreeRTOS_recvfrom_StubNonHappyPath( const ConstSocket_t xSocket, + void * pvBuffer, + size_t uxBufferLength, + BaseType_t xFlags, + struct freertos_sockaddr * pxSourceAddress, + socklen_t * pxSourceAddressLength, + int callbacks ) +{ + configASSERT( uxBufferLength == 0 ); + configASSERT( xFlags == FREERTOS_ZERO_COPY ); + configASSERT( pxSourceAddress == NULL ); + configASSERT( pxSourceAddressLength == NULL ); + + ( void ) callbacks; + + *( ( uint8_t ** ) pvBuffer ) = NULL; + + return -pdFREERTOS_ERRNO_EAGAIN; +} diff --git a/test/unit-test/FreeRTOS_IP_Utils/FreeRTOS_IP_Utils_utest.c b/test/unit-test/FreeRTOS_IP_Utils/FreeRTOS_IP_Utils_utest.c index 22b4b97fc4..99559b952b 100644 --- a/test/unit-test/FreeRTOS_IP_Utils/FreeRTOS_IP_Utils_utest.c +++ b/test/unit-test/FreeRTOS_IP_Utils/FreeRTOS_IP_Utils_utest.c @@ -51,6 +51,7 @@ #include "mock_FreeRTOS_DHCP.h" #include "mock_FreeRTOS_DHCPv6.h" #include "mock_FreeRTOS_Routing.h" +#include "mock_FreeRTOS_Sockets.h" #include "mock_FreeRTOS_IPv4_Utils.h" #include "mock_FreeRTOS_IPv6_Utils.h" #include "mock_NetworkBufferManagement.h" @@ -3332,3 +3333,35 @@ void test_eGetDHCPState( void ) TEST_ASSERT_EQUAL( i, eReturn ); } } + +/** + * @brief Test vReleaseSinglePacketFromUDPSocket + * To validate if vReleaseSinglePacketFromUDPSocket + * releases the buffer in happy path case. + */ +void test_vReleaseSinglePacketFromUDPSocket_HappyPath( void ) +{ + Socket_t xSocket; + + /* Get a stub. */ + FreeRTOS_recvfrom_Stub( FreeRTOS_recvfrom_StubHappyPath ); + + FreeRTOS_ReleaseUDPPayloadBuffer_Expect( RELEASE_UDP_SOCKET_NETWORK_BUFFER_ADDRESS ); + + vReleaseSinglePacketFromUDPSocket( xSocket ); +} + +/** + * @brief Test vReleaseSinglePacketFromUDPSocket + * To validate if vReleaseSinglePacketFromUDPSocket does not try to + * release the buffer if receive from fails. + */ +void test_vReleaseSinglePacketFromUDPSocket_NonHappyPath( void ) +{ + Socket_t xSocket; + + /* Get a stub. */ + FreeRTOS_recvfrom_Stub( FreeRTOS_recvfrom_StubNonHappyPath ); + + vReleaseSinglePacketFromUDPSocket( xSocket ); +} diff --git a/test/unit-test/FreeRTOS_IP_Utils/ut.cmake b/test/unit-test/FreeRTOS_IP_Utils/ut.cmake index 70d93eed9f..57f5072535 100644 --- a/test/unit-test/FreeRTOS_IP_Utils/ut.cmake +++ b/test/unit-test/FreeRTOS_IP_Utils/ut.cmake @@ -21,6 +21,7 @@ list(APPEND mock_list "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_ND.h" "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_DHCP.h" "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_DHCPv6.h" + "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_Sockets.h" "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_Routing.h" "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_IPv4_Utils.h" "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_IPv6_Utils.h" diff --git a/test/unit-test/FreeRTOS_IP_Utils_DiffConfig/FreeRTOS_IP_Utils_DiffConfig_utest.c b/test/unit-test/FreeRTOS_IP_Utils_DiffConfig/FreeRTOS_IP_Utils_DiffConfig_utest.c index 8d2ff7080e..b121d043af 100644 --- a/test/unit-test/FreeRTOS_IP_Utils_DiffConfig/FreeRTOS_IP_Utils_DiffConfig_utest.c +++ b/test/unit-test/FreeRTOS_IP_Utils_DiffConfig/FreeRTOS_IP_Utils_DiffConfig_utest.c @@ -50,6 +50,7 @@ #include "mock_FreeRTOS_IP_Timers.h" #include "mock_FreeRTOS_ARP.h" #include "mock_FreeRTOS_DHCP.h" +#include "mock_FreeRTOS_Sockets.h" #include "mock_FreeRTOS_Routing.h" #include "mock_NetworkBufferManagement.h" #include "mock_FreeRTOS_IPv4_Utils.h" diff --git a/test/unit-test/FreeRTOS_IP_Utils_DiffConfig/ut.cmake b/test/unit-test/FreeRTOS_IP_Utils_DiffConfig/ut.cmake index 790d608110..c4f023bded 100644 --- a/test/unit-test/FreeRTOS_IP_Utils_DiffConfig/ut.cmake +++ b/test/unit-test/FreeRTOS_IP_Utils_DiffConfig/ut.cmake @@ -20,6 +20,7 @@ list(APPEND mock_list "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_IPv4_Utils.h" "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_ARP.h" "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_DHCP.h" + "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_Sockets.h" "${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_Routing.h" "${CMAKE_BINARY_DIR}/Annexed_TCP/NetworkBufferManagement.h" "${CMAKE_BINARY_DIR}/Annexed_TCP/NetworkInterface.h"