Skip to content

Commit 160fa29

Browse files
htiboschtony-josi-awsActoryOukar-rahul-awsmoninom1
authored
Check minimum size of ICMPv6 packets (#994)
* Not all ICMPv6 packets have the same minimum length * More precise length checking * Repaired unit tests / coverage * Running uncrustify --------- Co-authored-by: Tony Josi <[email protected]> Co-authored-by: ActoryOu <[email protected]> Co-authored-by: kar-rahul-aws <[email protected]> Co-authored-by: Monika Singh <[email protected]>
1 parent 16a74c3 commit 160fa29

File tree

2 files changed

+108
-3
lines changed

2 files changed

+108
-3
lines changed

source/FreeRTOS_IPv6.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,29 @@ const struct xIPv6_Address FreeRTOS_in6addr_loopback = { { 0U, 0U, 0U, 0U, 0U, 0
173173
}
174174
else if( ucNextHeader == ( uint8_t ) ipPROTOCOL_ICMP_IPv6 )
175175
{
176-
uxMinimumLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + uxExtHeaderLength + ipSIZE_OF_ICMPv6_HEADER;
176+
uint8_t ucTypeOfMessage;
177+
178+
uxMinimumLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + uxExtHeaderLength;
179+
180+
ucTypeOfMessage = pucEthernetBuffer[ uxMinimumLength ];
181+
182+
if( ( ucTypeOfMessage == ipICMP_PING_REQUEST_IPv6 ) ||
183+
( ucTypeOfMessage == ipICMP_PING_REPLY_IPv6 ) )
184+
{
185+
uxMinimumLength += sizeof( ICMPEcho_IPv6_t );
186+
}
187+
else if( ucTypeOfMessage == ipICMP_ROUTER_SOLICITATION_IPv6 )
188+
{
189+
uxMinimumLength += sizeof( ICMPRouterSolicitation_IPv6_t );
190+
}
191+
else if( ucTypeOfMessage == ipICMP_ROUTER_ADVERTISEMENT_IPv6 )
192+
{
193+
uxMinimumLength += sizeof( ICMPRouterAdvertisement_IPv6_t );
194+
}
195+
else
196+
{
197+
uxMinimumLength += ipSIZE_OF_ICMPv6_HEADER;
198+
}
177199
}
178200
else
179201
{

test/unit-test/FreeRTOS_IPv6_ConfigDriverCheckChecksum/FreeRTOS_IPv6_ConfigDriverCheckChecksum_utest.c

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,10 +229,10 @@ void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_UDP_min_req
229229
}
230230

231231
/**
232-
* @brief test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement
232+
* @brief test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_1
233233
* The buffer size is less than ICMP packet minimal requirement. Check if prvAllowIPPacketIPv6 determines to release it.
234234
*/
235-
void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement()
235+
void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_1()
236236
{
237237
eFrameProcessingResult_t eResult;
238238
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
@@ -241,12 +241,95 @@ void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_re
241241
/* Set next header to ICMPv6 */
242242
pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_ICMP_IPv6;
243243
pxNetworkBuffer->xDataLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + 1;
244+
pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] = ipICMP_ROUTER_SOLICITATION_IPv6;
244245
pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( 1 );
245246

246247
eResult = prvAllowIPPacketIPv6( &pxIPPacket->xIPHeader, pxNetworkBuffer, 0U );
247248
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
248249
}
249250

251+
/**
252+
* @brief test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_2
253+
* The buffer size is less than ICMP packet minimal requirement. Check if prvAllowIPPacketIPv6 determines to release it.
254+
*/
255+
void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_2()
256+
{
257+
eFrameProcessingResult_t eResult;
258+
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
259+
IPPacket_IPv6_t * pxIPPacket = ( IPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
260+
261+
/* Set next header to ICMPv6 */
262+
pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_ICMP_IPv6;
263+
pxNetworkBuffer->xDataLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + 1;
264+
pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] = ipICMP_ROUTER_ADVERTISEMENT_IPv6;
265+
pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( 1 );
266+
267+
eResult = prvAllowIPPacketIPv6( &pxIPPacket->xIPHeader, pxNetworkBuffer, 0U );
268+
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
269+
}
270+
271+
/**
272+
* @brief test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_3
273+
* The buffer size is less than ICMP packet minimal requirement. Check if prvAllowIPPacketIPv6 determines to release it.
274+
*/
275+
void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_3()
276+
{
277+
eFrameProcessingResult_t eResult;
278+
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
279+
IPPacket_IPv6_t * pxIPPacket = ( IPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
280+
281+
/* Set next header to ICMPv6 */
282+
pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_ICMP_IPv6;
283+
pxNetworkBuffer->xDataLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + 1;
284+
pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] = ipICMP_PING_REQUEST_IPv6;
285+
pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( 1 );
286+
287+
eResult = prvAllowIPPacketIPv6( &pxIPPacket->xIPHeader, pxNetworkBuffer, 0U );
288+
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
289+
}
290+
291+
/**
292+
* @brief test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_4
293+
* The buffer size is less than ICMP packet minimal requirement. Check if prvAllowIPPacketIPv6 determines to release it.
294+
*/
295+
void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_4()
296+
{
297+
eFrameProcessingResult_t eResult;
298+
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
299+
IPPacket_IPv6_t * pxIPPacket = ( IPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
300+
301+
/* Set next header to ICMPv6 */
302+
pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_ICMP_IPv6;
303+
pxNetworkBuffer->xDataLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + 1;
304+
pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] = ipICMP_PING_REPLY_IPv6;
305+
pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( 1 );
306+
307+
eResult = prvAllowIPPacketIPv6( &pxIPPacket->xIPHeader, pxNetworkBuffer, 0U );
308+
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
309+
}
310+
311+
/**
312+
* @brief test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_5
313+
* This is the default case for all ICMPv6 packet length testing.
314+
* The buffer size is less than ICMP packet minimal requirement. Check if prvAllowIPPacketIPv6 determines to release it.
315+
*/
316+
void test_prvAllowIPPacketIPv6_xCheckIPv6SizeFields_length_less_than_ICMP_min_requirement_5()
317+
{
318+
eFrameProcessingResult_t eResult;
319+
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
320+
IPPacket_IPv6_t * pxIPPacket = ( IPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
321+
322+
/* Set next header to ICMPv6 */
323+
pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_ICMP_IPv6;
324+
pxNetworkBuffer->xDataLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + 1;
325+
pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] = ipICMP_NEIGHBOR_SOLICITATION_IPv6;
326+
pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( 1 );
327+
328+
eResult = prvAllowIPPacketIPv6( &pxIPPacket->xIPHeader, pxNetworkBuffer, 0U );
329+
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
330+
}
331+
332+
250333
/**
251334
* @brief test_prvAllowIPPacketIPv6_source_unspecified_address
252335
* Prepare a packet with unspecified address in source address.

0 commit comments

Comments
 (0)