DPDK  24.03.0
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 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
18 #include <stdint.h>
19 
20 #include <rte_branch_prediction.h>
21 #include <rte_common.h>
22 #include <rte_config.h>
23 
24 #include "rte_crc_sw.h"
25 
26 #define CRC32_SW (1U << 0)
27 #define CRC32_SSE42 (1U << 1)
28 #define CRC32_x64 (1U << 2)
29 #define CRC32_SSE42_x64 (CRC32_x64|CRC32_SSE42)
30 #define CRC32_ARM64 (1U << 3)
31 
32 extern uint8_t rte_hash_crc32_alg;
33 
34 #if defined(RTE_ARCH_ARM64) && defined(__ARM_FEATURE_CRC32)
35 #include "rte_crc_arm64.h"
36 #elif defined(RTE_ARCH_X86)
37 #include "rte_crc_x86.h"
38 #else
39 #include "rte_crc_generic.h"
40 #endif
41 
53 void
54 rte_hash_crc_set_alg(uint8_t alg);
55 
56 #ifdef __DOXYGEN__
57 
68 static inline uint32_t
69 rte_hash_crc_1byte(uint8_t data, uint32_t init_val);
70 
81 static inline uint32_t
82 rte_hash_crc_2byte(uint16_t data, uint32_t init_val);
83 
94 static inline uint32_t
95 rte_hash_crc_4byte(uint32_t data, uint32_t init_val);
96 
107 static inline uint32_t
108 rte_hash_crc_8byte(uint64_t data, uint32_t init_val);
109 
110 #endif /* __DOXYGEN__ */
111 
124 static inline uint32_t
125 rte_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  for (i = 0; i < data_len / 8; i++) {
131  init_val = rte_hash_crc_8byte(*(const uint64_t *)pd, init_val);
132  pd += 8;
133  }
134 
135  if (data_len & 0x4) {
136  init_val = rte_hash_crc_4byte(*(const uint32_t *)pd, init_val);
137  pd += 4;
138  }
139 
140  if (data_len & 0x2) {
141  init_val = rte_hash_crc_2byte(*(const uint16_t *)pd, init_val);
142  pd += 2;
143  }
144 
145  if (data_len & 0x1)
146  init_val = rte_hash_crc_1byte(*(const uint8_t *)pd, init_val);
147 
148  return init_val;
149 }
150 
151 #ifdef __cplusplus
152 }
153 #endif
154 
155 #endif /* _RTE_HASH_CRC_H_ */
void rte_hash_crc_set_alg(uint8_t alg)
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)
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_1byte(uint8_t data, uint32_t init_val)
static uint32_t rte_hash_crc_4byte(uint32_t data, uint32_t init_val)