From abcde7a2256f6e99261cab117ffde1b1defe9b63 Mon Sep 17 00:00:00 2001 From: Hein Tibosch Date: Thu, 16 Feb 2023 15:06:59 +0800 Subject: [PATCH 1/4] Main/TCP4 : ACK number in TCP RESET reply to SYN packet --- source/FreeRTOS_TCP_Transmission.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/source/FreeRTOS_TCP_Transmission.c b/source/FreeRTOS_TCP_Transmission.c index 154d0ac5b3..52f7876959 100644 --- a/source/FreeRTOS_TCP_Transmission.c +++ b/source/FreeRTOS_TCP_Transmission.c @@ -1463,10 +1463,20 @@ TCPPacket_t * pxTCPPacket = ( ( TCPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer ); const uint32_t ulSendLength = ( ipSIZE_OF_IPv4_HEADER + ipSIZE_OF_TCP_HEADER ); /* Plus 0 options. */ - + uint8_t ucFlagsReceived = pxTCPPacket->xTCPHeader.ucTCPFlags; pxTCPPacket->xTCPHeader.ucTCPFlags = ucTCPFlags; pxTCPPacket->xTCPHeader.ucTCPOffset = ( ipSIZE_OF_TCP_HEADER ) << 2; + if( ( ucFlagsReceived & tcpTCP_FLAG_SYN ) != 0U ) + { + /* A synchronise packet is received. It counts as 1 pseudo byte of data, + * so increase the variable with 1. Before sending a reply, the values of + * 'ulSequenceNumber' and 'ulAckNr' will be swapped. */ + uint32_t ulSequenceNumber = FreeRTOS_ntohl( pxTCPPacket->xTCPHeader.ulSequenceNumber ); + ulSequenceNumber++; + pxTCPPacket->xTCPHeader.ulSequenceNumber = FreeRTOS_ntohl( ulSequenceNumber ); + } + prvTCPReturnPacket( NULL, pxNetworkBuffer, ulSendLength, pdFALSE ); } #endif /* !ipconfigIGNORE_UNKNOWN_PACKETS */ From 309a1d5fd7b5f362797ea20579932cf45bdc2d79 Mon Sep 17 00:00:00 2001 From: Nikhil Kamath <110539926+amazonKamath@users.noreply.github.com> Date: Fri, 17 Feb 2023 10:10:21 +0530 Subject: [PATCH 2/4] Typo fix --- source/FreeRTOS_TCP_Transmission.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/FreeRTOS_TCP_Transmission.c b/source/FreeRTOS_TCP_Transmission.c index 52f7876959..7a4fc95db8 100644 --- a/source/FreeRTOS_TCP_Transmission.c +++ b/source/FreeRTOS_TCP_Transmission.c @@ -1469,7 +1469,7 @@ if( ( ucFlagsReceived & tcpTCP_FLAG_SYN ) != 0U ) { - /* A synchronise packet is received. It counts as 1 pseudo byte of data, + /* A synchronize packet is received. It counts as 1 pseudo byte of data, * so increase the variable with 1. Before sending a reply, the values of * 'ulSequenceNumber' and 'ulAckNr' will be swapped. */ uint32_t ulSequenceNumber = FreeRTOS_ntohl( pxTCPPacket->xTCPHeader.ulSequenceNumber ); From 764ea8c0e615e687744adb8f350927eb802c62c3 Mon Sep 17 00:00:00 2001 From: Aniruddha Kanhere <60444055+AniruddhaKanhere@users.noreply.github.com> Date: Sat, 18 Feb 2023 22:35:03 +0000 Subject: [PATCH 3/4] Add unit-test for coverage; Fix ntohl to htonl --- source/FreeRTOS_TCP_Transmission.c | 2 +- .../FreeRTOS_TCP_Transmission_utest.c | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/source/FreeRTOS_TCP_Transmission.c b/source/FreeRTOS_TCP_Transmission.c index 7a4fc95db8..bf1be23700 100644 --- a/source/FreeRTOS_TCP_Transmission.c +++ b/source/FreeRTOS_TCP_Transmission.c @@ -1474,7 +1474,7 @@ * 'ulSequenceNumber' and 'ulAckNr' will be swapped. */ uint32_t ulSequenceNumber = FreeRTOS_ntohl( pxTCPPacket->xTCPHeader.ulSequenceNumber ); ulSequenceNumber++; - pxTCPPacket->xTCPHeader.ulSequenceNumber = FreeRTOS_ntohl( ulSequenceNumber ); + pxTCPPacket->xTCPHeader.ulSequenceNumber = FreeRTOS_htonl( ulSequenceNumber ); } prvTCPReturnPacket( NULL, pxNetworkBuffer, ulSendLength, pdFALSE ); diff --git a/test/unit-test/FreeRTOS_TCP_Transmission/FreeRTOS_TCP_Transmission_utest.c b/test/unit-test/FreeRTOS_TCP_Transmission/FreeRTOS_TCP_Transmission_utest.c index a99d102e09..d54418aca6 100644 --- a/test/unit-test/FreeRTOS_TCP_Transmission/FreeRTOS_TCP_Transmission_utest.c +++ b/test/unit-test/FreeRTOS_TCP_Transmission/FreeRTOS_TCP_Transmission_utest.c @@ -1867,6 +1867,33 @@ void test_prvTCPSendSpecialPacketHelper( void ) TEST_ASSERT_EQUAL( 0x50, pxTCPPacket->xTCPHeader.ucTCPOffset ); } +/* test prvTCPSendSpecialPacketHelper function */ +void test_prvTCPSendSpecialPacketHelper_flagSYN( void ) +{ + BaseType_t Return = pdTRUE; + const uint32_t ulSequenceNumber = 0xABC12300; + + pxSocket = &xSocket; + pxNetworkBuffer = &xNetworkBuffer; + pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer; + TCPPacket_t * pxTCPPacket = ( ( const TCPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer ); + + pxTCPPacket->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_SYN; + pxTCPPacket->xTCPHeader.ucTCPOffset = 0; + pxTCPPacket->xTCPHeader.ulSequenceNumber = FreeRTOS_htonl( ulSequenceNumber ); + + usGenerateChecksum_ExpectAnyArgsAndReturn( 0x1111 ); + usGenerateProtocolChecksum_ExpectAnyArgsAndReturn( 0x2222 ); + eARPGetCacheEntry_ExpectAnyArgsAndReturn( eARPCacheHit ); + xNetworkInterfaceOutput_ExpectAnyArgsAndReturn( pdTRUE ); + + Return = prvTCPSendSpecialPacketHelper( pxNetworkBuffer, tcpTCP_FLAG_ACK ); + TEST_ASSERT_EQUAL( pdFALSE, Return ); + TEST_ASSERT_EQUAL( tcpTCP_FLAG_ACK, pxTCPPacket->xTCPHeader.ucTCPFlags ); + TEST_ASSERT_EQUAL( 0x50, pxTCPPacket->xTCPHeader.ucTCPOffset ); + TEST_ASSERT_EQUAL( ulSequenceNumber + 1, FreeRTOS_ntohl( pxTCPPacket->xTCPHeader.ulSequenceNumber ) ); +} + /* test prvTCPSendChallengeAck function */ void test_prvTCPSendChallengeAck( void ) { From 9b8d955474ad9124175cb2d92b0d0545f6e0a829 Mon Sep 17 00:00:00 2001 From: Aniruddha Kanhere <60444055+AniruddhaKanhere@users.noreply.github.com> Date: Sat, 18 Feb 2023 22:44:33 +0000 Subject: [PATCH 4/4] Fix unit-test --- .../FreeRTOS_TCP_Transmission/FreeRTOS_TCP_Transmission_utest.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit-test/FreeRTOS_TCP_Transmission/FreeRTOS_TCP_Transmission_utest.c b/test/unit-test/FreeRTOS_TCP_Transmission/FreeRTOS_TCP_Transmission_utest.c index d54418aca6..fdefe06894 100644 --- a/test/unit-test/FreeRTOS_TCP_Transmission/FreeRTOS_TCP_Transmission_utest.c +++ b/test/unit-test/FreeRTOS_TCP_Transmission/FreeRTOS_TCP_Transmission_utest.c @@ -1891,7 +1891,7 @@ void test_prvTCPSendSpecialPacketHelper_flagSYN( void ) TEST_ASSERT_EQUAL( pdFALSE, Return ); TEST_ASSERT_EQUAL( tcpTCP_FLAG_ACK, pxTCPPacket->xTCPHeader.ucTCPFlags ); TEST_ASSERT_EQUAL( 0x50, pxTCPPacket->xTCPHeader.ucTCPOffset ); - TEST_ASSERT_EQUAL( ulSequenceNumber + 1, FreeRTOS_ntohl( pxTCPPacket->xTCPHeader.ulSequenceNumber ) ); + TEST_ASSERT_EQUAL( ulSequenceNumber + 1, FreeRTOS_ntohl( pxTCPPacket->xTCPHeader.ulAckNr ) ); } /* test prvTCPSendChallengeAck function */