From a194165ce9495814f8ed23f1c75872d5e2b7977a Mon Sep 17 00:00:00 2001 From: Hein Tibosch Date: Fri, 10 Jun 2022 10:46:57 +0800 Subject: [PATCH 1/7] Let the TCP timer becomes expired in stead of active --- source/FreeRTOS_IP.c | 4 ++-- source/FreeRTOS_IP_Timers.c | 7 ++++--- source/include/FreeRTOS_IP_Timers.h | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/source/FreeRTOS_IP.c b/source/FreeRTOS_IP.c index fe5ddbf745..1e128ff6c0 100644 --- a/source/FreeRTOS_IP.c +++ b/source/FreeRTOS_IP.c @@ -429,7 +429,7 @@ static void prvProcessIPEventsAndTimers( void ) /* Simply mark the TCP timer as expired so it gets processed * the next time prvCheckNetworkTimers() is called. */ - vIPSetTCPTimerEnableState( pdTRUE ); + vIPSetTCPTimerExpiredState( pdTRUE ); #endif /* ipconfigUSE_TCP */ break; @@ -1100,7 +1100,7 @@ BaseType_t xSendEventStructToIPTask( const IPStackEvent_t * pxEvent, /* TCP timer events are sent to wake the timer task when * xTCPTimer has expired, but there is no point sending them if the * IP task is already awake processing other message. */ - vIPSetTCPTimerEnableState( pdTRUE ); + vIPSetTCPTimerExpiredState( pdTRUE ); if( uxQueueMessagesWaiting( xNetworkEventQueue ) != 0U ) { diff --git a/source/FreeRTOS_IP_Timers.c b/source/FreeRTOS_IP_Timers.c index b660bfa29e..815a8c31e3 100644 --- a/source/FreeRTOS_IP_Timers.c +++ b/source/FreeRTOS_IP_Timers.c @@ -394,15 +394,16 @@ static BaseType_t prvIPTimerCheck( IPTimer_t * pxTimer ) * * @param[in] xEnableState: pdTRUE - enable timer; pdFALSE - disable timer. */ - void vIPSetTCPTimerEnableState( BaseType_t xEnableState ) + void vIPSetTCPTimerExpiredState( BaseType_t xEnableState ) { + xTCPTimer.bActive = pdTRUE_UNSIGNED; if( xEnableState != pdFALSE ) { - xTCPTimer.bActive = pdTRUE_UNSIGNED; + xTCPTimer.bExpired = pdTRUE_UNSIGNED; } else { - xTCPTimer.bActive = pdFALSE_UNSIGNED; + xTCPTimer.bExpired = pdFALSE_UNSIGNED; } } /*-----------------------------------------------------------*/ diff --git a/source/include/FreeRTOS_IP_Timers.h b/source/include/FreeRTOS_IP_Timers.h index 004bb441ea..a2db984031 100644 --- a/source/include/FreeRTOS_IP_Timers.h +++ b/source/include/FreeRTOS_IP_Timers.h @@ -66,7 +66,7 @@ TickType_t xCalculateSleepTime( void ); void vIPTimerStartARPResolution( TickType_t xTime ); -void vIPSetTCPTimerEnableState( BaseType_t xEnableState ); +void vIPSetTCPTimerExpiredState( BaseType_t xEnableState ); void vIPSetARPTimerEnableState( BaseType_t xEnableState ); From 23b726835796944fbceb793cb802162c42e2b5c8 Mon Sep 17 00:00:00 2001 From: Hein Tibosch Date: Fri, 10 Jun 2022 11:13:26 +0800 Subject: [PATCH 2/7] Renamed parameter of function vIPSetTCPTimerExpiredState --- source/FreeRTOS_IP_Timers.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/source/FreeRTOS_IP_Timers.c b/source/FreeRTOS_IP_Timers.c index 81857514d2..2e2e16b925 100644 --- a/source/FreeRTOS_IP_Timers.c +++ b/source/FreeRTOS_IP_Timers.c @@ -382,18 +382,19 @@ static BaseType_t prvIPTimerCheck( IPTimer_t * pxTimer ) /** * @brief Enable/disable the TCP timer. * - * @param[in] xEnableState: pdTRUE - enable timer; pdFALSE - disable timer. + * @param[in] xExpiredState: pdTRUE - set as expired; pdFALSE - set as non-expired. */ - void vIPSetTCPTimerExpiredState( BaseType_t xEnableState ) + void vIPSetTCPTimerExpiredState( BaseType_t xExpiredState ) { xTCPTimer.bActive = pdTRUE_UNSIGNED; - if( xEnableState != pdFALSE ) + + if( xExpiredState != pdFALSE ) { - xTCPTimer.bExpired = pdTRUE_UNSIGNED; + xTCPTimer.bExpired = pdTRUE_UNSIGNED; } else { - xTCPTimer.bExpired = pdFALSE_UNSIGNED; + xTCPTimer.bExpired = pdFALSE_UNSIGNED; } } /*-----------------------------------------------------------*/ From 407d22dc491bf7cb6eb7ed75fbe3e58c22cc73be Mon Sep 17 00:00:00 2001 From: Hein Tibosch Date: Fri, 10 Jun 2022 11:25:01 +0800 Subject: [PATCH 3/7] Adapt unit tests to use the new name and field --- test/unit-test/FreeRTOS_IP/FreeRTOS_IP_utest.c | 8 ++++---- .../FreeRTOS_IP_Timers_utest.c | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/test/unit-test/FreeRTOS_IP/FreeRTOS_IP_utest.c b/test/unit-test/FreeRTOS_IP/FreeRTOS_IP_utest.c index fb02c73ae1..43e73317d3 100644 --- a/test/unit-test/FreeRTOS_IP/FreeRTOS_IP_utest.c +++ b/test/unit-test/FreeRTOS_IP/FreeRTOS_IP_utest.c @@ -945,7 +945,7 @@ void test_prvProcessIPEventsAndTimers_eTCPTimerEvent( void ) xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE ); xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) ); - vIPSetTCPTimerEnableState_Expect( pdTRUE ); + vIPSetTCPTimerExpiredState_Expect( pdTRUE ); prvProcessIPEventsAndTimers(); } @@ -1371,7 +1371,7 @@ void test_xSendEventStructToIPTask_IPTaskInit_eTCPTimerEvent( void ) xIPTaskInitialised = pdTRUE; xEvent.eEventType = eTCPTimerEvent; - vIPSetTCPTimerEnableState_Expect( pdTRUE ); + vIPSetTCPTimerExpiredState_Expect( pdTRUE ); uxQueueMessagesWaiting_ExpectAndReturn( xNetworkEventQueue, 0 ); @@ -1393,7 +1393,7 @@ void test_xSendEventStructToIPTask_IPTaskInit_eTCPTimerEvent1( void ) xIPTaskInitialised = pdTRUE; xEvent.eEventType = eTCPTimerEvent; - vIPSetTCPTimerEnableState_Expect( pdTRUE ); + vIPSetTCPTimerExpiredState_Expect( pdTRUE ); uxQueueMessagesWaiting_ExpectAndReturn( xNetworkEventQueue, 0 ); @@ -1415,7 +1415,7 @@ void test_xSendEventStructToIPTask_IPTaskInit_eTCPTimerEvent2( void ) xIPTaskInitialised = pdTRUE; xEvent.eEventType = eTCPTimerEvent; - vIPSetTCPTimerEnableState_Expect( pdTRUE ); + vIPSetTCPTimerExpiredState_Expect( pdTRUE ); uxQueueMessagesWaiting_ExpectAndReturn( xNetworkEventQueue, 1 ); diff --git a/test/unit-test/FreeRTOS_IP_Timers/FreeRTOS_IP_Timers_utest.c b/test/unit-test/FreeRTOS_IP_Timers/FreeRTOS_IP_Timers_utest.c index b5e64f90be..51b3c59f02 100644 --- a/test/unit-test/FreeRTOS_IP_Timers/FreeRTOS_IP_Timers_utest.c +++ b/test/unit-test/FreeRTOS_IP_Timers/FreeRTOS_IP_Timers_utest.c @@ -531,22 +531,22 @@ void test_prvIPTimerCheck_TimerNotExpired1( void ) TEST_ASSERT_EQUAL( pdFALSE, xTimer.bExpired ); } -void test_vIPSetTCPTimerEnableState_False( void ) +void test_vIPSetTCPTimerExpiredState_False( void ) { - BaseType_t xEnableState = pdFALSE; + BaseType_t xExpiredState = pdFALSE; - vIPSetTCPTimerEnableState( xEnableState ); + vIPSetTCPTimerExpiredState( xExpiredState ); - TEST_ASSERT_EQUAL( xEnableState, xTCPTimer.bActive ); + TEST_ASSERT_EQUAL( xExpiredState, xTCPTimer.bExpired ); } -void test_vIPSetTCPTimerEnableState_True( void ) +void test_vIPSetTCPTimerExpiredState_True( void ) { - BaseType_t xEnableState = pdTRUE; + BaseType_t xExpiredState = pdTRUE; - vIPSetTCPTimerEnableState( xEnableState ); + vIPSetTCPTimerExpiredState( xExpiredState ); - TEST_ASSERT_EQUAL( xEnableState, xTCPTimer.bActive ); + TEST_ASSERT_EQUAL( xExpiredState, xTCPTimer.bActive ); } void test_vIPSetARPTimerEnableState_False( void ) From 8bab49e11e560abd1c0cd2daa7ae17dbdfb83cb0 Mon Sep 17 00:00:00 2001 From: Hein Tibosch Date: Fri, 10 Jun 2022 11:29:35 +0800 Subject: [PATCH 4/7] Change bActive to bExpired --- test/unit-test/FreeRTOS_IP_Timers/FreeRTOS_IP_Timers_utest.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit-test/FreeRTOS_IP_Timers/FreeRTOS_IP_Timers_utest.c b/test/unit-test/FreeRTOS_IP_Timers/FreeRTOS_IP_Timers_utest.c index 51b3c59f02..948093707e 100644 --- a/test/unit-test/FreeRTOS_IP_Timers/FreeRTOS_IP_Timers_utest.c +++ b/test/unit-test/FreeRTOS_IP_Timers/FreeRTOS_IP_Timers_utest.c @@ -546,7 +546,7 @@ void test_vIPSetTCPTimerExpiredState_True( void ) vIPSetTCPTimerExpiredState( xExpiredState ); - TEST_ASSERT_EQUAL( xExpiredState, xTCPTimer.bActive ); + TEST_ASSERT_EQUAL( xExpiredState, xTCPTimer.bExpired ); } void test_vIPSetARPTimerEnableState_False( void ) From 5497db5d55f46d83aeff5c5074f5a1aa6652171c Mon Sep 17 00:00:00 2001 From: Aniruddha Kanhere <60444055+AniruddhaKanhere@users.noreply.github.com> Date: Fri, 10 Jun 2022 10:27:16 -0700 Subject: [PATCH 5/7] Empty commit From b1b0d2bcfc17d2dc45a34c990e729ee279f7973a Mon Sep 17 00:00:00 2001 From: Aniruddha Kanhere <60444055+AniruddhaKanhere@users.noreply.github.com> Date: Fri, 10 Jun 2022 13:26:54 -0700 Subject: [PATCH 6/7] Fix spell check --- .github/lexicon.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/lexicon.txt b/.github/lexicon.txt index d84c8aab1a..c23d181a21 100644 --- a/.github/lexicon.txt +++ b/.github/lexicon.txt @@ -1478,6 +1478,7 @@ xeventgroup xeventgroupwaitbits xexpected xexpectedmessagetype +xexpiredstate xflags xfound xfreebufferslist From f1d0b194855a823d17c04a46261382651ea369b1 Mon Sep 17 00:00:00 2001 From: Hein Tibosch Date: Mon, 13 Jun 2022 13:27:18 +0800 Subject: [PATCH 7/7] When a gratuitous ARP is received, use it to update the ARP cache entry --- source/FreeRTOS_ARP.c | 87 +++++++++++++++++++++++++------------------ 1 file changed, 51 insertions(+), 36 deletions(-) diff --git a/source/FreeRTOS_ARP.c b/source/FreeRTOS_ARP.c index bf97707979..8b9966f8dd 100644 --- a/source/FreeRTOS_ARP.c +++ b/source/FreeRTOS_ARP.c @@ -251,43 +251,58 @@ eFrameProcessingResult_t eARPProcessPacket( ARPPacket_t * const pxARPFrame ) case ipARP_REQUEST: /* The packet contained an ARP request. Was it for the IP - * address of the node running this code? And does the MAC - * address claim that it is coming from this device itself? */ - if( ( ulTargetProtocolAddress == *ipLOCAL_IP_ADDRESS_POINTER ) && - ( memcmp( ( void * ) ipLOCAL_MAC_ADDRESS, - ( void * ) ( pxARPHeader->xSenderHardwareAddress.ucBytes ), - ipMAC_ADDRESS_LENGTH_BYTES ) != 0 ) ) + * address of the node running this code? */ + if( ulTargetProtocolAddress == *ipLOCAL_IP_ADDRESS_POINTER ) { - iptraceSENDING_ARP_REPLY( ulSenderProtocolAddress ); - - /* The request is for the address of this node. Add the - * entry into the ARP cache, or refresh the entry if it - * already exists. */ - vARPRefreshCacheEntry( &( pxARPHeader->xSenderHardwareAddress ), ulSenderProtocolAddress ); - - /* Generate a reply payload in the same buffer. */ - pxARPHeader->usOperation = ( uint16_t ) ipARP_REPLY; - - ( void ) memcpy( &( pxARPHeader->xTargetHardwareAddress ), - &( pxARPHeader->xSenderHardwareAddress ), - sizeof( MACAddress_t ) ); - - pxARPHeader->ulTargetProtocolAddress = ulSenderProtocolAddress; - - /* - * Use helper variables for memcpy() to remain - * compliant with MISRA Rule 21.15. These should be - * optimized away. - */ - pvCopySource = ipLOCAL_MAC_ADDRESS; - pvCopyDest = pxARPHeader->xSenderHardwareAddress.ucBytes; - ( void ) memcpy( pvCopyDest, pvCopySource, sizeof( MACAddress_t ) ); - - pvCopySource = ipLOCAL_IP_ADDRESS_POINTER; - pvCopyDest = pxARPHeader->ucSenderProtocolAddress; - ( void ) memcpy( pvCopyDest, pvCopySource, sizeof( pxARPHeader->ucSenderProtocolAddress ) ); - - eReturn = eReturnEthernetFrame; + /* Does the MAC address claim that it is coming + * from this device itself? */ + if( memcmp( ( void * ) ipLOCAL_MAC_ADDRESS, + ( void * ) ( pxARPHeader->xSenderHardwareAddress.ucBytes ), + ipMAC_ADDRESS_LENGTH_BYTES ) != 0 ) + { + iptraceSENDING_ARP_REPLY( ulSenderProtocolAddress ); + + /* The request is for the address of this node. Add the + * entry into the ARP cache, or refresh the entry if it + * already exists. */ + vARPRefreshCacheEntry( &( pxARPHeader->xSenderHardwareAddress ), ulSenderProtocolAddress ); + + /* Generate a reply payload in the same buffer. */ + pxARPHeader->usOperation = ( uint16_t ) ipARP_REPLY; + + ( void ) memcpy( &( pxARPHeader->xTargetHardwareAddress ), + &( pxARPHeader->xSenderHardwareAddress ), + sizeof( MACAddress_t ) ); + + pxARPHeader->ulTargetProtocolAddress = ulSenderProtocolAddress; + + /* + * Use helper variables for memcpy() to remain + * compliant with MISRA Rule 21.15. These should be + * optimized away. + */ + pvCopySource = ipLOCAL_MAC_ADDRESS; + pvCopyDest = pxARPHeader->xSenderHardwareAddress.ucBytes; + ( void ) memcpy( pvCopyDest, pvCopySource, sizeof( MACAddress_t ) ); + + pvCopySource = ipLOCAL_IP_ADDRESS_POINTER; + pvCopyDest = pxARPHeader->ucSenderProtocolAddress; + ( void ) memcpy( pvCopyDest, pvCopySource, sizeof( pxARPHeader->ucSenderProtocolAddress ) ); + + eReturn = eReturnEthernetFrame; + } + } + else if( ulSenderProtocolAddress == ulTargetProtocolAddress ) /* Gratuitous ARP request? */ + { + MACAddress_t xHardwareAddress; + + /* The request is a Gratuitous ARP message. + * Refresh the entry if it already exists. */ + /* Determine the ARP cache status for the requested IP address. */ + if( eARPGetCacheEntry( &( ulSenderProtocolAddress ), &( xHardwareAddress ) ) == eARPCacheHit ) + { + vARPRefreshCacheEntry( &( pxARPHeader->xSenderHardwareAddress ), ulSenderProtocolAddress ); + } } break;