1
0
mirror of https://github.com/FreeRTOS/FreeRTOS-Plus-TCP synced 2025-10-24 12:02:37 +08:00
Files
FreeRTOS-Plus-TCP/test/unit-test/FreeRTOS_IP_DiffConfig/FreeRTOS_IP_DiffConfig_utest.c
Tony Josi 36172f9b66 Fix unit tests wrt. latest dev/IPv6_Integration changes (#740)
* fix ip timers unit tests

* fix FreeRTOS_IP_Utils_DiffConfig_utest tests

* fixed FreeRTOS_IP_Utils_utest

* fix dns cache unit test

* wip arp utests

* fixing arp unit tests

* fix dhcp errors

* clearing structs before usage

* fix dns parser seg fault

* fix dns parser seg fault in unit test

* fix arp uunit tests

* fix arp unit tests

* fixing dns unit test and updating the CBMC proofs

* fixing udp unit tests

* fixing TCP IP unit tests

* fixing TCP IP diffconfig unit tests

* adding additional header file for ARP for declaring missing stub headers

* minor fix

* Uncrustify: triggered by comment

* fixing comments

---------

Co-authored-by: GitHub Action <action@github.com>
2023-02-24 14:41:13 +05:30

1074 lines
38 KiB
C

/*
* FreeRTOS+TCP <DEVELOPMENT BRANCH>
* Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* http://aws.amazon.com/freertos
* http://www.FreeRTOS.org
*/
/* Include Unity header */
#include "unity.h"
/* Include standard libraries */
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include "mock_task.h"
#include "mock_list.h"
/* This must come after list.h is included (in this case, indirectly
* by mock_list.h). */
#include "mock_IP_DiffConfig_list_macros.h"
#include "mock_queue.h"
#include "mock_event_groups.h"
#include "mock_FreeRTOS_IP_Private.h"
#include "mock_FreeRTOS_IP_Utils.h"
#include "mock_FreeRTOS_IP_Timers.h"
#include "mock_FreeRTOS_TCP_IP.h"
#include "mock_FreeRTOS_ICMP.h"
#include "mock_FreeRTOS_ARP.h"
#include "mock_NetworkBufferManagement.h"
#include "mock_NetworkInterface.h"
#include "mock_FreeRTOS_DHCP.h"
#include "mock_FreeRTOS_Sockets.h"
#include "mock_FreeRTOS_Routing.h"
#include "mock_FreeRTOS_DNS.h"
#include "mock_FreeRTOS_Stream_Buffer.h"
#include "mock_FreeRTOS_TCP_WIN.h"
#include "mock_FreeRTOS_UDP_IP.h"
#include "FreeRTOS_IP.h"
/*#include "FreeRTOS_IP_stubs.c" */
#include "catch_assert.h"
#include "FreeRTOSIPConfig.h"
void prvIPTask( void * pvParameters );
void prvProcessIPEventsAndTimers( void );
eFrameProcessingResult_t prvProcessIPPacket( IPPacket_t * pxIPPacket,
NetworkBufferDescriptor_t * const pxNetworkBuffer );
void prvProcessEthernetPacket( NetworkBufferDescriptor_t * const pxNetworkBuffer );
extern BaseType_t xIPTaskInitialised;
extern BaseType_t xNetworkDownEventPending;
extern BaseType_t xNetworkUp;
extern UBaseType_t uxQueueMinimumSpace;
BaseType_t NetworkInterfaceOutputFunction_Stub_Called = 0;
BaseType_t NetworkInterfaceOutputFunction_Stub( struct xNetworkInterface * pxDescriptor,
NetworkBufferDescriptor_t * const pxNetworkBuffer,
BaseType_t xReleaseAfterSend )
{
NetworkInterfaceOutputFunction_Stub_Called++;
return 0;
}
static uint8_t ReleaseTCPPayloadBuffer[ 1500 ];
static BaseType_t ReleaseTCPPayloadBufferxByteCount = 100;
static size_t StubuxStreamBufferGetPtr_ReturnBadAddress( StreamBuffer_t * pxBuffer,
uint8_t ** ppucData,
int lCounter )
{
*ppucData = &ReleaseTCPPayloadBuffer[ 150 ];
return 0xFFFFFF;
}
static size_t StubuxStreamBufferGetPtr_ReturnIncorrectSize( StreamBuffer_t * pxBuffer,
uint8_t ** ppucData,
int lCounter )
{
*ppucData = &ReleaseTCPPayloadBuffer[ 0 ];
return( ReleaseTCPPayloadBufferxByteCount >> 1 );
}
static size_t StubuxStreamBufferGetPtr_ReturnCorrectVals( StreamBuffer_t * pxBuffer,
uint8_t ** ppucData,
int lCounter )
{
*ppucData = &ReleaseTCPPayloadBuffer[ 0 ];
return ReleaseTCPPayloadBufferxByteCount;
}
void test_prvProcessIPEventsAndTimers_NoEventReceived( void )
{
vCheckNetworkTimers_Expect();
xCalculateSleepTime_ExpectAndReturn( 0 );
/* No event received. */
xQueueReceive_ExpectAnyArgsAndReturn( pdFALSE );
prvProcessIPEventsAndTimers();
}
void test_prvProcessIPEventsAndTimers_eNetworkRxEventNULL_LessSpace( void )
{
IPStackEvent_t xReceivedEvent;
BaseType_t xQueueReturn = 100;
xReceivedEvent.eEventType = eNetworkRxEvent;
xReceivedEvent.pvData = NULL;
uxQueueMinimumSpace = xQueueReturn - 10;
vCheckNetworkTimers_Expect();
xCalculateSleepTime_ExpectAndReturn( 0 );
xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
uxQueueSpacesAvailable_ExpectAnyArgsAndReturn( xQueueReturn );
prvProcessIPEventsAndTimers();
TEST_ASSERT_EQUAL( xQueueReturn - 10, uxQueueMinimumSpace );
}
void test_prvProcessIPEventsAndTimers_eNetworkRxEvent_MoreSpace( void )
{
IPStackEvent_t xReceivedEvent;
NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
BaseType_t xQueueReturn = 100;
pxNetworkBuffer = &xNetworkBuffer;
pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
pxNetworkBuffer->xDataLength = sizeof( EthernetHeader_t ) - 1;
pxNetworkBuffer->pxNextBuffer = NULL;
xReceivedEvent.eEventType = eNetworkRxEvent;
xReceivedEvent.pvData = pxNetworkBuffer;
uxQueueMinimumSpace = xQueueReturn + 10;
vCheckNetworkTimers_Expect();
xCalculateSleepTime_ExpectAndReturn( 0 );
xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
uxQueueSpacesAvailable_ExpectAnyArgsAndReturn( xQueueReturn );
vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
prvProcessIPEventsAndTimers();
TEST_ASSERT_EQUAL( xQueueReturn, uxQueueMinimumSpace );
}
void test_prvProcessIPEventsAndTimers_eSocketSelectEvent( void )
{
IPStackEvent_t xReceivedEvent;
SocketSelectMessage_t xData;
BaseType_t xQueueReturn = 100;
memset( &xData, 0, sizeof( xData ) );
xData.pxSocketSet = ( void * ) 0xFFAABBCC;
xData.xTaskhandle = ( void * ) 0xABCDABCD;
xReceivedEvent.eEventType = eSocketSelectEvent;
xReceivedEvent.pvData = ( void * ) &xData;
vCheckNetworkTimers_Expect();
xCalculateSleepTime_ExpectAndReturn( 0 );
xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
uxQueueSpacesAvailable_ExpectAnyArgsAndReturn( xQueueReturn );
vSocketSelect_Expect( ( SocketSelect_t * ) 0xFFAABBCC );
xTaskGenericNotify_ExpectAndReturn( ( TaskHandle_t ) 0xABCDABCD, 0, ( 0 ), eIncrement, NULL, pdPASS );
prvProcessIPEventsAndTimers();
}
TaskHandle_t IPInItHappyPath_xTaskHandleToSet = ( TaskHandle_t ) 0xCDBA9087;
static BaseType_t StubxTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask )
{
*pxCreatedTask = IPInItHappyPath_xTaskHandleToSet;
return pdPASS;
}
void test_FreeRTOS_ReleaseTCPPayloadBuffer_IncorrectBufferAssert( void )
{
FreeRTOS_Socket_t xSocket;
BaseType_t xByteCount = 100, xReturn;
memset( &xSocket, 0, sizeof( xSocket ) );
uxStreamBufferGetPtr_Stub( StubuxStreamBufferGetPtr_ReturnBadAddress );
xReturn = FreeRTOS_ReleaseTCPPayloadBuffer( &xSocket, ReleaseTCPPayloadBuffer, xByteCount );
TEST_ASSERT_EQUAL( pdFAIL, xReturn );
}
void test_FreeRTOS_ReleaseTCPPayloadBuffer_IncorrectSizeAssert( void )
{
FreeRTOS_Socket_t xSocket;
BaseType_t xReturn;
memset( &xSocket, 0, sizeof( xSocket ) );
uxStreamBufferGetPtr_Stub( StubuxStreamBufferGetPtr_ReturnIncorrectSize );
xReturn = FreeRTOS_ReleaseTCPPayloadBuffer( &xSocket, ReleaseTCPPayloadBuffer, ReleaseTCPPayloadBufferxByteCount );
TEST_ASSERT_EQUAL( pdFAIL, xReturn );
}
void test_FreeRTOS_ReleaseTCPPayloadBuffer_IncorrectBytesReleasedAssert( void )
{
FreeRTOS_Socket_t xSocket;
BaseType_t xReturn;
memset( &xSocket, 0, sizeof( xSocket ) );
uxStreamBufferGetPtr_Stub( StubuxStreamBufferGetPtr_ReturnCorrectVals );
FreeRTOS_recv_ExpectAndReturn( &xSocket, NULL, ReleaseTCPPayloadBufferxByteCount, FREERTOS_MSG_DONTWAIT, ( ReleaseTCPPayloadBufferxByteCount >> 1 ) );
xReturn = FreeRTOS_ReleaseTCPPayloadBuffer( &xSocket, ReleaseTCPPayloadBuffer, ReleaseTCPPayloadBufferxByteCount );
TEST_ASSERT_EQUAL( pdFAIL, xReturn );
}
void test_FreeRTOS_ReleaseTCPPayloadBuffer_HappyPath( void )
{
FreeRTOS_Socket_t xSocket;
BaseType_t xReturn;
memset( &xSocket, 0, sizeof( xSocket ) );
uxStreamBufferGetPtr_Stub( StubuxStreamBufferGetPtr_ReturnCorrectVals );
FreeRTOS_recv_ExpectAndReturn( &xSocket, NULL, ReleaseTCPPayloadBufferxByteCount, FREERTOS_MSG_DONTWAIT, ReleaseTCPPayloadBufferxByteCount );
xReturn = FreeRTOS_ReleaseTCPPayloadBuffer( &xSocket, ReleaseTCPPayloadBuffer, ReleaseTCPPayloadBufferxByteCount );
TEST_ASSERT_EQUAL( pdPASS, xReturn );
}
void test_prvAllowIPPacketIPv4_BroadcastSourceIP( void )
{
eFrameProcessingResult_t eResult;
IPPacket_t * pxIPPacket;
NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
UBaseType_t uxHeaderLength = 0;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
IPHeader_t * pxIPHeader;
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
pxNetworkBuffer = &xNetworkBuffer;
pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
pxIPHeader = &( pxIPPacket->xIPHeader );
*ipLOCAL_IP_ADDRESS_POINTER = 0xFFFFFFFF;
pxIPHeader->ucVersionHeaderLength = 0x45;
pxIPHeader->ulDestinationIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
pxIPHeader->ulSourceIPAddress = 0xFFFFFFFF;
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
}
void test_prvAllowIPPacketIPv4_IncorrectSizeFields( void )
{
eFrameProcessingResult_t eResult;
IPPacket_t * pxIPPacket;
NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
UBaseType_t uxHeaderLength = 0;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
IPHeader_t * pxIPHeader;
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
pxNetworkBuffer = &xNetworkBuffer;
pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
pxIPHeader = &( pxIPPacket->xIPHeader );
*ipLOCAL_IP_ADDRESS_POINTER = 0xFFFFFFFF;
pxIPHeader->ucVersionHeaderLength = 0x45;
pxIPHeader->ulDestinationIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
}
void test_prvAllowIPPacketIPv4_UDPCheckSumZero( void )
{
eFrameProcessingResult_t eResult;
IPPacket_t * pxIPPacket;
NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
UBaseType_t uxHeaderLength = 0;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
IPHeader_t * pxIPHeader;
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
pxNetworkBuffer = &xNetworkBuffer;
pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
/* Set correct length. */
pxNetworkBuffer->xDataLength = sizeof( UDPPacket_t );
pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
pxIPHeader = &( pxIPPacket->xIPHeader );
*ipLOCAL_IP_ADDRESS_POINTER = 0xFFFFFFFF;
pxIPHeader->ucVersionHeaderLength = 0x45;
pxIPHeader->ulDestinationIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
/* Correct protocol. */
pxIPHeader->ucProtocol = ipPROTOCOL_UDP;
pxIPHeader->usLength = FreeRTOS_htons( ( ( pxIPHeader->ucVersionHeaderLength & 0x0F ) << 2 ) + sizeof( UDPHeader_t ) );
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
}
void test_prvAllowIPPacketIPv4_UDP_HappyPath( void )
{
eFrameProcessingResult_t eResult;
IPPacket_t * pxIPPacket;
NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
UBaseType_t uxHeaderLength = 0;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
IPHeader_t * pxIPHeader;
ProtocolPacket_t * pxProtPack;
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
pxNetworkBuffer = &xNetworkBuffer;
pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
/* Set correct length. */
pxNetworkBuffer->xDataLength = sizeof( UDPPacket_t );
pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
pxIPHeader = &( pxIPPacket->xIPHeader );
*ipLOCAL_IP_ADDRESS_POINTER = 0xFFFFFFFF;
pxIPHeader->ucVersionHeaderLength = 0x45;
pxIPHeader->ulDestinationIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
/* Correct protocol. */
pxIPHeader->ucProtocol = ipPROTOCOL_UDP;
pxIPHeader->usLength = FreeRTOS_htons( ( ( pxIPHeader->ucVersionHeaderLength & 0x0F ) << 2 ) + sizeof( UDPHeader_t ) );
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
uxHeaderLength = ipSIZE_OF_IPv4_HEADER;
pxProtPack = ( ( ProtocolPacket_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ uxHeaderLength - ipSIZE_OF_IPv4_HEADER ] ) );
/* Non-zero checksum. */
pxProtPack->xUDPPacket.xUDPHeader.usChecksum = 0xFF12;
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
}
void test_prvAllowIPPacketIPv4_TCP_HappyPath( void )
{
eFrameProcessingResult_t eResult;
IPPacket_t * pxIPPacket;
NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
UBaseType_t uxHeaderLength = ipSIZE_OF_IPv4_HEADER;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
IPHeader_t * pxIPHeader;
ProtocolPacket_t * pxProtPack;
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
pxNetworkBuffer = &xNetworkBuffer;
pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
/* Set correct length. */
pxNetworkBuffer->xDataLength = sizeof( TCPPacket_t );
pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
pxIPHeader = &( pxIPPacket->xIPHeader );
*ipLOCAL_IP_ADDRESS_POINTER = 0xFFFFFFFF;
pxIPHeader->ucVersionHeaderLength = 0x45;
pxIPHeader->ulDestinationIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
/* Correct protocol. */
pxIPHeader->ucProtocol = ipPROTOCOL_TCP;
pxIPHeader->usLength = FreeRTOS_htons( ( ( pxIPHeader->ucVersionHeaderLength & 0x0F ) << 2 ) + sizeof( UDPHeader_t ) );
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
}
void test_prvProcessIPPacket_( void )
{
eFrameProcessingResult_t eResult;
IPPacket_t * pxIPPacket;
NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
UBaseType_t uxHeaderLength = 0;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
IPHeader_t * pxIPHeader;
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
pxNetworkBuffer = &xNetworkBuffer;
pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
pxIPHeader = &( pxIPPacket->xIPHeader );
*ipLOCAL_IP_ADDRESS_POINTER = 0xFFFFFFFF;
pxIPHeader->ucVersionHeaderLength = 0x46;
pxIPHeader->ucProtocol = ipPROTOCOL_TCP;
pxIPHeader->ulDestinationIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
pxIPHeader->usLength = FreeRTOS_htons( ( ( pxIPHeader->ucVersionHeaderLength & 0x0F ) << 2 ) + sizeof( TCPHeader_t ) );
pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
}
void test_xCheckSizeFields_BufferLengthLess( void )
{
BaseType_t xReturn;
size_t uxBufferLength = 0;
eFrameProcessingResult_t eResult;
IPPacket_t * pxIPPacket;
UBaseType_t uxHeaderLength = 0;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
IPHeader_t * pxIPHeader;
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
pxIPPacket = ( IPPacket_t * ) ucEthBuffer;
pxIPHeader = &( pxIPPacket->xIPHeader );
*ipLOCAL_IP_ADDRESS_POINTER = 0xFFFFFFFF;
pxIPHeader->ucVersionHeaderLength = 0x46;
pxIPHeader->ucProtocol = ipPROTOCOL_TCP;
pxIPHeader->ulDestinationIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
pxIPHeader->usLength = FreeRTOS_htons( ( ( pxIPHeader->ucVersionHeaderLength & 0x0F ) << 2 ) + sizeof( TCPHeader_t ) );
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
for( uint32_t i = 0; i < sizeof( IPPacket_t ); i++ )
{
uxBufferLength = i;
xReturn = xCheckSizeFields( ucEthBuffer, uxBufferLength );
TEST_ASSERT_EQUAL( pdFAIL, xReturn );
}
}
void test_xCheckSizeFields_HeaderLengthLess( void )
{
BaseType_t xReturn;
size_t uxBufferLength = sizeof( IPPacket_t );
eFrameProcessingResult_t eResult;
IPPacket_t * pxIPPacket;
UBaseType_t uxHeaderLength = 0;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
IPHeader_t * pxIPHeader;
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
pxIPPacket = ( IPPacket_t * ) ucEthBuffer;
pxIPHeader = &( pxIPPacket->xIPHeader );
*ipLOCAL_IP_ADDRESS_POINTER = 0xFFFFFFFF;
/* Value less than 0x45. */
pxIPHeader->ucVersionHeaderLength = 0x45 - 2;
pxIPHeader->ucProtocol = ipPROTOCOL_TCP;
pxIPHeader->ulDestinationIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
pxIPHeader->usLength = FreeRTOS_htons( ( ( pxIPHeader->ucVersionHeaderLength & 0x0F ) << 2 ) + sizeof( TCPHeader_t ) );
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
xReturn = xCheckSizeFields( ucEthBuffer, uxBufferLength );
TEST_ASSERT_EQUAL( pdFAIL, xReturn );
}
void test_xCheckSizeFields_HeaderLengthMore( void )
{
BaseType_t xReturn;
size_t uxBufferLength = sizeof( IPPacket_t );
eFrameProcessingResult_t eResult;
IPPacket_t * pxIPPacket;
UBaseType_t uxHeaderLength = 0;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
IPHeader_t * pxIPHeader;
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
pxIPPacket = ( IPPacket_t * ) ucEthBuffer;
pxIPHeader = &( pxIPPacket->xIPHeader );
*ipLOCAL_IP_ADDRESS_POINTER = 0xFFFFFFFF;
/* Value more than 4F. */
pxIPHeader->ucVersionHeaderLength = 0x4F + 2;
pxIPHeader->ucProtocol = ipPROTOCOL_TCP;
pxIPHeader->ulDestinationIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
pxIPHeader->usLength = FreeRTOS_htons( ( ( pxIPHeader->ucVersionHeaderLength & 0x0F ) << 2 ) + sizeof( TCPHeader_t ) );
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
xReturn = xCheckSizeFields( ucEthBuffer, uxBufferLength );
TEST_ASSERT_EQUAL( pdFAIL, xReturn );
}
void test_xCheckSizeFields_HeaderLengthMoreThanTotalLength( void )
{
BaseType_t xReturn;
size_t uxBufferLength;
eFrameProcessingResult_t eResult;
IPPacket_t * pxIPPacket;
UBaseType_t uxHeaderLength = 0;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
IPHeader_t * pxIPHeader;
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
pxIPPacket = ( IPPacket_t * ) ucEthBuffer;
pxIPHeader = &( pxIPPacket->xIPHeader );
*ipLOCAL_IP_ADDRESS_POINTER = 0xFFFFFFFF;
/* Value more than 4F. */
pxIPHeader->ucVersionHeaderLength = 0x4F;
pxIPHeader->ucProtocol = ipPROTOCOL_TCP;
pxIPHeader->ulDestinationIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
pxIPHeader->usLength = FreeRTOS_htons( ( ( pxIPHeader->ucVersionHeaderLength & 0x0F ) << 2 ) + sizeof( TCPHeader_t ) );
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
uxBufferLength = ( ( pxIPHeader->ucVersionHeaderLength & 0x0F ) << 2 );
xReturn = xCheckSizeFields( ucEthBuffer, uxBufferLength );
TEST_ASSERT_EQUAL( pdFAIL, xReturn );
}
void test_xCheckSizeFields_IPPacketLengthMoreThanTotalLength( void )
{
BaseType_t xReturn;
size_t uxBufferLength;
eFrameProcessingResult_t eResult;
IPPacket_t * pxIPPacket;
UBaseType_t uxHeaderLength = 0;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
IPHeader_t * pxIPHeader;
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
pxIPPacket = ( IPPacket_t * ) ucEthBuffer;
pxIPHeader = &( pxIPPacket->xIPHeader );
*ipLOCAL_IP_ADDRESS_POINTER = 0xFFFFFFFF;
/* Value more than 4F. */
pxIPHeader->ucVersionHeaderLength = 0x4F;
pxIPHeader->ucProtocol = ipPROTOCOL_TCP;
pxIPHeader->ulDestinationIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
pxIPHeader->usLength = FreeRTOS_htons( ( ( pxIPHeader->ucVersionHeaderLength & 0x0F ) << 2 ) + sizeof( TCPHeader_t ) );
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
uxBufferLength = FreeRTOS_ntohs( pxIPHeader->usLength ) - 1;
xReturn = xCheckSizeFields( ucEthBuffer, uxBufferLength );
TEST_ASSERT_EQUAL( pdFAIL, xReturn );
}
void test_xCheckSizeFields_UDP_IncorrectPacketLen( void )
{
BaseType_t xReturn;
size_t uxBufferLength;
eFrameProcessingResult_t eResult;
IPPacket_t * pxIPPacket;
UBaseType_t uxHeaderLength = 0;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
IPHeader_t * pxIPHeader;
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
pxIPPacket = ( IPPacket_t * ) ucEthBuffer;
pxIPHeader = &( pxIPPacket->xIPHeader );
*ipLOCAL_IP_ADDRESS_POINTER = 0xFFFFFFFF;
/* Value more than 4F. */
pxIPHeader->ucVersionHeaderLength = 0x4F;
pxIPHeader->ucProtocol = ipPROTOCOL_UDP;
pxIPHeader->ulDestinationIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
uxBufferLength = ( ( pxIPHeader->ucVersionHeaderLength & 0x0F ) << 2 ) + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_UDP_HEADER - 1;
pxIPHeader->usLength = FreeRTOS_htons( uxBufferLength - ipSIZE_OF_ETH_HEADER );
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
xReturn = xCheckSizeFields( ucEthBuffer, uxBufferLength );
TEST_ASSERT_EQUAL( pdFAIL, xReturn );
}
void test_xCheckSizeFields_TCP_IncorrectPacketLen( void )
{
BaseType_t xReturn;
size_t uxBufferLength;
eFrameProcessingResult_t eResult;
IPPacket_t * pxIPPacket;
UBaseType_t uxHeaderLength = 0;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
IPHeader_t * pxIPHeader;
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
pxIPPacket = ( IPPacket_t * ) ucEthBuffer;
pxIPHeader = &( pxIPPacket->xIPHeader );
*ipLOCAL_IP_ADDRESS_POINTER = 0xFFFFFFFF;
/* Value more than 4F. */
pxIPHeader->ucVersionHeaderLength = 0x4F;
pxIPHeader->ucProtocol = ipPROTOCOL_TCP;
pxIPHeader->ulDestinationIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
uxBufferLength = ( ( pxIPHeader->ucVersionHeaderLength & 0x0F ) << 2 ) + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_TCP_HEADER - 1;
pxIPHeader->usLength = FreeRTOS_htons( uxBufferLength - ipSIZE_OF_ETH_HEADER );
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
xReturn = xCheckSizeFields( ucEthBuffer, uxBufferLength );
TEST_ASSERT_EQUAL( pdFAIL, xReturn );
}
void test_xCheckSizeFields_ICMP_IncorrectPacketLen( void )
{
BaseType_t xReturn;
size_t uxBufferLength;
eFrameProcessingResult_t eResult;
IPPacket_t * pxIPPacket;
UBaseType_t uxHeaderLength = 0;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
IPHeader_t * pxIPHeader;
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
pxIPPacket = ( IPPacket_t * ) ucEthBuffer;
pxIPHeader = &( pxIPPacket->xIPHeader );
*ipLOCAL_IP_ADDRESS_POINTER = 0xFFFFFFFF;
/* Value more than 4F. */
pxIPHeader->ucVersionHeaderLength = 0x4F;
pxIPHeader->ucProtocol = ipPROTOCOL_ICMP;
pxIPHeader->ulDestinationIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
uxBufferLength = ( ( pxIPHeader->ucVersionHeaderLength & 0x0F ) << 2 ) + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_ICMPv4_HEADER - 1;
pxIPHeader->usLength = FreeRTOS_htons( uxBufferLength - ipSIZE_OF_ETH_HEADER );
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
xReturn = xCheckSizeFields( ucEthBuffer, uxBufferLength );
TEST_ASSERT_EQUAL( pdFAIL, xReturn );
}
void test_xCheckSizeFields_IGMP_IncorrectPacketLen( void )
{
BaseType_t xReturn;
size_t uxBufferLength;
eFrameProcessingResult_t eResult;
IPPacket_t * pxIPPacket;
UBaseType_t uxHeaderLength = 0;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
IPHeader_t * pxIPHeader;
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
pxIPPacket = ( IPPacket_t * ) ucEthBuffer;
pxIPHeader = &( pxIPPacket->xIPHeader );
*ipLOCAL_IP_ADDRESS_POINTER = 0xFFFFFFFF;
/* Value more than 4F. */
pxIPHeader->ucVersionHeaderLength = 0x4F;
pxIPHeader->ucProtocol = ipPROTOCOL_IGMP;
pxIPHeader->ulDestinationIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
uxBufferLength = ( ( pxIPHeader->ucVersionHeaderLength & 0x0F ) << 2 ) + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_ICMPv4_HEADER - 1;
pxIPHeader->usLength = FreeRTOS_htons( uxBufferLength - ipSIZE_OF_ETH_HEADER );
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
xReturn = xCheckSizeFields( ucEthBuffer, uxBufferLength );
TEST_ASSERT_EQUAL( pdFAIL, xReturn );
}
void test_xCheckSizeFields_NoProt( void )
{
BaseType_t xReturn;
size_t uxBufferLength;
eFrameProcessingResult_t eResult;
IPPacket_t * pxIPPacket;
UBaseType_t uxHeaderLength = 0;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
IPHeader_t * pxIPHeader;
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
pxIPPacket = ( IPPacket_t * ) ucEthBuffer;
pxIPHeader = &( pxIPPacket->xIPHeader );
*ipLOCAL_IP_ADDRESS_POINTER = 0xFFFFFFFF;
/* Value more than 4F. */
pxIPHeader->ucVersionHeaderLength = 0x4F;
pxIPHeader->ucProtocol = 0;
pxIPHeader->ulDestinationIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
uxBufferLength = ( ( pxIPHeader->ucVersionHeaderLength & 0x0F ) << 2 ) + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_ICMPv4_HEADER - 1;
pxIPHeader->usLength = FreeRTOS_htons( uxBufferLength - ipSIZE_OF_ETH_HEADER );
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
xReturn = xCheckSizeFields( ucEthBuffer, uxBufferLength );
TEST_ASSERT_EQUAL( pdFAIL, xReturn );
}
void test_xCheckSizeFields_UDP_LengthLess( void )
{
BaseType_t xReturn;
size_t uxBufferLength;
eFrameProcessingResult_t eResult;
IPPacket_t * pxIPPacket;
UBaseType_t uxHeaderLength = 0;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
IPHeader_t * pxIPHeader;
ProtocolPacket_t * pxProtPack;
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
pxIPPacket = ( IPPacket_t * ) ucEthBuffer;
pxIPHeader = &( pxIPPacket->xIPHeader );
*ipLOCAL_IP_ADDRESS_POINTER = 0xFFFFFFFF;
/* Value more than 4F. */
pxIPHeader->ucVersionHeaderLength = 0x4F;
pxIPHeader->ucProtocol = ipPROTOCOL_UDP;
pxIPHeader->ulDestinationIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
uxBufferLength = ( ( pxIPHeader->ucVersionHeaderLength & 0x0F ) << 2 ) + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_UDP_HEADER;
pxIPHeader->usLength = FreeRTOS_ntohs( ( ( pxIPHeader->ucVersionHeaderLength & 0x0F ) << 2 ) + sizeof( pxProtPack->xUDPPacket.xUDPHeader ) - 1 );
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
xReturn = xCheckSizeFields( ucEthBuffer, uxBufferLength );
TEST_ASSERT_EQUAL( pdFAIL, xReturn );
}
void test_xCheckSizeFields_UDP_LengthMore( void )
{
BaseType_t xReturn;
size_t uxBufferLength;
eFrameProcessingResult_t eResult;
IPPacket_t * pxIPPacket;
UBaseType_t uxHeaderLength = 0;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
IPHeader_t * pxIPHeader;
ProtocolPacket_t * pxProtPack;
memset( ucEthBuffer, 0, ipconfigTCP_MSS );
pxIPPacket = ( IPPacket_t * ) ucEthBuffer;
pxIPHeader = &( pxIPPacket->xIPHeader );
*ipLOCAL_IP_ADDRESS_POINTER = 0xFFFFFFFF;
/* Value more than 4F. */
pxIPHeader->ucVersionHeaderLength = 0x4F;
pxIPHeader->ucProtocol = ipPROTOCOL_UDP;
pxIPHeader->ulDestinationIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
uxBufferLength = ipconfigNETWORK_MTU + 20;
pxIPHeader->usLength = FreeRTOS_ntohs( ipconfigNETWORK_MTU + 1 );
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
xReturn = xCheckSizeFields( ucEthBuffer, uxBufferLength );
TEST_ASSERT_EQUAL( pdFAIL, xReturn );
}
void test_vReturnEthernetFrame_DuplicationFailed( void )
{
NetworkBufferDescriptor_t xNetworkBuffer;
BaseType_t xReleaseAfterSend = pdFALSE;
NetworkEndPoint_t xEndPoint = { 0 }, * pxEndPoint = &xEndPoint;
xNetworkBuffer.xDataLength = ipconfigETHERNET_MINIMUM_PACKET_BYTES;
pxDuplicateNetworkBufferWithDescriptor_ExpectAndReturn( &xNetworkBuffer, xNetworkBuffer.xDataLength, NULL );
FreeRTOS_FindEndPointOnNetMask_IgnoreAndReturn( pxEndPoint );
vReturnEthernetFrame( &xNetworkBuffer, xReleaseAfterSend );
}
void test_vReturnEthernetFrame_DuplicationSuccess( void )
{
NetworkBufferDescriptor_t xDuplicateNetworkBuffer;
BaseType_t xReleaseAfterSend = pdFALSE;
NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
EthernetHeader_t * pxEthernetHeader;
struct xNetworkInterface xInterface;
NetworkEndPoint_t xEndPoint = { 0 }, * pxEndPoint = &xEndPoint;
pxNetworkBuffer = &xNetworkBuffer;
memset( pxNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
memset( &xDuplicateNetworkBuffer, 0, sizeof( xDuplicateNetworkBuffer ) );
pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
memset( ucEthBuffer, 0xAA, ipconfigTCP_MSS );
memset( pxEndPoint, 0, sizeof( NetworkEndPoint_t ) );
xDuplicateNetworkBuffer.pucEthernetBuffer = ucEthBuffer;
pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
memset( &pxEthernetHeader->xDestinationAddress, 0x11, sizeof( pxEthernetHeader->xDestinationAddress ) );
memset( &pxEthernetHeader->xSourceAddress, 0x22, sizeof( pxEthernetHeader->xSourceAddress ) );
memcpy( pxEndPoint->xMACAddress.ucBytes, ipLOCAL_MAC_ADDRESS, sizeof( MACAddress_t ) );
pxNetworkBuffer->pxEndPoint = &xEndPoint;
xEndPoint.pxNetworkInterface = &xInterfaces;
xInterfaces->pfOutput = &NetworkInterfaceOutputFunction_Stub;
NetworkInterfaceOutputFunction_Stub_Called = 0;
pxNetworkBuffer->xDataLength = ipconfigETHERNET_MINIMUM_PACKET_BYTES;
pxDuplicateNetworkBufferWithDescriptor_ExpectAndReturn( &xNetworkBuffer, xNetworkBuffer.xDataLength, &xDuplicateNetworkBuffer );
FreeRTOS_FindEndPointOnNetMask_IgnoreAndReturn( pxEndPoint );
xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
vReturnEthernetFrame( pxNetworkBuffer, xReleaseAfterSend );
TEST_ASSERT_EQUAL( ipconfigETHERNET_MINIMUM_PACKET_BYTES, pxNetworkBuffer->xDataLength );
TEST_ASSERT_EQUAL( xNetworkBuffer.xDataLength, xDuplicateNetworkBuffer.xDataLength );
TEST_ASSERT_EACH_EQUAL_UINT8( 0x22, &pxEthernetHeader->xDestinationAddress, sizeof( pxEthernetHeader->xDestinationAddress ) );
TEST_ASSERT_EQUAL_MEMORY( ipLOCAL_MAC_ADDRESS, &pxEthernetHeader->xSourceAddress, sizeof( pxEthernetHeader->xSourceAddress ) );
TEST_ASSERT_EQUAL( 1, NetworkInterfaceOutputFunction_Stub_Called );
}
void test_vReturnEthernetFrame( void )
{
NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
BaseType_t xReleaseAfterSend = pdTRUE;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
EthernetHeader_t * pxEthernetHeader;
NetworkEndPoint_t xEndPoint = { 0 }, * pxEndPoint = &xEndPoint;
pxNetworkBuffer = &xNetworkBuffer;
memset( pxNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
memset( ucEthBuffer, 0xAA, ipconfigTCP_MSS );
pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
memset( &pxEthernetHeader->xDestinationAddress, 0x11, sizeof( pxEthernetHeader->xDestinationAddress ) );
memset( &pxEthernetHeader->xSourceAddress, 0x22, sizeof( pxEthernetHeader->xSourceAddress ) );
memcpy( pxEndPoint->xMACAddress.ucBytes, ipLOCAL_MAC_ADDRESS, sizeof( MACAddress_t ) );
pxNetworkBuffer->xDataLength = ipconfigETHERNET_MINIMUM_PACKET_BYTES - 10;
pxNetworkBuffer->pxEndPoint = &xEndPoint;
xEndPoint.pxNetworkInterface = &xInterfaces;
xInterfaces->pfOutput = &NetworkInterfaceOutputFunction_Stub;
NetworkInterfaceOutputFunction_Stub_Called = 0;
FreeRTOS_FindEndPointOnNetMask_IgnoreAndReturn( pxEndPoint );
xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
vReturnEthernetFrame( pxNetworkBuffer, xReleaseAfterSend );
TEST_ASSERT_EQUAL( ipconfigETHERNET_MINIMUM_PACKET_BYTES, pxNetworkBuffer->xDataLength );
TEST_ASSERT_EACH_EQUAL_UINT8( 0, &ucEthBuffer[ ipconfigETHERNET_MINIMUM_PACKET_BYTES - 10 ], 10 );
TEST_ASSERT_EACH_EQUAL_UINT8( 0x22, &pxEthernetHeader->xDestinationAddress, sizeof( pxEthernetHeader->xDestinationAddress ) );
TEST_ASSERT_EQUAL_MEMORY( ipLOCAL_MAC_ADDRESS, &pxEthernetHeader->xSourceAddress, sizeof( pxEthernetHeader->xSourceAddress ) );
TEST_ASSERT_EQUAL( 1, NetworkInterfaceOutputFunction_Stub_Called );
}
void test_vReturnEthernetFrame_DataLenMoreThanRequired( void )
{
NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
BaseType_t xReleaseAfterSend = pdTRUE;
uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
EthernetHeader_t * pxEthernetHeader;
NetworkEndPoint_t xEndPoint = { 0 }, * pxEndPoint = &xEndPoint;
pxNetworkBuffer = &xNetworkBuffer;
memset( pxNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
memset( ucEthBuffer, 0xAA, ipconfigTCP_MSS );
pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
memset( &pxEthernetHeader->xDestinationAddress, 0x11, sizeof( pxEthernetHeader->xDestinationAddress ) );
memset( &pxEthernetHeader->xSourceAddress, 0x22, sizeof( pxEthernetHeader->xSourceAddress ) );
memcpy( pxEndPoint->xMACAddress.ucBytes, ipLOCAL_MAC_ADDRESS, sizeof( MACAddress_t ) );
pxNetworkBuffer->xDataLength = ipconfigETHERNET_MINIMUM_PACKET_BYTES;
pxNetworkBuffer->pxEndPoint = &xEndPoint;
xEndPoint.pxNetworkInterface = &xInterfaces;
xInterfaces->pfOutput = &NetworkInterfaceOutputFunction_Stub;
NetworkInterfaceOutputFunction_Stub_Called = 0;
FreeRTOS_FindEndPointOnNetMask_IgnoreAndReturn( pxEndPoint );
xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
vReturnEthernetFrame( pxNetworkBuffer, xReleaseAfterSend );
TEST_ASSERT_EQUAL( ipconfigETHERNET_MINIMUM_PACKET_BYTES, pxNetworkBuffer->xDataLength );
TEST_ASSERT_EACH_EQUAL_UINT8( 0xAA, &ucEthBuffer[ ipconfigETHERNET_MINIMUM_PACKET_BYTES - 10 ], 10 );
TEST_ASSERT_EACH_EQUAL_UINT8( 0x22, &pxEthernetHeader->xDestinationAddress, sizeof( pxEthernetHeader->xDestinationAddress ) );
TEST_ASSERT_EQUAL_MEMORY( ipLOCAL_MAC_ADDRESS, &pxEthernetHeader->xSourceAddress, sizeof( pxEthernetHeader->xSourceAddress ) );
TEST_ASSERT_EQUAL( 1, NetworkInterfaceOutputFunction_Stub_Called );
}
void test_uxGetMinimumIPQueueSpace( void )
{
UBaseType_t uxReturn;
uxQueueMinimumSpace = 10;
uxReturn = uxGetMinimumIPQueueSpace();
TEST_ASSERT_EQUAL( 10, uxReturn );
}