/** * Copyright (C) Mellanox Technologies Ltd. 2001-2016. ALL RIGHTS RESERVED. * * See file LICENSE for terms. */ #include #include /* CRC-16-CCITT */ #define UCS_CRC16_POLY 0x8408u /* CRC-32 (ISO 3309) */ #define UCS_CRC32_POLY 0xedb88320l #define UCS_CRC_CALC(_width, _buffer, _size, _crc) \ do { \ const uint8_t *end = (const uint8_t*)(UCS_PTR_BYTE_OFFSET(_buffer, _size)); \ const uint8_t *p; \ uint8_t bit; \ \ if ((_size) != 0) { \ for (p = (_buffer); p < end; ++p) { \ (_crc) ^= *p; \ for (bit = 0; bit < 8; ++bit) { \ (_crc) = ((_crc) >> 1) ^ (-(int)((_crc) & 1) & \ UCS_CRC ## _width ## _POLY); \ } \ } \ } \ (_crc) = ~(_crc); \ } while (0) uint16_t ucs_crc16(const void *buffer, size_t size) { uint16_t crc = UINT16_MAX; UCS_CRC_CALC(16, buffer, size, crc); return crc; } uint16_t ucs_crc16_string(const char *s) { return ucs_crc16((const char*)s, strlen(s)); } uint32_t ucs_crc32(uint32_t prev_crc, const void *buffer, size_t size) { uint32_t crc = ~prev_crc; UCS_CRC_CALC(32, buffer, size, crc); return crc; }