Skip to content

Commit 4f4adb3

Browse files
committed
Fix missing check for IPv6 version field in header
1 parent e1536d8 commit 4f4adb3

File tree

3 files changed

+50
-12
lines changed

3 files changed

+50
-12
lines changed

source/FreeRTOS_IPv6.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ const struct xIPv6_Address FreeRTOS_in6addr_loopback = { { 0U, 0U, 0U, 0U, 0U, 0
9393
size_t uxBufferLength )
9494
{
9595
BaseType_t xResult = pdFAIL;
96-
uint16_t ucVersionTrafficClass;
9796
uint16_t usPayloadLength;
9897
uint8_t ucNextHeader;
9998
size_t uxMinimumLength;
@@ -116,15 +115,6 @@ const struct xIPv6_Address FreeRTOS_in6addr_loopback = { { 0U, 0U, 0U, 0U, 0U, 0
116115
break;
117116
}
118117

119-
ucVersionTrafficClass = pxIPv6Packet->xIPHeader.ucVersionTrafficClass;
120-
121-
/* Test if the IP-version is 6. */
122-
if( ( ( ucVersionTrafficClass & ( uint8_t ) 0xF0U ) >> 4 ) != 6U )
123-
{
124-
DEBUG_SET_TRACE_VARIABLE( xLocation, 2 );
125-
break;
126-
}
127-
128118
/* Check if the IPv6-header is transferred. */
129119
if( uxBufferLength < ( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ) )
130120
{
@@ -497,6 +487,7 @@ eFrameProcessingResult_t prvAllowIPPacketIPv6( const IPHeader_IPv6_t * const pxI
497487
const IPv6_Address_t * pxDestinationIPAddress = &( pxIPv6Header->xDestinationAddress );
498488
const IPv6_Address_t * pxSourceIPAddress = &( pxIPv6Header->xSourceAddress );
499489
BaseType_t xHasUnspecifiedAddress = pdFALSE;
490+
uint16_t ucVersionTrafficClass = pxIPv6Header->ucVersionTrafficClass;
500491

501492
/* Drop if packet has unspecified IPv6 address (defined in RFC4291 - sec 2.5.2)
502493
* either in source or destination address. */
@@ -506,8 +497,15 @@ eFrameProcessingResult_t prvAllowIPPacketIPv6( const IPHeader_IPv6_t * const pxI
506497
xHasUnspecifiedAddress = pdTRUE;
507498
}
508499

500+
/* Test if the IP-version is 6. */
501+
if( ( ( ucVersionTrafficClass & ( uint8_t ) 0xF0U ) >> 4 ) != 6U )
502+
{
503+
/* Can not handle, unknown or invalid header version. */
504+
eReturn = eReleaseBuffer;
505+
FreeRTOS_printf( ( "prvAllowIPPacketIPv6: drop packet, invalid header version: %u\n", ( ucVersionTrafficClass & ( uint8_t ) 0xF0U ) >> 4 ) );
506+
}
509507
/* Is the packet for this IP address? */
510-
if( ( xHasUnspecifiedAddress == pdFALSE ) &&
508+
else if( ( xHasUnspecifiedAddress == pdFALSE ) &&
511509
( pxNetworkBuffer->pxEndPoint != NULL ) &&
512510
( memcmp( pxDestinationIPAddress->ucBytes, pxNetworkBuffer->pxEndPoint->ipv6_settings.xIPAddress.ucBytes, sizeof( IPv6_Address_t ) ) == 0 ) )
513511
{

test/unit-test/FreeRTOS_IPv6/FreeRTOS_IPv6_utest.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ void test_prvAllowIPPacketIPv6_SourceUnspecifiedAddress()
6868
memset( &xIPv6Address, 0, sizeof( xIPv6Address ) );
6969
memcpy( xIPv6Address.xDestinationAddress.ucBytes, xIPAddressFive.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
7070
memcpy( xIPv6Address.xSourceAddress.ucBytes, FreeRTOS_in6addr_any.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
71+
xIPv6Address.ucVersionTrafficClass = 0x60U;
7172

7273
eResult = prvAllowIPPacketIPv6( &xIPv6Address, NULL, 0U );
7374
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
@@ -85,7 +86,8 @@ void test_prvAllowIPPacketIPv6_DestinationUnspecifiedAddress()
8586
memset( &xIPv6Address, 0, sizeof( xIPv6Address ) );
8687
memcpy( xIPv6Address.xDestinationAddress.ucBytes, FreeRTOS_in6addr_any.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
8788
memcpy( xIPv6Address.xSourceAddress.ucBytes, xIPAddressFive.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
88-
89+
xIPv6Address.ucVersionTrafficClass = 0x60U;
90+
8991
eResult = prvAllowIPPacketIPv6( &xIPv6Address, NULL, 0U );
9092
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
9193
}
@@ -100,6 +102,8 @@ void test_prvAllowIPPacketIPv6_HappyPath()
100102
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
101103
TCPPacket_IPv6_t * pxTCPPacket = ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
102104

105+
pxTCPPacket->xIPHeader.ucVersionTrafficClass = 0x60U;
106+
103107
FreeRTOS_FindEndPointOnMAC_ExpectAndReturn( &pxTCPPacket->xEthernetHeader.xSourceAddress, NULL, NULL );
104108
usGenerateProtocolChecksum_ExpectAndReturn( pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, pdFALSE, ipCORRECT_CRC );
105109

@@ -118,6 +122,7 @@ void test_prvAllowIPPacketIPv6_MulticastAddress()
118122
/* Multicast IPv6 address is FF02::1 */
119123
IPv6_Address_t xMCIPAddress = { 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
120124

125+
pxTCPPacket->xIPHeader.ucVersionTrafficClass = 0x60U;
121126
memcpy( pxTCPPacket->xIPHeader.xDestinationAddress.ucBytes, xMCIPAddress.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
122127

123128
FreeRTOS_FindEndPointOnIP_IPv6_ExpectAndReturn( &( pxTCPPacket->xIPHeader.xSourceAddress ), pxNetworkBuffer->pxEndPoint );
@@ -139,6 +144,7 @@ void test_prvAllowIPPacketIPv6_LoopbackAddress()
139144
TCPPacket_IPv6_t * pxTCPPacket = ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
140145
NetworkEndPoint_t xEndPoint;
141146

147+
pxTCPPacket->xIPHeader.ucVersionTrafficClass = 0x60U;
142148
memcpy( pxTCPPacket->xIPHeader.xSourceAddress.ucBytes, FreeRTOS_in6addr_loopback.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
143149
memcpy( pxTCPPacket->xIPHeader.xDestinationAddress.ucBytes, FreeRTOS_in6addr_loopback.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
144150

@@ -163,6 +169,7 @@ void test_prvAllowIPPacketIPv6_LoopbackNotMatchDest()
163169
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
164170
TCPPacket_IPv6_t * pxTCPPacket = ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
165171

172+
pxTCPPacket->xIPHeader.ucVersionTrafficClass = 0x60U;
166173
pxTCPPacket->xIPHeader.xDestinationAddress.ucBytes[ 15 ] = 0x11;
167174

168175
FreeRTOS_FindEndPointOnIP_IPv6_ExpectAndReturn( &pxTCPPacket->xIPHeader.xSourceAddress, pxNetworkBuffer->pxEndPoint );
@@ -185,6 +192,7 @@ void test_prvAllowIPPacketIPv6_LoopbackNotMatchSrc()
185192
TCPPacket_IPv6_t * pxTCPPacket = ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
186193
NetworkEndPoint_t xEndPoint;
187194

195+
pxTCPPacket->xIPHeader.ucVersionTrafficClass = 0x60U;
188196
memcpy( pxTCPPacket->xIPHeader.xDestinationAddress.ucBytes, FreeRTOS_in6addr_loopback.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
189197

190198
FreeRTOS_FindEndPointOnIP_IPv6_ExpectAndReturn( &pxTCPPacket->xIPHeader.xSourceAddress, &xEndPoint );
@@ -206,6 +214,8 @@ void test_prvAllowIPPacketIPv6_NetworkDown()
206214

207215
pxNetworkBuffer->pxEndPoint = NULL;
208216

217+
pxTCPPacket->xIPHeader.ucVersionTrafficClass = 0x60U;
218+
209219
FreeRTOS_FindEndPointOnIP_IPv6_ExpectAndReturn( &pxTCPPacket->xIPHeader.xSourceAddress, NULL );
210220
FreeRTOS_IsNetworkUp_IgnoreAndReturn( 0 );
211221
FreeRTOS_FindEndPointOnMAC_ExpectAndReturn( &pxTCPPacket->xEthernetHeader.xSourceAddress, NULL, NULL );
@@ -225,6 +235,8 @@ void test_prvAllowIPPacketIPv6_SelfSend()
225235
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
226236
TCPPacket_IPv6_t * pxTCPPacket = ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
227237

238+
pxTCPPacket->xIPHeader.ucVersionTrafficClass = 0x60U;
239+
228240
FreeRTOS_FindEndPointOnMAC_ExpectAndReturn( &pxTCPPacket->xEthernetHeader.xSourceAddress, NULL, pxNetworkBuffer->pxEndPoint );
229241

230242
eResult = prvAllowIPPacketIPv6( &pxTCPPacket->xIPHeader, pxNetworkBuffer, 0U );
@@ -241,6 +253,8 @@ void test_prvAllowIPPacketIPv6_ChecksumError()
241253
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
242254
TCPPacket_IPv6_t * pxTCPPacket = ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
243255

256+
pxTCPPacket->xIPHeader.ucVersionTrafficClass = 0x60U;
257+
244258
FreeRTOS_FindEndPointOnMAC_ExpectAndReturn( &pxTCPPacket->xEthernetHeader.xSourceAddress, NULL, NULL );
245259
usGenerateProtocolChecksum_ExpectAndReturn( pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, pdFALSE, ipWRONG_CRC );
246260

@@ -260,6 +274,8 @@ void test_prvAllowIPPacketIPv6_InvalidPacket()
260274

261275
pxNetworkBuffer->pxEndPoint = NULL;
262276

277+
pxTCPPacket->xIPHeader.ucVersionTrafficClass = 0x60U;
278+
263279
FreeRTOS_FindEndPointOnIP_IPv6_ExpectAndReturn( &pxTCPPacket->xIPHeader.xSourceAddress, NULL );
264280
FreeRTOS_IsNetworkUp_IgnoreAndReturn( 1 );
265281

@@ -285,6 +301,8 @@ void test_prvAllowIPPacketIPv6_EndpointDifferentAddress()
285301
memcpy( xEndpoint.ipv6_settings.xIPAddress.ucBytes, xDiffIPAddress.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
286302
pxNetworkBuffer->pxEndPoint = &xEndpoint;
287303

304+
pxTCPPacket->xIPHeader.ucVersionTrafficClass = 0x60U;
305+
288306
FreeRTOS_FindEndPointOnIP_IPv6_ExpectAndReturn( &( pxTCPPacket->xIPHeader.xSourceAddress ), NULL );
289307
FreeRTOS_IsNetworkUp_IgnoreAndReturn( 1 );
290308

test/unit-test/FreeRTOS_ND/FreeRTOS_ND_utest.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1234,6 +1234,28 @@ void test_prvProcessICMPMessage_IPv6_EP( void )
12341234
TEST_ASSERT_EQUAL( eReturn, eReleaseBuffer );
12351235
}
12361236

1237+
/**
1238+
* @brief This function process ICMP message when message has size
1239+
* less than ICMPv6 header size
1240+
*/
1241+
void test_prvProcessICMPMessage_IPv6_PacketSizeBelowHeaderSize( void )
1242+
{
1243+
NetworkBufferDescriptor_t xNetworkBuffer, * pxNetworkBuffer = &xNetworkBuffer;
1244+
ICMPPacket_IPv6_t xICMPPacket;
1245+
NetworkEndPoint_t xEndPoint;
1246+
eFrameProcessingResult_t eReturn;
1247+
1248+
xEndPoint.bits.bIPv6 = pdTRUE_UNSIGNED;
1249+
xICMPPacket.xICMPHeaderIPv6.ucTypeOfMessage = ipICMP_DEST_UNREACHABLE_IPv6;
1250+
pxNetworkBuffer->pxEndPoint = &xEndPoint;
1251+
pxNetworkBuffer->pucEthernetBuffer = ( uint8_t * ) &xICMPPacket;
1252+
pxNetworkBuffer->xDataLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + 2U;
1253+
1254+
eReturn = prvProcessICMPMessage_IPv6( pxNetworkBuffer );
1255+
1256+
TEST_ASSERT_EQUAL( eReturn, eReleaseBuffer );
1257+
}
1258+
12371259
/**
12381260
* @brief This function process ICMP message when message type is
12391261
* ipICMP_DEST_UNREACHABLE_IPv6.

0 commit comments

Comments
 (0)