Skip to content

Commit 3733583

Browse files
Let valid broadcast packets in when endpoint is not yet up (#1240)
* Let valid broadcast packets in when endpoint is not yet up * Update comments * Fix formatting
1 parent 5cd9e83 commit 3733583

File tree

3 files changed

+108
-5
lines changed

3 files changed

+108
-5
lines changed

source/FreeRTOS_IPv4.c

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -435,20 +435,37 @@ enum eFrameProcessingResult prvAllowIPPacketIPv4( const struct xIP_PACKET * cons
435435
{
436436
/* Endpoint is down */
437437

438+
/* Check if the destination MAC address is a broadcast MAC address. */
439+
if( memcmp( xBroadcastMACAddress.ucBytes,
440+
pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes,
441+
sizeof( MACAddress_t ) ) == 0 )
442+
{
443+
if( ulDestinationIPAddress != FREERTOS_INADDR_BROADCAST )
444+
{
445+
/* Ethernet address is a broadcast address, but the IP address is not a
446+
* broadcast address. */
447+
eReturn = eReleaseBuffer;
448+
}
449+
else
450+
{
451+
/* Accept valid broadcast packet. */
452+
}
453+
}
454+
438455
/* RFC 2131: https://datatracker.ietf.org/doc/html/rfc2131#autoid-8
439456
* The TCP/IP software SHOULD accept and
440457
* forward to the IP layer any IP packets delivered to the client's
441458
* hardware address before the IP address is configured; DHCP servers
442459
* and BOOTP relay agents may not be able to deliver DHCP messages to
443460
* clients that cannot accept hardware unicast datagrams before the
444461
* TCP/IP software is configured. */
445-
if( ( memcmp( pxEndPoint->xMACAddress.ucBytes,
446-
pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes,
447-
sizeof( MACAddress_t ) ) != 0 ) )
462+
else if( ( memcmp( pxEndPoint->xMACAddress.ucBytes,
463+
pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes,
464+
sizeof( MACAddress_t ) ) != 0 ) )
448465
{
449466
/* The endpoint is not up, and the destination MAC address of the
450-
* packet is not matching the endpoint's MAC address. Drop the
451-
* packet. */
467+
* packet is not matching the endpoint's MAC address nor broadcast
468+
* MAC address. Drop the packet. */
452469
eReturn = eReleaseBuffer;
453470
}
454471
else

test/unit-test/FreeRTOS_IPv4/FreeRTOS_IPv4_utest.c

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,88 @@ void test_prvAllowIPPacketIPv4_EndpointDown_UnHappyPath( void )
672672
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
673673
}
674674

675+
/**
676+
* @brief test_prvAllowIPPacketIPv4_EndpointDown_HappyPath
677+
* To validate if prvAllowIPPacketIPv4() returns eProcessBuffer when
678+
* endpoint is down and the packet is broadcast packet with destination
679+
* MAC address as broadcast MAC and the destination IP as broadcast IP
680+
*/
681+
void test_prvAllowIPPacketIPv4_EndpointDown_UnHappyPathBroadcast( void )
682+
{
683+
eFrameProcessingResult_t eResult;
684+
IPPacket_t * pxIPPacket;
685+
NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
686+
UBaseType_t uxHeaderLength = 0;
687+
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
688+
IPHeader_t * pxIPHeader;
689+
NetworkEndPoint_t xEndpoint;
690+
691+
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
692+
693+
pxNetworkBuffer = &xNetworkBuffer;
694+
pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
695+
pxNetworkBuffer->pxEndPoint = &xEndpoint;
696+
pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
697+
pxIPHeader = &( pxIPPacket->xIPHeader );
698+
699+
pxIPHeader->ucVersionHeaderLength = 0x45;
700+
701+
pxIPHeader->ulDestinationIPAddress = 0xFFFFFFFF;
702+
703+
memset( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, 0xFF, sizeof( MACAddress_t ) );
704+
memset( xEndpoint.xMACAddress.ucBytes, 0xCD, sizeof( MACAddress_t ) );
705+
706+
FreeRTOS_IsEndPointUp_ExpectAndReturn( &xEndpoint, pdFALSE );
707+
FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( NULL );
708+
709+
usGenerateChecksum_ExpectAndReturn( 0U, ( uint8_t * ) &( pxIPHeader->ucVersionHeaderLength ), ( size_t ) uxHeaderLength, ipCORRECT_CRC );
710+
711+
usGenerateProtocolChecksum_ExpectAndReturn( ( uint8_t * ) ( pxNetworkBuffer->pucEthernetBuffer ), pxNetworkBuffer->xDataLength, pdFALSE, ipCORRECT_CRC );
712+
713+
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
714+
715+
TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
716+
}
717+
718+
/**
719+
* @brief test_prvAllowIPPacketIPv4_EndpointDown_HappyPath
720+
* To validate if prvAllowIPPacketIPv4() returns eReleaseBuffer when
721+
* endpoint is down and the packet is malformed broadcast packet with destination
722+
* MAC address as broadcast MAC and but the destination IP not broadcast IP
723+
*/
724+
void test_prvAllowIPPacketIPv4_EndpointDown_UnHappyPathIncorrectBroadcast( void )
725+
{
726+
eFrameProcessingResult_t eResult;
727+
IPPacket_t * pxIPPacket;
728+
NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
729+
UBaseType_t uxHeaderLength = 0;
730+
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
731+
IPHeader_t * pxIPHeader;
732+
NetworkEndPoint_t xEndpoint;
733+
734+
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
735+
736+
pxNetworkBuffer = &xNetworkBuffer;
737+
pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
738+
pxNetworkBuffer->pxEndPoint = &xEndpoint;
739+
pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
740+
pxIPHeader = &( pxIPPacket->xIPHeader );
741+
742+
pxIPHeader->ucVersionHeaderLength = 0x45;
743+
744+
pxIPHeader->ulDestinationIPAddress = 0xFFFFABCD;
745+
746+
memset( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, 0xFF, sizeof( MACAddress_t ) );
747+
memset( xEndpoint.xMACAddress.ucBytes, 0xCD, sizeof( MACAddress_t ) );
748+
749+
FreeRTOS_IsEndPointUp_ExpectAndReturn( &xEndpoint, pdFALSE );
750+
751+
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
752+
753+
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
754+
}
755+
756+
675757
/**
676758
* @brief test_prvAllowIPPacketIPv4_DestMACBrdCast_DestIPBroadcastAndIncorrectChkSum
677759
* To validate if prvAllowIPPacketIPv4() when

test/unit-test/FreeRTOS_Sockets/FreeRTOS_Sockets_privates_utest.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ void test_prvFindSelectedSocket_SendFail( void )
110110
{
111111
SocketSelect_t xSocketSet;
112112

113+
xSocketSet.xSelectGroup = NULL;
114+
113115
xEventGroupClearBits_ExpectAndReturn( xSocketSet.xSelectGroup, ( BaseType_t ) eSELECT_CALL_IP, pdFALSE );
114116

115117
xSendEventStructToIPTask_ExpectAnyArgsAndReturn( pdFAIL );
@@ -124,6 +126,8 @@ void test_prvFindSelectedSocket_SendSuccess( void )
124126
{
125127
SocketSelect_t xSocketSet;
126128

129+
xSocketSet.xSelectGroup = NULL;
130+
127131
xEventGroupClearBits_ExpectAndReturn( xSocketSet.xSelectGroup, ( BaseType_t ) eSELECT_CALL_IP, pdFALSE );
128132

129133
xSendEventStructToIPTask_ExpectAnyArgsAndReturn( pdPASS );

0 commit comments

Comments
 (0)