/* * Cisco router simulation platform. * Copyright (c) 2006 Christophe Fillot (cf@utc.fr) * * CRC functions. */ #ifndef __CRC_H__ #define __CRC_H__ #include #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