direwolf/fcs_calc.c
WB2OSZ 8978f2de6c Version 1.0 - Initial commit
Changes to be committed:
	new file:   .gitattributes
	new file:   .gitignore
	new file:   APRStt-Implementation-Notes.pdf
	new file:   CHANGES.txt
	new file:   LICENSE-dire-wolf.txt
	new file:   LICENSE-other.txt
	new file:   Makefile.linux
	new file:   Makefile.win
	new file:   Quick-Start-Guide-Windows.pdf
	new file:   Raspberry-Pi-APRS.pdf
	new file:   User-Guide.pdf
	new file:   aclients.c
	new file:   aprs_tt.c
	new file:   aprs_tt.h
	new file:   atest.c
	new file:   audio.c
	new file:   audio.h
	new file:   audio_win.c
	new file:   ax25_pad.c
	new file:   ax25_pad.h
	new file:   beacon.c
	new file:   beacon.h
	new file:   config.c
	new file:   config.h
	new file:   decode_aprs.c
	new file:   decode_aprs.h
	new file:   dedupe.c
	new file:   dedupe.h
	new file:   demod.c
	new file:   demod.h
	new file:   demod_9600.c
	new file:   demod_9600.h
	new file:   demod_afsk.c
	new file:   demod_afsk.h
	new file:   digipeater.c
	new file:   digipeater.h
	new file:   direwolf.c
	new file:   direwolf.conf
	new file:   direwolf.desktop
	new file:   direwolf.h
	new file:   dsp.c
	new file:   dsp.h
	new file:   dtmf.c
	new file:   dtmf.h
	new file:   dw-icon.ico
	new file:   dw-icon.png
	new file:   dw-icon.rc
	new file:   dw-start.sh
	new file:   dwgps.c
	new file:   dwgps.h
	new file:   encode_aprs.c
	new file:   encode_aprs.h
	new file:   fcs_calc.c
	new file:   fcs_calc.h
	new file:   fsk_demod_agc.h
	new file:   fsk_demod_state.h
	new file:   fsk_filters.h
	new file:   fsk_gen_filter.h
	new file:   gen_packets.c
	new file:   gen_tone.c
	new file:   gen_tone.h
	new file:   hdlc_rec.c
	new file:   hdlc_rec.h
	new file:   hdlc_rec2.c
	new file:   hdlc_rec2.h
	new file:   hdlc_send.c
	new file:   hdlc_send.h
	new file:   igate.c
	new file:   igate.h
	new file:   kiss.c
	new file:   kiss.h
	new file:   kiss_frame.c
	new file:   kiss_frame.h
	new file:   kissnet.c
	new file:   kissnet.h
	new file:   latlong.c
	new file:   latlong.h
	new file:   ll2utm.c
	new file:   misc/README-dire-wolf.txt
	new file:   misc/strcasestr.c
	new file:   misc/strsep.c
	new file:   misc/strtok_r.c
	new file:   morse.c
	new file:   multi_modem.c
	new file:   multi_modem.h
	new file:   ptt.c
	new file:   ptt.h
	new file:   pttest.c
	new file:   rdq.c
	new file:   rdq.h
	new file:   redecode.c
	new file:   redecode.h
	new file:   regex/COPYING
	new file:   regex/INSTALL
	new file:   regex/LICENSES
	new file:   regex/NEWS
	new file:   regex/README
	new file:   regex/README-dire-wolf.txt
	new file:   regex/re_comp.h
	new file:   regex/regcomp.c
	new file:   regex/regex.c
	new file:   regex/regex.h
	new file:   regex/regex_internal.c
	new file:   regex/regex_internal.h
	new file:   regex/regexec.c
	new file:   rrbb.c
	new file:   rrbb.h
	new file:   server.c
	new file:   server.h
	new file:   symbols-new.txt
	new file:   symbols.c
	new file:   symbols.h
	new file:   symbolsX.txt
	new file:   textcolor.c
	new file:   textcolor.h
	new file:   tocalls.txt
	new file:   tq.c
	new file:   tq.h
	new file:   tt_text.c
	new file:   tt_text.h
	new file:   tt_user.c
	new file:   tt_user.h
	new file:   tune.h
	new file:   udp_test.c
	new file:   utm/LatLong-UTMconversion.c
	new file:   utm/LatLong-UTMconversion.h
	new file:   utm/README.txt
	new file:   utm/SwissGrid.cpp
	new file:   utm/UTMConversions.cpp
	new file:   utm/constants.h
	new file:   utm2ll.c
	new file:   version.h
	new file:   xmit.c
	new file:   xmit.h
2015-07-26 20:35:07 -04:00

109 lines
3.8 KiB
C

//
// This file is part of Dire Wolf, an amateur radio packet TNC.
//
// Copyright (C) 2011 John Langner, WB2OSZ
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
#include <stdio.h>
/*
* Calculate the FCS for an AX.25 frame.
*/
#include "fcs_calc.h"
static const unsigned short ccitt_table[256] = {
// from http://www.ietf.org/rfc/rfc1549.txt
0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
};
/*
* Use this for an AX.25 frame.
*/
unsigned short fcs_calc (unsigned char *data, int len)
{
unsigned short crc = 0xffff;
int j;
for (j=0; j<len; j++) {
crc = ((crc) >> 8) ^ ccitt_table[((crc) ^ data[j]) & 0xff];
}
return ( crc ^ 0xffff );
}
/*
* This can be used when we want to calculate a single CRC over disjoint data.
*
* crc = crc16 (region1, sizeof(region1), 0xffff);
* crc = crc16 (region2, sizeof(region2), crc);
* crc = crc16 (region3, sizeof(region3), crc);
*/
unsigned short crc16 (unsigned char *data, int len, unsigned short seed)
{
unsigned short crc = seed;
int j;
for (j=0; j<len; j++) {
crc = ((crc) >> 8) ^ ccitt_table[((crc) ^ data[j]) & 0xff];
}
return ( crc ^ 0xffff );
}