DPDK 26.03.0-rc2
rte_hash_crc.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2010-2014 Intel Corporation
3 */
4
5#ifndef _RTE_HASH_CRC_H_
6#define _RTE_HASH_CRC_H_
7
14#include <stdint.h>
15
17#include <rte_common.h>
18#include <rte_config.h>
19
20#include "rte_crc_sw.h"
21
22#define CRC32_SW (1U << 0)
23#define CRC32_SSE42 (1U << 1)
24#define CRC32_x64 (1U << 2)
25#define CRC32_SSE42_x64 (CRC32_x64|CRC32_SSE42)
26#define CRC32_ARM64 (1U << 3)
27
28extern uint8_t rte_hash_crc32_alg;
29
30#if defined(RTE_ARCH_ARM64) && defined(__ARM_FEATURE_CRC32)
31#include "rte_crc_arm64.h"
32#elif defined(RTE_ARCH_X86)
33#include "rte_crc_x86.h"
34#else
35#include "rte_crc_generic.h"
36#endif
37
38#ifdef __cplusplus
39extern "C" {
40#endif
41
53void
55
56#ifdef __DOXYGEN__
57
68static inline uint32_t
69rte_hash_crc_1byte(uint8_t data, uint32_t init_val);
70
81static inline uint32_t
82rte_hash_crc_2byte(uint16_t data, uint32_t init_val);
83
94static inline uint32_t
95rte_hash_crc_4byte(uint32_t data, uint32_t init_val);
96
107static inline uint32_t
108rte_hash_crc_8byte(uint64_t data, uint32_t init_val);
109
110#endif /* __DOXYGEN__ */
111
124static inline uint32_t
125rte_hash_crc(const void *data, uint32_t data_len, uint32_t init_val)
126{
127 unsigned i;
128 uintptr_t pd = (uintptr_t) data;
129
130 /* align input to 8 byte boundary if needed */
131 if (pd & 0x7) {
132 unsigned int unaligned_bytes = RTE_MIN(8 - (pd & 0x7), data_len);
133 for (i = 0; i < unaligned_bytes; i++) {
134 init_val = rte_hash_crc_1byte(*(const uint8_t *)pd, init_val);
135 pd++;
136 data_len--;
137 }
138 }
139
140 for (i = 0; i < data_len / 8; i++) {
141 init_val = rte_hash_crc_8byte(*(const uint64_t *)pd, init_val);
142 pd += 8;
143 }
144
145 if (data_len & 0x4) {
146 init_val = rte_hash_crc_4byte(*(const uint32_t *)pd, init_val);
147 pd += 4;
148 }
149
150 if (data_len & 0x2) {
151 init_val = rte_hash_crc_2byte(*(const uint16_t *)pd, init_val);
152 pd += 2;
153 }
154
155 if (data_len & 0x1)
156 init_val = rte_hash_crc_1byte(*(const uint8_t *)pd, init_val);
157
158 return init_val;
159}
160
161#ifdef __cplusplus
162}
163#endif
164
165#endif /* _RTE_HASH_CRC_H_ */
#define RTE_MIN(a, b)
Definition: rte_common.h:795
static uint32_t rte_hash_crc_4byte(uint32_t data, uint32_t init_val)
static uint32_t rte_hash_crc_1byte(uint8_t data, uint32_t init_val)
void rte_hash_crc_set_alg(uint8_t alg)
static uint32_t rte_hash_crc(const void *data, uint32_t data_len, uint32_t init_val)
Definition: rte_hash_crc.h:125
static uint32_t rte_hash_crc_2byte(uint16_t data, uint32_t init_val)
static uint32_t rte_hash_crc_8byte(uint64_t data, uint32_t init_val)