|
version 1.1.1.1, 2013/01/17 10:05:35
|
version 1.7.2.1, 2024/10/12 16:00:11
|
|
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, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 | 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 56 const crcPoly_t crc_Poly[] = {
|
Line 59 const crcPoly_t crc_Poly[] = {
|
| { 5, (u_int) 0x15, "CRC-5-ITU" }, |
{ 5, (u_int) 0x15, "CRC-5-ITU" }, |
| { 6, (u_int) 0x3, "CRC-6-ITU" }, |
{ 6, (u_int) 0x3, "CRC-6-ITU" }, |
| { 7, (u_int) 0x9, "CRC-7-MMC" }, |
{ 7, (u_int) 0x9, "CRC-7-MMC" }, |
| { 8, (u_int) 0x8D, "CRC-8-CCITT" }, | { 8, (u_int) 0x7, "CRC-8-CCITT" }, |
| { 10, (u_int) 0x233, "CRC-10" }, |
{ 10, (u_int) 0x233, "CRC-10" }, |
| { 11, (u_int) 0x385, "CRC-11-FlexRay" }, |
{ 11, (u_int) 0x385, "CRC-11-FlexRay" }, |
| { 12, (u_int) 0x80F, "CRC-12-Telco" }, |
{ 12, (u_int) 0x80F, "CRC-12-Telco" }, |
|
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 |
| */ |
*/ |
| inline u_int | u_int |
| crcReflect(u_int crcNum, u_char crcBits) |
crcReflect(u_int crcNum, u_char crcBits) |
| { |
{ |
| register u_int i, j, rev; | register u_int i, j = 1, rev = 0; |
| |
|
| for (i = (u_int) 1 << (crcBits - 1), j = 1, rev ^= rev; i; i >>= 1, j <<= 1) | for (i = (u_int) 1 << (crcBits - 1); i; i >>= 1, j <<= 1) |
| if (crcNum & i) |
if (crcNum & i) |
| rev |= j; |
rev |= j; |
| return rev; |
return rev; |
|
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 |
| */ |
*/ |
| inline 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 |
| */ |
*/ |
| inline u_short | u_short |
| crcIP(u_char * __restrict buf, int bufLen) |
crcIP(u_char * __restrict buf, int bufLen) |
| { |
{ |
| register u_int sum; |
register u_int sum; |
|
Line 201 crcIP(u_char * __restrict buf, int bufLen)
|
Line 292 crcIP(u_char * __restrict buf, int bufLen)
|
| |
|
| assert(buf); |
assert(buf); |
| |
|
| for (sum = 0; bufLen && bufLen > 1; bufLen -= 2) | for (sum = 0; bufLen > 1; bufLen -= 2) |
| sum += *nBuf++; |
sum += *nBuf++; |
| if (bufLen == 1) { |
if (bufLen == 1) { |
| *(u_char*)(&last) += *(u_char*) nBuf; |
*(u_char*)(&last) += *(u_char*) nBuf; |
|
Line 215 crcIP(u_char * __restrict buf, int bufLen)
|
Line 306 crcIP(u_char * __restrict buf, int bufLen)
|
| } |
} |
| |
|
| /* |
/* |
| |
* crcTCP() - Checksum for TCP v4 communication |
| |
* |
| |
* @buf = Data for calculation |
| |
* @bufLen = Length of data |
| |
* @th = TCP header |
| |
* return: Checksum |
| |
*/ |
| |
u_short |
| |
crcTCP(struct in_addr src, struct in_addr dst, u_char * __restrict th) |
| |
{ |
| |
struct psd_tcp { |
| |
struct in_addr src; |
| |
struct in_addr dst; |
| |
u_char pad; |
| |
u_char proto; |
| |
u_short tcp_len; |
| |
u_char tcp[20]; |
| |
} buf; |
| |
|
| |
buf.src = src; |
| |
buf.dst = dst; |
| |
buf.pad = 0; |
| |
buf.proto = IPPROTO_TCP; |
| |
buf.tcp_len = htons(sizeof buf.tcp); |
| |
memcpy(&buf.tcp, th, sizeof buf.tcp); |
| |
|
| |
return crcIP((u_char*) &buf, sizeof buf); |
| |
} |
| |
|
| |
/* |
| |
* crcUDP() - Checksum for UDP v4 communication |
| |
* |
| |
* @buf = Data for calculation |
| |
* @bufLen = Length of data |
| |
* @uh = UDP header |
| |
* return: Checksum |
| |
*/ |
| |
u_short |
| |
crcUDP(struct in_addr src, struct in_addr dst, u_char * __restrict uh) |
| |
{ |
| |
struct psd_udp { |
| |
struct in_addr src; |
| |
struct in_addr dst; |
| |
u_char pad; |
| |
u_char proto; |
| |
u_short udp_len; |
| |
u_char udp[8]; |
| |
} buf; |
| |
|
| |
buf.src = src; |
| |
buf.dst = dst; |
| |
buf.pad = 0; |
| |
buf.proto = IPPROTO_UDP; |
| |
buf.udp_len = htons(sizeof buf.udp); |
| |
memcpy(&buf.udp, uh, sizeof buf.udp); |
| |
|
| |
return crcIP((u_char*) &buf, sizeof buf); |
| |
} |
| |
|
| |
|
| |
/* |
| * crcFletcher16() - Fletcher-16 Checksum computing |
* crcFletcher16() - Fletcher-16 Checksum computing |
| * |
* |
| * @nBuf = Data for calculation |
* @nBuf = Data for calculation |
| * @bufLen = Length of data |
* @bufLen = Length of data |
| * return: -1 error, !=-1 Checksum | * return: Checksum |
| */ |
*/ |
| inline u_short | u_short |
| crcFletcher16(u_short * __restrict nBuf, int bufLen) |
crcFletcher16(u_short * __restrict nBuf, int bufLen) |
| { |
{ |
| register u_short s1, s2; |
register u_short s1, s2; |
|
Line 251 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 |
| */ |
*/ |
| inline u_int | u_int |
| crcFletcher(u_short * __restrict nBuf, int bufLen) |
crcFletcher(u_short * __restrict nBuf, int bufLen) |
| { |
{ |
| register u_int s1, s2, clen; |
register u_int s1, s2, clen; |
|
Line 282 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 |
| */ |
*/ |
| inline u_int | u_int |
| crcAdler(u_char * __restrict psBuf, int bufLen) |
crcAdler(u_char * __restrict psBuf, int bufLen) |
| { |
{ |
| register u_int s1, s2, clen; | register u_int s1 = 1, s2 = 0, clen; |
| |
|
| assert(psBuf); |
assert(psBuf); |
| |
|
| s1 = 1L; |
|
| s2 ^= s2; |
|
| while (bufLen) { |
while (bufLen) { |
| clen = bufLen > MAX_ADLER_DIGEST ? MAX_ADLER_DIGEST : bufLen; |
clen = bufLen > MAX_ADLER_DIGEST ? MAX_ADLER_DIGEST : bufLen; |
| bufLen -= clen; |
bufLen -= clen; |