FIX dissector - Improve Message info

Bug: 5350
Change-Id: I4b2d60549f9680bbc008a2abba5d7ec108f6bf22
Reviewed-on: https://code.wireshark.org/review/15905
Petri-Dish: Michael Mann <mmann78@netscape.net>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
This commit is contained in:
Michael Mann 2016-06-14 17:23:58 -04:00
parent 581a17af40
commit b7e32bbd46
1 changed files with 11 additions and 4 deletions

View File

@ -60,6 +60,7 @@ static gint ett_badfield = -1;
static gint ett_checksum = -1;
static expert_field ei_fix_checksum_bad = EI_INIT;
static expert_field ei_fix_missing_field = EI_INIT;
static int hf_fix_data = -1; /* continuation data */
static int hf_fix_checksum_good = -1;
@ -251,6 +252,7 @@ dissect_fix_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
/* begin string */
ctrla_offset = tvb_find_guint8(tvb, offset, -1, 0x01);
if (ctrla_offset == -1) {
expert_add_info_format(pinfo, ti, &ei_fix_missing_field, "Missing BeginString field");
return tvb_captured_length(tvb);
}
offset = ctrla_offset + 1;
@ -258,19 +260,17 @@ dissect_fix_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
/* msg length */
ctrla_offset = tvb_find_guint8(tvb, offset, -1, 0x01);
if (ctrla_offset == -1) {
expert_add_info_format(pinfo, ti, &ei_fix_missing_field, "Missing BodyLength field");
return tvb_captured_length(tvb);
}
offset = ctrla_offset + 1;
/* msg type */
if (!(tag = fix_param(tvb, offset)) || tag->value_len < 1) {
expert_add_info_format(pinfo, ti, &ei_fix_missing_field, "Missing MsgType field");
return tvb_captured_length(tvb);
}
value = tvb_get_string_enc(wmem_packet_scope(), tvb, tag->value_offset, tag->value_len, ENC_ASCII);
msg_type = str_to_str(value, messages_val, "FIX Message (%s)");
col_add_str(pinfo->cinfo, COL_INFO, msg_type);
/* In the interest of speed, if "tree" is NULL, don't do any work not
* necessary to generate protocol tree items.
*/
@ -315,6 +315,12 @@ dissect_fix_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
case 1: /* strings */
proto_tree_add_string_format_value(fix_tree, fix_fields[i].hf_id, tvb, field_offset, tag->field_len, value,
"%s (%s)", value, str_to_str(value, (const string_string *)fix_fields[i].table, "unknown %s"));
if (tag_value == 35) {
/* Make message type part of the Info column */
msg_type = str_to_str(value, messages_val, "FIX Message (%s)");
col_append_sep_str(pinfo->cinfo, COL_INFO, ", ", msg_type);
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case 2: /* char */
proto_tree_add_string_format_value(fix_tree, fix_fields[i].hf_id, tvb, field_offset, tag->field_len, value,
@ -503,6 +509,7 @@ proto_register_fix(void)
static ei_register_info ei[] = {
{ &ei_fix_checksum_bad, { "fix.checksum_bad.expert", PI_CHECKSUM, PI_ERROR, "Bad checksum", EXPFILL }},
{ &ei_fix_missing_field, { "fix.missing_field", PI_MALFORMED, PI_ERROR, "Missing mandatory field", EXPFILL }},
};
module_t *fix_module;