[dpdk-dev] [PATCH v2 0/2] librte_net: add crc computation support
Jasvinder Singh
jasvinder.singh at intel.com
Tue Feb 28 13:08:19 CET 2017
In some applications, CRC (Cyclic Redundancy Check) needs to be computed or
updated during packet processing operations. This patchset adds software
implementation of some common standard CRCs (32-bit Ethernet CRC as per
Ethernet/[ISO/IEC 8802-3] and 16-bit CCITT-CRC [ITU-T X.25]). Two
versions of each 32-bit and 16-bit CRC calculation are proposed.
The first version presents a fast and efficient CRC generation on IA
processors by using the carry-less multiplication instruction – PCLMULQDQ
(i.e SSE4.2 instrinsics). In this implementation, a parallelized folding
approach has been used to first reduce an arbitrary length buffer to a small
fixed size length buffer (16 bytes) with the help of precomputed constants.
The resultant single 16-bytes chunk is further reduced by Barrett reduction
method to generate final CRC value. For more details on the implementation,
see reference [1].
The second version presents the fallback solution to support the CRC
generation without needing any specific support from CPU (for examples-
SSE4.2 intrinsics). It is based on generic Look-Up Table(LUT) algorithm that
uses precomputed 256 element table as explained in reference[2].
Following APIs have been added;
(i) rte_net_crc_init()
(ii)rte_net_crc_calc()
The first API (i) initalises the data structures required for CRC computation
and this api should be used only once in the application before using second
API (ii) for 16-bit and 32-bit CRC calculations.
References:
[1] Fast CRC Computation for Generic Polynomials Using PCLMULQDQ Instruction
http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/fast-crc-computation-generic-polynomials-pclmulqdq-paper.pdf
[2] A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS
http://www.ross.net/crc/download/crc_v3.txt
v2 changes:
- fix build errors for target i686-native-linuxapp-gcc
- fix checkpatch warnings
Notes:
- Build not successful with clang version earlier than 3.7.0 due to
missing intrinsics. Refer dpdk known issue section for more details.
Jasvinder Singh (2):
librte_net: add crc init and compute APIs
app/test: add unit test for CRC computation
app/test/Makefile | 2 +
app/test/test_crc.c | 229 +++++++++++++
lib/librte_net/Makefile | 2 +
lib/librte_net/rte_net_crc.c | 664 +++++++++++++++++++++++++++++++++++++
lib/librte_net/rte_net_crc.h | 101 ++++++
lib/librte_net/rte_net_version.map | 8 +
6 files changed, 1006 insertions(+)
create mode 100644 app/test/test_crc.c
create mode 100644 lib/librte_net/rte_net_crc.c
create mode 100644 lib/librte_net/rte_net_crc.h
--
2.5.5
More information about the dev
mailing list