diff options
author | Jaap Keuter <jaap.keuter@xs4all.nl> | 2007-01-04 14:23:56 +0000 |
---|---|---|
committer | Jaap Keuter <jaap.keuter@xs4all.nl> | 2007-01-04 14:23:56 +0000 |
commit | ad44a5cdfb476a6af3df18154ee75b01afb7df5b (patch) | |
tree | b5e220cdc1a0a4acec63745d11373d9ba387d27d /plugins/irda | |
parent | 04e34b975a85d2c4ed3ef4682a06da80367d4faa (diff) |
Serious source code cleanup.
svn path=/trunk/; revision=20308
Diffstat (limited to 'plugins/irda')
-rw-r--r-- | plugins/irda/packet-sir.c | 155 |
1 files changed, 80 insertions, 75 deletions
diff --git a/plugins/irda/packet-sir.c b/plugins/irda/packet-sir.c index bdfe36959e..6187130360 100644 --- a/plugins/irda/packet-sir.c +++ b/plugins/irda/packet-sir.c @@ -3,6 +3,12 @@ * @copyright Copyright 2004 Shaun Jackman * @license GPL * + * $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 @@ -21,9 +27,6 @@ #ifdef HAVE_CONFIG_H # include "config.h" #endif -#include "moduleinfo.h" - -#include <gmodule.h> #include <epan/packet.h> #include <epan/crc16.h> @@ -62,109 +65,111 @@ static int hf_sir_preamble = -1; /** Unescapes the data. */ -static tvbuff_t* -unescape_data( tvbuff_t* tvb, packet_info* pinfo) +static tvbuff_t * +unescape_data(tvbuff_t *tvb, packet_info *pinfo) { - if( tvb_find_guint8( tvb, 0, -1, SIR_CE) == -1) { + if (tvb_find_guint8(tvb, 0, -1, SIR_CE) == -1) { return tvb; } else { - guint8* data = g_malloc( tvb_length( tvb)); - const guint8* src = tvb_get_ptr( tvb, 0, -1); - const guint8* end = src + tvb_length( tvb); - guint8* dst = data; - while( src < end) { - guint8 c = *src++; - switch( c) { - case SIR_CE: - if( src < end) - c = SIR_ESCAPE( *src++); - default: - *dst++ = c; - } - } + guint length = tvb_length(tvb); + guint offset; + guint8 *data = g_malloc(length); + guint8 *dst = data; + tvbuff_t *next_tvb; + + for (offset = 0; offset < length; ) { - tvbuff_t* next_tvb = tvb_new_real_data( - data, dst-data, dst-data); - tvb_set_free_cb( next_tvb, g_free); - tvb_set_child_real_data_tvbuff( tvb, next_tvb); - add_new_data_source( pinfo, next_tvb, "Unescaped SIR"); - return next_tvb; + guint8 c = tvb_get_guint8(tvb, offset++); + if ((c == SIR_CE) && (offset < length)) + c = SIR_ESCAPE(tvb_get_guint8(tvb, offset++)); + *dst++ = c; } + + next_tvb = tvb_new_real_data(data, dst-data, dst-data); + tvb_set_free_cb(next_tvb, g_free); + tvb_set_child_real_data_tvbuff(tvb, next_tvb); + add_new_data_source(pinfo, next_tvb, "Unescaped SIR"); + return next_tvb; } } /** Checksums the data. */ -static tvbuff_t* -checksum_data( tvbuff_t* tvb, proto_tree* tree) +static tvbuff_t * +checksum_data(tvbuff_t *tvb, proto_tree *tree) { - int len = tvb_length( tvb) - 2; - if( len < 0) + int len = tvb_length(tvb) - 2; + if (len < 0) return tvb; - if( tree) { - guint16 actual_fcs = tvb_get_letohs( tvb, len); - guint16 calculated_fcs = crc16_ccitt_tvb( tvb, len); - if( calculated_fcs == actual_fcs) { - proto_tree_add_uint_format( tree, hf_sir_fcs, + if (tree) { + guint16 actual_fcs = tvb_get_letohs(tvb, len); + guint16 calculated_fcs = crc16_ccitt_tvb(tvb, len); + if (calculated_fcs == actual_fcs) { + proto_tree_add_uint_format(tree, hf_sir_fcs, tvb, len, 2, actual_fcs, "Frame check sequence: 0x%04x (correct)", actual_fcs); } else { - proto_tree_add_boolean_hidden( tree, + proto_tree_add_boolean_hidden(tree, hf_sir_fcs_bad, tvb, len, 2, TRUE); - proto_tree_add_uint_format( tree, hf_sir_fcs, + proto_tree_add_uint_format(tree, hf_sir_fcs, tvb, len, 2, actual_fcs, "Frame check sequence: 0x%04x " "(incorrect, should be 0x%04x)", actual_fcs, calculated_fcs); } } - return tvb_new_subset( tvb, 0, len, len); + return tvb_new_subset(tvb, 0, len, len); } /** Dissects an SIR packet. */ static void -dissect_sir( tvbuff_t* tvb, packet_info* pinfo, proto_tree* root) +dissect_sir(tvbuff_t *tvb, packet_info *pinfo, proto_tree *root) { gint offset = 0; - while( tvb_length_remaining( tvb, offset) > 0) { - gint bof_offset = tvb_find_guint8( tvb, offset, -1, SIR_BOF); - guint preamble_len = bof_offset - offset; - gint eof_offset = bof_offset == -1 ? -1 : - tvb_find_guint8( tvb, bof_offset, -1, SIR_EOF); - gint data_offset = bof_offset + 1; - guint data_len = eof_offset - data_offset; - tvbuff_t* next_tvb = tvb_new_subset( tvb, - data_offset, data_len, -1); - if( bof_offset == -1 || eof_offset == -1) { - if( pinfo->can_desegment) { + gint bof_offset; + gint eof_offset; + + while (tvb_length_remaining(tvb, offset) > 0) { + bof_offset = tvb_find_guint8(tvb, offset, -1, SIR_BOF); + eof_offset = (bof_offset == -1) ? -1 : + tvb_find_guint8(tvb, bof_offset, -1, SIR_EOF); + + if (bof_offset == -1 || eof_offset == -1) { + if (pinfo->can_desegment) { pinfo->desegment_offset = offset; pinfo->desegment_len = 1; } return; } else { - next_tvb = unescape_data( next_tvb, pinfo); - if( root) { - unsigned data_len = tvb_length( next_tvb) < 2 ? 0 : - tvb_length( next_tvb) - 2; - proto_tree* ti = proto_tree_add_protocol_format( root, + guint preamble_len = bof_offset - offset; + gint data_offset = bof_offset + 1; + guint data_len = eof_offset - data_offset; + tvbuff_t* next_tvb = tvb_new_subset(tvb, + data_offset, data_len, -1); + next_tvb = unescape_data(next_tvb, pinfo); + if (root) { + unsigned data_len = tvb_length(next_tvb) < 2 ? 0 : + tvb_length(next_tvb) - 2; + proto_tree* ti = proto_tree_add_protocol_format(root, proto_sir, tvb, offset, eof_offset - offset + 1, "Serial Infrared, Len: %d", data_len); - proto_tree* tree = proto_item_add_subtree( ti, ett_sir); - if( preamble_len > 0) - proto_tree_add_item( tree, hf_sir_preamble, tvb, + proto_tree* tree = proto_item_add_subtree(ti, ett_sir); + if (preamble_len > 0) + proto_tree_add_item(tree, hf_sir_preamble, tvb, offset, preamble_len, FALSE); - proto_tree_add_item( tree, hf_sir_bof, tvb, + proto_tree_add_item(tree, hf_sir_bof, tvb, bof_offset, 1, FALSE); - proto_tree_add_uint( tree, hf_sir_length, + proto_tree_add_uint(tree, hf_sir_length, next_tvb, 0, data_len, data_len); - next_tvb = checksum_data( next_tvb, tree); - proto_tree_add_item( tree, hf_sir_eof, tvb, + next_tvb = checksum_data(next_tvb, tree); + proto_tree_add_item(tree, hf_sir_eof, tvb, eof_offset, 1, FALSE); - } else - next_tvb = checksum_data( next_tvb, NULL); - call_dissector( irda_handle, next_tvb, pinfo, root); + } else { + next_tvb = checksum_data(next_tvb, NULL); + } + call_dissector(irda_handle, next_tvb, pinfo, root); } offset = eof_offset + 1; } @@ -173,20 +178,20 @@ dissect_sir( tvbuff_t* tvb, packet_info* pinfo, proto_tree* root) /** Registers this dissector with the parent dissector. */ void -proto_reg_handoff_irsir( void) +proto_reg_handoff_irsir(void) { - dissector_add( "tcp.port", TCP_PORT_SIR, find_dissector( "sir")); + dissector_add("tcp.port", TCP_PORT_SIR, find_dissector("sir")); - data_handle = find_dissector( "data"); - irda_handle = find_dissector( "irda"); - if( irda_handle == 0) + data_handle = find_dissector("data"); + irda_handle = find_dissector("irda"); + if (irda_handle == 0) irda_handle = data_handle; } /** Initializes this protocol. */ void -proto_register_irsir( void) +proto_register_irsir(void) { static gint* ett[] = { &ett_sir }; @@ -218,13 +223,13 @@ proto_register_irsir( void) { &hf_sir_preamble, { "Preamble", "sir.preamble", FT_BYTES, BASE_NONE, NULL, 0, - "", HFILL }}, + "", HFILL }} }; proto_sir = proto_register_protocol( "Serial Infrared", "SIR", "sir"); - register_dissector( "sir", dissect_sir, proto_sir); - proto_register_subtree_array( ett, array_length( ett)); + register_dissector("sir", dissect_sir, proto_sir); + proto_register_subtree_array(ett, array_length(ett)); proto_register_field_array( - proto_sir, hf_sir, array_length( hf_sir)); + proto_sir, hf_sir, array_length(hf_sir)); } |