1 |
dpavlin |
1 |
/* |
2 |
|
|
* Cisco 7200 (Predator) simulation platform. |
3 |
|
|
* Copyright (c) 2006 Christophe Fillot (cf@utc.fr) |
4 |
|
|
* |
5 |
|
|
* CRC functions. |
6 |
|
|
*/ |
7 |
|
|
|
8 |
|
|
#ifndef __CRC_H__ |
9 |
|
|
#define __CRC_H__ |
10 |
|
|
|
11 |
|
|
#include <sys/types.h> |
12 |
|
|
#include "utils.h" |
13 |
|
|
|
14 |
|
|
extern m_uint16_t crc12_array[],crc16_array[]; |
15 |
|
|
extern m_uint32_t crc32_array[]; |
16 |
|
|
|
17 |
|
|
/* Compute a CRC-12 hash on a 32-bit integer */ |
18 |
|
|
static forced_inline m_uint32_t crc12_hash_u32(m_uint32_t val) |
19 |
|
|
{ |
20 |
|
|
register m_uint32_t crc=0; |
21 |
|
|
register int i; |
22 |
|
|
|
23 |
|
|
for(i=0;i<4;i++) { |
24 |
|
|
crc = (crc >> 8) ^ crc12_array[(crc^val) & 0xff]; |
25 |
|
|
val >>= 8; |
26 |
|
|
} |
27 |
|
|
|
28 |
|
|
return(crc); |
29 |
|
|
} |
30 |
|
|
|
31 |
|
|
/* Compute a CRC-16 hash on a 32-bit integer */ |
32 |
|
|
static forced_inline m_uint32_t crc16_hash_u32(m_uint32_t val) |
33 |
|
|
{ |
34 |
|
|
register m_uint32_t crc=0; |
35 |
|
|
register int i; |
36 |
|
|
|
37 |
|
|
for(i=0;i<4;i++) { |
38 |
|
|
crc = (crc >> 8) ^ crc16_array[(crc^val) & 0xff]; |
39 |
|
|
val >>= 8; |
40 |
|
|
} |
41 |
|
|
|
42 |
|
|
return(crc); |
43 |
|
|
} |
44 |
|
|
|
45 |
|
|
/* Compute a CRC-32 on the specified block */ |
46 |
|
|
static forced_inline |
47 |
|
|
m_uint32_t crc32_compute(m_uint32_t crc_accum,m_uint8_t *ptr,int len) |
48 |
|
|
{ |
49 |
|
|
unsigned long c = crc_accum; |
50 |
|
|
int n; |
51 |
|
|
|
52 |
|
|
for (n = 0; n < len; n++) { |
53 |
|
|
c = crc32_array[(c ^ ptr[n]) & 0xff] ^ (c >> 8); |
54 |
|
|
} |
55 |
|
|
|
56 |
|
|
return(~c); |
57 |
|
|
} |
58 |
|
|
|
59 |
|
|
|
60 |
|
|
/* Initialize CRC algorithms */ |
61 |
|
|
void crc_init(void); |
62 |
|
|
|
63 |
|
|
#endif |