156497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross/*- 256497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross * COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or 356497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross * code or tables extracted from it, as desired without restriction. 456497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross */ 556497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 656497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross/* CRC32 code derived from work by Gary S. Brown. */ 756497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 856497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross/* Code taken from FreeBSD 8 */ 956497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 1056497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross/* Converted to crc16 */ 1156497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 1256497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross#include "ext4_utils.h" 1356497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 1456497f28bd20001dd5f931208e8d948cf2f81b2fColin Crossstatic u16 crc16_tab[] = { 1556497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 1656497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, 1756497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, 1856497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, 1956497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 2056497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, 2156497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, 2256497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, 2356497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, 2456497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, 2556497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, 2656497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, 2756497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, 2856497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, 2956497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 3056497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, 3156497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, 3256497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, 3356497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, 3456497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, 3556497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, 3656497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, 3756497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 3856497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, 3956497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, 4056497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, 4156497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, 4256497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, 4356497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, 4456497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, 4556497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 4656497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040, 4756497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross}; 4856497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 4956497f28bd20001dd5f931208e8d948cf2f81b2fColin Crossu16 ext4_crc16(u16 crc_in, const void *buf, int size) 5056497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross{ 5156497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross const u8 *p = buf; 5256497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross u16 crc = crc_in; 5356497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 5456497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross while (size--) 5556497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross crc = crc16_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8); 5656497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross 5756497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross return crc; 5856497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross} 59