aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2004-02-19 00:29:15 +0000
committerGerald Combs <gerald@wireshark.org>2004-02-19 00:29:15 +0000
commit64853fa2a8c73f9d56c95fdbcb19aa92b430d646 (patch)
treebf1a2cf1b5b3f3a1c06ec273f1db93173682ba00
parent0fca48673499cb46eb0ffc93bfbfc54db35dbc74 (diff)
From Dinesh Dutt:
- Add FCIP to the list of protocols that can be selected from "Decode As" - Add an indicator for EISL header in FC frames. svn path=/trunk/; revision=10101
-rw-r--r--packet-fc.c13
-rw-r--r--packet-fcip.c33
2 files changed, 40 insertions, 6 deletions
diff --git a/packet-fc.c b/packet-fc.c
index 620c174d0d..32ff569dcb 100644
--- a/packet-fc.c
+++ b/packet-fc.c
@@ -4,7 +4,7 @@
* Copyright 2003 Ronnie Sahlberg, exchange first/last matching and
* tap listener and misc updates
*
- * $Id: packet-fc.c,v 1.17 2003/12/17 23:35:28 ulfl Exp $
+ * $Id: packet-fc.c,v 1.18 2004/02/19 00:29:15 gerald Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -109,6 +109,7 @@ static int hf_fc_rxid = -1;
static int hf_fc_param = -1;
static int hf_fc_ftype = -1; /* Derived field, non-existent in FC hdr */
static int hf_fc_reassembled = -1;
+static int hf_fc_eisl = -1;
/* Network_Header fields */
static int hf_fc_nh_da = -1;
@@ -761,7 +762,7 @@ dissect_fc (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_item *ti=NULL;
proto_tree *fc_tree = NULL;
tvbuff_t *next_tvb;
- int offset = 0, next_offset;
+ int offset = 0, next_offset, eisl_offset = -1;
gboolean is_lastframe_inseq, is_1frame_inseq, is_valid_frame;
gboolean is_exchg_resp = 0;
fragment_data *fcfrag_head;
@@ -793,6 +794,7 @@ dissect_fc (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
* real FC header. EISL is Cisco-proprietary and is not decoded.
*/
if (fchdr.r_ctl == FC_RCTL_EISL) {
+ eisl_offset = offset;
offset += 8;
fchdr.r_ctl = tvb_get_guint8 (tvb, offset);
}
@@ -852,6 +854,11 @@ dissect_fc (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
fc_tree = proto_item_add_subtree (ti, ett_fc);
}
+ /* Highlight EISL header, if present */
+ if (eisl_offset != -1) {
+ proto_tree_add_item (fc_tree, hf_fc_eisl, tvb, eisl_offset, 8, 0);
+ }
+
/* match first exchange with last exchange */
if(fchdr.fctl&FC_FCTL_EXCHANGE_FIRST){
if(!pinfo->fd->flags.visited){
@@ -1391,6 +1398,8 @@ proto_register_fc(void)
{ &hf_fc_time,
{ "Time from Exchange First", "fc.time", FT_RELATIVE_TIME, BASE_NONE, NULL,
0, "Time since the first frame of the Exchange", HFILL }},
+ { &hf_fc_eisl,
+ {"EISL Header", "fc.eisl", FT_BYTES, BASE_HEX, NULL, 0, "EISL Header", HFILL}},
};
/* Setup protocol subtree array */
diff --git a/packet-fcip.c b/packet-fcip.c
index 92cdaab748..1c16a5a5c2 100644
--- a/packet-fcip.c
+++ b/packet-fcip.c
@@ -2,7 +2,7 @@
* Routines for FCIP dissection
* Copyright 2001, Dinesh G Dutt (ddutt@cisco.com)
*
- * $Id: packet-fcip.c,v 1.11 2003/12/21 04:31:56 jmayer Exp $
+ * $Id: packet-fcip.c,v 1.12 2004/02/19 00:29:15 gerald Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -377,7 +377,8 @@ dissect_fcip_sf (tvbuff_t *tvb, proto_tree *tree, gint offset)
}
static gboolean
-dissect_fcip (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+dissect_fcip (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
+ gboolean check_port)
{
gint offset = 0,
start = 0,
@@ -393,7 +394,8 @@ dissect_fcip (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
return FALSE;
}
- if ((pinfo->srcport != fcip_port) && (pinfo->destport != fcip_port)) {
+ if (check_port &&
+ ((pinfo->srcport != fcip_port) && (pinfo->destport != fcip_port))) {
return FALSE;
}
@@ -525,6 +527,23 @@ dissect_fcip (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
return (TRUE);
}
+/* This is called for those sessions where we have explicitely said
+ this to be FCIP using "Decode As..."
+ In this case we will not check the port number for sanity and just
+ do as the user said.
+*/
+static void
+dissect_fcip_handle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ dissect_fcip (tvb, pinfo, tree, FALSE);
+}
+
+static gboolean
+dissect_fcip_heur (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ return (dissect_fcip (tvb, pinfo, tree, TRUE));
+}
+
void
proto_register_fcip (void)
{
@@ -649,7 +668,13 @@ proto_register_fcip (void)
void
proto_reg_handoff_fcip (void)
{
- heur_dissector_add("tcp", dissect_fcip, proto_fcip);
+ dissector_handle_t fcip_handle;
+
+ heur_dissector_add("tcp", dissect_fcip_heur, proto_fcip);
+
+ fcip_handle = create_dissector_handle(dissect_fcip_handle, proto_fcip);
+ dissector_add_handle("tcp.port", fcip_handle);
+
data_handle = find_dissector("data");
fc_handle = find_dissector("fc");
}