From 915742996decf098e6215ca5f83912c4f6c1d050 Mon Sep 17 00:00:00 2001 From: ActoryOu Date: Fri, 16 Jun 2023 07:38:04 +0000 Subject: [PATCH 1/3] Allow buffer data^Cength to be more than IP packets --- source/FreeRTOS_IPv6.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/FreeRTOS_IPv6.c b/source/FreeRTOS_IPv6.c index 33076e6e90..701f8ef2f1 100644 --- a/source/FreeRTOS_IPv6.c +++ b/source/FreeRTOS_IPv6.c @@ -132,7 +132,9 @@ const struct xIPv6_Address FreeRTOS_in6addr_loopback = { { 0, 0, 0, 0, 0, 0, 0, /* Check if the complete IPv6-header plus protocol data have been transferred: */ usPayloadLength = FreeRTOS_ntohs( pxIPv6Packet->xIPHeader.usPayloadLength ); - if( uxBufferLength != ( size_t ) ( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + ( size_t ) usPayloadLength ) ) + /* Since network interface might put some data in the network buffer, + * we allow buffer length to be greater than necessary. */ + if( uxBufferLength < ( size_t ) ( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + ( size_t ) usPayloadLength ) ) { DEBUG_SET_TRACE_VARIABLE( xLocation, 4 ); break; From 83014622d772a0ec1c5815ce2d43db6467f34f9b Mon Sep 17 00:00:00 2001 From: ActoryOu Date: Fri, 16 Jun 2023 08:26:14 +0000 Subject: [PATCH 2/3] Fix UT --- .../FreeRTOS_IPv6_ConfigDriverCheckChecksum_utest.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit-test/FreeRTOS_IPv6_ConfigDriverCheckChecksum/FreeRTOS_IPv6_ConfigDriverCheckChecksum_utest.c b/test/unit-test/FreeRTOS_IPv6_ConfigDriverCheckChecksum/FreeRTOS_IPv6_ConfigDriverCheckChecksum_utest.c index 8404b9ba24..ef3facb504 100644 --- a/test/unit-test/FreeRTOS_IPv6_ConfigDriverCheckChecksum/FreeRTOS_IPv6_ConfigDriverCheckChecksum_utest.c +++ b/test/unit-test/FreeRTOS_IPv6_ConfigDriverCheckChecksum/FreeRTOS_IPv6_ConfigDriverCheckChecksum_utest.c @@ -145,8 +145,8 @@ void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_wrong_ip_length() NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor(); IPPacket_IPv6_t * pxIPPacket = ( IPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer; - /* Modify the length in IP header */ - pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( sizeof( TCPHeader_t ) ); + /* Modify the length in IP header to be greater than data length. */ + pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( sizeof( TCPHeader_t ) + 9U ); eResult = prvAllowIPPacketIPv6( &pxIPPacket->xIPHeader, pxNetworkBuffer, 0U ); TEST_ASSERT_EQUAL( eReleaseBuffer, eResult ); From 0227250912bc7d2badddc1d9fba4687882c6b3a6 Mon Sep 17 00:00:00 2001 From: ActoryOu Date: Wed, 21 Jun 2023 09:59:07 +0000 Subject: [PATCH 3/3] Use MACRO instead to represent payload length --- .../FreeRTOS_IPv6_ConfigDriverCheckChecksum_stubs.c | 9 ++++++--- .../FreeRTOS_IPv6_ConfigDriverCheckChecksum_utest.c | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/test/unit-test/FreeRTOS_IPv6_ConfigDriverCheckChecksum/FreeRTOS_IPv6_ConfigDriverCheckChecksum_stubs.c b/test/unit-test/FreeRTOS_IPv6_ConfigDriverCheckChecksum/FreeRTOS_IPv6_ConfigDriverCheckChecksum_stubs.c index 2895fb0e6f..ea4581a1f6 100644 --- a/test/unit-test/FreeRTOS_IPv6_ConfigDriverCheckChecksum/FreeRTOS_IPv6_ConfigDriverCheckChecksum_stubs.c +++ b/test/unit-test/FreeRTOS_IPv6_ConfigDriverCheckChecksum/FreeRTOS_IPv6_ConfigDriverCheckChecksum_stubs.c @@ -51,6 +51,9 @@ const IPv6_Address_t xIPAddressTen = { 0x20, 0x01, 0x12, 0x34, 0x56, 0x78, 0x00, /* MAC Address for endpoint. */ const uint8_t ucMACAddress[ ipMAC_ADDRESS_LENGTH_BYTES ] = { 0xab, 0xcd, 0xef, 0x11, 0x22, 0x33 }; +/* Default payload length in this test. */ +#define TEST_DEFAULT_PROTOCOL_PAYLOAD_LENGTH ( 8U ) + /* ======================== Stub Callback Functions ========================= */ NetworkEndPoint_t * prvInitializeEndpoint() @@ -74,14 +77,14 @@ NetworkEndPoint_t * prvInitializeEndpoint() NetworkBufferDescriptor_t * prvInitializeNetworkDescriptor() { static NetworkBufferDescriptor_t xNetworkBuffer; - static uint8_t pcNetworkBuffer[ sizeof( TCPPacket_IPv6_t ) + 8U ]; + static uint8_t pcNetworkBuffer[ sizeof( TCPPacket_IPv6_t ) + TEST_DEFAULT_PROTOCOL_PAYLOAD_LENGTH ]; TCPPacket_IPv6_t * pxTCPPacket = ( TCPPacket_IPv6_t * ) pcNetworkBuffer; /* Initialize network buffer descriptor. */ memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) ); xNetworkBuffer.pxEndPoint = prvInitializeEndpoint(); xNetworkBuffer.pucEthernetBuffer = ( uint8_t * ) pxTCPPacket; - xNetworkBuffer.xDataLength = sizeof( TCPPacket_IPv6_t ) + 8U; + xNetworkBuffer.xDataLength = sizeof( TCPPacket_IPv6_t ) + TEST_DEFAULT_PROTOCOL_PAYLOAD_LENGTH; /* Initialize network buffer. */ memset( pcNetworkBuffer, 0, sizeof( pcNetworkBuffer ) ); @@ -93,7 +96,7 @@ NetworkBufferDescriptor_t * prvInitializeNetworkDescriptor() memcpy( pxTCPPacket->xIPHeader.xSourceAddress.ucBytes, xIPAddressTen.ucBytes, sizeof( IPv6_Address_t ) ); memcpy( pxTCPPacket->xIPHeader.xDestinationAddress.ucBytes, xIPAddressFive.ucBytes, sizeof( IPv6_Address_t ) ); pxTCPPacket->xIPHeader.ucVersionTrafficClass |= 6U << 4; - pxTCPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( sizeof( TCPHeader_t ) + 8U ); + pxTCPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( sizeof( TCPHeader_t ) + TEST_DEFAULT_PROTOCOL_PAYLOAD_LENGTH ); pxTCPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_TCP; return &xNetworkBuffer; diff --git a/test/unit-test/FreeRTOS_IPv6_ConfigDriverCheckChecksum/FreeRTOS_IPv6_ConfigDriverCheckChecksum_utest.c b/test/unit-test/FreeRTOS_IPv6_ConfigDriverCheckChecksum/FreeRTOS_IPv6_ConfigDriverCheckChecksum_utest.c index ef3facb504..00aef5bd76 100644 --- a/test/unit-test/FreeRTOS_IPv6_ConfigDriverCheckChecksum/FreeRTOS_IPv6_ConfigDriverCheckChecksum_utest.c +++ b/test/unit-test/FreeRTOS_IPv6_ConfigDriverCheckChecksum/FreeRTOS_IPv6_ConfigDriverCheckChecksum_utest.c @@ -146,7 +146,7 @@ void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_wrong_ip_length() IPPacket_IPv6_t * pxIPPacket = ( IPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer; /* Modify the length in IP header to be greater than data length. */ - pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( sizeof( TCPHeader_t ) + 9U ); + pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( sizeof( TCPHeader_t ) + TEST_DEFAULT_PROTOCOL_PAYLOAD_LENGTH + 1U ); eResult = prvAllowIPPacketIPv6( &pxIPPacket->xIPHeader, pxNetworkBuffer, 0U ); TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );