version 1.4, 2011/04/28 20:28:20
|
version 1.4.2.4, 2012/07/04 14:52:57
|
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 | Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 |
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 49 SUCH DAMAGE.
|
Line 49 SUCH DAMAGE.
|
static int crc_Errno; |
static int crc_Errno; |
static char crc_Error[MAX_STR + 1]; |
static char crc_Error[MAX_STR + 1]; |
|
|
// Adler module | /* Adler module */ |
const u_int crc_modAdler = 0xFFF1L; |
const u_int crc_modAdler = 0xFFF1L; |
|
|
// All known library CRC types ... | /* All known library CRC types ... */ |
const crcPoly_t crc_Poly[] = { |
const crcPoly_t crc_Poly[] = { |
{ 1, (u_int) 0x1, "CRC-1-Parity" }, |
{ 1, (u_int) 0x1, "CRC-1-Parity" }, |
{ 4, (u_int) 0x3, "CRC-4-ITU" }, |
{ 4, (u_int) 0x3, "CRC-4-ITU" }, |
Line 70 const crcPoly_t crc_Poly[] = {
|
Line 70 const crcPoly_t crc_Poly[] = {
|
{ 32, (u_int) 0x04C11DB7, "CRC-32-802.3" } |
{ 32, (u_int) 0x04C11DB7, "CRC-32-802.3" } |
}; |
}; |
|
|
// ---------------------------------------------------------- |
|
|
|
// | /* |
// Error maintenance functions ... | * Error maintenance functions ... |
// | */ |
|
|
// crc_GetErrno() Get error code of last operation | /* crc_GetErrno() Get error code of last operation */ |
inline int crc_GetErrno() | inline int |
| crc_GetErrno() |
{ |
{ |
return crc_Errno; |
return crc_Errno; |
} |
} |
|
|
// crc_GetError() Get error text of last operation | /* crc_GetError() Get error text of last operation */ |
inline const char *crc_GetError() | inline const char * |
| crc_GetError() |
{ |
{ |
return crc_Error; |
return crc_Error; |
} |
} |
|
|
// crcSetErr() Set error to variables for internal use!!! | /* crc_SetErr() Set error to variables for internal use!!! */ |
inline void crcSetErr(int eno, char *estr, ...) | inline void |
| crc_SetErr(int eno, char *estr, ...) |
{ |
{ |
va_list lst; |
va_list lst; |
|
|
crc_Errno = eno; |
crc_Errno = eno; |
memset(crc_Error, 0, MAX_STR + 1); | memset(crc_Error, 0, sizeof crc_Error); |
va_start(lst, estr); |
va_start(lst, estr); |
vsnprintf(crc_Error, MAX_STR + 1, estr, lst); | vsnprintf(crc_Error, sizeof crc_Error, estr, lst); |
va_end(lst); |
va_end(lst); |
} |
} |
|
|
// ---------------------------------------------------------- |
|
|
|
/* |
/* |
* crcReflect() Reflect all bits of number | * crcReflect() - Reflect all bits of number |
| * |
* @crcNum = Number for reflection |
* @crcNum = Number for reflection |
* @crcBits = Number width bits |
* @crcBits = Number width bits |
* return: -1 error, !=-1 reflecting number |
* return: -1 error, !=-1 reflecting number |
Line 122 crcReflect(u_int crcNum, u_char crcBits)
|
Line 124 crcReflect(u_int crcNum, u_char crcBits)
|
} |
} |
|
|
/* |
/* |
* crcCalc() Generic CRC calculation function for many sub variants of CRC algorithms | * crcCalc() - Generic CRC calculation function for many sub variants of CRC algorithms |
| * |
* @psBuf = Data for calculation |
* @psBuf = Data for calculation |
* @bufLen = Length of data |
* @bufLen = Length of data |
* @crcBits = CRC algorithm bits (1, 4, 5, 6, 7, 8, 10, 11, 12, 15, 16, 24, 30, 32) |
* @crcBits = CRC algorithm bits (1, 4, 5, 6, 7, 8, 10, 11, 12, 15, 16, 24, 30, 32) |
Line 138 crcCalc(u_char * __restrict psBuf, u_int bufLen, u_cha
|
Line 141 crcCalc(u_char * __restrict psBuf, u_int bufLen, u_cha
|
u_int poly, crchibit, crc; |
u_int poly, crchibit, crc; |
register u_int i, j, b, ch; |
register u_int i, j, b, ch; |
|
|
if (!psBuf) { | assert(psBuf); |
crc_Errno = 1; | |
strlcpy(crc_Error, "crcCalc(): Invalid parameters!", MAX_STR + 1); | |
return -1; | |
} | |
|
|
switch (crcBits) { |
switch (crcBits) { |
case 1: |
case 1: |
Line 188 crcCalc(u_char * __restrict psBuf, u_int bufLen, u_cha
|
Line 187 crcCalc(u_char * __restrict psBuf, u_int bufLen, u_cha
|
poly = crc_Poly[13].poly_num; |
poly = crc_Poly[13].poly_num; |
break; |
break; |
default: |
default: |
crc_Errno = 2; | crc_SetErr(EINVAL, "crcCalc(): Unsupported CRC method!!!"); |
strlcpy(crc_Error, "crcCalc(): Unsupported CRC method!!!", MAX_STR + 1); | |
return -1; |
return -1; |
} |
} |
poly <<= bits; |
poly <<= bits; |
Line 225 crcCalc(u_char * __restrict psBuf, u_int bufLen, u_cha
|
Line 223 crcCalc(u_char * __restrict psBuf, u_int bufLen, u_cha
|
return crc; |
return crc; |
} |
} |
|
|
// ---------------------------------------------------------- |
|
|
|
/* |
/* |
* crcIP() Checksum in IP communication | * crcIP() - Checksum in IP communication |
* @nBuf = Data for calculation | * |
| * @buf = Data for calculation |
* @bufLen = Length of data |
* @bufLen = Length of data |
* return: -1 error, !=-1 Checksum |
* return: -1 error, !=-1 Checksum |
*/ |
*/ |
inline u_short |
inline u_short |
crcIP(u_short * __restrict nBuf, int bufLen) | crcIP(u_char * __restrict buf, int bufLen) |
{ |
{ |
register u_int sum; |
register u_int sum; |
|
u_short last = 0, *nBuf = (u_short*) buf; |
|
|
if (!nBuf) { | assert(buf); |
crc_Errno = 1; | |
strlcpy(crc_Error, "crcIP(): Invalid parameters!", MAX_STR + 1); | |
return -1; | |
} | |
|
|
for (sum = 0; bufLen; bufLen--) | for (sum = 0; bufLen && bufLen > 1; bufLen -= 2) |
sum += *nBuf++; |
sum += *nBuf++; |
|
if (bufLen == 1) { |
|
*(u_char*)(&last) += *(u_char*) nBuf; |
|
sum += last; |
|
} |
|
|
sum = (sum >> 16) + (sum & 0xFFFF); |
sum = (sum >> 16) + (sum & 0xFFFF); |
sum += sum >> 16; |
sum += sum >> 16; |
Line 255 crcIP(u_short * __restrict nBuf, int bufLen)
|
Line 254 crcIP(u_short * __restrict nBuf, int bufLen)
|
} |
} |
|
|
/* |
/* |
* 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: -1 error, !=-1 Checksum |
Line 266 crcFletcher16(u_short * __restrict nBuf, int bufLen)
|
Line 266 crcFletcher16(u_short * __restrict nBuf, int bufLen)
|
register u_short s1, s2; |
register u_short s1, s2; |
register u_int clen; |
register u_int clen; |
|
|
if (!nBuf) { | assert(nBuf); |
crc_Errno = 1; | |
strlcpy(crc_Error, "crcFletcher16(): Invalid parameters!", MAX_STR + 1); | |
return -1; | |
} | |
|
|
s1 = s2 = 0xFF; |
s1 = s2 = 0xFF; |
while (bufLen) { |
while (bufLen) { |
Line 291 crcFletcher16(u_short * __restrict nBuf, int bufLen)
|
Line 287 crcFletcher16(u_short * __restrict nBuf, int bufLen)
|
} |
} |
|
|
/* |
/* |
* crcFletcher() Fletcher-32 Checksum computing | * crcFletcher() - Fletcher-32 Checksum computing |
| * |
* @nBuf = Data for calculation |
* @nBuf = Data for calculation |
* @bufLen = Length of data |
* @bufLen = Length of data |
* return: -1 error, !=-1 Checksum |
* return: -1 error, !=-1 Checksum |
Line 301 crcFletcher(u_short * __restrict nBuf, int bufLen)
|
Line 298 crcFletcher(u_short * __restrict nBuf, int bufLen)
|
{ |
{ |
register u_int s1, s2, clen; |
register u_int s1, s2, clen; |
|
|
if (!nBuf) { | assert(nBuf); |
crc_Errno = 1; | |
strlcpy(crc_Error, "crcFletcher(): Invalid parameters!", MAX_STR + 1); | |
return -1; | |
} | |
|
|
s1 = s2 = 0xFFFF; |
s1 = s2 = 0xFFFF; |
while (bufLen) { |
while (bufLen) { |
Line 326 crcFletcher(u_short * __restrict nBuf, int bufLen)
|
Line 319 crcFletcher(u_short * __restrict nBuf, int bufLen)
|
} |
} |
|
|
/* |
/* |
* crcAdler() crcAdler-32 Checksum computing | * crcAdler() - crcAdler-32 Checksum computing |
| * |
* @psBuf = Data for calculation |
* @psBuf = Data for calculation |
* @bufLen = Length of data |
* @bufLen = Length of data |
* return: -1 error, !=-1 Checksum |
* return: -1 error, !=-1 Checksum |
Line 336 crcAdler(u_char * __restrict psBuf, int bufLen)
|
Line 330 crcAdler(u_char * __restrict psBuf, int bufLen)
|
{ |
{ |
register u_int s1, s2, clen; |
register u_int s1, s2, clen; |
|
|
if (!psBuf) { | assert(psBuf); |
crc_Errno = 1; | |
strlcpy(crc_Error, "crcAdler(): Invalid parameters!", MAX_STR + 1); | |
return -1; | |
} | |
|
|
s1 = 1L; |
s1 = 1L; |
s2 ^= s2; |
s2 ^= s2; |