| version 1.5, 2017/12/08 00:07:48 | version 1.6.36.1, 2024/10/10 23:53:00 | 
| Line 12  terms: | Line 12  terms: | 
 | All of the documentation and software included in the ELWIX and AITNET | All of the documentation and software included in the ELWIX and AITNET | 
 | Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> | Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> | 
 |  |  | 
| Copyright 2004 - 2015 | Copyright 2004 - 2024 | 
 | by Michael Pounov <misho@elwix.org>.  All rights reserved. | by Michael Pounov <misho@elwix.org>.  All rights reserved. | 
 |  |  | 
 | Redistribution and use in source and binary forms, with or without | Redistribution and use in source and binary forms, with or without | 
| Line 46  SUCH DAMAGE. | Line 46  SUCH DAMAGE. | 
 | #include "global.h" | #include "global.h" | 
 |  |  | 
 |  |  | 
 |  | /* CRC16 poly */ | 
 |  | const u_short crc_16poly = 0x1021; | 
 |  |  | 
 | /* Adler module */ | /* Adler module */ | 
 | const u_int crc_modAdler = 0xFFF1L; | const u_int crc_modAdler = 0xFFF1L; | 
 |  |  | 
| Line 64  const crcPoly_t crc_Poly[] = { | Line 67  const crcPoly_t crc_Poly[] = { | 
 | { 16, (u_int) 0x8005, "CRC-16-IBM" }, | { 16, (u_int) 0x8005, "CRC-16-IBM" }, | 
 | { 24, (u_int) 0x864CFB, "CRC-24-Radix64" }, | { 24, (u_int) 0x864CFB, "CRC-24-Radix64" }, | 
 | { 30, (u_int) 0x2030B9C7, "CRC-30-CDMA" }, | { 30, (u_int) 0x2030B9C7, "CRC-30-CDMA" }, | 
| { 32, (u_int) 0x04C11DB7, "CRC-32-802.3" } | { 32, (u_int) 0x04C11DB7, "CRC-32-802.3" }, | 
|  | { 16, (u_int) 0x1021, "CRC-16-CCITT" }, | 
|  | { 16, (u_int) 0x8408, "CRC-16-XMODEM" } | 
 | }; | }; | 
 |  |  | 
 |  |  | 
| Line 73  const crcPoly_t crc_Poly[] = { | Line 78  const crcPoly_t crc_Poly[] = { | 
 | * | * | 
 | * @crcNum = Number for reflection | * @crcNum = Number for reflection | 
 | * @crcBits = Number width bits | * @crcBits = Number width bits | 
| * return: -1 error, !=-1 reflecting number | * return: reflecting number | 
 | */ | */ | 
 | u_int | u_int | 
 | crcReflect(u_int crcNum, u_char crcBits) | crcReflect(u_int crcNum, u_char crcBits) | 
| Line 95  crcReflect(u_int crcNum, u_char crcBits) | Line 100  crcReflect(u_int crcNum, u_char crcBits) | 
 | * @RevOpts = Options for computation (REVOPTS_REVERTBYTE, REVOPTS_REVERTCRC) | * @RevOpts = Options for computation (REVOPTS_REVERTBYTE, REVOPTS_REVERTCRC) | 
 | * @initCRC = Initial CRC value | * @initCRC = Initial CRC value | 
 | * @xorCRC = Last xor CRC value | * @xorCRC = Last xor CRC value | 
| * return: -1 error, !=-1 CRC checksum | * return: CRC checksum | 
 | */ | */ | 
 | u_int | u_int | 
 | crcCalc(u_char * __restrict psBuf, u_int bufLen, u_char crcBits, u_char RevOpts, u_int initCRC, u_int xorCRC) | crcCalc(u_char * __restrict psBuf, u_int bufLen, u_char crcBits, u_char RevOpts, u_int initCRC, u_int xorCRC) | 
 | { | { | 
| const u_int bits = sizeof(int) * 8 - crcBits; | u_int bits = sizeof(int) * 8; | 
 | u_int poly, crchibit, crc; | u_int poly, crchibit, crc; | 
 | register u_int i, j, b, ch; | register u_int i, j, b, ch; | 
 |  |  | 
| Line 109  crcCalc(u_char * __restrict psBuf, u_int bufLen, u_cha | Line 114  crcCalc(u_char * __restrict psBuf, u_int bufLen, u_cha | 
 | switch (crcBits) { | switch (crcBits) { | 
 | case 1: | case 1: | 
 | poly = crc_Poly[0].poly_num; | poly = crc_Poly[0].poly_num; | 
 |  | bits -= crc_Poly[0].poly_bits; | 
 | break; | break; | 
 | case 4: | case 4: | 
 | poly = crc_Poly[1].poly_num; | poly = crc_Poly[1].poly_num; | 
 |  | bits -= crc_Poly[1].poly_bits; | 
 | break; | break; | 
 | case 5: | case 5: | 
 | poly = crc_Poly[2].poly_num; | poly = crc_Poly[2].poly_num; | 
 |  | bits -= crc_Poly[2].poly_bits; | 
 | break; | break; | 
 | case 6: | case 6: | 
 | poly = crc_Poly[3].poly_num; | poly = crc_Poly[3].poly_num; | 
 |  | bits -= crc_Poly[3].poly_bits; | 
 | break; | break; | 
 | case 7: | case 7: | 
 | poly = crc_Poly[4].poly_num; | poly = crc_Poly[4].poly_num; | 
 |  | bits -= crc_Poly[4].poly_bits; | 
 | break; | break; | 
 | case 8: | case 8: | 
 | poly = crc_Poly[5].poly_num; | poly = crc_Poly[5].poly_num; | 
 |  | bits -= crc_Poly[5].poly_bits; | 
 | break; | break; | 
 | case 10: | case 10: | 
 | poly = crc_Poly[6].poly_num; | poly = crc_Poly[6].poly_num; | 
 |  | bits -= crc_Poly[6].poly_bits; | 
 | break; | break; | 
 | case 11: | case 11: | 
 | poly = crc_Poly[7].poly_num; | poly = crc_Poly[7].poly_num; | 
 |  | bits -= crc_Poly[7].poly_bits; | 
 | break; | break; | 
 | case 12: | case 12: | 
 | poly = crc_Poly[8].poly_num; | poly = crc_Poly[8].poly_num; | 
 |  | bits -= crc_Poly[8].poly_bits; | 
 | break; | break; | 
 | case 15: | case 15: | 
 | poly = crc_Poly[9].poly_num; | poly = crc_Poly[9].poly_num; | 
 |  | bits -= crc_Poly[9].poly_bits; | 
 | break; | break; | 
 | case 16: | case 16: | 
 | poly = crc_Poly[10].poly_num; | poly = crc_Poly[10].poly_num; | 
 |  | bits -= crc_Poly[10].poly_bits; | 
 | break; | break; | 
 | case 24: | case 24: | 
 | poly = crc_Poly[11].poly_num; | poly = crc_Poly[11].poly_num; | 
 |  | bits -= crc_Poly[11].poly_bits; | 
 | break; | break; | 
 | case 30: | case 30: | 
 | poly = crc_Poly[12].poly_num; | poly = crc_Poly[12].poly_num; | 
 |  | bits -= crc_Poly[12].poly_bits; | 
 | break; | break; | 
 | case 32: | case 32: | 
 | poly = crc_Poly[13].poly_num; | poly = crc_Poly[13].poly_num; | 
 |  | bits -= crc_Poly[13].poly_bits; | 
 | break; | break; | 
 |  | case 161: | 
 |  | poly = crc_Poly[14].poly_num; | 
 |  | bits -= crc_Poly[14].poly_bits; | 
 |  | crcBits = crc_Poly[14].poly_bits; | 
 |  | break; | 
 |  | case 162: | 
 |  | poly = crc_Poly[15].poly_num; | 
 |  | bits -= crc_Poly[15].poly_bits; | 
 |  | crcBits = crc_Poly[15].poly_bits; | 
 |  | break; | 
 | default: | default: | 
 | elwix_SetErr(EINVAL, "crcCalc(): Unsupported CRC method!!!"); | elwix_SetErr(EINVAL, "crcCalc(): Unsupported CRC method!!!"); | 
 | return -1; | return -1; | 
| Line 187  crcCalc(u_char * __restrict psBuf, u_int bufLen, u_cha | Line 216  crcCalc(u_char * __restrict psBuf, u_int bufLen, u_cha | 
 |  |  | 
 |  |  | 
 | /* | /* | 
 |  | * crc16_xy() - Checksum calculation in X/Y modem communication | 
 |  | * | 
 |  | * @buf = Data for calculation | 
 |  | * @bufLen = Length of data | 
 |  | * return: Checksum | 
 |  | */ | 
 |  | u_short | 
 |  | crc16_xy(u_char * __restrict buf, int bufLen) | 
 |  | { | 
 |  | u_short crc, x; | 
 |  | register u_short i; | 
 |  |  | 
 |  | assert(buf); | 
 |  |  | 
 |  | for (crc = 0; bufLen > 0; bufLen--, buf++) | 
 |  | for (i = 0x80; i; i >>= 1) { | 
 |  | x = crc >> 15; | 
 |  | crc <<= 1; | 
 |  |  | 
 |  | if (*buf & i) | 
 |  | crc++; | 
 |  | if (x) | 
 |  | crc ^= crc_16poly; | 
 |  | } | 
 |  |  | 
 |  | for (i = 0; i < 16; i++) { | 
 |  | x = crc >> 15; | 
 |  | crc <<= 1; | 
 |  |  | 
 |  | if (x) | 
 |  | crc ^= crc_16poly; | 
 |  | } | 
 |  |  | 
 |  | return crc; | 
 |  | } | 
 |  |  | 
 |  | /* | 
 |  | * crc16_ccitt() - Checksum calculation | 
 |  | * | 
 |  | * @buf = Data for calculation | 
 |  | * @bufLen = Length of data | 
 |  | * return: Checksum | 
 |  | */ | 
 |  | u_short | 
 |  | crc16_ccitt(u_char * __restrict buf, int bufLen) | 
 |  | { | 
 |  | u_short crc; | 
 |  | register u_char i; | 
 |  |  | 
 |  | for (crc = 0; bufLen > 0; bufLen--, buf++) { | 
 |  | crc ^= (u_short) *buf << 8; | 
 |  | for (i = 0x80; i; i >>= 1) | 
 |  | if (crc & 0x8000) | 
 |  | crc = crc << 1 ^ crc_16poly; | 
 |  | else | 
 |  | crc <<= 1; | 
 |  | } | 
 |  |  | 
 |  | return crc; | 
 |  | } | 
 |  |  | 
 |  | /* | 
 | * crcIP() - Checksum in IP communication | * crcIP() - Checksum in IP communication | 
 | * | * | 
 | * @buf = Data for calculation | * @buf = Data for calculation | 
 | * @bufLen = Length of data | * @bufLen = Length of data | 
| * return: -1 error, !=-1 Checksum | * return: Checksum | 
 | */ | */ | 
 | u_short | u_short | 
 | crcIP(u_char * __restrict buf, int bufLen) | crcIP(u_char * __restrict buf, int bufLen) | 
| Line 220  crcIP(u_char * __restrict buf, int bufLen) | Line 311  crcIP(u_char * __restrict buf, int bufLen) | 
 | * @buf = Data for calculation | * @buf = Data for calculation | 
 | * @bufLen = Length of data | * @bufLen = Length of data | 
 | * @th = TCP header | * @th = TCP header | 
| * return: -1 error, !=-1 Checksum | * return: Checksum | 
 | */ | */ | 
 | u_short | u_short | 
 | crcTCP(struct in_addr src, struct in_addr dst, u_char * __restrict th) | crcTCP(struct in_addr src, struct in_addr dst, u_char * __restrict th) | 
| Line 250  crcTCP(struct in_addr src, struct in_addr dst, u_char | Line 341  crcTCP(struct in_addr src, struct in_addr dst, u_char | 
 | * @buf = Data for calculation | * @buf = Data for calculation | 
 | * @bufLen = Length of data | * @bufLen = Length of data | 
 | * @uh = UDP header | * @uh = UDP header | 
| * return: -1 error, !=-1 Checksum | * return: Checksum | 
 | */ | */ | 
 | u_short | u_short | 
 | crcUDP(struct in_addr src, struct in_addr dst, u_char * __restrict uh) | crcUDP(struct in_addr src, struct in_addr dst, u_char * __restrict uh) | 
| Line 280  crcUDP(struct in_addr src, struct in_addr dst, u_char | Line 371  crcUDP(struct in_addr src, struct in_addr dst, u_char | 
 | * | * | 
 | * @nBuf = Data for calculation | * @nBuf = Data for calculation | 
 | * @bufLen = Length of data | * @bufLen = Length of data | 
| * return: -1 error, !=-1 Checksum | * return: Checksum | 
 | */ | */ | 
 | u_short | u_short | 
 | crcFletcher16(u_short * __restrict nBuf, int bufLen) | crcFletcher16(u_short * __restrict nBuf, int bufLen) | 
| Line 312  crcFletcher16(u_short * __restrict nBuf, int bufLen) | Line 403  crcFletcher16(u_short * __restrict nBuf, int bufLen) | 
 | * | * | 
 | * @nBuf = Data for calculation | * @nBuf = Data for calculation | 
 | * @bufLen = Length of data | * @bufLen = Length of data | 
| * return: -1 error, !=-1 Checksum | * return: Checksum | 
 | */ | */ | 
 | u_int | u_int | 
 | crcFletcher(u_short * __restrict nBuf, int bufLen) | crcFletcher(u_short * __restrict nBuf, int bufLen) | 
| Line 343  crcFletcher(u_short * __restrict nBuf, int bufLen) | Line 434  crcFletcher(u_short * __restrict nBuf, int bufLen) | 
 | * | * | 
 | * @psBuf = Data for calculation | * @psBuf = Data for calculation | 
 | * @bufLen = Length of data | * @bufLen = Length of data | 
| * return: -1 error, !=-1 Checksum | * return: Checksum | 
 | */ | */ | 
 | u_int | u_int | 
 | crcAdler(u_char * __restrict psBuf, int bufLen) | crcAdler(u_char * __restrict psBuf, int bufLen) |