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