P4C
The P4 Compiler
Loading...
Searching...
No Matches
bfn_hash_algorithm.h
1#ifndef BACKENDS_TOFINO_BF_UTILS_DYNAMIC_HASH_BFN_HASH_ALGORITHM_H_
2#define BACKENDS_TOFINO_BF_UTILS_DYNAMIC_HASH_BFN_HASH_ALGORITHM_H_
3
4#ifndef __KERNEL__
5#include <stdbool.h>
6#include <stdint.h>
7#include <string.h>
8#endif
9
10#define BF_UTILS_ALGO_NAME_LEN 30
11
12typedef enum {
13 CRC_8,
14 CRC_8_DARC,
15 CRC_8_I_CODE,
16 CRC_8_ITU,
17 CRC_8_MAXIM,
18 CRC_8_ROHC,
19 CRC_8_WCDMA,
20 CRC_16,
21 CRC_16_BYPASS,
22 CRC_16_DDS_110,
23 CRC_16_DECT,
24 CRC_16_DECT_R,
25 CRC_16_DECT_X,
26 CRC_16_DNP,
27 CRC_16_EN_13757,
28 CRC_16_GENIBUS,
29 CRC_16_MAXIM,
30 CRC_16_MCRF4XX,
31 CRC_16_RIELLO,
32 CRC_16_T10_DIF,
33 CRC_16_TELEDISK,
34 CRC_16_USB,
35 X_25,
36 XMODEM,
37 MODBUS,
38 KERMIT,
39 CRC_CCITT_FALSE,
40 CRC_AUG_CCITT,
41 CRC_32,
42 CRC_32_BZIP2,
43 CRC_32C,
44 CRC_32D,
45 CRC_32_MPEG,
46 POSIX,
47 CRC_32Q,
48 JAMCRC,
49 XFER,
50 CRC_64,
51 CRC_64_GO_ISO,
52 CRC_64_WE,
53 CRC_64_JONES,
54 CRC_INVALID
55} bfn_crc_alg_t;
56
57typedef enum { IDENTITY_DYN, CRC_DYN, RANDOM_DYN, XOR_DYN, INVALID_DYN } bfn_hash_alg_type_t;
58
59static inline void crc_alg_type_to_str(bfn_crc_alg_t crc_type, char *crc_name) {
60 if (!crc_name) {
61 return;
62 }
63 switch (crc_type) {
64 case CRC_8:
65 strncpy(crc_name, "CRC_8\0", BF_UTILS_ALGO_NAME_LEN);
66 break;
67 case CRC_8_DARC:
68 strncpy(crc_name, "CRC_8_DARC\0", BF_UTILS_ALGO_NAME_LEN);
69 break;
70 case CRC_8_I_CODE:
71 strncpy(crc_name, "CRC_8_I_CODE\0", BF_UTILS_ALGO_NAME_LEN);
72 break;
73 case CRC_8_ITU:
74 strncpy(crc_name, "CRC_8_ITU\0", BF_UTILS_ALGO_NAME_LEN);
75 break;
76 case CRC_8_MAXIM:
77 strncpy(crc_name, "CRC_8_MAXIM\0", BF_UTILS_ALGO_NAME_LEN);
78 break;
79 case CRC_8_ROHC:
80 strncpy(crc_name, "CRC_8_ROHC\0", BF_UTILS_ALGO_NAME_LEN);
81 break;
82 case CRC_8_WCDMA:
83 strncpy(crc_name, "CRC_8_WCDMA\0", BF_UTILS_ALGO_NAME_LEN);
84 break;
85 case CRC_16:
86 strncpy(crc_name, "CRC_16\0", BF_UTILS_ALGO_NAME_LEN);
87 break;
88 case CRC_16_BYPASS:
89 strncpy(crc_name, "CRC_16_BYPASS\0", BF_UTILS_ALGO_NAME_LEN);
90 break;
91 case CRC_16_DDS_110:
92 strncpy(crc_name, "CRC_16_DDS_110\0", BF_UTILS_ALGO_NAME_LEN);
93 break;
94 case CRC_16_DECT:
95 strncpy(crc_name, "CRC_16_DECT\0", BF_UTILS_ALGO_NAME_LEN);
96 break;
97 case CRC_16_DECT_R:
98 strncpy(crc_name, "CRC_16_DECT_R\0", BF_UTILS_ALGO_NAME_LEN);
99 break;
100 case CRC_16_DECT_X:
101 strncpy(crc_name, "CRC_16_DECT_X\0", BF_UTILS_ALGO_NAME_LEN);
102 break;
103 case CRC_16_DNP:
104 strncpy(crc_name, "CRC_16_DNP\0", BF_UTILS_ALGO_NAME_LEN);
105 break;
106 case CRC_16_EN_13757:
107 strncpy(crc_name, "CRC_16_EN_13757\0", BF_UTILS_ALGO_NAME_LEN);
108 break;
109 case CRC_16_GENIBUS:
110 strncpy(crc_name, "CRC_16_GENIBUS\0", BF_UTILS_ALGO_NAME_LEN);
111 break;
112 case CRC_16_MAXIM:
113 strncpy(crc_name, "CRC_16_MAXIM\0", BF_UTILS_ALGO_NAME_LEN);
114 break;
115 case CRC_16_MCRF4XX:
116 strncpy(crc_name, "CRC_16_MCRF4XX\0", BF_UTILS_ALGO_NAME_LEN);
117 break;
118 case CRC_16_RIELLO:
119 strncpy(crc_name, "CRC_16_RIELLO\0", BF_UTILS_ALGO_NAME_LEN);
120 break;
121 case CRC_16_T10_DIF:
122 strncpy(crc_name, "CRC_16_T10_DIF\0", BF_UTILS_ALGO_NAME_LEN);
123 break;
124 case CRC_16_TELEDISK:
125 strncpy(crc_name, "CRC_16_TELEDISK\0", BF_UTILS_ALGO_NAME_LEN);
126 break;
127 case CRC_16_USB:
128 strncpy(crc_name, "CRC_16_USB\0", BF_UTILS_ALGO_NAME_LEN);
129 break;
130 case X_25:
131 strncpy(crc_name, "X_25\0", BF_UTILS_ALGO_NAME_LEN);
132 break;
133 case XMODEM:
134 strncpy(crc_name, "XMODEM\0", BF_UTILS_ALGO_NAME_LEN);
135 break;
136 case MODBUS:
137 strncpy(crc_name, "MODBUS\0", BF_UTILS_ALGO_NAME_LEN);
138 break;
139 case KERMIT:
140 strncpy(crc_name, "KERMIT\0", BF_UTILS_ALGO_NAME_LEN);
141 break;
142 case CRC_CCITT_FALSE:
143 strncpy(crc_name, "CRC_CCITT_FALSE\0", BF_UTILS_ALGO_NAME_LEN);
144 break;
145 case CRC_AUG_CCITT:
146 strncpy(crc_name, "CRC_AUG_CCITT\0", BF_UTILS_ALGO_NAME_LEN);
147 break;
148 case CRC_32:
149 strncpy(crc_name, "CRC_32\0", BF_UTILS_ALGO_NAME_LEN);
150 break;
151 case CRC_32_BZIP2:
152 strncpy(crc_name, "CRC_32_BZIP2\0", BF_UTILS_ALGO_NAME_LEN);
153 break;
154 case CRC_32C:
155 strncpy(crc_name, "CRC_32C\0", BF_UTILS_ALGO_NAME_LEN);
156 break;
157 case CRC_32D:
158 strncpy(crc_name, "CRC_32D\0", BF_UTILS_ALGO_NAME_LEN);
159 break;
160 case CRC_32_MPEG:
161 strncpy(crc_name, "CRC_32_MPEG\0", BF_UTILS_ALGO_NAME_LEN);
162 break;
163 case POSIX:
164 strncpy(crc_name, "POSIX\0", BF_UTILS_ALGO_NAME_LEN);
165 break;
166 case CRC_32Q:
167 strncpy(crc_name, "CRC_32Q\0", BF_UTILS_ALGO_NAME_LEN);
168 break;
169 case JAMCRC:
170 strncpy(crc_name, "JAMCRC\0", BF_UTILS_ALGO_NAME_LEN);
171 break;
172 case XFER:
173 strncpy(crc_name, "XFER\0", BF_UTILS_ALGO_NAME_LEN);
174 break;
175 case CRC_64:
176 strncpy(crc_name, "CRC_64\0", BF_UTILS_ALGO_NAME_LEN);
177 break;
178 case CRC_64_GO_ISO:
179 strncpy(crc_name, "CRC_64_GO_ISO\0", BF_UTILS_ALGO_NAME_LEN);
180 break;
181 case CRC_64_WE:
182 strncpy(crc_name, "CRC_64_WE\0", BF_UTILS_ALGO_NAME_LEN);
183 break;
184 case CRC_64_JONES:
185 strncpy(crc_name, "CRC_64_JONES\0", BF_UTILS_ALGO_NAME_LEN);
186 break;
187 case CRC_INVALID:
188 default:
189 strncpy(crc_name, "CRC_INVALID\0", BF_UTILS_ALGO_NAME_LEN);
190 break;
191 }
192 return;
193}
194
195static inline bfn_crc_alg_t crc_alg_str_to_type(const char *crc_name) {
196 if (crc_name == NULL) {
197 return CRC_INVALID;
198 }
199 if (!strcmp(crc_name, "crc_8") || !strcmp(crc_name, "CRC_8")) {
200 return CRC_8;
201 }
202 if (!strcmp(crc_name, "crc_8_darc") || !strcmp(crc_name, "CRC_8_DARC")) {
203 return CRC_8_DARC;
204 }
205 if (!strcmp(crc_name, "crc_8_i_code") || !strcmp(crc_name, "CRC_8_I_CODE")) {
206 return CRC_8_I_CODE;
207 }
208 if (!strcmp(crc_name, "crc_8_itu") || !strcmp(crc_name, "CRC_8_ITU")) {
209 return CRC_8_ITU;
210 }
211 if (!strcmp(crc_name, "crc_8_maxim") || !strcmp(crc_name, "CRC_8_MAXIM")) {
212 return CRC_8_MAXIM;
213 }
214 if (!strcmp(crc_name, "crc_8_rohc") || !strcmp(crc_name, "CRC_8_ROHC")) {
215 return CRC_8_ROHC;
216 }
217 if (!strcmp(crc_name, "crc_8_wcdma") || !strcmp(crc_name, "CRC_8_WCDMA")) {
218 return CRC_8_WCDMA;
219 }
220 if (!strcmp(crc_name, "crc_16") || !strcmp(crc_name, "CRC_16")) {
221 return CRC_16;
222 }
223 if (!strcmp(crc_name, "crc_16_bypass") || !strcmp(crc_name, "CRC_16_BYPASS")) {
224 return CRC_16_BYPASS;
225 }
226 if (!strcmp(crc_name, "crc_16_dds_110") || !strcmp(crc_name, "CRC_16_DDS_110")) {
227 return CRC_16_DDS_110;
228 }
229 if (!strcmp(crc_name, "crc_16_dect") || !strcmp(crc_name, "CRC_16_DECT")) {
230 return CRC_16_DECT;
231 }
232 if (!strcmp(crc_name, "crc_16_dect_r") || !strcmp(crc_name, "CRC_16_DECT_R")) {
233 return CRC_16_DECT_R;
234 }
235 if (!strcmp(crc_name, "crc_16_dect_x") || !strcmp(crc_name, "CRC_16_DECT_X")) {
236 return CRC_16_DECT_X;
237 }
238 if (!strcmp(crc_name, "crc_16_dnp") || !strcmp(crc_name, "CRC_16_DNP")) {
239 return CRC_16_DNP;
240 }
241 if (!strcmp(crc_name, "crc_16_en_13757") || !strcmp(crc_name, "CRC_16_EN_13757")) {
242 return CRC_16_EN_13757;
243 }
244 if (!strcmp(crc_name, "crc_16_genibus") || !strcmp(crc_name, "CRC_16_GENIBUS")) {
245 return CRC_16_GENIBUS;
246 }
247 if (!strcmp(crc_name, "crc_16_maxim") || !strcmp(crc_name, "CRC_16_MAXIM")) {
248 return CRC_16_MAXIM;
249 }
250 if (!strcmp(crc_name, "crc_16_mcrf4xx") || !strcmp(crc_name, "CRC_16_MCRF4XX")) {
251 return CRC_16_MCRF4XX;
252 }
253 if (!strcmp(crc_name, "crc_16_riello") || !strcmp(crc_name, "CRC_16_RIELLO")) {
254 return CRC_16_RIELLO;
255 }
256 if (!strcmp(crc_name, "crc_16_t10_dif") || !strcmp(crc_name, "CRC_16_T10_DIF")) {
257 return CRC_16_T10_DIF;
258 }
259 if (!strcmp(crc_name, "crc_16_teledisk") || !strcmp(crc_name, "CRC_16_TELEDISK")) {
260 return CRC_16_TELEDISK;
261 }
262 if (!strcmp(crc_name, "crc_16_usb") || !strcmp(crc_name, "CRC_16_USB")) {
263 return CRC_16_USB;
264 }
265 if (!strcmp(crc_name, "x_25") || !strcmp(crc_name, "X_25")) {
266 return X_25;
267 }
268 if (!strcmp(crc_name, "xmodem") || !strcmp(crc_name, "XMODEM")) {
269 return XMODEM;
270 }
271 if (!strcmp(crc_name, "modbus") || !strcmp(crc_name, "MODBUS")) {
272 return MODBUS;
273 }
274 if (!strcmp(crc_name, "kermit") || !strcmp(crc_name, "KERMIT")) {
275 return KERMIT;
276 }
277 if (!strcmp(crc_name, "crc_ccitt_false") || !strcmp(crc_name, "CRC_CCITT_FALSE")) {
278 return CRC_CCITT_FALSE;
279 }
280 if (!strcmp(crc_name, "crc_aug_ccitt") || !strcmp(crc_name, "CRC_AUG_CCITT")) {
281 return CRC_AUG_CCITT;
282 }
283 if (!strcmp(crc_name, "crc_32") || !strcmp(crc_name, "CRC_32")) {
284 return CRC_32;
285 }
286 if (!strcmp(crc_name, "crc_32_bzip2") || !strcmp(crc_name, "CRC_32_BZIP2")) {
287 return CRC_32_BZIP2;
288 }
289 if (!strcmp(crc_name, "crc_32c") || !strcmp(crc_name, "CRC_32C")) {
290 return CRC_32C;
291 }
292 if (!strcmp(crc_name, "crc_32d") || !strcmp(crc_name, "CRC_32D")) {
293 return CRC_32D;
294 }
295 if (!strcmp(crc_name, "crc_32_mpeg") || !strcmp(crc_name, "CRC_32_MPEG")) {
296 return CRC_32_MPEG;
297 }
298 if (!strcmp(crc_name, "posix") || !strcmp(crc_name, "POSIX")) {
299 return POSIX;
300 }
301 if (!strcmp(crc_name, "crc_32q") || !strcmp(crc_name, "CRC_32Q")) {
302 return CRC_32Q;
303 }
304 if (!strcmp(crc_name, "jamcrc") || !strcmp(crc_name, "JAMCRC")) {
305 return JAMCRC;
306 }
307 if (!strcmp(crc_name, "xfer") || !strcmp(crc_name, "XFER")) {
308 return XFER;
309 }
310 if (!strcmp(crc_name, "crc_64") || !strcmp(crc_name, "CRC_64")) {
311 return CRC_64;
312 }
313 if (!strcmp(crc_name, "crc_64_go_iso") || !strcmp(crc_name, "CRC_64_GO_ISO")) {
314 return CRC_64_GO_ISO;
315 }
316 if (!strcmp(crc_name, "crc_64_we") || !strcmp(crc_name, "CRC_64_WE")) {
317 return CRC_64_WE;
318 }
319 if (!strcmp(crc_name, "crc_64_jones") || !strcmp(crc_name, "CRC_64_JONES")) {
320 return CRC_64_JONES;
321 }
322 return CRC_INVALID;
323}
324
325static inline void hash_alg_type_to_str(bfn_hash_alg_type_t alg_type, char *alg_name) {
326 if (alg_name == NULL) {
327 return;
328 }
329 switch (alg_type) {
330 case IDENTITY_DYN:
331 strncpy(alg_name, "IDENTITY\0", BF_UTILS_ALGO_NAME_LEN);
332 break;
333 case CRC_DYN:
334 strncpy(alg_name, "CRC\0", BF_UTILS_ALGO_NAME_LEN);
335 break;
336 case RANDOM_DYN:
337 strncpy(alg_name, "RANDOM\0", BF_UTILS_ALGO_NAME_LEN);
338 break;
339 case XOR_DYN:
340 strncpy(alg_name, "XOR\0", BF_UTILS_ALGO_NAME_LEN);
341 break;
342 case INVALID_DYN:
343 default:
344 strncpy(alg_name, "INVALID\0", BF_UTILS_ALGO_NAME_LEN);
345 break;
346 }
347 return;
348}
349
350static inline bfn_hash_alg_type_t hash_alg_str_to_type(const char *alg_name) {
351 if (alg_name == NULL) {
352 return INVALID_DYN;
353 }
354 if (!strcmp(alg_name, "identity") || !strcmp(alg_name, "IDENTITY")) {
355 return IDENTITY_DYN;
356 }
357 if (!strcmp(alg_name, "crc") || !strcmp(alg_name, "CRC")) {
358 return CRC_DYN;
359 }
360 if (!strcmp(alg_name, "random") || !strcmp(alg_name, "RANDOM")) {
361 return RANDOM_DYN;
362 }
363 if (!strcmp(alg_name, "xor") || !strcmp(alg_name, "XOR")) {
364 return XOR_DYN;
365 }
366 return INVALID_DYN;
367}
368
373typedef struct crc_alg_info_ {
374 const char *crc_name;
375 uint64_t poly;
376 bool reverse;
377 uint64_t init;
378 uint64_t final_xor;
379} crc_alg_info_t;
380
381typedef struct bfn_hash_algorithm_ {
382 bfn_hash_alg_type_t hash_alg;
383 bool msb;
384 bool extend;
385
386 /* -- All fields below are algorithm dependent. Most of them
387 * has meaning just for the CRC algorithm. */
388 bfn_crc_alg_t crc_type; // CRC, will be Invalid if unknown crc
389 int hash_bit_width; // CRC, XOR
390 bool reverse; // CRC
391 uint64_t poly; // CRC
392 uint64_t init; // CRC
393 uint64_t final_xor; // CRC
394 uint8_t **crc_matrix; // CRC
395} bfn_hash_algorithm_t;
396
402bool verify_algorithm(bfn_hash_algorithm_t *alg, const char **error_message);
403
414void initialize_algorithm(bfn_hash_algorithm_t *alg, bfn_hash_alg_type_t hash_alg_type, bool msb,
415 bool extend, bfn_crc_alg_t crc_alg);
416
417void initialize_crc_matrix(bfn_hash_algorithm_t *alg);
418
419void calculate_crc(bfn_hash_algorithm_t *alg, uint32_t hash_output_bits, uint8_t *stream,
420 uint32_t stream_len, uint8_t *crc);
421
422#endif /* BACKENDS_TOFINO_BF_UTILS_DYNAMIC_HASH_BFN_HASH_ALGORITHM_H_ */
Definition bfn_hash_algorithm.h:381
Definition bfn_hash_algorithm.h:373