Skip to content

Commit 77f00d8

Browse files
committed
Improve ARP buffer allocation sizing and ICMPv6 NS validation ordering
1 parent af6b379 commit 77f00d8

File tree

7 files changed

+33
-31
lines changed

7 files changed

+33
-31
lines changed

source/FreeRTOS_ARP.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1194,7 +1194,7 @@
11941194
{
11951195
/* This is called from the context of the IP event task, so a block time
11961196
* must not be used. */
1197-
pxNetworkBuffer = pxGetNetworkBufferWithDescriptor( sizeof( ARPPacket_t ), ( TickType_t ) 0U );
1197+
pxNetworkBuffer = pxGetNetworkBufferWithDescriptor( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), ( TickType_t ) 0U );
11981198

11991199
if( pxNetworkBuffer != NULL )
12001200
{

source/FreeRTOS_ND.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,7 +1109,18 @@
11091109
size_t uxICMPSize;
11101110
BaseType_t xCompare;
11111111
const NetworkEndPoint_t * pxTargetedEndPoint = pxEndPoint;
1112-
const NetworkEndPoint_t * pxEndPointInSameSubnet = FreeRTOS_InterfaceEPInSameSubnet_IPv6( pxNetworkBuffer->pxInterface, &( pxICMPHeader_IPv6->xIPv6Address ) );
1112+
const NetworkEndPoint_t * pxEndPointInSameSubnet;
1113+
1114+
uxICMPSize = sizeof( ICMPHeader_IPv6_t );
1115+
uxNeededSize = ( size_t ) ( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + uxICMPSize );
1116+
1117+
if( uxNeededSize > pxNetworkBuffer->xDataLength )
1118+
{
1119+
FreeRTOS_printf( ( "Too small\n" ) );
1120+
break;
1121+
}
1122+
1123+
pxEndPointInSameSubnet = FreeRTOS_InterfaceEPInSameSubnet_IPv6( pxNetworkBuffer->pxInterface, &( pxICMPHeader_IPv6->xIPv6Address ) );
11131124

11141125
if( pxEndPointInSameSubnet != NULL )
11151126
{
@@ -1121,15 +1132,6 @@
11211132
pxICMPHeader_IPv6->xIPv6Address.ucBytes ) );
11221133
}
11231134

1124-
uxICMPSize = sizeof( ICMPHeader_IPv6_t );
1125-
uxNeededSize = ( size_t ) ( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + uxICMPSize );
1126-
1127-
if( uxNeededSize > pxNetworkBuffer->xDataLength )
1128-
{
1129-
FreeRTOS_printf( ( "Too small\n" ) );
1130-
break;
1131-
}
1132-
11331135
xCompare = memcmp( pxICMPHeader_IPv6->xIPv6Address.ucBytes, pxTargetedEndPoint->ipv6_settings.xIPAddress.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
11341136

11351137
FreeRTOS_printf( ( "ND NS for %pip endpoint %pip %s\n",

test/cbmc/proofs/ARP/ARP_OutputARPRequest_buffer_alloc1/Configurations.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"$(ENTRY)_harness.goto",
1212
"$(FREERTOS_PLUS_TCP)/source/FreeRTOS_IP.goto",
1313
"$(FREERTOS_PLUS_TCP)/source/FreeRTOS_ARP.goto",
14+
"$(FREERTOS_PLUS_TCP)/source/FreeRTOS_IP_Utils.goto",
1415
"$(FREERTOS_PLUS_TCP)/source/FreeRTOS_Routing.goto",
1516
"$(FREERTOS_PLUS_TCP)/source/portable/BufferManagement/BufferAllocation_1.goto",
1617
"$(FREERTOS_PLUS_TCP)/test/FreeRTOS-Kernel/list.goto",

test/cbmc/proofs/ARP/ARP_OutputARPRequest_buffer_alloc2/Configurations.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"$(ENTRY)_harness.goto",
1212
"$(FREERTOS_PLUS_TCP)/source/FreeRTOS_ARP.goto",
1313
"$(FREERTOS_PLUS_TCP)/source/FreeRTOS_IP.goto",
14+
"$(FREERTOS_PLUS_TCP)/source/FreeRTOS_IP_Utils.goto",
1415
"$(FREERTOS_PLUS_TCP)/source/FreeRTOS_Routing.goto",
1516
"$(FREERTOS_PLUS_TCP)/source/portable/BufferManagement/BufferAllocation_2.goto",
1617
"$(FREERTOS_PLUS_TCP)/test/FreeRTOS-Kernel/list.goto",

test/unit-test/FreeRTOS_ARP/FreeRTOS_ARP_utest.c

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ void test_eARPProcessPacket_Request_SenderAndTargetSame( void )
488488
/* Reset the private variable uxARPClashCounter. */
489489
vResetARPClashCounter();
490490

491-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, &xNetworkBuffer );
491+
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), 0, &xNetworkBuffer );
492492

493493
xIsCallingFromIPTask_IgnoreAndReturn( pdFALSE );
494494
xSendEventStructToIPTask_IgnoreAndReturn( pdFAIL );
@@ -1081,7 +1081,7 @@ void test_eARPProcessPacket_Reply_SenderAndTargetSame( void )
10811081
xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
10821082
xNetworkBuffer.pxEndPoint = &xEndPoint;
10831083

1084-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, &xNetworkBuffer );
1084+
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), 0, &xNetworkBuffer );
10851085

10861086
xIsCallingFromIPTask_IgnoreAndReturn( pdFALSE );
10871087
xSendEventStructToIPTask_IgnoreAndReturn( pdFAIL );
@@ -2445,7 +2445,7 @@ void test_vARPAgeCache( void )
24452445

24462446
/* The function which calls 'pxGetNetworkBufferWithDescriptor' is 'FreeRTOS_OutputARPRequest'.
24472447
* It doesn't return anything and will be tested separately. */
2448-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2448+
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), 0, NULL );
24492449

24502450

24512451
vARPAgeCache();
@@ -2463,14 +2463,14 @@ void test_vARPAgeCache( void )
24632463

24642464
/* The function which calls 'pxGetNetworkBufferWithDescriptor' is 'FreeRTOS_OutputARPRequest'.
24652465
* It doesn't return anything and will be tested separately. */
2466-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2466+
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), 0, NULL );
24672467

24682468
/* Let the value returned first time be 100. */
24692469
xTaskGetTickCount_ExpectAndReturn( 100 );
24702470

24712471
/* The function which calls 'pxGetNetworkBufferWithDescriptor' is 'FreeRTOS_OutputARPRequest'.
24722472
* It doesn't return anything and will be tested separately. */
2473-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2473+
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), 0, NULL );
24742474

24752475
vARPAgeCache();
24762476
/* =================================================== */
@@ -2486,7 +2486,7 @@ void test_vARPAgeCache( void )
24862486

24872487
/* The function which calls 'pxGetNetworkBufferWithDescriptor' is 'FreeRTOS_OutputARPRequest'.
24882488
* It doesn't return anything and will be tested separately. */
2489-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2489+
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), 0, NULL );
24902490

24912491
/* Let the value returned first time be 100. */
24922492
xTaskGetTickCount_ExpectAndReturn( 100 );
@@ -2507,7 +2507,7 @@ void test_vARPAgeCache( void )
25072507

25082508
/* The function which calls 'pxGetNetworkBufferWithDescriptor' is 'FreeRTOS_OutputARPRequest'.
25092509
* It doesn't return anything and will be tested separately. */
2510-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2510+
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), 0, NULL );
25112511

25122512
vARPAgeCache();
25132513
/* =================================================== */
@@ -2590,7 +2590,7 @@ void test_FreeRTOS_OutputARPRequest( void )
25902590

25912591
FreeRTOS_FindEndPointOnNetMask_ExpectAndReturn( ulIPAddress, &xEndPoint );
25922592

2593-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, &xNetworkBuffer );
2593+
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), 0, &xNetworkBuffer );
25942594

25952595
xIsCallingFromIPTask_IgnoreAndReturn( pdTRUE );
25962596

@@ -2603,7 +2603,7 @@ void test_FreeRTOS_OutputARPRequest( void )
26032603

26042604
FreeRTOS_FindEndPointOnNetMask_ExpectAndReturn( ulIPAddress, &xEndPoint );
26052605

2606-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, &xNetworkBuffer );
2606+
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), 0, &xNetworkBuffer );
26072607

26082608
xIsCallingFromIPTask_IgnoreAndReturn( pdFALSE );
26092609
xSendEventStructToIPTask_IgnoreAndReturn( pdFAIL );
@@ -2617,7 +2617,7 @@ void test_FreeRTOS_OutputARPRequest( void )
26172617
xNetworkInterfaceOutput_ARP_STUB_CallCount = 0;
26182618
FreeRTOS_FindEndPointOnNetMask_ExpectAndReturn( ulIPAddress, &xEndPoint );
26192619

2620-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, &xNetworkBuffer );
2620+
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), 0, &xNetworkBuffer );
26212621
xIsCallingFromIPTask_IgnoreAndReturn( pdFALSE );
26222622
xSendEventStructToIPTask_IgnoreAndReturn( pdPASS );
26232623

@@ -2633,7 +2633,7 @@ void test_FreeRTOS_OutputARPRequest( void )
26332633

26342634
FreeRTOS_FindEndPointOnNetMask_ExpectAndReturn( ulIPAddress, &xEndPoint );
26352635

2636-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, &xNetworkBuffer );
2636+
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), 0, &xNetworkBuffer );
26372637
xIsCallingFromIPTask_IgnoreAndReturn( pdTRUE );
26382638

26392639
FreeRTOS_OutputARPRequest( ulIPAddress );
@@ -2648,7 +2648,7 @@ void test_FreeRTOS_OutputARPRequest( void )
26482648

26492649
FreeRTOS_FindEndPointOnNetMask_ExpectAndReturn( ulIPAddress, &xEndPoint );
26502650

2651-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, &xNetworkBuffer );
2651+
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), 0, &xNetworkBuffer );
26522652
xIsCallingFromIPTask_IgnoreAndReturn( pdTRUE );
26532653

26542654
FreeRTOS_OutputARPRequest( ulIPAddress );
@@ -2771,7 +2771,7 @@ void test_xARPWaitResolution_GNWFailsNoTimeout( void )
27712771
for( i = 0; i < ipconfigMAX_ARP_RETRANSMISSIONS; i++ )
27722772
{
27732773
FreeRTOS_FindEndPointOnNetMask_ExpectAndReturn( ulIPAddress, &xEndPoint );
2774-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2774+
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), 0, NULL );
27752775
vTaskDelay_Expect( pdMS_TO_TICKS( 250U ) );
27762776
xIsIPv4Loopback_ExpectAndReturn( ulIPAddress, 0UL );
27772777
xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
@@ -2824,7 +2824,7 @@ void test_xARPWaitResolution( void )
28242824
for( i = 0; i < ( ipconfigMAX_ARP_RETRANSMISSIONS - 1 ); i++ )
28252825
{
28262826
FreeRTOS_FindEndPointOnNetMask_ExpectAndReturn( ulIPAddress, &xEndPoint );
2827-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2827+
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), 0, NULL );
28282828
vTaskDelay_Expect( pdMS_TO_TICKS( 250U ) );
28292829
xIsIPv4Loopback_ExpectAndReturn( ulIPAddress, 0UL );
28302830
xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
@@ -2834,7 +2834,7 @@ void test_xARPWaitResolution( void )
28342834
}
28352835

28362836
FreeRTOS_FindEndPointOnNetMask_ExpectAndReturn( ulIPAddress, &xEndPoint );
2837-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2837+
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), 0, NULL );
28382838
vTaskDelay_Expect( pdMS_TO_TICKS( 250U ) );
28392839
xIsIPv4Loopback_ExpectAndReturn( ulIPAddress, 0UL );
28402840
xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
@@ -2875,7 +2875,7 @@ void test_xARPWaitResolution( void )
28752875
for( i = 0; i < ( ipconfigMAX_ARP_RETRANSMISSIONS - 2 ); i++ )
28762876
{
28772877
FreeRTOS_FindEndPointOnNetMask_ExpectAndReturn( ulIPAddress, &xEndPoint );
2878-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2878+
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), 0, NULL );
28792879
vTaskDelay_Expect( pdMS_TO_TICKS( 250U ) );
28802880
xIsIPv4Loopback_ExpectAndReturn( ulIPAddress, 0UL );
28812881
xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
@@ -2885,7 +2885,7 @@ void test_xARPWaitResolution( void )
28852885
}
28862886

28872887
FreeRTOS_FindEndPointOnNetMask_ExpectAndReturn( ulIPAddress, &xEndPoint );
2888-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2888+
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), 0, NULL );
28892889
vTaskDelay_Expect( pdMS_TO_TICKS( 250U ) );
28902890
xIsIPv4Loopback_ExpectAndReturn( ulIPAddress, 0UL );
28912891
xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 1UL );

test/unit-test/FreeRTOS_ARP_DataLenLessThanMinPacket/FreeRTOS_ARP_DataLenLessThanMinPacket_utest.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ void test_FreeRTOS_OutputARPRequest_MinimumPacketSizeLessThanARPPacket( void )
5656

5757
FreeRTOS_FindEndPointOnNetMask_ExpectAndReturn( ulIPAddress, &xEndPoint );
5858

59-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, &xNetworkBuffer );
59+
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( FreeRTOS_max_size_t( sizeof( ARPPacket_t ), ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES ), 0, &xNetworkBuffer );
6060
xIsCallingFromIPTask_IgnoreAndReturn( pdTRUE );
6161

6262
FreeRTOS_OutputARPRequest( ulIPAddress );

test/unit-test/FreeRTOS_ND/FreeRTOS_ND_utest.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1667,8 +1667,6 @@ void test_prvProcessICMPMessage_IPv6_NeighborSolicitationIncorrectLen( void )
16671667
pxNetworkBuffer->pucEthernetBuffer = ( uint8_t * ) &xICMPPacket;
16681668
pxNetworkBuffer->xDataLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + 5;
16691669

1670-
FreeRTOS_InterfaceEPInSameSubnet_IPv6_ExpectAnyArgsAndReturn( &xEndPoint );
1671-
16721670
eReturn = prvProcessICMPMessage_IPv6( pxNetworkBuffer );
16731671

16741672
TEST_ASSERT_EQUAL( eReturn, eReleaseBuffer );

0 commit comments

Comments
 (0)