/* * 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