diff options
author | Petri Savolainen <petri.savolainen@nokia.com> | 2021-04-14 13:34:28 +0300 |
---|---|---|
committer | Petri Savolainen <petri.savolainen@nokia.com> | 2021-04-19 10:09:53 +0300 |
commit | 994c22698fa9617ca918f904684066096858f287 (patch) | |
tree | beb904f1f901905a3ae399c6bd620648ffcfa907 /test/validation/api | |
parent | 6f50e77074fa5c42cb60bfd55be882efcbffccc9 (diff) |
validation: hash: add Ethernet frame CRC tests
Test odp_hash_crc32() correctness with Ethernet test packets
that include a correct Ethernet FCS at the end of the packet
(last 4 bytes). When CRC32 calculation includes FCS, the
result (0xdebb20e3) is common for all packets.
Verify CRC32 calculation also in odd data alignment.
Signed-off-by: Petri Savolainen <petri.savolainen@nokia.com>
Reviewed-by: Jere Leppänen <jere.leppanen@nokia.com>
Diffstat (limited to 'test/validation/api')
-rw-r--r-- | test/validation/api/hash/hash.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/test/validation/api/hash/hash.c b/test/validation/api/hash/hash.c index b4f22d609..a5dc2e286 100644 --- a/test/validation/api/hash/hash.c +++ b/test/validation/api/hash/hash.c @@ -1,4 +1,5 @@ /* Copyright (c) 2015-2018, Linaro Limited + * Copyright (c) 2021, Nokia * All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause @@ -6,6 +7,7 @@ #include <odp_api.h> #include <odp_cunit_common.h> +#include <test_packet_ipv4_with_crc.h> /* Commonly used CRC check string */ #define CHECK_STR "123456789" @@ -16,6 +18,10 @@ #define CRC32_INIT 0xffffffff #define CRC32_XOR 0xffffffff +/* When Ethernet frame CRC is included into the CRC32 calculation, + * the result should match this value. */ +#define ETHCRC_CHECK_VAL 0xdebb20e3 + typedef struct hash_test_vector_t { const uint8_t *data; uint32_t len; @@ -238,6 +244,83 @@ static void hash_test_crc32(void) } } +static void hash_test_ethernet_crc32(void) +{ + uint32_t ret; + + ret = odp_hash_crc32(test_packet_ipv4_udp_64_crc, + sizeof(test_packet_ipv4_udp_64_crc), CRC32_INIT); + CU_ASSERT(ret == ETHCRC_CHECK_VAL); + + ret = odp_hash_crc32(test_packet_ipv4_udp_68_crc, + sizeof(test_packet_ipv4_udp_68_crc), CRC32_INIT); + CU_ASSERT(ret == ETHCRC_CHECK_VAL); + + ret = odp_hash_crc32(test_packet_ipv4_udp_70_crc, + sizeof(test_packet_ipv4_udp_70_crc), CRC32_INIT); + CU_ASSERT(ret == ETHCRC_CHECK_VAL); + + ret = odp_hash_crc32(test_packet_ipv4_udp_71_crc, + sizeof(test_packet_ipv4_udp_71_crc), CRC32_INIT); + CU_ASSERT(ret == ETHCRC_CHECK_VAL); + + ret = odp_hash_crc32(test_packet_ipv4_udp_287_crc, + sizeof(test_packet_ipv4_udp_287_crc), CRC32_INIT); + CU_ASSERT(ret == ETHCRC_CHECK_VAL); + + ret = odp_hash_crc32(test_packet_ipv4_udp_400_crc, + sizeof(test_packet_ipv4_udp_400_crc), CRC32_INIT); + CU_ASSERT(ret == ETHCRC_CHECK_VAL); + + ret = odp_hash_crc32(test_packet_ipv4_udp_503_crc, + sizeof(test_packet_ipv4_udp_503_crc), CRC32_INIT); + CU_ASSERT(ret == ETHCRC_CHECK_VAL); +} + +static void hash_test_ethernet_crc32_odd_align(void) +{ + uint32_t ret, size; + const uint32_t max_size = sizeof(test_packet_ipv4_udp_503_crc); + uint8_t buf[max_size + 1] ODP_ALIGNED(8); + + memset(buf, 0, sizeof(buf)); + + size = sizeof(test_packet_ipv4_udp_64_crc); + memcpy(&buf[1], test_packet_ipv4_udp_64_crc, size); + ret = odp_hash_crc32(&buf[1], size, CRC32_INIT); + CU_ASSERT(ret == ETHCRC_CHECK_VAL); + + size = sizeof(test_packet_ipv4_udp_68_crc); + memcpy(&buf[1], test_packet_ipv4_udp_68_crc, size); + ret = odp_hash_crc32(&buf[1], size, CRC32_INIT); + CU_ASSERT(ret == ETHCRC_CHECK_VAL); + + size = sizeof(test_packet_ipv4_udp_70_crc); + memcpy(&buf[1], test_packet_ipv4_udp_70_crc, size); + ret = odp_hash_crc32(&buf[1], size, CRC32_INIT); + CU_ASSERT(ret == ETHCRC_CHECK_VAL); + + size = sizeof(test_packet_ipv4_udp_71_crc); + memcpy(&buf[1], test_packet_ipv4_udp_71_crc, size); + ret = odp_hash_crc32(&buf[1], size, CRC32_INIT); + CU_ASSERT(ret == ETHCRC_CHECK_VAL); + + size = sizeof(test_packet_ipv4_udp_287_crc); + memcpy(&buf[1], test_packet_ipv4_udp_287_crc, size); + ret = odp_hash_crc32(&buf[1], size, CRC32_INIT); + CU_ASSERT(ret == ETHCRC_CHECK_VAL); + + size = sizeof(test_packet_ipv4_udp_400_crc); + memcpy(&buf[1], test_packet_ipv4_udp_400_crc, size); + ret = odp_hash_crc32(&buf[1], size, CRC32_INIT); + CU_ASSERT(ret == ETHCRC_CHECK_VAL); + + size = sizeof(test_packet_ipv4_udp_503_crc); + memcpy(&buf[1], test_packet_ipv4_udp_503_crc, size); + ret = odp_hash_crc32(&buf[1], size, CRC32_INIT); + CU_ASSERT(ret == ETHCRC_CHECK_VAL); +} + /* * Test various commonly used 32 bit CRCs. Used CRC names, parameters and * check values can be found e.g. here: @@ -650,6 +733,8 @@ static void hash_test_crc16_generic(void) odp_testinfo_t hash_suite[] = { ODP_TEST_INFO(hash_test_crc32c), ODP_TEST_INFO(hash_test_crc32), + ODP_TEST_INFO(hash_test_ethernet_crc32), + ODP_TEST_INFO(hash_test_ethernet_crc32_odd_align), ODP_TEST_INFO(hash_test_crc32_generic), ODP_TEST_INFO(hash_test_crc24_generic), ODP_TEST_INFO(hash_test_crc16_generic), |