diff options
author | Gerald Combs <gerald@wireshark.org> | 2007-05-25 23:40:42 +0000 |
---|---|---|
committer | Gerald Combs <gerald@wireshark.org> | 2007-05-25 23:40:42 +0000 |
commit | a491fec183044f6065b8d92a3775f5130049b636 (patch) | |
tree | 3f899da6a2bb6dead6dbfa2392764a88ac26faa6 /plugins/wimax/crc.c | |
parent | 1e7c1bc0369f0c962ed73e8e34fa5ba7fa1a6c3d (diff) |
From Mike Harvey: Support for WiMAX and the WiMAX M2M encapsulation protocol.
Add support for WiMAX and M2M to various makefiles and installer files. Add
basic support for M2M to randpkt.
svn path=/trunk/; revision=21945
Diffstat (limited to 'plugins/wimax/crc.c')
-rw-r--r-- | plugins/wimax/crc.c | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/plugins/wimax/crc.c b/plugins/wimax/crc.c new file mode 100644 index 0000000000..504ef59435 --- /dev/null +++ b/plugins/wimax/crc.c @@ -0,0 +1,199 @@ +/* crc.c + * crc checksum generation and calculation functions: crc.c + * + * Copyright (c) 2007 by Intel Corporation. + * + * Author: Mike Harvey <michael.harvey@intel.com> + * + * $Id$ + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1999 Gerald Combs + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "crc.h" + +#define WMAX_MAC_CRC32_POLYNOMIAL 0x04c11db7L /* polynomial used in calculating the CRC-32 checksum */ +#define CCITT_X25_CRC16_POLYNOMIAL 0x1021 /* polynomial used in calculating the CRC-16 checksum */ +#define WMAX_MAC_CRC8_POLYNOMIAL 0x07 /* polynomial used in calculating the CRC-8 checksum */ +#define CRC32_INITIAL_VALUE 0xFFFFFFFF +#define CRC16_INITIAL_VALUE 0xFFFF + +#ifndef STATIC_DATA +static guint8 crc8_table[256]; +static guint32 crc32_table[256]; + +extern guint16 crc16_table[256]; + +/* + void wimax_mac_gen_crc32_table(void) + + REQUIRES: The functions must be called only once to initialze CRC table + + DESCRIPTION: Generate the table of CRC remainders + for all possible bytes + + ARGS: + + RETURNS: + + SIDE EFFECTS: + +*/ +void wimax_mac_gen_crc32_table(void) +{ + guint32 index, bit; + guint32 crc; + + /* little-endian (reflected) algorithm */ + for ( index = 0; index < 256; index++ ) + { + crc = ( index << 24 ); + for ( bit = 0; bit < 8; bit++ ) + { + if ( crc & 0x80000000L ) + crc = ( crc << 1 ) ^ WMAX_MAC_CRC32_POLYNOMIAL; + else + crc = ( crc << 1 ); + } + crc32_table[index] = crc; + } +} + +/* + void wimax_mac_gen_crc8_table(void) + + REQUIRES: The functions must be called only once to initialze CRC table + + DESCRIPTION: Generate the table of CRC remainders + for all possible bytes + + ARGS: + + RETURNS: + + SIDE EFFECTS: + +*/ +void wimax_mac_gen_crc8_table(void) +{ + guint index, bit; + guint8 crc; + + for ( index = 0; index < 256; index++ ) + { + crc = index; + for ( bit = 0; bit < 8; bit++ ) + { + if ( crc & 0x80 ) + crc = ( crc << 1 ) ^ WMAX_MAC_CRC8_POLYNOMIAL; + else + crc = ( crc << 1 ); + } + crc8_table[index] = crc; + } +} +#endif + +/* + + guint32 wimax_mac_calc_crc32(guint8 *data, guint data_len) + + REQUIRES: wimax_mac_gen_crc32_table() must be called before + + DESCRIPTION: Calculate the 32-bit CRC from a given data block + + ARGS: data - pointer to data + data_len - length of data (in bytes) + + RETURNS: calculated crc32 + + SIDE EFFECTS: + +*/ +guint32 wimax_mac_calc_crc32(guint8 *data, guint data_len) +{ + guint32 crc=CRC32_INITIAL_VALUE; + guint i, j; + + for ( j = 0; j < data_len; j++ ) + { + i = ( (guint8)(crc>>24) ^ data[j] ) & 0xff; + crc = ( crc<<8 ) ^ crc32_table[i]; + } + return ~crc; +} + +/* + + guint16 wimax_mac_calc_crc16(guint8 *data, guint data_len) + + REQUIRES: crc16_table[] in crc_data.c + + DESCRIPTION: Calculate the 16-bit CRC from a given data block + + ARGS: data - pointer to data + data_len - length of data (in bytes) + + RETURNS: calculated crc16 + + SIDE EFFECTS: + +*/ +guint16 wimax_mac_calc_crc16(guint8 *data, guint data_len) +{ + guint32 crc=CRC16_INITIAL_VALUE; + guint j; + + for ( j = 0; j < data_len; j++ ) + { + crc ^= data[j] << 8; + crc = (crc << 8) ^ crc16_table[(crc & 0xff00) >> 8]; + } + crc ^= 0xFFFF; /* Invert the output. */ + crc &= 0xFFFF; + return crc; +} + +/* + + guint8 wimax_mac_calc_crc8(guint8 *data, guint data_len) + + REQUIRES: wimax_mac_gen_crc8_table() must be called before + + DESCRIPTION: Calculate the 8-bit CRC from a given data block + + ARGS: data - pointer to data + data_len - length of data (in bytes) + + RETURNS: calculated crc8 + + SIDE EFFECTS: + +*/ +guint8 wimax_mac_calc_crc8(guint8 *data, guint data_len) +{ + guint8 crc=0; + guint i; + + for(i = 0; i < data_len; i++) + { + crc = crc8_table[data[i]^crc]; + } + return crc; +} |