1 | /* |
2 | * crc32.h |
3 | * See linux/lib/crc32.c for license and changes |
4 | */ |
5 | #ifndef _LINUX_CRC32_H |
6 | #define _LINUX_CRC32_H |
7 | |
8 | #include <linux/types.h> |
9 | #include <linux/bitrev.h> |
10 | |
11 | u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len); |
12 | u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len); |
13 | |
14 | /** |
15 | * crc32_le_combine - Combine two crc32 check values into one. For two |
16 | * sequences of bytes, seq1 and seq2 with lengths len1 |
17 | * and len2, crc32_le() check values were calculated |
18 | * for each, crc1 and crc2. |
19 | * |
20 | * @crc1: crc32 of the first block |
21 | * @crc2: crc32 of the second block |
22 | * @len2: length of the second block |
23 | * |
24 | * Return: The crc32_le() check value of seq1 and seq2 concatenated, |
25 | * requiring only crc1, crc2, and len2. Note: If seq_full denotes |
26 | * the concatenated memory area of seq1 with seq2, and crc_full |
27 | * the crc32_le() value of seq_full, then crc_full == |
28 | * crc32_le_combine(crc1, crc2, len2) when crc_full was seeded |
29 | * with the same initializer as crc1, and crc2 seed was 0. See |
30 | * also crc32_combine_test(). |
31 | */ |
32 | u32 __attribute_const__ crc32_le_shift(u32 crc, size_t len); |
33 | |
34 | static inline u32 crc32_le_combine(u32 crc1, u32 crc2, size_t len2) |
35 | { |
36 | return crc32_le_shift(crc: crc1, len: len2) ^ crc2; |
37 | } |
38 | |
39 | u32 __pure __crc32c_le(u32 crc, unsigned char const *p, size_t len); |
40 | |
41 | /** |
42 | * __crc32c_le_combine - Combine two crc32c check values into one. For two |
43 | * sequences of bytes, seq1 and seq2 with lengths len1 |
44 | * and len2, __crc32c_le() check values were calculated |
45 | * for each, crc1 and crc2. |
46 | * |
47 | * @crc1: crc32c of the first block |
48 | * @crc2: crc32c of the second block |
49 | * @len2: length of the second block |
50 | * |
51 | * Return: The __crc32c_le() check value of seq1 and seq2 concatenated, |
52 | * requiring only crc1, crc2, and len2. Note: If seq_full denotes |
53 | * the concatenated memory area of seq1 with seq2, and crc_full |
54 | * the __crc32c_le() value of seq_full, then crc_full == |
55 | * __crc32c_le_combine(crc1, crc2, len2) when crc_full was |
56 | * seeded with the same initializer as crc1, and crc2 seed |
57 | * was 0. See also crc32c_combine_test(). |
58 | */ |
59 | u32 __attribute_const__ __crc32c_le_shift(u32 crc, size_t len); |
60 | |
61 | static inline u32 __crc32c_le_combine(u32 crc1, u32 crc2, size_t len2) |
62 | { |
63 | return __crc32c_le_shift(crc: crc1, len: len2) ^ crc2; |
64 | } |
65 | |
66 | #define crc32(seed, data, length) crc32_le(seed, (unsigned char const *)(data), length) |
67 | |
68 | /* |
69 | * Helpers for hash table generation of ethernet nics: |
70 | * |
71 | * Ethernet sends the least significant bit of a byte first, thus crc32_le |
72 | * is used. The output of crc32_le is bit reversed [most significant bit |
73 | * is in bit nr 0], thus it must be reversed before use. Except for |
74 | * nics that bit swap the result internally... |
75 | */ |
76 | #define ether_crc(length, data) bitrev32(crc32_le(~0, data, length)) |
77 | #define ether_crc_le(length, data) crc32_le(~0, data, length) |
78 | |
79 | #endif /* _LINUX_CRC32_H */ |
80 | |