diff options
author | Stig Bjørlykke <stig@bjorlykke.org> | 2007-10-06 11:28:09 +0000 |
---|---|---|
committer | Stig Bjørlykke <stig@bjorlykke.org> | 2007-10-06 11:28:09 +0000 |
commit | af2d10d5bf8e81d95682219ccbe0f9fd4a9188d9 (patch) | |
tree | 63e8151fb50ed1c4643feb3a259a739a25280c44 /epan | |
parent | e63da0188c1858d9e13a02dd7d8d08115dc939d8 (diff) | |
download | wireshark-af2d10d5bf8e81d95682219ccbe0f9fd4a9188d9.tar.gz |
- Added option to use relative message id (MSID)
- Added generated entry for total missing sequence numbers
- Added expert info on invalid ack info length
- Added count of ack in info column
svn path=/trunk/; revision=23079
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-p_mul.c | 109 |
1 files changed, 88 insertions, 21 deletions
diff --git a/epan/dissectors/packet-p_mul.c b/epan/dissectors/packet-p_mul.c index 779af77b42..7c747ef57e 100644 --- a/epan/dissectors/packet-p_mul.c +++ b/epan/dissectors/packet-p_mul.c @@ -93,6 +93,7 @@ static int hf_ack_count = -1; static int hf_ack_entry = -1; static int hf_ack_length = -1; static int hf_miss_seq_no = -1; +static int hf_tot_miss_seq_no = -1; static int hf_dest_entry = -1; static int hf_dest_id = -1; static int hf_msg_seq_no = -1; @@ -118,6 +119,7 @@ static gint ett_msg_fragments = -1; /* User definable values to use for dissection */ static gboolean p_mul_reassemble = TRUE; static gint decode_option = DECODE_NONE; +static gboolean use_relative_msgid = TRUE; static guint global_p_mul_tport = P_MUL_TPORT; static guint global_p_mul_rport = P_MUL_RPORT; @@ -132,6 +134,8 @@ static guint p_mul_aport = 0; static GHashTable *p_mul_fragment_table = NULL; static GHashTable *p_mul_reassembled_table = NULL; +static guint32 message_id_offset = 0; + static const fragment_items p_mul_frag_items = { /* Fragment subtrees */ &ett_msg_fragment, @@ -233,7 +237,7 @@ static void dissect_p_mul (tvbuff_t *tvb, packet_info *pinfo _U_, guint16 no_dest = 0, count = 0, len = 0, data_len = 0; guint16 checksum1, checksum2, pdu_length = 0; guint8 pdu_type = 0, *value = NULL, map = 0; - gint i, no_missing = 0, offset = 0; + gint i, tot_no_missing = 0, no_missing = 0, offset = 0; nstime_t ts; if (check_col (pinfo->cinfo, COL_PROTOCOL)) @@ -319,7 +323,7 @@ static void dissect_p_mul (tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree_add_item (p_mul_tree, hf_seq_no, tvb, offset, 2, FALSE); proto_item_append_text (ti, ", Seq no: %u", seq_no); if (check_col (pinfo->cinfo, COL_INFO)) - col_append_fstr (pinfo->cinfo, COL_INFO, ", Seq no: %u", seq_no); + col_append_fstr (pinfo->cinfo, COL_INFO, ", Seq no: %u", seq_no); break; case Announce_PDU: @@ -365,7 +369,18 @@ static void dissect_p_mul (tvbuff_t *tvb, packet_info *pinfo _U_, /* Message Id */ message_id = tvb_get_ntohl (tvb, offset); - proto_tree_add_item (p_mul_tree, hf_message_id, tvb, offset, 4, FALSE); + if (use_relative_msgid) { + if (message_id_offset == 0) { + /* First P_Mul package - initialize message_id_offset */ + message_id_offset = message_id; + } + message_id -= message_id_offset; + proto_tree_add_uint_format (p_mul_tree, hf_message_id, tvb, offset, 4, + message_id, "Message ID (MSID): %u" + " (relative message id)", message_id); + } else { + proto_tree_add_item (p_mul_tree, hf_message_id, tvb, offset, 4, FALSE); + } offset += 4; proto_item_append_text (ti, ", MSID: %u", message_id); @@ -426,7 +441,8 @@ static void dissect_p_mul (tvbuff_t *tvb, packet_info *pinfo _U_, if (p_mul_reassemble) { /* Start fragment table */ - fragment_start_seq_check (pinfo, message_id, p_mul_fragment_table, no_pdus - 1); + fragment_start_seq_check (pinfo, message_id, p_mul_fragment_table, + no_pdus - 1); } break; @@ -472,32 +488,60 @@ static void dissect_p_mul (tvbuff_t *tvb, packet_info *pinfo _U_, field_tree = proto_item_add_subtree (en, ett_entry); /* Length of Ack Info Entry */ - proto_tree_add_item (field_tree, hf_ack_length, tvb, offset, 2, FALSE); + en = proto_tree_add_item (field_tree, hf_ack_length, tvb, offset, + 2, FALSE); offset += 2; + if (len < 10) { + proto_item_append_text (en, " (invalid length)"); + expert_add_info_format (pinfo, en, PI_MALFORMED, PI_WARN, + "Invalid ack info length"); + } + /* Source Id */ proto_tree_add_item (field_tree, hf_source_id, tvb, offset, 4, FALSE); offset += 4; /* Message Id */ - proto_tree_add_item (field_tree, hf_message_id, tvb, offset, 4, FALSE); - offset += 4; - - for (no_missing = 0; no_missing < (len - 10) / 2; no_missing++) { - /* Missing Data PDU Seq Number */ - proto_tree_add_item (field_tree, hf_miss_seq_no, tvb,offset, 2, FALSE); - offset += 2; + message_id = tvb_get_ntohl (tvb, offset); + if (use_relative_msgid) { + if (message_id_offset == 0) { + /* First P_Mul package - initialize message_id_offset */ + message_id_offset = message_id; + } + message_id -= message_id_offset; + proto_tree_add_uint_format (field_tree, hf_message_id, tvb, offset, 4, + message_id, "Message ID (MSID): %u" + " (relative message id)", message_id); + } else { + proto_tree_add_item (field_tree, hf_message_id, tvb, offset, 4, FALSE); } + offset += 4; - if (no_missing) { - proto_item_append_text (ti, ", Missing seq numbers: %u", no_missing); - expert_add_info_format (pinfo, en, PI_RESPONSE_CODE, PI_NOTE, - "Missing seq numbers: %d", no_missing); - if (check_col (pinfo->cinfo, COL_INFO)) - col_append_fstr (pinfo->cinfo, COL_INFO, ", Missing seq numbers: %u", - no_missing); + if (len > 10) { + for (no_missing = 0; no_missing < (len - 10) / 2; no_missing++) { + /* Missing Data PDU Seq Number */ + proto_tree_add_item (field_tree, hf_miss_seq_no, tvb,offset, + 2, FALSE); + offset += 2; + } + tot_no_missing += no_missing; } } + + if (tot_no_missing) { + proto_item_append_text (ti, ", Missing seq numbers: %u", tot_no_missing); + en = proto_tree_add_uint (p_mul_tree, hf_tot_miss_seq_no, tvb, 0, 0, + tot_no_missing); + PROTO_ITEM_SET_GENERATED (en); + expert_add_info_format (pinfo, en, PI_RESPONSE_CODE, PI_NOTE, + "Missing seq numbers: %d", tot_no_missing); + if (check_col (pinfo->cinfo, COL_INFO)) + col_append_fstr (pinfo->cinfo, COL_INFO, ", Missing seq numbers: %u", + tot_no_missing); + } + if (check_col (pinfo->cinfo, COL_INFO)) + col_append_fstr (pinfo->cinfo, COL_INFO, ", Count of Ack: %u", count); break; case Announce_PDU: @@ -543,8 +587,9 @@ static void dissect_p_mul (tvbuff_t *tvb, packet_info *pinfo _U_, static void p_mul_reassemble_init (void) { - fragment_table_init (&p_mul_fragment_table); - reassembled_table_init (&p_mul_reassembled_table); + fragment_table_init (&p_mul_fragment_table); + reassembled_table_init (&p_mul_reassembled_table); + message_id_offset = 0; } void proto_register_p_mul (void) @@ -619,6 +664,10 @@ void proto_register_p_mul (void) { &hf_miss_seq_no, { "Missing Data PDU Seq Number", "p_mul.missing_seq_no", FT_UINT16, BASE_DEC, NULL, 0x0, "Missing Data PDU Seq Number", HFILL } }, + { &hf_tot_miss_seq_no, + { "Total Number of Missing Data PDU Sequence Numbers", + "p_mul.no_missing_seq_no", FT_UINT16, BASE_DEC, NULL, 0x0, + "Total Number of Missing Data PDU Sequence Numbers", HFILL } }, { &hf_dest_entry, { "Destination Entry", "p_mul.dest_entry", FT_NONE, BASE_NONE, NULL, 0x0, "Destination Entry", HFILL } }, @@ -689,6 +738,11 @@ void proto_register_p_mul (void) "Reassemble fragmented P_Mul packets", "Reassemble fragmented P_Mul packets", &p_mul_reassemble); + prefs_register_bool_preference (p_mul_module, "relative_msgid", + "Use relative Message ID", + "Make the P_Mul dissector use relative" + " message id number instead of absolute" + " ones", &use_relative_msgid); prefs_register_enum_preference (p_mul_module, "decode", "Decode Data PDU as", "Type of content in Data_PDU", @@ -739,3 +793,16 @@ void proto_reg_handoff_p_mul (void) dissector_add ("udp.port", global_p_mul_dport, p_mul_handle); dissector_add ("udp.port", global_p_mul_aport, p_mul_handle); } + +/* + * Editor modelines + * + * Local Variables: + * c-basic-offset: 2 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * ex: set shiftwidth=2 tabstop=8 noexpandtab + * :indentSize=2:tabSize=8:noTabs=false: + */ |