xref: /dpdk/lib/net/rte_net_crc.h (revision 99a2dd955fba6e4cc23b77d590a033650ced9c45)
1*99a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2*99a2dd95SBruce Richardson  * Copyright(c) 2017-2020 Intel Corporation
3*99a2dd95SBruce Richardson  */
4*99a2dd95SBruce Richardson 
5*99a2dd95SBruce Richardson #ifndef _RTE_NET_CRC_H_
6*99a2dd95SBruce Richardson #define _RTE_NET_CRC_H_
7*99a2dd95SBruce Richardson 
8*99a2dd95SBruce Richardson #include <stdint.h>
9*99a2dd95SBruce Richardson 
10*99a2dd95SBruce Richardson #ifdef __cplusplus
11*99a2dd95SBruce Richardson extern "C" {
12*99a2dd95SBruce Richardson #endif
13*99a2dd95SBruce Richardson 
14*99a2dd95SBruce Richardson /** CRC types */
15*99a2dd95SBruce Richardson enum rte_net_crc_type {
16*99a2dd95SBruce Richardson 	RTE_NET_CRC16_CCITT = 0,
17*99a2dd95SBruce Richardson 	RTE_NET_CRC32_ETH,
18*99a2dd95SBruce Richardson 	RTE_NET_CRC_REQS
19*99a2dd95SBruce Richardson };
20*99a2dd95SBruce Richardson 
21*99a2dd95SBruce Richardson /** CRC compute algorithm */
22*99a2dd95SBruce Richardson enum rte_net_crc_alg {
23*99a2dd95SBruce Richardson 	RTE_NET_CRC_SCALAR = 0,
24*99a2dd95SBruce Richardson 	RTE_NET_CRC_SSE42,
25*99a2dd95SBruce Richardson 	RTE_NET_CRC_NEON,
26*99a2dd95SBruce Richardson 	RTE_NET_CRC_AVX512,
27*99a2dd95SBruce Richardson };
28*99a2dd95SBruce Richardson 
29*99a2dd95SBruce Richardson /**
30*99a2dd95SBruce Richardson  * This API set the CRC computation algorithm (i.e. scalar version,
31*99a2dd95SBruce Richardson  * x86 64-bit sse4.2 intrinsic version, etc.) and internal data
32*99a2dd95SBruce Richardson  * structure.
33*99a2dd95SBruce Richardson  *
34*99a2dd95SBruce Richardson  * @param alg
35*99a2dd95SBruce Richardson  *   This parameter is used to select the CRC implementation version.
36*99a2dd95SBruce Richardson  *   - RTE_NET_CRC_SCALAR
37*99a2dd95SBruce Richardson  *   - RTE_NET_CRC_SSE42 (Use 64-bit SSE4.2 intrinsic)
38*99a2dd95SBruce Richardson  *   - RTE_NET_CRC_NEON (Use ARM Neon intrinsic)
39*99a2dd95SBruce Richardson  *   - RTE_NET_CRC_AVX512 (Use 512-bit AVX intrinsic)
40*99a2dd95SBruce Richardson  */
41*99a2dd95SBruce Richardson void
42*99a2dd95SBruce Richardson rte_net_crc_set_alg(enum rte_net_crc_alg alg);
43*99a2dd95SBruce Richardson 
44*99a2dd95SBruce Richardson /**
45*99a2dd95SBruce Richardson  * CRC compute API
46*99a2dd95SBruce Richardson  *
47*99a2dd95SBruce Richardson  * @param data
48*99a2dd95SBruce Richardson  *   Pointer to the packet data for CRC computation
49*99a2dd95SBruce Richardson  * @param data_len
50*99a2dd95SBruce Richardson  *   Data length for CRC computation
51*99a2dd95SBruce Richardson  * @param type
52*99a2dd95SBruce Richardson  *   CRC type (enum rte_net_crc_type)
53*99a2dd95SBruce Richardson  *
54*99a2dd95SBruce Richardson  * @return
55*99a2dd95SBruce Richardson  *   CRC value
56*99a2dd95SBruce Richardson  */
57*99a2dd95SBruce Richardson uint32_t
58*99a2dd95SBruce Richardson rte_net_crc_calc(const void *data,
59*99a2dd95SBruce Richardson 	uint32_t data_len,
60*99a2dd95SBruce Richardson 	enum rte_net_crc_type type);
61*99a2dd95SBruce Richardson 
62*99a2dd95SBruce Richardson #ifdef __cplusplus
63*99a2dd95SBruce Richardson }
64*99a2dd95SBruce Richardson #endif
65*99a2dd95SBruce Richardson 
66*99a2dd95SBruce Richardson 
67*99a2dd95SBruce Richardson #endif /* _RTE_NET_CRC_H_ */
68