xref: /freebsd/sys/libkern/crc16.c (revision 4d846d260e2b9a3d4d0a701462568268cbfe7a5b)
1b344bd3aSVal Packett /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3b344bd3aSVal Packett  *
4b344bd3aSVal Packett  * Copyright (c) 2017, Fedor Uporov
5b344bd3aSVal Packett  * All rights reserved.
6b344bd3aSVal Packett  *
7b344bd3aSVal Packett  * Redistribution and use in source and binary forms, with or without
8b344bd3aSVal Packett  * modification, are permitted provided that the following conditions
9b344bd3aSVal Packett  * are met:
10b344bd3aSVal Packett  * 1. Redistributions of source code must retain the above copyright
11b344bd3aSVal Packett  *    notice, this list of conditions and the following disclaimer.
12b344bd3aSVal Packett  * 2. Redistributions in binary form must reproduce the above copyright
13b344bd3aSVal Packett  *    notice, this list of conditions and the following disclaimer in the
14b344bd3aSVal Packett  *    documentation and/or other materials provided with the distribution.
15b344bd3aSVal Packett  *
16b344bd3aSVal Packett  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
17b344bd3aSVal Packett  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18b344bd3aSVal Packett  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19b344bd3aSVal Packett  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
20b344bd3aSVal Packett  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21b344bd3aSVal Packett  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22b344bd3aSVal Packett  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23b344bd3aSVal Packett  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24b344bd3aSVal Packett  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25b344bd3aSVal Packett  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26b344bd3aSVal Packett  * SUCH DAMAGE.
27b344bd3aSVal Packett  */
28b344bd3aSVal Packett 
29b344bd3aSVal Packett #include <sys/types.h>
30b344bd3aSVal Packett #include <sys/crc16.h>
31b344bd3aSVal Packett 
32b344bd3aSVal Packett /* CRC table for the CRC-16. The poly is 0x8005 (x16 + x15 + x2 + 1). */
33b344bd3aSVal Packett uint16_t const crc16_table[256] = {
34b344bd3aSVal Packett 	0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
35b344bd3aSVal Packett 	0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
36b344bd3aSVal Packett 	0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
37b344bd3aSVal Packett 	0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
38b344bd3aSVal Packett 	0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
39b344bd3aSVal Packett 	0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
40b344bd3aSVal Packett 	0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
41b344bd3aSVal Packett 	0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
42b344bd3aSVal Packett 	0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
43b344bd3aSVal Packett 	0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
44b344bd3aSVal Packett 	0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
45b344bd3aSVal Packett 	0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
46b344bd3aSVal Packett 	0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
47b344bd3aSVal Packett 	0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
48b344bd3aSVal Packett 	0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
49b344bd3aSVal Packett 	0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
50b344bd3aSVal Packett 	0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
51b344bd3aSVal Packett 	0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
52b344bd3aSVal Packett 	0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
53b344bd3aSVal Packett 	0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
54b344bd3aSVal Packett 	0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
55b344bd3aSVal Packett 	0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
56b344bd3aSVal Packett 	0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
57b344bd3aSVal Packett 	0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
58b344bd3aSVal Packett 	0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
59b344bd3aSVal Packett 	0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
60b344bd3aSVal Packett 	0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
61b344bd3aSVal Packett 	0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
62b344bd3aSVal Packett 	0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
63b344bd3aSVal Packett 	0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
64b344bd3aSVal Packett 	0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
65b344bd3aSVal Packett 	0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
66b344bd3aSVal Packett };
67