aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetri Savolainen <petri.savolainen@nokia.com>2021-04-14 13:34:28 +0300
committerPetri Savolainen <petri.savolainen@nokia.com>2021-04-19 10:09:53 +0300
commit994c22698fa9617ca918f904684066096858f287 (patch)
treebeb904f1f901905a3ae399c6bd620648ffcfa907
parent6f50e77074fa5c42cb60bfd55be882efcbffccc9 (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>
-rw-r--r--test/validation/api/hash/hash.c85
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),