Create an "epan/crc" directory for CRC code. Add crc-16-plain.[ch],

generated from pycrc. The command line used to generate the file is in
epan/crc/Makefile.common. I used "plain" to distinguish it from CCITT,
USB, and other 16-bit CRCs. Integrate the new CRC code into our
infrastructure.

Add crc16_plain_tvb_offset() to epan/crc16.[ch] and use it in
plugins/profinet/packet-pn-rt.c. This _should_ work correctly, but
hasn't been tested.

svn path=/trunk/; revision=27790
This commit is contained in:
Gerald Combs 2009-03-18 21:59:30 +00:00
parent cf536e062b
commit dd903ca9c8
12 changed files with 366 additions and 16 deletions

View File

@ -1646,6 +1646,7 @@ AC_OUTPUT(
asn1/x721/Makefile
doc/Makefile
epan/Makefile
epan/crc/Makefile
epan/crypt/Makefile
epan/doxygen.cfg
epan/dfilter/Makefile

View File

@ -35,7 +35,7 @@ wslua_dist_dir = wslua
endif # HAVE_LIBLUA
SUBDIRS = crypt ftypes dfilter dissectors $(wslua_dir)
SUBDIRS = crc crypt ftypes dfilter dissectors $(wslua_dir)
DIST_SUBDIRS = $(SUBDIRS) $(wslua_dist_dir)
@ -125,8 +125,8 @@ MAINTAINERCLEANFILES = \
#
libwireshark_la_LIBADD = \
@INET_ATON_LO@ @INET_PTON_LO@ @INET_NTOP_LO@ libwireshark_generated.la \
libwireshark_asmopt.la crypt/libairpdcap.la ftypes/libftypes.la \
dfilter/libdfilter.la dissectors/libdissectors.la \
libwireshark_asmopt.la crc/libcrc.la crypt/libairpdcap.la \
ftypes/libftypes.la dfilter/libdfilter.la dissectors/libdissectors.la \
dissectors/libdirtydissectors.la $(wslua_lib) @SOCKET_LIBS@ @NSL_LIBS@ \
@C_ARES_LIBS@ @ADNS_LIBS@ @LIBGCRYPT_LIBS@ @LIBGNUTLS_LIBS@ \
@KRB5_LIBS@ @SSL_LIBS@ @LIBSMI_LDFLAGS@ @GEOIP_LIBS@ \
@ -134,8 +134,8 @@ libwireshark_la_LIBADD = \
libwireshark_la_DEPENDENCIES = \
@INET_ATON_LO@ @INET_PTON_LO@ @INET_NTOP_LO@ libwireshark_generated.la \
libwireshark_asmopt.la crypt/libairpdcap.la ftypes/libftypes.la \
dfilter/libdfilter.la dissectors/libdissectors.la \
libwireshark_asmopt.la crc/libcrc.la crypt/libairpdcap.la \
ftypes/libftypes.la dfilter/libdfilter.la dissectors/libdissectors.la \
dissectors/libdirtydissectors.la $(wslua_lib) \
${top_builddir}/wsutil/libwsutil.la

View File

@ -44,6 +44,7 @@ libwireshark_LIBS = \
!IFDEF ICONV_DIR
$(ICONV_DIR)\lib\iconv.lib \
!ENDIF
crc\crc.lib \
crypt\airpdcap.lib \
ftypes\ftypes.lib \
dfilter\dfilter.lib \
@ -75,17 +76,17 @@ DOXYGEN_DEP=doxygen
!ENDIF
!IFDEF ENABLE_LIBWIRESHARK
all: crypt ftypes dfilter $(WSLUA_DIR) dissectors libwireshark.dll
all: crc crypt ftypes dfilter $(WSLUA_DIR) dissectors libwireshark.dll
!ELSE
all: crypt ftypes dfilter $(WSLUA_DIR) dissectors libwireshark.lib
all: crc crypt ftypes dfilter $(WSLUA_DIR) dissectors libwireshark.lib
!ENDIF
# For use when making libwireshark.dll
libwireshark.lib: libwireshark.dll
libwireshark.exp: libwireshark.dll
libwireshark.dll: ..\config.h $(LIBWIRESHARK_OBJECTS) libwireshark.def crypt ftypes dfilter $(WSLUA_DIR) dissectors $(DOXYGEN_DEP) $(EXTRA_OBJECTS) \
crypt\airpdcap.lib ftypes\ftypes.lib dfilter\dfilter.lib dissectors\dissectors.lib $(WSLUA_LIB) ..\image\libwireshark.res
libwireshark.dll: ..\config.h $(LIBWIRESHARK_OBJECTS) libwireshark.def crc crypt ftypes dfilter $(WSLUA_DIR) dissectors $(DOXYGEN_DEP) $(EXTRA_OBJECTS) \
crc\crc.lib crypt\airpdcap.lib ftypes\ftypes.lib dfilter\dfilter.lib dissectors\dissectors.lib $(WSLUA_LIB) ..\image\libwireshark.res
@echo Linking libwireshark.dll
$(link) $(dlllflags) $(conlibsdll) shell32.lib \
$(LOCAL_LDFLAGS) $(DLL_LDFLAGS) \
@ -95,8 +96,8 @@ libwireshark.dll: ..\config.h $(LIBWIRESHARK_OBJECTS) libwireshark.def crypt fty
dissectors\register.obj \
$(EXTRA_OBJECTS)
libwireshark.lib : ..\config.h $(LIBWIRESHARK_OBJECTS) crypt ftypes dfilter $(WSLUA_DIR) dissectors $(DOXYGEN_DEP) $(EXTRA_OBJECTS) \
crypt\airpdcap.lib ftypes\ftypes.lib dfilter\dfilter.lib $(WSLUA_LIB) dissectors\dissectors.lib
libwireshark.lib : ..\config.h $(LIBWIRESHARK_OBJECTS) crc crypt ftypes dfilter $(WSLUA_DIR) dissectors $(DOXYGEN_DEP) $(EXTRA_OBJECTS) \
crc\crc.lib crypt\airpdcap.lib ftypes\ftypes.lib dfilter\dfilter.lib $(WSLUA_LIB) dissectors\dissectors.lib
link /lib /out:libwireshark.lib $(LIBWIRESHARK_OBJECTS) \
$(EXTRA_OBJECTS)
@ -113,7 +114,9 @@ clean-local:
if exist html rmdir html
clean: clean-local
cd crypt
cd crc
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
cd ../crypt
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
cd ../ftypes
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
@ -144,7 +147,9 @@ distclean-local: clean-local
dtd_grammar.out sminmpec.c
distclean: distclean-local
cd crypt
cd crc
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
cd ../crypt
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
cd ../ftypes
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
@ -159,7 +164,9 @@ distclean: distclean-local
maintainer-clean-local: distclean-local
maintainer-clean: maintainer-clean-local
cd crypt
cd crc
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
cd ../crypt
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
cd ../ftypes
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
@ -171,6 +178,11 @@ maintainer-clean: maintainer-clean-local
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
cd ..
crc:: ..\config.h
cd crc
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake
cd ..
crypt:: ..\config.h
cd crypt
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake

54
epan/crc/Makefile.am Normal file
View File

@ -0,0 +1,54 @@
# Makefile.am
# Automake file for crc routines for Wireshark
#
# $Id$
#
# Wireshark - Network traffic analyzer
# By Gerald Combs <gerald@wireshark.org>
# Copyright 1998 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.
INCLUDES = -I$(top_srcdir)
include Makefile.common
if HAVE_WARNINGS_AS_ERRORS
AM_CFLAGS = -Werror
endif
noinst_LTLIBRARIES = libcrc.la
CLEANFILES = \
libcrc.a \
libcrc.la \
*~
DISTCLEANFILES =
MAINTAINERCLEANFILES = \
Makefile.in
libcrc_la_SOURCES = \
$(CRC_SRC) \
$(CRC_INCLUDES)
EXTRA_DIST = \
Makefile.common \
Makefile.nmake
checkapi:
$(PERL) ../../tools/checkAPIs.pl -g termoutput \
$(CRC_SRC)

33
epan/crc/Makefile.common Normal file
View File

@ -0,0 +1,33 @@
# Makefile.common
# Contains the stuff from Makefile.am and Makefile.nmake that is
# a) common to both files and
# b) portable between both files
#
# $Id$
#
# Wireshark - Network traffic analyzer
# By Gerald Combs <gerald@wireshark.org>
# Copyright 1998 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.
# crc-16-plain.c: pycrc.py --model crc-16 --algorithm table-driven --symbol-prefix crc16_plain_ --crc-type guint16 --include-file glib.h --generate c -o crc-16-plain.c
# crc-16-plain.h: pycrc.py --model crc-16 --algorithm table-driven --symbol-prefix crc16_plain_ --crc-type guint16 --include-file glib.h --generate h -o crc-16-plain.h
CRC_SRC = \
crc-16-plain.c
CRC_INCLUDES = \
crc-16-plain.h

30
epan/crc/Makefile.nmake Normal file
View File

@ -0,0 +1,30 @@
## Makefile for building crc.lib with Microsoft C and nmake
## Use: $(MAKE) /$(MAKEFLAGS) -f makefile.nmake
#
# $Id$
include ..\..\config.nmake
include Makefile.common
############### no need to modify below this line #########
CFLAGS=-WX -DHAVE_CONFIG_H $(GLIB_CFLAGS) -D_U_="" /I../.. $(LOCAL_CFLAGS)
.c.obj::
$(CC) $(CFLAGS) -Fd.\ -c $<
CRC_OBJECTS = $(CRC_SRC:.c=.obj)
crc.lib: $(CRC_OBJECTS)
link /lib /out:crc.lib $(CRC_OBJECTS)
clean:
rm -f $(CRC_OBJECTS) crc.lib *.pdb
distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl -g termoutput \
$(CRC_SRC)

103
epan/crc/crc-16-plain.c Normal file
View File

@ -0,0 +1,103 @@
/**
* \file crc-16-plain.c
* Functions and types for CRC checks.
*
* Generated on Wed Mar 18 14:12:09 2009,
* by pycrc v0.7, http://www.tty1.net/pycrc/
* using the configuration:
* Width = 16
* Poly = 0x8005
* XorIn = 0x0000
* ReflectIn = True
* XorOut = 0x0000
* ReflectOut = True
* Algorithm = table-driven
* Direct = True
*****************************************************************************/
#include "glib.h"
#include "crc-16-plain.h"
#include <stdint.h>
#include <stdlib.h>
/**
* Static table used for the table_driven implementation.
*****************************************************************************/
static const crc16_plain_t crc_table[256] = {
0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241,
0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440,
0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40,
0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841,
0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40,
0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,
0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641,
0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040,
0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240,
0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441,
0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41,
0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,
0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41,
0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40,
0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640,
0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041,
0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240,
0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41,
0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840,
0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41,
0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40,
0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640,
0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,
0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241,
0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440,
0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40,
0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841,
0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40,
0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,
0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641,
0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040
};
/**
* Reflect all bits of a \a data word of \a data_len bytes.
*
* \param data The data word to be reflected.
* \param data_len The width of \a data expressed in number of bits.
* \return The reflected data.
*****************************************************************************/
long crc16_plain_reflect(long data, size_t data_len)
{
unsigned int i;
long ret;
ret = data & 0x01;
for (i = 1; i < data_len; i++)
{
data >>= 1;
ret = (ret << 1) | (data & 0x01);
}
return ret;
}
/**
* Update the crc value with new data.
*
* \param crc The current crc value.
* \param data Pointer to a buffer of \a data_len bytes.
* \param data_len Number of bytes in the \a data buffer.
* \return The updated crc value.
*****************************************************************************/
crc16_plain_t crc16_plain_update(crc16_plain_t crc, const unsigned char *data, size_t data_len)
{
unsigned int tbl_idx;
while (data_len--) {
tbl_idx = (crc ^ *data) & 0xff;
crc = (crc_table[tbl_idx] ^ (crc >> 8)) & 0xffff;
data++;
}
return crc & 0xffff;
}

85
epan/crc/crc-16-plain.h Normal file
View File

@ -0,0 +1,85 @@
/**
* \file crc-16-plain.h
* Functions and types for CRC checks.
*
* Generated on Wed Mar 18 14:12:15 2009,
* by pycrc v0.7, http://www.tty1.net/pycrc/
* using the configuration:
* Width = 16
* Poly = 0x8005
* XorIn = 0x0000
* ReflectIn = True
* XorOut = 0x0000
* ReflectOut = True
* Algorithm = table-driven
* Direct = True
*****************************************************************************/
#ifndef __CRC____PLAIN_H__
#define __CRC____PLAIN_H__
#include "glib.h"
#include <stdint.h>
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* The definition of the used algorithm.
*****************************************************************************/
#define CRC_ALGO_TABLE_DRIVEN 1
/**
* The type of the CRC values.
*
* This type must be big enough to contain at least 16 bits.
*****************************************************************************/
typedef guint16 crc16_plain_t;
/**
* Reflect all bits of a \a data word of \a data_len bytes.
*
* \param data The data word to be reflected.
* \param data_len The width of \a data expressed in number of bits.
* \return The reflected data.
*****************************************************************************/
long crc16_plain_reflect(long data, size_t data_len);
/**
* Calculate the initial crc value.
*
* \return The initial crc value.
*****************************************************************************/
static inline crc16_plain_t crc16_plain_init(void)
{
return 0x0000;
}
/**
* Update the crc value with new data.
*
* \param crc The current crc value.
* \param data Pointer to a buffer of \a data_len bytes.
* \param data_len Number of bytes in the \a data buffer.
* \return The updated crc value.
*****************************************************************************/
crc16_plain_t crc16_plain_update(crc16_plain_t crc, const unsigned char *data, size_t data_len);
/**
* Calculate the final crc value.
*
* \param crc The current crc value.
* \return The final crc value.
*****************************************************************************/
static inline crc16_plain_t crc16_plain_finalize(crc16_plain_t crc)
{
return crc ^ 0x0000;
}
#ifdef __cplusplus
} /* closing brace for extern "C" */
#endif
#endif /* __CRC____PLAIN_H__ */

View File

@ -36,6 +36,7 @@
#include <glib.h>
#include <epan/tvbuff.h>
#include <epan/crc16.h>
#include <epan/crc/crc-16-plain.h>
/*****************************************************************/
@ -236,3 +237,14 @@ guint16 crc16_ccitt_tvb_offset_seed(tvbuff_t *tvb, guint offset, guint len, guin
return crc16_ccitt_seed(buf, len, seed);
}
guint16 crc16_plain_tvb_offset(tvbuff_t *tvb, guint offset, guint len)
{
guint16 crc = crc16_plain_init();
const guint8* buf = tvb_get_ptr(tvb, offset, len);
crc = crc16_plain_update(crc, buf, len);
return crc16_plain_finalize(crc);
}

View File

@ -102,6 +102,23 @@ extern guint16 crc16_ccitt_tvb_seed(tvbuff_t *tvb, guint len, guint16 seed);
extern guint16 crc16_ccitt_tvb_offset_seed(tvbuff_t *tvb, guint offset,
guint len, guint16 seed);
/** Compute the "plain" CRC16 checksum of a tv buffer using the following
* parameters:
* Width = 16
* Poly = 0x8005
* XorIn = 0x0000
* ReflectIn = True
* XorOut = 0x0000
* ReflectOut = True
* Algorithm = table-driven
* Direct = True
@param tvb The tv buffer containing the data.
@param offset The offset into the tv buffer.
@param len The number of bytes to include in the computation.
@return The CRC16 checksum. */
extern guint16 crc16_plain_tvb_offset(tvbuff_t *tvb, guint offset, guint len);
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@ -105,6 +105,7 @@ convert_string_to_hex
copy_file_binary_mode
copy_prefs
crc16_ccitt_tvb
crc16_plain_tvb_offset
create_dissector_handle
create_persconffile_dir
create_persconffile_profile

View File

@ -49,9 +49,9 @@
#include <epan/etypes.h>
#include <epan/expert.h>
#include <epan/dissectors/packet-dcerpc.h>
#include <epan/crc16.h>
#include "packet-pn.h"
#include "crc16.h"
/* Define the pn-rt proto */
static int proto_pn_rt = -1;
@ -145,7 +145,6 @@ dissect_SubFrame_heur(tvbuff_t *tvb,
proto_item *sub_item;
proto_tree *sub_tree;
proto_item *item;
const char *crc_buf;
guint16 crc;
@ -193,8 +192,11 @@ dissect_SubFrame_heur(tvbuff_t *tvb,
item = proto_tree_add_uint(sub_tree, hf_pn_rt_sf_crc16, tvb, offset, 2, u16SFCRC16);
if(u8SFPosition & 0x80) {
/*
crc_buf = (const char *) tvb_get_ptr(tvb, u32SubStart, offset-u32SubStart);
crc = crc16(0, crc_buf, offset-u32SubStart);
*/
crc = crc16_plain_tvb_offset(tvb, u32SubStart, offset-u32SubStart);
if(crc != u16SFCRC16) {
proto_item_append_text(item, " [Preliminary check: incorrect, should be: %u]", crc);