aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-fix.c
diff options
context:
space:
mode:
authorRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2006-05-06 21:52:47 +0000
committerRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2006-05-06 21:52:47 +0000
commitdcb63e2a9f376108dd158e5ccd2cb7e6cd7a525e (patch)
tree04ee3e22e63234745ae4f42c4d94c36888638409 /epan/dissectors/packet-fix.c
parent71bcc9b28d0467fc678be7e5d3fbfb41690a463e (diff)
from Chris Audley
fix for bug 909 svn path=/trunk/; revision=18100
Diffstat (limited to 'epan/dissectors/packet-fix.c')
-rw-r--r--epan/dissectors/packet-fix.c43
1 files changed, 34 insertions, 9 deletions
diff --git a/epan/dissectors/packet-fix.c b/epan/dissectors/packet-fix.c
index 62bb78e365..cb768f4444 100644
--- a/epan/dissectors/packet-fix.c
+++ b/epan/dissectors/packet-fix.c
@@ -843,7 +843,10 @@ dissect_fix(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
/* Set up structures needed to add the protocol subtree and manage it */
proto_item *ti;
- proto_tree *fix_tree;
+ proto_tree *fix_tree = NULL; /* eliminates warning that can be safely ignored */
+ /* GCC may complain that fix_tree can be used before it is initialized. However,
+ fix_tree is initialized in the switch statement handler for type '8' which
+ MUST be the first field in a valid FIX message. */
gint next;
int linelen;
@@ -852,9 +855,13 @@ dissect_fix(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
int tag;
char *value;
char *tag_str;
+ char *msg_type;
int field_len = 0;
int tag_len = 0;
int value_len = 0;
+ int msg_count = 0;
+ GString *label = NULL;
+ GString *summary_label = NULL;
/* get at least the fix version: 8=FIX.x.x */
if (tvb_strneql(tvb, 0, "8=FIX.", 6) != 0) {
@@ -906,12 +913,13 @@ dissect_fix(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
if (check_col(pinfo->cinfo, COL_INFO)) {
- char *msg_type;
-
value = tvb_get_ephemeral_string(tvb, value_offset, value_len);
msg_type = (char *)g_datalist_get_data(&msg_types, value);
if(msg_type) {
- col_add_fstr(pinfo->cinfo, COL_INFO, "%s", msg_type);
+ summary_label = g_string_new(msg_type);
+ } else {
+ summary_label = g_string_new("FIX Message");
+ g_string_sprintfa(summary_label, " (%s)", value);
}
}
@@ -919,10 +927,6 @@ dissect_fix(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
* necessary to generate protocol tree items.
*/
if (tree) {
- /* create display subtree for the protocol */
- ti = proto_tree_add_item(tree, proto_fix, tvb, 0, -1, FALSE);
- fix_tree = proto_item_add_subtree(ti, ett_fix);
-
field_offset = offset = 0;
ctrla_offset = tvb_find_guint8(tvb, offset, -1, 0x01);
if (ctrla_offset == -1) {
@@ -996,6 +1000,14 @@ dissect_fix(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree_add_string(fix_tree, hf_fix_BeginSeqNo, tvb, offset, field_len, value);
break;
case 8: /* Field BeginString */
+ /* BeginString is always the first field of a fix message. The first
+ check in this routine looks for the BeginString field to verify that
+ the packet contains at least one fix message. Create display subtree
+ for the fix message */
+ ti = proto_tree_add_item(tree, proto_fix, tvb, 0, -1, FALSE);
+ fix_tree = proto_item_add_subtree(ti, ett_fix);
+ ++msg_count;
+
proto_tree_add_string(fix_tree, hf_fix_BeginString, tvb, offset, field_len, value);
break;
case 9: /* Field BodyLength */
@@ -1077,7 +1089,13 @@ dissect_fix(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree_add_string(fix_tree, hf_fix_MsgSeqNum, tvb, offset, field_len, value);
break;
case 35: /* Field MsgType */
- proto_tree_add_string(fix_tree, hf_fix_MsgType, tvb, offset, field_len, value);
+ /* We have a mapping of MsgType to descriptive strings, use it to
+ enhance the value display for the MsgType field */
+ label = g_string_new(value);
+ msg_type = (char *)g_datalist_get_data(&msg_types, value);
+ if (NULL != msg_type) g_string_sprintfa(label, " (%s)", msg_type);
+ proto_tree_add_string(fix_tree, hf_fix_MsgType, tvb, offset, field_len, label->str);
+ g_string_free(label, TRUE);
break;
case 36: /* Field NewSeqNo */
proto_tree_add_string(fix_tree, hf_fix_NewSeqNo, tvb, offset, field_len, value);
@@ -3006,6 +3024,13 @@ dissect_fix(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
}
+ if (check_col(pinfo->cinfo, COL_INFO)) {
+ if (msg_count > 1)
+ g_string_sprintfa(summary_label, " (%d)", msg_count);
+ col_add_fstr(pinfo->cinfo, COL_INFO, "%s", summary_label->str);
+ g_string_free(summary_label, TRUE);
+ }
+
return TRUE;
}