--- libelwix/src/crc.c 2017/12/08 00:07:48 1.5 +++ libelwix/src/crc.c 2019/12/30 18:11:16 1.6 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: crc.c,v 1.5 2017/12/08 00:07:48 misho Exp $ +* $Id: crc.c,v 1.6 2019/12/30 18:11:16 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004 - 2015 +Copyright 2004 - 2019 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -46,6 +46,9 @@ SUCH DAMAGE. #include "global.h" +/* CRC16 poly */ +const u_short crc_16poly = 0x1021; + /* Adler module */ const u_int crc_modAdler = 0xFFF1L; @@ -73,7 +76,7 @@ const crcPoly_t crc_Poly[] = { * * @crcNum = Number for reflection * @crcBits = Number width bits - * return: -1 error, !=-1 reflecting number + * return: reflecting number */ u_int crcReflect(u_int crcNum, u_char crcBits) @@ -95,7 +98,7 @@ crcReflect(u_int crcNum, u_char crcBits) * @RevOpts = Options for computation (REVOPTS_REVERTBYTE, REVOPTS_REVERTCRC) * @initCRC = Initial CRC value * @xorCRC = Last xor CRC value - * return: -1 error, !=-1 CRC checksum + * return: CRC checksum */ u_int crcCalc(u_char * __restrict psBuf, u_int bufLen, u_char crcBits, u_char RevOpts, u_int initCRC, u_int xorCRC) @@ -187,11 +190,73 @@ crcCalc(u_char * __restrict psBuf, u_int bufLen, u_cha /* + * crc16_ext() - Checksum ver.2 calculation in X/Y modem communication + * + * @buf = Data for calculation + * @bufLen = Length of data + * return: Checksum + */ +u_short +crc16_ext(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() - Checksum calculation in X/Y modem communication + * + * @buf = Data for calculation + * @bufLen = Length of data + * return: Checksum + */ +u_short +crc16(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 * * @buf = Data for calculation * @bufLen = Length of data - * return: -1 error, !=-1 Checksum + * return: Checksum */ u_short crcIP(u_char * __restrict buf, int bufLen) @@ -220,7 +285,7 @@ crcIP(u_char * __restrict buf, int bufLen) * @buf = Data for calculation * @bufLen = Length of data * @th = TCP header - * return: -1 error, !=-1 Checksum + * return: Checksum */ u_short crcTCP(struct in_addr src, struct in_addr dst, u_char * __restrict th) @@ -250,7 +315,7 @@ crcTCP(struct in_addr src, struct in_addr dst, u_char * @buf = Data for calculation * @bufLen = Length of data * @uh = UDP header - * return: -1 error, !=-1 Checksum + * return: Checksum */ u_short crcUDP(struct in_addr src, struct in_addr dst, u_char * __restrict uh) @@ -280,7 +345,7 @@ crcUDP(struct in_addr src, struct in_addr dst, u_char * * @nBuf = Data for calculation * @bufLen = Length of data - * return: -1 error, !=-1 Checksum + * return: Checksum */ u_short crcFletcher16(u_short * __restrict nBuf, int bufLen) @@ -312,7 +377,7 @@ crcFletcher16(u_short * __restrict nBuf, int bufLen) * * @nBuf = Data for calculation * @bufLen = Length of data - * return: -1 error, !=-1 Checksum + * return: Checksum */ u_int crcFletcher(u_short * __restrict nBuf, int bufLen) @@ -343,7 +408,7 @@ crcFletcher(u_short * __restrict nBuf, int bufLen) * * @psBuf = Data for calculation * @bufLen = Length of data - * return: -1 error, !=-1 Checksum + * return: Checksum */ u_int crcAdler(u_char * __restrict psBuf, int bufLen)