1
0
mirror of https://github.com/FreeRTOS/FreeRTOS-Plus-TCP synced 2025-10-23 10:07:43 +08:00
Files
FreeRTOS-Plus-TCP/test/unit-test/FreeRTOS_IPv6/FreeRTOS_IPv6_utest.c
ActoryOu a9c6f266d7 [IPv6] Add Unit Test for FreeRTOS_IPv6. (#860)
* Add FreeRTOS_IPv6 unit test framework

* Add test cases for prvAllowIPPacketIPv6

* Add test cases for eHandleIPv6ExtensionHeaders

* Add test cases for IPv6 for first configuration

* AddIPv6 different configuration framework

* Add test cases for xCheckIPv6SizeFields
2023-05-16 12:31:13 +08:00

933 lines
40 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>
/* This must come after list.h is included (in this case, indirectly
* by mock_list.h). */
#include "mock_FreeRTOS_Routing.h"
#include "mock_FreeRTOS_IP.h"
#include "mock_FreeRTOS_IP_Private.h"
#include "FreeRTOS_IP.h"
#include "FreeRTOS_IPv6.h"
#include "catch_assert.h"
#include "FreeRTOSIPConfig.h"
/* =========================== EXTERN VARIABLES =========================== */
/* The basic length for one IPv6 extension headers. */
#define TEST_IPv6_EXTESION_HEADER_LENGTH ( 8U )
/* The default length ofIPv6 extension headers in unit test. */
#define TEST_IPv6_DEFAULT_EXTESION_HEADERS_LENGTH ( 7U * TEST_IPv6_EXTESION_HEADER_LENGTH )
extern const struct xIPv6_Address xIPv6UnspecifiedAddress;
extern const struct xIPv6_Address FreeRTOS_in6addr_loopback;
/* First IPv6 address is 2001:1234:5678::5 */
const IPv6_Address_t xIPAddressFive = { 0x20, 0x01, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05 };
/* Second IPv6 address is 2001:1234:5678::10 */
const IPv6_Address_t xIPAddressTen = { 0x20, 0x01, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 };
/* MAC Address for endpoint. */
const uint8_t ucMACAddress[ ipMAC_ADDRESS_LENGTH_BYTES ] = { 0xab, 0xcd, 0xef, 0x11, 0x22, 0x33 };
/* ======================== Stub Callback Functions ========================= */
static NetworkEndPoint_t * prvInitializeEndpoint()
{
static NetworkEndPoint_t xEndpoint;
memset( &xEndpoint, 0, sizeof( xEndpoint ) );
xEndpoint.bits.bIPv6 = 1U;
memcpy( xEndpoint.ipv6_settings.xIPAddress.ucBytes, xIPAddressFive.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
return &xEndpoint;
}
static NetworkBufferDescriptor_t * prvInitializeNetworkDescriptor()
{
static NetworkBufferDescriptor_t xNetworkBuffer;
static uint8_t pcNetworkBuffer[ sizeof( TCPPacket_IPv6_t ) ];
TCPPacket_IPv6_t * pxTCPPacket = ( TCPPacket_IPv6_t * ) pcNetworkBuffer;
/* Initialize network buffer descriptor. */
memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
xNetworkBuffer.pxEndPoint = prvInitializeEndpoint();
xNetworkBuffer.pucEthernetBuffer = ( uint8_t * ) pxTCPPacket;
xNetworkBuffer.xDataLength = sizeof( TCPPacket_IPv6_t );
/* Initialize network buffer. */
memset( pcNetworkBuffer, 0, sizeof( pcNetworkBuffer ) );
/* Ethernet part. */
memcpy( pxTCPPacket->xEthernetHeader.xDestinationAddress.ucBytes, ucMACAddress, sizeof( ucMACAddress ) );
memcpy( pxTCPPacket->xEthernetHeader.xSourceAddress.ucBytes, ucMACAddress, sizeof( ucMACAddress ) );
pxTCPPacket->xEthernetHeader.usFrameType = ipIPv6_FRAME_TYPE;
/* IP part. */
memcpy( pxTCPPacket->xIPHeader.xSourceAddress.ucBytes, xIPAddressTen.ucBytes, sizeof( IPv6_Address_t ) );
memcpy( pxTCPPacket->xIPHeader.xDestinationAddress.ucBytes, xIPAddressFive.ucBytes, sizeof( IPv6_Address_t ) );
return &xNetworkBuffer;
}
/*
* Prepare a packet have extension with following order. Check if eHandleIPv6ExtensionHeaders determines to process it.
* - ipIPv6_EXT_HEADER_HOP_BY_HOP
* - ipIPv6_EXT_HEADER_ROUTING_HEADER
* - ipIPv6_EXT_HEADER_FRAGMENT_HEADER
* - ipIPv6_EXT_HEADER_SECURE_PAYLOAD
* - ipIPv6_EXT_HEADER_AUTHEN_HEADER
* - ipIPv6_EXT_HEADER_DESTINATION_OPTIONS
* - ipIPv6_EXT_HEADER_MOBILITY_HEADER
*/
static NetworkBufferDescriptor_t * prvInitializeNetworkDescriptorWithExtensionHeader( uint8_t ucProtocol )
{
static NetworkBufferDescriptor_t xNetworkBuffer;
/* Ethernet header + IPv6 header + Maximum protocol header + IPv6 Extension Headers + 1 payload */
static uint8_t pcNetworkBuffer[ sizeof( EthernetHeader_t ) + sizeof( IPHeader_IPv6_t ) + TEST_IPv6_DEFAULT_EXTESION_HEADERS_LENGTH + sizeof( ICMPHeader_IPv6_t ) + 1U ];
EthernetHeader_t * pxEthHeader = ( EthernetHeader_t * ) pcNetworkBuffer;
IPHeader_IPv6_t * pxIPv6Header = ( IPHeader_IPv6_t * ) &( pcNetworkBuffer[ sizeof( EthernetHeader_t ) ] );
uint8_t * pxIPv6ExtHeader = ( uint8_t * ) &( pcNetworkBuffer[ sizeof( EthernetHeader_t ) + sizeof( IPHeader_IPv6_t ) ] );
size_t uxIndex = sizeof( EthernetHeader_t ) + sizeof( IPHeader_IPv6_t );
uint8_t ucProtocolHeaderSize;
if( ucProtocol == ipPROTOCOL_TCP )
{
ucProtocolHeaderSize = sizeof( TCPHeader_t );
}
else if( ucProtocol == ipPROTOCOL_UDP )
{
ucProtocolHeaderSize = sizeof( UDPHeader_t );
}
else if( ucProtocol == ipPROTOCOL_ICMP_IPv6 )
{
ucProtocolHeaderSize = sizeof( ICMPHeader_IPv6_t );
}
else
{
TEST_ASSERT_TRUE( false );
}
/* Initialize network buffer descriptor. */
memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
xNetworkBuffer.pxEndPoint = prvInitializeEndpoint();
xNetworkBuffer.pucEthernetBuffer = ( uint8_t * ) pcNetworkBuffer;
xNetworkBuffer.xDataLength = sizeof( EthernetHeader_t ) + sizeof( IPHeader_IPv6_t ) + TEST_IPv6_DEFAULT_EXTESION_HEADERS_LENGTH + ucProtocolHeaderSize + 1U;
/* Initialize network buffer. */
memset( pcNetworkBuffer, 0, sizeof( pcNetworkBuffer ) );
/* Ethernet part. */
memcpy( pxEthHeader->xDestinationAddress.ucBytes, ucMACAddress, sizeof( ucMACAddress ) );
memcpy( pxEthHeader->xSourceAddress.ucBytes, ucMACAddress, sizeof( ucMACAddress ) );
pxEthHeader->usFrameType = ipIPv6_FRAME_TYPE;
/* IP part. */
memcpy( pxIPv6Header->xSourceAddress.ucBytes, xIPAddressTen.ucBytes, sizeof( IPv6_Address_t ) );
memcpy( pxIPv6Header->xDestinationAddress.ucBytes, xIPAddressFive.ucBytes, sizeof( IPv6_Address_t ) );
pxIPv6Header->usPayloadLength = FreeRTOS_htons( TEST_IPv6_DEFAULT_EXTESION_HEADERS_LENGTH + ucProtocolHeaderSize + 1U ); /* Extension header length + protocol header + payload */
pxIPv6Header->ucNextHeader = ipIPv6_EXT_HEADER_HOP_BY_HOP;
/* Append extension headers */
pcNetworkBuffer[ uxIndex ] = ipIPv6_EXT_HEADER_ROUTING_HEADER;
pcNetworkBuffer[ uxIndex + 1 ] = 0;
uxIndex += 8;
pcNetworkBuffer[ uxIndex ] = ipIPv6_EXT_HEADER_FRAGMENT_HEADER;
pcNetworkBuffer[ uxIndex + 1 ] = 0;
uxIndex += 8;
pcNetworkBuffer[ uxIndex ] = ipIPv6_EXT_HEADER_SECURE_PAYLOAD;
pcNetworkBuffer[ uxIndex + 1 ] = 0;
uxIndex += 8;
pcNetworkBuffer[ uxIndex ] = ipIPv6_EXT_HEADER_AUTHEN_HEADER;
pcNetworkBuffer[ uxIndex + 1 ] = 0;
uxIndex += 8;
pcNetworkBuffer[ uxIndex ] = ipIPv6_EXT_HEADER_DESTINATION_OPTIONS;
pcNetworkBuffer[ uxIndex + 1 ] = 0;
uxIndex += 8;
pcNetworkBuffer[ uxIndex ] = ipIPv6_EXT_HEADER_MOBILITY_HEADER;
pcNetworkBuffer[ uxIndex + 1 ] = 0;
uxIndex += 8;
pcNetworkBuffer[ uxIndex ] = ucProtocol;
pcNetworkBuffer[ uxIndex + 1 ] = 0;
uxIndex += 8;
return &xNetworkBuffer;
}
/* ============================== Test Cases ============================== */
/**
* @brief test_prvAllowIPPacketIPv6_source_unspecified_address
* Prepare a packet with unspecified address in source address.
* Check if prvAllowIPPacketIPv6 determines to release it.
*/
void test_prvAllowIPPacketIPv6_source_unspecified_address()
{
IPHeader_IPv6_t xIPv6Address;
eFrameProcessingResult_t eResult;
memset( &xIPv6Address, 0, sizeof( xIPv6Address ) );
memcpy( xIPv6Address.xDestinationAddress.ucBytes, xIPAddressFive.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
memcpy( xIPv6Address.xSourceAddress.ucBytes, xIPv6UnspecifiedAddress.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
eResult = prvAllowIPPacketIPv6( &xIPv6Address, NULL, 0U );
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
}
/**
* @brief test_prvAllowIPPacketIPv6_destination_unspecified_address
* Prepare a packet with unspecified address in destination address.
* Check if prvAllowIPPacketIPv6 determines to release it.
*/
void test_prvAllowIPPacketIPv6_destination_unspecified_address()
{
IPHeader_IPv6_t xIPv6Address;
eFrameProcessingResult_t eResult;
memset( &xIPv6Address, 0, sizeof( xIPv6Address ) );
memcpy( xIPv6Address.xDestinationAddress.ucBytes, xIPv6UnspecifiedAddress.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
memcpy( xIPv6Address.xSourceAddress.ucBytes, xIPAddressFive.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
eResult = prvAllowIPPacketIPv6( &xIPv6Address, NULL, 0U );
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
}
/**
* @brief test_prvAllowIPPacketIPv6_happy_path
* Prepare a packet from 2001:1234:5678::10 -> 2001:1234:5678::5. And it's not a loopback packet.
* Check if prvAllowIPPacketIPv6 determines to process it.
*/
void test_prvAllowIPPacketIPv6_happy_path()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
TCPPacket_IPv6_t * pxTCPPacket = ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
FreeRTOS_FindEndPointOnMAC_ExpectAndReturn( &pxTCPPacket->xEthernetHeader.xSourceAddress, NULL, NULL );
usGenerateProtocolChecksum_ExpectAndReturn( pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, pdFALSE, ipCORRECT_CRC );
eResult = prvAllowIPPacketIPv6( &pxTCPPacket->xIPHeader, pxNetworkBuffer, 0U );
TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
}
/**
* @brief test_prvAllowIPPacketIPv6_multicast_address
* Prepare a packet from 2001:1234:5678::5 -> FF02::1. Check if prvAllowIPPacketIPv6 determines to process it.
*/
void test_prvAllowIPPacketIPv6_multicast_address()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
TCPPacket_IPv6_t * pxTCPPacket = ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
/* Multicast IPv6 address is FF02::1 */
IPv6_Address_t xMCIPAddress = { 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
memcpy( pxTCPPacket->xIPHeader.xDestinationAddress.ucBytes, xMCIPAddress.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
FreeRTOS_FindEndPointOnMAC_ExpectAndReturn( &pxTCPPacket->xEthernetHeader.xSourceAddress, NULL, NULL );
usGenerateProtocolChecksum_ExpectAndReturn( pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, pdFALSE, ipCORRECT_CRC );
eResult = prvAllowIPPacketIPv6( &pxTCPPacket->xIPHeader, pxNetworkBuffer, 0U );
TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
}
/**
* @brief test_prvAllowIPPacketIPv6_loopback_address
* Prepare a packet from 2001:1234:5678::5 -> ::1.
* Check if prvAllowIPPacketIPv6 determines to process it.
*/
void test_prvAllowIPPacketIPv6_loopback_address()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
TCPPacket_IPv6_t * pxTCPPacket = ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
memcpy( pxTCPPacket->xIPHeader.xSourceAddress.ucBytes, xIPAddressFive.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
memcpy( pxTCPPacket->xIPHeader.xDestinationAddress.ucBytes, FreeRTOS_in6addr_loopback.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
FreeRTOS_FindEndPointOnIP_IPv6_ExpectAndReturn( &pxTCPPacket->xIPHeader.xSourceAddress, pxNetworkBuffer->pxEndPoint );
FreeRTOS_FindEndPointOnMAC_ExpectAndReturn( &pxTCPPacket->xEthernetHeader.xSourceAddress, NULL, NULL );
usGenerateProtocolChecksum_ExpectAndReturn( pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, pdFALSE, ipCORRECT_CRC );
eResult = prvAllowIPPacketIPv6( &pxTCPPacket->xIPHeader, pxNetworkBuffer, 0U );
TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
}
/**
* @brief test_prvAllowIPPacketIPv6_loopback_not_match_dest
* Prepare a packet from 2001:1234:5678::10 -> 2001:1234:5678::11.
* Check if prvAllowIPPacketIPv6 determines to process it.
*/
void test_prvAllowIPPacketIPv6_loopback_not_match_dest()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
TCPPacket_IPv6_t * pxTCPPacket = ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
pxTCPPacket->xIPHeader.xDestinationAddress.ucBytes[ 15 ] = 0x11;
FreeRTOS_FindEndPointOnIP_IPv6_ExpectAndReturn( &pxTCPPacket->xIPHeader.xSourceAddress, pxNetworkBuffer->pxEndPoint );
FreeRTOS_IsNetworkUp_IgnoreAndReturn( 0 );
FreeRTOS_FindEndPointOnMAC_ExpectAndReturn( &pxTCPPacket->xEthernetHeader.xSourceAddress, NULL, NULL );
usGenerateProtocolChecksum_ExpectAndReturn( pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, pdFALSE, ipCORRECT_CRC );
eResult = prvAllowIPPacketIPv6( &pxTCPPacket->xIPHeader, pxNetworkBuffer, 0U );
TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
}
/**
* @brief test_prvAllowIPPacketIPv6_loopback_not_match_src
* Prepare a packet from 2001:1234:5678::10 -> ::1.
* Check if prvAllowIPPacketIPv6 determines to process it.
*/
void test_prvAllowIPPacketIPv6_loopback_not_match_src()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
TCPPacket_IPv6_t * pxTCPPacket = ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
memcpy( pxTCPPacket->xIPHeader.xDestinationAddress.ucBytes, FreeRTOS_in6addr_loopback.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
FreeRTOS_FindEndPointOnIP_IPv6_ExpectAndReturn( &pxTCPPacket->xIPHeader.xSourceAddress, pxNetworkBuffer->pxEndPoint );
FreeRTOS_IsNetworkUp_IgnoreAndReturn( 0 );
FreeRTOS_FindEndPointOnMAC_ExpectAndReturn( &pxTCPPacket->xEthernetHeader.xSourceAddress, NULL, NULL );
usGenerateProtocolChecksum_ExpectAndReturn( pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, pdFALSE, ipCORRECT_CRC );
eResult = prvAllowIPPacketIPv6( &pxTCPPacket->xIPHeader, pxNetworkBuffer, 0U );
TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
}
/**
* @brief test_prvAllowIPPacketIPv6_network_down
* Prepare a packet from 2001:1234:5678::10 -> 2001:1234:5678::FFFF when network is down.
* Check if prvAllowIPPacketIPv6 determines to process it.
*/
void test_prvAllowIPPacketIPv6_network_down()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
TCPPacket_IPv6_t * pxTCPPacket = ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
pxNetworkBuffer->pxEndPoint = NULL;
FreeRTOS_FindEndPointOnIP_IPv6_ExpectAndReturn( &pxTCPPacket->xIPHeader.xSourceAddress, NULL );
FreeRTOS_IsNetworkUp_IgnoreAndReturn( 0 );
FreeRTOS_FindEndPointOnMAC_ExpectAndReturn( &pxTCPPacket->xEthernetHeader.xSourceAddress, NULL, NULL );
usGenerateProtocolChecksum_ExpectAndReturn( pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, pdFALSE, ipCORRECT_CRC );
eResult = prvAllowIPPacketIPv6( &pxTCPPacket->xIPHeader, pxNetworkBuffer, 0U );
TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
}
/**
* @brief test_prvAllowIPPacketIPv6_happy_path
* Prepare a packet from 2001:1234:5678::10 -> 2001:1234:5678::5. And the source MAC address in packet is same as endpoint.
* Check if prvAllowIPPacketIPv6 determines to process it.
*/
void test_prvAllowIPPacketIPv6_self_send()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
TCPPacket_IPv6_t * pxTCPPacket = ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
FreeRTOS_FindEndPointOnMAC_ExpectAndReturn( &pxTCPPacket->xEthernetHeader.xSourceAddress, NULL, pxNetworkBuffer->pxEndPoint );
eResult = prvAllowIPPacketIPv6( &pxTCPPacket->xIPHeader, pxNetworkBuffer, 0U );
TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
}
/**
* @brief test_prvAllowIPPacketIPv6_checksum_error
* Prepare a packet from 2001:1234:5678::10 -> 2001:1234:5678::5. But the checksum is wrong.
* Check if prvAllowIPPacketIPv6 determines to release it.
*/
void test_prvAllowIPPacketIPv6_checksum_error()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
TCPPacket_IPv6_t * pxTCPPacket = ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
FreeRTOS_FindEndPointOnMAC_ExpectAndReturn( &pxTCPPacket->xEthernetHeader.xSourceAddress, NULL, NULL );
usGenerateProtocolChecksum_ExpectAndReturn( pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, pdFALSE, ipWRONG_CRC );
eResult = prvAllowIPPacketIPv6( &pxTCPPacket->xIPHeader, pxNetworkBuffer, 0U );
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
}
/**
* @brief test_prvAllowIPPacketIPv6_invalid_packet
* Prepare a packet from 2001:1234:5678::10 -> 2001:1234:5678::5. But there is no rule to process this packet.
* Check if prvAllowIPPacketIPv6 determines to release it.
*/
void test_prvAllowIPPacketIPv6_invalid_packet()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
TCPPacket_IPv6_t * pxTCPPacket = ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
pxNetworkBuffer->pxEndPoint = NULL;
FreeRTOS_FindEndPointOnIP_IPv6_ExpectAndReturn( &pxTCPPacket->xIPHeader.xSourceAddress, NULL );
FreeRTOS_IsNetworkUp_IgnoreAndReturn( 1 );
eResult = prvAllowIPPacketIPv6( &pxTCPPacket->xIPHeader, pxNetworkBuffer, 0U );
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
}
/**
* @brief test_prvAllowIPPacketIPv6_endpoint_different_address
* Prepare a packet from 2001:1234:5678::10 -> 2001:1234:5678::5. But the address in endpoint in network descriptor is different from packet.
* Check if prvAllowIPPacketIPv6 determines to lease it.
*/
void test_prvAllowIPPacketIPv6_endpoint_different_address()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
TCPPacket_IPv6_t * pxTCPPacket = ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
NetworkEndPoint_t xEndpoint;
/* Different IPv6 address is 2001:1234:5678::FFFF */
IPv6_Address_t xDiffIPAddress = { 0x20, 0x01, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF };
memset( &xEndpoint, 0, sizeof( xEndpoint ) );
xEndpoint.bits.bIPv6 = 1U;
memcpy( xEndpoint.ipv6_settings.xIPAddress.ucBytes, xDiffIPAddress.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
pxNetworkBuffer->pxEndPoint = &xEndpoint;
FreeRTOS_FindEndPointOnIP_IPv6_ExpectAndReturn( &( pxTCPPacket->xIPHeader.xSourceAddress ), NULL );
FreeRTOS_IsNetworkUp_IgnoreAndReturn( 1 );
eResult = prvAllowIPPacketIPv6( &( pxTCPPacket->xIPHeader ), pxNetworkBuffer, 0U );
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
}
/**
* @brief test_eHandleIPv6ExtensionHeaders_TCP_happy_path
* Prepare a packet have extension with following order. Check if eHandleIPv6ExtensionHeaders determines to process it.
* - ipIPv6_EXT_HEADER_HOP_BY_HOP
* - ipIPv6_EXT_HEADER_ROUTING_HEADER
* - ipIPv6_EXT_HEADER_FRAGMENT_HEADER
* - ipIPv6_EXT_HEADER_SECURE_PAYLOAD
* - ipIPv6_EXT_HEADER_AUTHEN_HEADER
* - ipIPv6_EXT_HEADER_DESTINATION_OPTIONS
* - ipIPv6_EXT_HEADER_MOBILITY_HEADER
* - ipPROTOCOL_TCP
* - 1 byte payload
*/
void test_eHandleIPv6ExtensionHeaders_TCP_happy_path()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptorWithExtensionHeader( ipPROTOCOL_TCP );
TCPHeader_t * pxProtocolHeader = ( TCPHeader_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + TEST_IPv6_DEFAULT_EXTESION_HEADERS_LENGTH ] );
uint8_t * pxPayload;
pxPayload = ( uint8_t * ) ( pxProtocolHeader + 1 );
*pxPayload = 'a';
eResult = eHandleIPv6ExtensionHeaders( pxNetworkBuffer, pdTRUE );
TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
TEST_ASSERT_EQUAL( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + sizeof( TCPHeader_t ) + 1U, pxNetworkBuffer->xDataLength );
}
/**
* @brief test_eHandleIPv6ExtensionHeaders_UDP_happy_path
* Prepare a packet have extension with following order. Check if eHandleIPv6ExtensionHeaders determines to process it.
* - ipIPv6_EXT_HEADER_HOP_BY_HOP
* - ipIPv6_EXT_HEADER_ROUTING_HEADER
* - ipIPv6_EXT_HEADER_FRAGMENT_HEADER
* - ipIPv6_EXT_HEADER_SECURE_PAYLOAD
* - ipIPv6_EXT_HEADER_AUTHEN_HEADER
* - ipIPv6_EXT_HEADER_DESTINATION_OPTIONS
* - ipIPv6_EXT_HEADER_MOBILITY_HEADER
* - ipPROTOCOL_UDP
* - 1 byte payload
*/
void test_eHandleIPv6ExtensionHeaders_UDP_happy_path()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptorWithExtensionHeader( ipPROTOCOL_UDP );
UDPHeader_t * pxProtocolHeader = ( UDPHeader_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + TEST_IPv6_DEFAULT_EXTESION_HEADERS_LENGTH ] );
uint8_t * pxPayload;
pxPayload = ( uint8_t * ) ( pxProtocolHeader + 1 );
*pxPayload = 'a';
eResult = eHandleIPv6ExtensionHeaders( pxNetworkBuffer, pdTRUE );
TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
TEST_ASSERT_EQUAL( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + sizeof( UDPHeader_t ) + 1U, pxNetworkBuffer->xDataLength );
}
/**
* @brief test_eHandleIPv6ExtensionHeaders_ICMPv6_happy_path
* Prepare a packet have extension with following order. Check if eHandleIPv6ExtensionHeaders determines to process it.
* - ipIPv6_EXT_HEADER_HOP_BY_HOP
* - ipIPv6_EXT_HEADER_ROUTING_HEADER
* - ipIPv6_EXT_HEADER_FRAGMENT_HEADER
* - ipIPv6_EXT_HEADER_SECURE_PAYLOAD
* - ipIPv6_EXT_HEADER_AUTHEN_HEADER
* - ipIPv6_EXT_HEADER_DESTINATION_OPTIONS
* - ipIPv6_EXT_HEADER_MOBILITY_HEADER
* - ipPROTOCOL_ICMP_IPv6
* - 1 byte payload
*/
void test_eHandleIPv6ExtensionHeaders_ICMPv6_happy_path()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptorWithExtensionHeader( ipPROTOCOL_ICMP_IPv6 );
ICMPHeader_IPv6_t * pxProtocolHeader = ( ICMPHeader_IPv6_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + TEST_IPv6_DEFAULT_EXTESION_HEADERS_LENGTH ] );
uint8_t * pxPayload;
pxPayload = ( uint8_t * ) ( pxProtocolHeader + 1 );
*pxPayload = 'a';
eResult = eHandleIPv6ExtensionHeaders( pxNetworkBuffer, pdTRUE );
TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
TEST_ASSERT_EQUAL( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + sizeof( ICMPHeader_IPv6_t ) + 1U, pxNetworkBuffer->xDataLength );
}
/**
* @brief test_eHandleIPv6ExtensionHeaders_TCP_happy_path_not_remove
* Prepare a packet have extension with following order. Check if eHandleIPv6ExtensionHeaders determines to release it due to not support.
* And the extension headers still exist.
* - ipIPv6_EXT_HEADER_HOP_BY_HOP
* - ipIPv6_EXT_HEADER_ROUTING_HEADER
* - ipIPv6_EXT_HEADER_FRAGMENT_HEADER
* - ipIPv6_EXT_HEADER_SECURE_PAYLOAD
* - ipIPv6_EXT_HEADER_AUTHEN_HEADER
* - ipIPv6_EXT_HEADER_DESTINATION_OPTIONS
* - ipIPv6_EXT_HEADER_MOBILITY_HEADER
* - ipPROTOCOL_TCP
* - 1 byte payload
*/
void test_eHandleIPv6ExtensionHeaders_TCP_happy_path_not_remove()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptorWithExtensionHeader( ipPROTOCOL_TCP );
TCPHeader_t * pxProtocolHeader = ( TCPHeader_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + TEST_IPv6_DEFAULT_EXTESION_HEADERS_LENGTH ] );
uint8_t * pxPayload;
pxPayload = ( uint8_t * ) ( pxProtocolHeader + 1 );
*pxPayload = 'a';
eResult = eHandleIPv6ExtensionHeaders( pxNetworkBuffer, pdFALSE );
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
TEST_ASSERT_EQUAL( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + TEST_IPv6_DEFAULT_EXTESION_HEADERS_LENGTH + sizeof( TCPHeader_t ) + 1U, pxNetworkBuffer->xDataLength );
}
/**
* @brief test_eHandleIPv6ExtensionHeaders_hop_by_hop_in_wrong_order
* Prepare a packet have extension with following order. Check if eHandleIPv6ExtensionHeaders determines to release it.
* - ipIPv6_EXT_HEADER_ROUTING_HEADER
* - ipIPv6_EXT_HEADER_HOP_BY_HOP
* - ipPROTOCOL_TCP
*/
void test_eHandleIPv6ExtensionHeaders_hop_by_hop_in_wrong_order()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptorWithExtensionHeader( ipPROTOCOL_TCP );
IPHeader_IPv6_t * pxIPv6Header = ( IPHeader_IPv6_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER ] );
size_t uxIndex = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER;
/* Modify the extension header */
pxIPv6Header->ucNextHeader = ipIPv6_EXT_HEADER_ROUTING_HEADER;
pxNetworkBuffer->pucEthernetBuffer[ uxIndex ] = ipIPv6_EXT_HEADER_HOP_BY_HOP;
pxNetworkBuffer->pucEthernetBuffer[ uxIndex + 1 ] = 0;
uxIndex += 8;
pxNetworkBuffer->pucEthernetBuffer[ uxIndex ] = ipPROTOCOL_TCP;
pxNetworkBuffer->pucEthernetBuffer[ uxIndex + 1 ] = 0;
uxIndex += 8;
eResult = eHandleIPv6ExtensionHeaders( pxNetworkBuffer, pdTRUE );
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
}
/**
* @brief test_eHandleIPv6ExtensionHeaders_short_buffer_length
* Prepare a packet with 0 buffer length. Check if eHandleIPv6ExtensionHeaders determines to release it.
*/
void test_eHandleIPv6ExtensionHeaders_short_buffer_length()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptor();
pxNetworkBuffer->xDataLength = 0;
eResult = eHandleIPv6ExtensionHeaders( pxNetworkBuffer, pdTRUE );
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
}
/**
* @brief test_eHandleIPv6ExtensionHeaders_small_IP_payload_length
* Prepare a packet with small IP payload length. Check if eHandleIPv6ExtensionHeaders determines to release it.
*/
void test_eHandleIPv6ExtensionHeaders_small_IP_payload_length()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptorWithExtensionHeader( ipPROTOCOL_TCP );
IPPacket_IPv6_t * pxIPPacket_IPv6 = ( ( IPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer );
pxIPPacket_IPv6->xIPHeader.usPayloadLength = FreeRTOS_htons( 20 ); /* Need to remove 56 bytes extension header but only 20 bytes length set in IP header. */
eResult = eHandleIPv6ExtensionHeaders( pxNetworkBuffer, pdTRUE );
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
}
/**
* @brief test_eHandleIPv6ExtensionHeaders_large_extension_header
* Prepare a packet with large extension header length. Check if eHandleIPv6ExtensionHeaders determines to release it.
*/
void test_eHandleIPv6ExtensionHeaders_large_extension_header()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptorWithExtensionHeader( ipPROTOCOL_TCP );
IPHeader_IPv6_t * pxIPv6Header = ( IPHeader_IPv6_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER ] );
size_t uxIndex = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER;
/* Modify the extension header */
pxIPv6Header->ucNextHeader = ipIPv6_EXT_HEADER_HOP_BY_HOP;
pxNetworkBuffer->pucEthernetBuffer[ uxIndex ] = ipIPv6_EXT_HEADER_ROUTING_HEADER;
pxNetworkBuffer->pucEthernetBuffer[ uxIndex + 1 ] = 200U; /* Extension header length is set to 200*8 + 8, which is larger than buffer size. */
uxIndex += 8;
pxNetworkBuffer->pucEthernetBuffer[ uxIndex ] = ipPROTOCOL_TCP;
pxNetworkBuffer->pucEthernetBuffer[ uxIndex + 1 ] = 0;
uxIndex += 8;
eResult = eHandleIPv6ExtensionHeaders( pxNetworkBuffer, pdTRUE );
TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
}
/**
* @brief test_eHandleIPv6ExtensionHeaders_unknown_extension_header
* Prepare a packet with unknown extension header. Check if eHandleIPv6ExtensionHeaders can skip it and process it.
*/
void test_eHandleIPv6ExtensionHeaders_unknown_extension_header()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptorWithExtensionHeader( ipPROTOCOL_TCP );
IPHeader_IPv6_t * pxIPv6Header = ( IPHeader_IPv6_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER ] );
/* Modify the extension header to 0x7F (unknown) */
pxIPv6Header->ucNextHeader = 0x7F;
eResult = eHandleIPv6ExtensionHeaders( pxNetworkBuffer, pdTRUE );
TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
}
/**
* @brief test_eHandleIPv6ExtensionHeaders_dest_then_routing
* Prepare a packet with specific extension header order - destination -> routing.
* Check if eHandleIPv6ExtensionHeaders determines to process it.
*/
void test_eHandleIPv6ExtensionHeaders_dest_then_routing()
{
eFrameProcessingResult_t eResult;
NetworkBufferDescriptor_t * pxNetworkBuffer = prvInitializeNetworkDescriptorWithExtensionHeader( ipPROTOCOL_TCP );
IPHeader_IPv6_t * pxIPv6Header = ( IPHeader_IPv6_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER ] );
size_t uxIndex = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER;
pxIPv6Header->ucNextHeader = ipIPv6_EXT_HEADER_DESTINATION_OPTIONS;
pxNetworkBuffer->pucEthernetBuffer[ uxIndex ] = ipIPv6_EXT_HEADER_ROUTING_HEADER;
pxNetworkBuffer->pucEthernetBuffer[ uxIndex + 1 ] = 0U;
eResult = eHandleIPv6ExtensionHeaders( pxNetworkBuffer, pdTRUE );
TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
}
/**
* @brief test_xIsIPv6AllowedMulticast_zero_scope
* Prepare a IPv6 addresses FF00:: ~ FFF0::. Check if xIsIPv6AllowedMulticast returns pdFALSE.
*/
void test_xIsIPv6AllowedMulticast_zero_scope()
{
IPv6_Address_t xMulticastZeroGroupID = { 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
BaseType_t xReturn;
uint16_t ucScope;
for( ucScope = 0x0; ucScope <= 0xF0; ucScope += 0x10 )
{
xMulticastZeroGroupID.ucBytes[ 1 ] = ( uint8_t ) ucScope;
xReturn = xIsIPv6AllowedMulticast( &xMulticastZeroGroupID );
TEST_ASSERT_EQUAL( pdFALSE, xReturn );
}
}
/**
* @brief test_xIsIPv6AllowedMulticast_reserved_address
* Prepare IPv6 addresses FF00:: ~ FF0F::. Check if xIsIPv6AllowedMulticast returns pdTRUE.
*/
void test_xIsIPv6AllowedMulticast_reserved_address()
{
IPv6_Address_t xMulticastZeroFlag = { 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
BaseType_t xReturn;
uint8_t ucFlag;
for( ucFlag = 0x0; ucFlag <= 0xF; ucFlag++ )
{
xMulticastZeroFlag.ucBytes[ 1 ] = ucFlag;
xReturn = xIsIPv6AllowedMulticast( &xMulticastZeroFlag );
TEST_ASSERT_EQUAL( pdFALSE, xReturn );
}
}
/**
* @brief test_xIsIPv6AllowedMulticast_valid_address
* Prepare IPv6 address FF11::1. Check if xIsIPv6AllowedMulticast returns pdTRUE.
*/
void test_xIsIPv6AllowedMulticast_valid_address()
{
IPv6_Address_t xMulticastZeroFlag = { 0xFF, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
BaseType_t xReturn;
xReturn = xIsIPv6AllowedMulticast( &xMulticastZeroFlag );
TEST_ASSERT_EQUAL( pdTRUE, xReturn );
}
/**
* @brief test_xCompareIPv6_Address_LLMNR
* Prepare IPv6 address below. Check if xIsIPv6AllowedMulticast returns 0.
* - Left: 2001::00AB:CDEF
* - Right: FF02::FFAB:CDEF
*/
void test_xCompareIPv6_Address_LLMNR()
{
BaseType_t xReturn;
IPv6_Address_t xLeftAddress = { 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0xcd, 0xef };
IPv6_Address_t xRightAddress = { 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xab, 0xcd, 0xef };
xReturn = xCompareIPv6_Address( &xLeftAddress, &xRightAddress, 16 );
TEST_ASSERT_EQUAL( 0, xReturn );
}
/**
* @brief test_xCompareIPv6_Address_all_nodes
* Prepare IPv6 address below. Check if xIsIPv6AllowedMulticast returns 0.
* - Left: 2001::00AB:CDEF
* - Right: FF02::1
*/
void test_xCompareIPv6_Address_all_nodes()
{
BaseType_t xReturn;
IPv6_Address_t xLeftAddress = { 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0xcd, 0xef };
IPv6_Address_t xRightAddress = { 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
xReturn = xCompareIPv6_Address( &xLeftAddress, &xRightAddress, 16 );
TEST_ASSERT_EQUAL( 0, xReturn );
}
/**
* @brief test_xCompareIPv6_Address_both_local_addresses
* Prepare IPv6 address below. Check if xIsIPv6AllowedMulticast returns 0.
* - Left: FE80::1
* - Right: FE80::2
*/
void test_xCompareIPv6_Address_both_local_addresses()
{
BaseType_t xReturn;
IPv6_Address_t xLeftAddress = { 0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
IPv6_Address_t xRightAddress = { 0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 };
xReturn = xCompareIPv6_Address( &xLeftAddress, &xRightAddress, 16 );
TEST_ASSERT_EQUAL( 0, xReturn );
}
/**
* @brief test_xCompareIPv6_Address_coverage_local_address_left_FF80
* Prepare IPv6 address below. Check if xIsIPv6AllowedMulticast returns 0.
* - Left: FF80::1
* - Right: FE80::2
*/
void test_xCompareIPv6_Address_coverage_local_address_left_FF80()
{
BaseType_t xReturn;
IPv6_Address_t xLeftAddress = { 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
IPv6_Address_t xRightAddress = { 0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 };
xReturn = xCompareIPv6_Address( &xLeftAddress, &xRightAddress, 128 );
TEST_ASSERT_NOT_EQUAL( 0, xReturn );
}
/**
* @brief test_xCompareIPv6_Address_coverage_local_address_left_FE81
* Prepare IPv6 address below. Check if xIsIPv6AllowedMulticast returns 0.
* - Left: FE81::1
* - Right: FE80::2
*/
void test_xCompareIPv6_Address_coverage_local_address_left_FE81()
{
BaseType_t xReturn;
IPv6_Address_t xLeftAddress = { 0xFE, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
IPv6_Address_t xRightAddress = { 0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 };
xReturn = xCompareIPv6_Address( &xLeftAddress, &xRightAddress, 128 );
TEST_ASSERT_NOT_EQUAL( 0, xReturn );
}
/**
* @brief test_xCompareIPv6_Address_coverage_local_address_right_FF80
* Prepare IPv6 address below. Check if xIsIPv6AllowedMulticast returns 0.
* - Left: FE80::1
* - Right: FF80::2
*/
void test_xCompareIPv6_Address_coverage_local_address_right_FF80()
{
BaseType_t xReturn;
IPv6_Address_t xLeftAddress = { 0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
IPv6_Address_t xRightAddress = { 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 };
xReturn = xCompareIPv6_Address( &xLeftAddress, &xRightAddress, 128 );
TEST_ASSERT_NOT_EQUAL( 0, xReturn );
}
/**
* @brief test_xCompareIPv6_Address_coverage_local_address_right_FE81
* Prepare IPv6 address below. Check if xIsIPv6AllowedMulticast returns 0.
* - Left: FE80::1
* - Right: FE81::2
*/
void test_xCompareIPv6_Address_coverage_local_address_right_FE81()
{
BaseType_t xReturn;
IPv6_Address_t xLeftAddress = { 0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
IPv6_Address_t xRightAddress = { 0xFE, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 };
xReturn = xCompareIPv6_Address( &xLeftAddress, &xRightAddress, 128 );
TEST_ASSERT_NOT_EQUAL( 0, xReturn );
}
/**
* @brief test_xCompareIPv6_Address_zero_prefix_length
* Prepare IPv6 address below. With prefix length 0, xCompareIPv6_Address should take all IP address as same region.
* - Left: 2001:1234:5678::5
* - Right: 2001:1234:5678::10
*/
void test_xCompareIPv6_Address_zero_prefix_length()
{
BaseType_t xReturn;
xReturn = xCompareIPv6_Address( &xIPAddressFive, &xIPAddressTen, 0 );
TEST_ASSERT_EQUAL( 0, xReturn );
}
/**
* @brief test_xCompareIPv6_Address_same_address_prefix_128
* Prepare IPv6 address below. With prefix length 128, xCompareIPv6_Address should compare whole IP address.
* - Left: 2001:1234:5678::5
* - Right: 2001:1234:5678::5
*/
void test_xCompareIPv6_Address_same_address_prefix_128()
{
BaseType_t xReturn;
xReturn = xCompareIPv6_Address( &xIPAddressFive, &xIPAddressFive, 128 );
TEST_ASSERT_EQUAL( 0, xReturn );
}
/**
* @brief test_xCompareIPv6_Address_same_region_prefix_64
* Prepare IPv6 address below. With prefix length 64, xCompareIPv6_Address should compare first 64 bit of IP address.
* - Left: 2001:1234:5678::5
* - Right: 2001:1234:5678::10
*/
void test_xCompareIPv6_Address_same_region_prefix_64()
{
BaseType_t xReturn;
xReturn = xCompareIPv6_Address( &xIPAddressFive, &xIPAddressTen, 64 );
TEST_ASSERT_EQUAL( 0, xReturn );
}
/**
* @brief test_xCompareIPv6_Address_different_region_prefix_64
* Prepare IPv6 address below. With prefix length 64, xCompareIPv6_Address should compare first 64 bit of IP address.
* - Left: 2001:1234:5678::5
* - Right: FF01::10
*/
void test_xCompareIPv6_Address_different_region_prefix_64()
{
BaseType_t xReturn;
IPv6_Address_t xRightAddress = { 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 };
xReturn = xCompareIPv6_Address( &xIPAddressFive, &xRightAddress, 64 );
TEST_ASSERT_NOT_EQUAL( 0, xReturn );
}
/**
* @brief test_xCompareIPv6_Address_different_region_prefix_4
* Prepare IPv6 address below. With prefix length 4, xCompareIPv6_Address should compare first 4 bit of IP address.
* - Left: 2001:1234:5678::5
* - Right: 4001:1234:5678::5
*/
void test_xCompareIPv6_Address_different_region_prefix_4()
{
BaseType_t xReturn;
IPv6_Address_t xRightAddress;
memcpy( xRightAddress.ucBytes, &xIPAddressFive, ipSIZE_OF_IPv6_ADDRESS );
xRightAddress.ucBytes[ 0 ] = 0x40;
xReturn = xCompareIPv6_Address( &xIPAddressFive, &xRightAddress, 4 );
TEST_ASSERT_NOT_EQUAL( 0, xReturn );
}
/**
* @brief test_xCompareIPv6_Address_different_region_prefix_44
* Prepare IPv6 address below. With prefix length 44, xCompareIPv6_Address should compare first 44 bit of IP address.
* - Left: 2001:1234:5678::5
* - Right: 2001:1234:5688::5
*/
void test_xCompareIPv6_Address_different_region_prefix_44()
{
BaseType_t xReturn;
IPv6_Address_t xRightAddress;
memcpy( xRightAddress.ucBytes, &xIPAddressFive, ipSIZE_OF_IPv6_ADDRESS );
xRightAddress.ucBytes[ 5 ] = 0x88;
xReturn = xCompareIPv6_Address( &xIPAddressFive, &xRightAddress, 44 );
TEST_ASSERT_NOT_EQUAL( 0, xReturn );
}
/**
* @brief test_xCompareIPv6_Address_same_region_prefix_44
* Prepare IPv6 address below. With prefix length 44, xCompareIPv6_Address should compare first 44 bit of IP address.
* - Left: 2001:1234:5678::5
* - Right: 2001:1234:5678::10
*/
void test_xCompareIPv6_Address_same_region_prefix_44()
{
BaseType_t xReturn;
xReturn = xCompareIPv6_Address( &xIPAddressFive, &xIPAddressTen, 44 );
TEST_ASSERT_EQUAL( 0, xReturn );
}