Ethereal-dev: [Ethereal-dev] Patch to packet-fcip.c
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Dinesh G Dutt <ddutt@xxxxxxxxx>
Date: Tue, 2 Sep 2003 11:15:56 -0700
Hi, This is a bugfix to packet-fcip.c. Without this patch, ethereal hangs with some FCIP captures. The patch also includes some cleanups. Dinesh --
Index: packet-fcip.c
===================================================================
RCS file: /cvsroot/ethereal/packet-fcip.c,v
retrieving revision 1.4
diff -u -r1.4 packet-fcip.c
--- packet-fcip.c 9 Jul 2003 06:24:48 -0000 1.4
+++ packet-fcip.c 2 Sep 2003 18:14:42 -0000
@@ -103,16 +103,6 @@
{0, NULL},
};
-static const gchar * sof_strings[] = {
- "SOFf", "SOFi4", "", "", "", "SOFi2", "SOFi3", "", "", "SOFn4", "", "", "",
- "SOFn2", "SOFn3", "", "", "SOFc4", "",
-};
-
-static const gchar *eof_strings[] = {
- "EOFn", "EOFt", "", "EOFrt", "", "EOFdt", "", "", "EOFni", "", "", "", "",
- "EOFdti", "EOFrti", "EOFa", "",
-};
-
static guint fcip_header_2_bytes[2] = {FCIP_ENCAP_PROTO_VER,
FCIP_ENCAP_PROTO_VER};
@@ -385,7 +375,7 @@
gint offset = 0,
start = 0,
frame_len = 0;
- guint bytes_remaining = tvb_length_remaining (tvb, offset);
+ gint bytes_remaining = tvb_length_remaining (tvb, offset);
guint8 pflags, sof, eof;
/* Set up structures needed to add the protocol subtree and manage it */
proto_item *ti;
@@ -417,6 +407,22 @@
col_set_str(pinfo->cinfo, COL_PROTOCOL, "FCIP");
frame_len = (tvb_get_ntohs (tvb, offset+12) & 0x03FF)*4;
+
+ if (bytes_remaining < frame_len) {
+ if(fcip_desegment && pinfo->can_desegment) {
+ /*
+ * This frame doesn't have all of the data for
+ * this message, but we can do reassembly on it.
+ *
+ * Tell the TCP dissector where the data for this
+ * message starts in the data it handed us, and
+ * how many more bytes we need, and return.
+ */
+ pinfo->desegment_offset = offset;
+ pinfo->desegment_len = frame_len - bytes_remaining;
+ return (TRUE);
+ }
+ }
pflags = tvb_get_guint8 (tvb, start+8);
@@ -426,22 +432,27 @@
FCIP_ENCAP_HEADER_LEN,
"FCIP");
}
- else {
- sof = tvb_get_guint8 (tvb, offset+FCIP_ENCAP_HEADER_LEN) - 0x28;
- eof = tvb_get_guint8 (tvb, offset+frame_len - 4) - 0x41;
+ else if (tvb_bytes_exist (tvb, offset, offset+frame_len-4)) {
+ sof = tvb_get_guint8 (tvb, offset+FCIP_ENCAP_HEADER_LEN);
+ eof = tvb_get_guint8 (tvb, offset+frame_len - 4);
- if (sof > 18) {
- sof = 18; /* The last SOF */
- }
- if (eof > 15) {
- eof = 16;
- }
+ ti = proto_tree_add_protocol_format (tree, proto_fcip, tvb, 0,
+ FCIP_ENCAP_HEADER_LEN,
+ "FCIP (%s/%s)",
+ val_to_str (sof, fcip_sof_vals,
+ "0x%x"),
+ val_to_str (eof, fcip_eof_vals,
+ "0x%x"));
+ }
+ else {
+ sof = tvb_get_guint8 (tvb, offset+FCIP_ENCAP_HEADER_LEN);
ti = proto_tree_add_protocol_format (tree, proto_fcip, tvb, 0,
FCIP_ENCAP_HEADER_LEN,
"FCIP (%s/%s)",
- sof_strings[sof],
- eof_strings[eof]);
+ val_to_str (sof, fcip_sof_vals,
+ "0x%x"),
+ "NA");
}
fcip_tree = proto_item_add_subtree (ti, ett_fcip);
/* Dissect the Common FC Encap header */
@@ -456,8 +467,10 @@
/* print EOF */
offset += (frame_len-FCIP_ENCAP_HEADER_LEN-4);
- proto_tree_add_item (fcip_tree, hf_fcip_eof, tvb, offset, 1, 0);
- proto_tree_add_item (fcip_tree, hf_fcip_eof_c, tvb, offset+2, 1, 0);
+ if (tvb_bytes_exist (tvb, offset, 4)) {
+ proto_tree_add_item (fcip_tree, hf_fcip_eof, tvb, offset, 1, 0);
+ proto_tree_add_item (fcip_tree, hf_fcip_eof_c, tvb, offset+2, 1, 0);
+ }
}
}
-- Much unhappiness results from our inability to remember the nice things that happen to us. - W. N. Rieger
- Follow-Ups:
- Re: [Ethereal-dev] Patch to packet-fcip.c
- From: Guy Harris
- Re: [Ethereal-dev] Patch to packet-fcip.c
- Prev by Date: Re: [Ethereal-dev] [PATCH] Wish list item 17 (packet generator)
- Next by Date: [Ethereal-dev] Another Windows-only sniffer: PacScope ...
- Previous by thread: Re: R: [Ethereal-dev] [PATCH] Wish list item 17 (packet generator)
- Next by thread: Re: [Ethereal-dev] Patch to packet-fcip.c
- Index(es):





