From 8128cdbe3945192b874c8da19f7fddd4796be1b0 Mon Sep 17 00:00:00 2001 From: Hein Tibosch Date: Wed, 9 Aug 2023 13:52:43 +0800 Subject: [PATCH 1/4] Not all ICMPv6 packets have the same minimum length --- source/FreeRTOS_IPv6.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/source/FreeRTOS_IPv6.c b/source/FreeRTOS_IPv6.c index 7224096803..af19df6552 100644 --- a/source/FreeRTOS_IPv6.c +++ b/source/FreeRTOS_IPv6.c @@ -173,7 +173,21 @@ const struct xIPv6_Address FreeRTOS_in6addr_loopback = { { 0, 0, 0, 0, 0, 0, 0, } else if( ucNextHeader == ( uint8_t ) ipPROTOCOL_ICMP_IPv6 ) { - uxMinimumLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + uxExtHeaderLength + ipSIZE_OF_ICMPv6_HEADER; + uint8_t ucTypeOfMessage; + + uxMinimumLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + uxExtHeaderLength; + + ucTypeOfMessage = pucEthernetBuffer[ uxMinimumLength ]; + + if( ( ucTypeOfMessage == ipICMP_PING_REQUEST_IPv6 ) || + ( ucTypeOfMessage == ipICMP_PING_REPLY_IPv6 ) ) + { + uxMinimumLength += sizeof( ICMPEcho_IPv6_t ); + } + else + { + uxMinimumLength += ipSIZE_OF_ICMPv6_HEADER; + } } else { From 17b9672dbe6b9907c60822bbbb6d4172875a28f7 Mon Sep 17 00:00:00 2001 From: Hein Tibosch Date: Fri, 11 Aug 2023 17:06:01 +0800 Subject: [PATCH 2/4] More precise length checking --- source/FreeRTOS_IPv6.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/FreeRTOS_IPv6.c b/source/FreeRTOS_IPv6.c index af19df6552..1b9025a5ec 100644 --- a/source/FreeRTOS_IPv6.c +++ b/source/FreeRTOS_IPv6.c @@ -184,6 +184,14 @@ const struct xIPv6_Address FreeRTOS_in6addr_loopback = { { 0, 0, 0, 0, 0, 0, 0, { uxMinimumLength += sizeof( ICMPEcho_IPv6_t ); } + else if( ucTypeOfMessage == ipICMP_ROUTER_SOLICITATION_IPv6 ) + { + uxMinimumLength += sizeof( ICMPRouterSolicitation_IPv6_t ); + } + else if( ucTypeOfMessage == ipICMP_ROUTER_ADVERTISEMENT_IPv6 ) + { + uxMinimumLength += sizeof( ICMPRouterAdvertisement_IPv6_t ); + } else { uxMinimumLength += ipSIZE_OF_ICMPv6_HEADER; From 2fa9dc8c9bdca27a0dd88470de5c453e3c3abc46 Mon Sep 17 00:00:00 2001 From: Hein Tibosch Date: Mon, 21 Aug 2023 22:07:59 +0800 Subject: [PATCH 3/4] Repaired unit tests / coverage --- ...TOS_IPv6_ConfigDriverCheckChecksum_utest.c | 87 ++++++++++++++++++- 1 file changed, 85 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 00aef5bd76..0e7e3fa9f4 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 @@ -229,10 +229,10 @@ void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_UDP_min_req } /** - * @brief test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement + * @brief test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_1 * The buffer size is less than ICMP packet minimal requirement. Check if prvAllowIPPacketIPv6 determines to release it. */ -void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement() +void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_1() { eFrameProcessingResult_t eResult; NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor(); @@ -241,12 +241,95 @@ void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_re /* Set next header to ICMPv6 */ pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_ICMP_IPv6; pxNetworkBuffer->xDataLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + 1; + pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] = ipICMP_ROUTER_SOLICITATION_IPv6; pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( 1 ); eResult = prvAllowIPPacketIPv6( &pxIPPacket->xIPHeader, pxNetworkBuffer, 0U ); TEST_ASSERT_EQUAL( eReleaseBuffer, eResult ); } +/** + * @brief test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_2 + * The buffer size is less than ICMP packet minimal requirement. Check if prvAllowIPPacketIPv6 determines to release it. + */ +void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_2() +{ + eFrameProcessingResult_t eResult; + NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor(); + IPPacket_IPv6_t * pxIPPacket = ( IPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer; + + /* Set next header to ICMPv6 */ + pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_ICMP_IPv6; + pxNetworkBuffer->xDataLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + 1; + pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] = ipICMP_ROUTER_ADVERTISEMENT_IPv6; + pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( 1 ); + + eResult = prvAllowIPPacketIPv6( &pxIPPacket->xIPHeader, pxNetworkBuffer, 0U ); + TEST_ASSERT_EQUAL( eReleaseBuffer, eResult ); +} + +/** + * @brief test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_3 + * The buffer size is less than ICMP packet minimal requirement. Check if prvAllowIPPacketIPv6 determines to release it. + */ +void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_3() +{ + eFrameProcessingResult_t eResult; + NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor(); + IPPacket_IPv6_t * pxIPPacket = ( IPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer; + + /* Set next header to ICMPv6 */ + pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_ICMP_IPv6; + pxNetworkBuffer->xDataLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + 1; + pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] = ipICMP_PING_REQUEST_IPv6; + pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( 1 ); + + eResult = prvAllowIPPacketIPv6( &pxIPPacket->xIPHeader, pxNetworkBuffer, 0U ); + TEST_ASSERT_EQUAL( eReleaseBuffer, eResult ); +} + +/** + * @brief test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_4 + * The buffer size is less than ICMP packet minimal requirement. Check if prvAllowIPPacketIPv6 determines to release it. + */ +void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_4() +{ + eFrameProcessingResult_t eResult; + NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor(); + IPPacket_IPv6_t * pxIPPacket = ( IPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer; + + /* Set next header to ICMPv6 */ + pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_ICMP_IPv6; + pxNetworkBuffer->xDataLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + 1; + pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] = ipICMP_PING_REPLY_IPv6; + pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( 1 ); + + eResult = prvAllowIPPacketIPv6( &pxIPPacket->xIPHeader, pxNetworkBuffer, 0U ); + TEST_ASSERT_EQUAL( eReleaseBuffer, eResult ); +} + +/** + * @brief test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_5 + * This is the default case for all ICMPv6 packet length testing. + * The buffer size is less than ICMP packet minimal requirement. Check if prvAllowIPPacketIPv6 determines to release it. + */ +void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_5() +{ + eFrameProcessingResult_t eResult; + NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor(); + IPPacket_IPv6_t * pxIPPacket = ( IPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer; + + /* Set next header to ICMPv6 */ + pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_ICMP_IPv6; + pxNetworkBuffer->xDataLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + 1; + pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] = ipICMP_NEIGHBOR_SOLICITATION_IPv6; + pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( 1 ); + + eResult = prvAllowIPPacketIPv6( &pxIPPacket->xIPHeader, pxNetworkBuffer, 0U ); + TEST_ASSERT_EQUAL( eReleaseBuffer, eResult ); +} + + /** * @brief test_prvAllowIPPacketIPv6_source_unspecified_address * Prepare a packet with unspecified address in source address. From 1ae466983d5ff0281750fbd19d989cc001c554d3 Mon Sep 17 00:00:00 2001 From: Hein Tibosch Date: Mon, 21 Aug 2023 22:55:18 +0800 Subject: [PATCH 4/4] Running uncrustify --- .../FreeRTOS_IPv6_ConfigDriverCheckChecksum_utest.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 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 0e7e3fa9f4..389e103ef5 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 @@ -241,7 +241,7 @@ void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_re /* Set next header to ICMPv6 */ pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_ICMP_IPv6; pxNetworkBuffer->xDataLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + 1; - pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] = ipICMP_ROUTER_SOLICITATION_IPv6; + pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] = ipICMP_ROUTER_SOLICITATION_IPv6; pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( 1 ); eResult = prvAllowIPPacketIPv6( &pxIPPacket->xIPHeader, pxNetworkBuffer, 0U ); @@ -261,7 +261,7 @@ void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_re /* Set next header to ICMPv6 */ pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_ICMP_IPv6; pxNetworkBuffer->xDataLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + 1; - pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] = ipICMP_ROUTER_ADVERTISEMENT_IPv6; + pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] = ipICMP_ROUTER_ADVERTISEMENT_IPv6; pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( 1 ); eResult = prvAllowIPPacketIPv6( &pxIPPacket->xIPHeader, pxNetworkBuffer, 0U ); @@ -281,7 +281,7 @@ void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_re /* Set next header to ICMPv6 */ pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_ICMP_IPv6; pxNetworkBuffer->xDataLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + 1; - pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] = ipICMP_PING_REQUEST_IPv6; + pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] = ipICMP_PING_REQUEST_IPv6; pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( 1 ); eResult = prvAllowIPPacketIPv6( &pxIPPacket->xIPHeader, pxNetworkBuffer, 0U ); @@ -322,7 +322,7 @@ void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_re /* Set next header to ICMPv6 */ pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_ICMP_IPv6; pxNetworkBuffer->xDataLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + 1; - pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] = ipICMP_NEIGHBOR_SOLICITATION_IPv6; + pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] = ipICMP_NEIGHBOR_SOLICITATION_IPv6; pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( 1 ); eResult = prvAllowIPPacketIPv6( &pxIPPacket->xIPHeader, pxNetworkBuffer, 0U );