63 lines
1.2 KiB
C
63 lines
1.2 KiB
C
/*
|
|
* Cisco router simulation platform.
|
|
* Copyright (c) 2006 Christophe Fillot (cf@utc.fr)
|
|
*
|
|
* CRC functions.
|
|
*/
|
|
|
|
#ifndef __CRC_H__
|
|
#define __CRC_H__
|
|
|
|
#include <sys/types.h>
|
|
#include "utils.h"
|
|
|
|
extern m_uint16_t crc12_array[], crc16_array[];
|
|
extern m_uint32_t crc32_array[];
|
|
|
|
/* Compute a CRC-12 hash on a 32-bit integer */
|
|
static forced_inline m_uint32_t crc12_hash_u32 (m_uint32_t val)
|
|
{
|
|
register m_uint32_t crc = 0;
|
|
register int i;
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
crc = (crc >> 8) ^ crc12_array[(crc ^ val) & 0xff];
|
|
val >>= 8;
|
|
}
|
|
|
|
return (crc);
|
|
}
|
|
|
|
/* Compute a CRC-16 hash on a 32-bit integer */
|
|
static forced_inline m_uint32_t crc16_hash_u32 (m_uint32_t val)
|
|
{
|
|
register m_uint32_t crc = 0;
|
|
register int i;
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
crc = (crc >> 8) ^ crc16_array[(crc ^ val) & 0xff];
|
|
val >>= 8;
|
|
}
|
|
|
|
return (crc);
|
|
}
|
|
|
|
/* Compute a CRC-32 on the specified block */
|
|
static forced_inline m_uint32_t crc32_compute (m_uint32_t crc_accum,
|
|
m_uint8_t * ptr, int len)
|
|
{
|
|
unsigned long c = crc_accum;
|
|
int n;
|
|
|
|
for (n = 0; n < len; n++) {
|
|
c = crc32_array[(c ^ ptr[n]) & 0xff] ^ (c >> 8);
|
|
}
|
|
|
|
return (~c);
|
|
}
|
|
|
|
/* Initialize CRC algorithms */
|
|
void crc_init (void);
|
|
|
|
#endif
|