aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-ifcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'epan/dissectors/packet-ifcp.c')
-rw-r--r--epan/dissectors/packet-ifcp.c707
1 files changed, 357 insertions, 350 deletions
diff --git a/epan/dissectors/packet-ifcp.c b/epan/dissectors/packet-ifcp.c
index 68f2b86529..31248a2c10 100644
--- a/epan/dissectors/packet-ifcp.c
+++ b/epan/dissectors/packet-ifcp.c
@@ -41,8 +41,8 @@
void proto_register_ifcp(void);
void proto_reg_handoff_ifcp(void);
-#define iFCP_ENCAP_HEADER_LEN 28
-#define iFCP_MIN_HEADER_LEN 16 /* upto frame len field */
+#define iFCP_ENCAP_HEADER_LEN 28
+#define iFCP_MIN_HEADER_LEN 16 /* upto frame len field */
typedef enum {
iFCP_EOFn = 0x41,
@@ -72,19 +72,19 @@ typedef enum {
} fcencap_proto_t;
static const value_string ifcp_eof_vals[] = {
- {iFCP_EOFn, "EOFn" },
- {iFCP_EOFt, "EOFt" },
- {iFCP_EOFrt, "EOFrt" },
- {iFCP_EOFdt, "EOFdt" },
- {iFCP_EOFni, "EOFni" },
+ {iFCP_EOFn, "EOFn" },
+ {iFCP_EOFt, "EOFt" },
+ {iFCP_EOFrt, "EOFrt" },
+ {iFCP_EOFdt, "EOFdt" },
+ {iFCP_EOFni, "EOFni" },
{iFCP_EOFdti, "EOFdti" },
{iFCP_EOFrti, "EOFrti" },
- {iFCP_EOFa, "EOFa" },
+ {iFCP_EOFa, "EOFa" },
{0, NULL},
};
static const value_string ifcp_sof_vals[] = {
- {iFCP_SOFf, "SOFf" },
+ {iFCP_SOFf, "SOFf" },
{iFCP_SOFi4, "SOFi4" },
{iFCP_SOFi2, "SOFi2" },
{iFCP_SOFi3, "SOFi3" },
@@ -109,28 +109,28 @@ static const guint8 ifcp_header_4_bytes[4] = {
0x02, 0x01, 0xFD, 0xFE
};
-static int proto_ifcp = -1;
-
-static int hf_ifcp_protocol = -1;
-static int hf_ifcp_protocol_c = -1;
-static int hf_ifcp_version = -1;
-static int hf_ifcp_version_c = -1;
-static int hf_ifcp_encap_flags_c=-1;
-static int hf_ifcp_framelen = -1;
-static int hf_ifcp_framelen_c = -1;
-static int hf_ifcp_tsec = -1;
-static int hf_ifcp_tusec = -1;
-static int hf_ifcp_encap_crc = -1;
-static int hf_ifcp_sof = -1;
-static int hf_ifcp_sof_c = -1;
-static int hf_ifcp_eof = -1;
-static int hf_ifcp_eof_c = -1;
-static int hf_ifcp_ls_command_acc = -1;
-static int hf_ifcp_flags = -1;
-static int hf_ifcp_flags_ses = -1;
-static int hf_ifcp_flags_trp = -1;
-static int hf_ifcp_flags_spc = -1;
-static int hf_ifcp_common_flags = -1;
+static int proto_ifcp = -1;
+
+static int hf_ifcp_protocol = -1;
+static int hf_ifcp_protocol_c = -1;
+static int hf_ifcp_version = -1;
+static int hf_ifcp_version_c = -1;
+static int hf_ifcp_encap_flags_c = -1;
+static int hf_ifcp_framelen = -1;
+static int hf_ifcp_framelen_c = -1;
+static int hf_ifcp_tsec = -1;
+static int hf_ifcp_tusec = -1;
+static int hf_ifcp_encap_crc = -1;
+static int hf_ifcp_sof = -1;
+static int hf_ifcp_sof_c = -1;
+static int hf_ifcp_eof = -1;
+static int hf_ifcp_eof_c = -1;
+static int hf_ifcp_ls_command_acc = -1;
+static int hf_ifcp_flags = -1;
+static int hf_ifcp_flags_ses = -1;
+static int hf_ifcp_flags_trp = -1;
+static int hf_ifcp_flags_spc = -1;
+static int hf_ifcp_common_flags = -1;
static int hf_ifcp_common_flags_crcv = -1;
static int ett_ifcp = -1;
@@ -144,9 +144,9 @@ static int ett_ifcp_frame_len = -1;
static gboolean ifcp_desegment = TRUE;
-static dissector_handle_t ifcp_handle=NULL;
-static dissector_handle_t data_handle=NULL;
-static dissector_handle_t fc_handle=NULL;
+static dissector_handle_t ifcp_handle = NULL;
+static dissector_handle_t data_handle = NULL;
+static dissector_handle_t fc_handle = NULL;
/* This function checks the first 16 bytes of the "header" that it looks sane
@@ -155,180 +155,180 @@ static dissector_handle_t fc_handle=NULL;
static gboolean
ifcp_header_test(tvbuff_t *tvb, int offset)
{
- guint16 flen, flen1;
-
- /* we can only do this test if we have 16 bytes or more */
- if(tvb_length_remaining(tvb, offset)<iFCP_MIN_HEADER_LEN){
- return FALSE;
- }
-
- /*
- * As per the iFCP standard, the following tests must PASS:
- * 1) Frame Length field validation -- 15 < Frame Length < 545;
- * 2) Comparison of Frame Length field to its ones complement; and
- * 3) A valid EOF is found in the word preceding the start of the next
- * iFCP header as indicated by the Frame Length field, to be tested
- * as follows:
- * 1) Bits 24-31 and 16-23 contain identical legal EOF values (the
- * list of legal EOF values is in the FC Frame Encapsulation
- * [21]); and
- * 2) Bits 8-15 and 0-7 contain the ones complement of the EOF
- * value found in bits 24-31.
- *
- * As per the iFCP standard, in addition, at least 3 of the following
- * set of tests must be performed to identify that we've located the
- * start of an iFCP frame.
- * a) Protocol# ones complement field (1 test);
- * b) Version ones complement field (1 test);
- * c) Replication of encapsulation word 0 in word 1 (1 test);
- * d) Reserved field and its ones complement (2 tests);
- * e) Flags field and its ones complement (2 tests);
- * f) CRC field is equal to zero (1 test); (DON'T DO THIS TEST!)
- * g) SOF fields and ones complement fields (4 tests);
- * h) Format and values of FC header (1 test);
- * i) CRC of FC Frame (2 tests);
- * j) FC Frame Encapsulation header information in the next iFCP Frame
- * (1 test).
- *
- * At least 3 of the 16 tests listed above SHALL be performed. Failure
- * of any of the above tests actually performed SHALL indicate an
- * encapsulation error and the FC Frame SHALL NOT be forwarded on to
- * the FC Entity.
- */
-
-
- /*
- * Tests a, b and c
- */
- if(tvb_memeql(tvb, offset, ifcp_header_4_bytes, 4) != 0){
- return FALSE;
+ guint16 flen, flen1;
+
+ /* we can only do this test if we have 16 bytes or more */
+ if(tvb_length_remaining(tvb, offset)<iFCP_MIN_HEADER_LEN){
+ return FALSE;
+ }
+
+ /*
+ * As per the iFCP standard, the following tests must PASS:
+ * 1) Frame Length field validation -- 15 < Frame Length < 545;
+ * 2) Comparison of Frame Length field to its ones complement; and
+ * 3) A valid EOF is found in the word preceding the start of the next
+ * iFCP header as indicated by the Frame Length field, to be tested
+ * as follows:
+ * 1) Bits 24-31 and 16-23 contain identical legal EOF values (the
+ * list of legal EOF values is in the FC Frame Encapsulation
+ * [21]); and
+ * 2) Bits 8-15 and 0-7 contain the ones complement of the EOF
+ * value found in bits 24-31.
+ *
+ * As per the iFCP standard, in addition, at least 3 of the following
+ * set of tests must be performed to identify that we've located the
+ * start of an iFCP frame.
+ * a) Protocol# ones complement field (1 test);
+ * b) Version ones complement field (1 test);
+ * c) Replication of encapsulation word 0 in word 1 (1 test);
+ * d) Reserved field and its ones complement (2 tests);
+ * e) Flags field and its ones complement (2 tests);
+ * f) CRC field is equal to zero (1 test); (DON'T DO THIS TEST!)
+ * g) SOF fields and ones complement fields (4 tests);
+ * h) Format and values of FC header (1 test);
+ * i) CRC of FC Frame (2 tests);
+ * j) FC Frame Encapsulation header information in the next iFCP Frame
+ * (1 test).
+ *
+ * At least 3 of the 16 tests listed above SHALL be performed. Failure
+ * of any of the above tests actually performed SHALL indicate an
+ * encapsulation error and the FC Frame SHALL NOT be forwarded on to
+ * the FC Entity.
+ */
+
+
+ /*
+ * Tests a, b and c
+ */
+ if(tvb_memeql(tvb, offset, ifcp_header_4_bytes, 4) != 0){
+ return FALSE;
}
- /* check the frame length */
- flen=tvb_get_ntohs(tvb, offset+12)&0x03FF;
- if((flen < 15) || (flen > 545)){
- return FALSE;
- }
+ /* check the frame length */
+ flen=tvb_get_ntohs(tvb, offset+12)&0x03FF;
+ if((flen < 15) || (flen > 545)){
+ return FALSE;
+ }
- /* check the complement of the frame length */
- flen1=tvb_get_ntohs(tvb, offset+14)&0x03FF;
- if(flen!=((~flen1)&0x03FF)){
- return FALSE;
- }
+ /* check the complement of the frame length */
+ flen1=tvb_get_ntohs(tvb, offset+14)&0x03FF;
+ if(flen!=((~flen1)&0x03FF)){
+ return FALSE;
+ }
- /* this should be good enough for our heuristics */
- return TRUE;
+ /* this should be good enough for our heuristics */
+ return TRUE;
}
-#define IFCP_FLAGS_SES 0x04
-#define IFCP_FLAGS_TRP 0x02
-#define IFCP_FLAGS_SPC 0x01
+#define IFCP_FLAGS_SES 0x04
+#define IFCP_FLAGS_TRP 0x02
+#define IFCP_FLAGS_SPC 0x01
static const true_false_string ifcp_flags_ses_tfs = {
- "This is a SESSION CONTROL FRAME",
- "This is a normal frame"
+ "This is a SESSION CONTROL FRAME",
+ "This is a normal frame"
};
static const true_false_string ifcp_flags_trp_tfs = {
- "Address TRANSPARENT Mode Enabled",
- "Address TRANSLATION Mode Enabled"
+ "Address TRANSPARENT Mode Enabled",
+ "Address TRANSLATION Mode Enabled"
};
static const true_false_string ifcp_flags_spc_tfs = {
- "This frame requires SPECIAL PROCESSING",
- "This is a normal frame"
+ "This frame requires SPECIAL PROCESSING",
+ "This is a normal frame"
};
static int
dissect_ifcpflags(tvbuff_t *tvb, int offset, proto_tree *parent_tree)
{
- proto_item *item;
- proto_tree *tree;
- guint8 flags;
-
- item=proto_tree_add_item(parent_tree, hf_ifcp_flags, tvb, offset, 1, ENC_BIG_ENDIAN);
- tree=proto_item_add_subtree (item, ett_ifcp_flags);
-
- flags=tvb_get_guint8(tvb, offset);
-
- /* SES */
- proto_tree_add_boolean(tree, hf_ifcp_flags_ses, tvb, offset, 1, flags);
- if(flags&IFCP_FLAGS_SES){
- proto_item_append_text(item, " SES");
- }
- flags&=(~IFCP_FLAGS_SES);
-
- /* TRP */
- proto_tree_add_boolean(tree, hf_ifcp_flags_trp, tvb, offset, 1, flags);
- if(flags&IFCP_FLAGS_TRP){
- proto_item_append_text(item, " TRP");
- }
- flags&=(~IFCP_FLAGS_TRP);
-
- /* SPC */
- proto_tree_add_boolean(tree, hf_ifcp_flags_spc, tvb, offset, 1, flags);
- if(flags&IFCP_FLAGS_SPC){
- proto_item_append_text(item, " SPC");
- }
-
-
- offset++;
- return offset;
+ proto_item *item;
+ proto_tree *tree;
+ guint8 flags;
+
+ item=proto_tree_add_item(parent_tree, hf_ifcp_flags, tvb, offset, 1, ENC_BIG_ENDIAN);
+ tree=proto_item_add_subtree (item, ett_ifcp_flags);
+
+ flags=tvb_get_guint8(tvb, offset);
+
+ /* SES */
+ proto_tree_add_boolean(tree, hf_ifcp_flags_ses, tvb, offset, 1, flags);
+ if(flags&IFCP_FLAGS_SES){
+ proto_item_append_text(item, " SES");
+ }
+ flags&=(~IFCP_FLAGS_SES);
+
+ /* TRP */
+ proto_tree_add_boolean(tree, hf_ifcp_flags_trp, tvb, offset, 1, flags);
+ if(flags&IFCP_FLAGS_TRP){
+ proto_item_append_text(item, " TRP");
+ }
+ flags&=(~IFCP_FLAGS_TRP);
+
+ /* SPC */
+ proto_tree_add_boolean(tree, hf_ifcp_flags_spc, tvb, offset, 1, flags);
+ if(flags&IFCP_FLAGS_SPC){
+ proto_item_append_text(item, " SPC");
+ }
+
+
+ offset++;
+ return offset;
}
-#define IFCP_COMMON_FLAGS_CRCV 0x04
+#define IFCP_COMMON_FLAGS_CRCV 0x04
static const true_false_string ifcp_common_flags_crcv_tfs = {
- "CRC is VALID",
- "Crc is NOT valid"
+ "CRC is VALID",
+ "Crc is NOT valid"
};
static void
dissect_commonflags(tvbuff_t *tvb, int offset, proto_tree *parent_tree)
{
- proto_item *item;
- proto_tree *tree;
- guint8 flags;
+ proto_item *item;
+ proto_tree *tree;
+ guint8 flags;
- item=proto_tree_add_item(parent_tree, hf_ifcp_common_flags, tvb, offset, 1, ENC_BIG_ENDIAN);
- tree=proto_item_add_subtree (item, ett_ifcp_common_flags);
+ item=proto_tree_add_item(parent_tree, hf_ifcp_common_flags, tvb, offset, 1, ENC_BIG_ENDIAN);
+ tree=proto_item_add_subtree (item, ett_ifcp_common_flags);
- flags=tvb_get_guint8(tvb, offset);
+ flags=tvb_get_guint8(tvb, offset);
- /* CRCV */
- proto_tree_add_boolean(tree, hf_ifcp_common_flags_crcv, tvb, offset, 1, flags);
- if(flags&IFCP_COMMON_FLAGS_CRCV){
- proto_item_append_text(item, " CRCV");
- }
+ /* CRCV */
+ proto_tree_add_boolean(tree, hf_ifcp_common_flags_crcv, tvb, offset, 1, flags);
+ if(flags&IFCP_COMMON_FLAGS_CRCV){
+ proto_item_append_text(item, " CRCV");
+ }
}
static int
dissect_ifcp_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* data _U_)
{
- gint offset = 0, frame_len = 0;
- guint8 sof = 0, eof = 0;
- proto_item *ti;
- proto_tree *tree = NULL;
- tvbuff_t *next_tvb;
- guint8 protocol;
- proto_tree *protocol_tree=NULL;
- proto_tree *version_tree=NULL;
- proto_tree *frame_len_tree=NULL;
- proto_tree *sof_tree=NULL;
- proto_tree *eof_tree=NULL;
- fc_data_t fc_data;
+ gint offset = 0, frame_len = 0;
+ guint8 sof = 0, eof = 0;
+ proto_item *ti;
+ proto_tree *tree = NULL;
+ tvbuff_t *next_tvb;
+ guint8 protocol;
+ proto_tree *protocol_tree = NULL;
+ proto_tree *version_tree = NULL;
+ proto_tree *frame_len_tree = NULL;
+ proto_tree *sof_tree = NULL;
+ proto_tree *eof_tree = NULL;
+ fc_data_t fc_data;
- /* verify we have a full header (do we need to do this? */
- if(tvb_length(tvb)<iFCP_ENCAP_HEADER_LEN){
- return 0;
- }
+ /* verify we have a full header (do we need to do this? */
+ if(tvb_length(tvb)<iFCP_ENCAP_HEADER_LEN){
+ return 0;
+ }
- col_set_str(pinfo->cinfo, COL_PROTOCOL, "iFCP");
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "iFCP");
- frame_len = (tvb_get_ntohs (tvb, offset+12) & 0x03FF)*4;
+ frame_len = (tvb_get_ntohs (tvb, offset+12) & 0x03FF)*4;
if (parent_tree) {
@@ -358,152 +358,152 @@ dissect_ifcp_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, voi
- /* The Common FC Encap header */
- /* protocol */
- protocol = tvb_get_guint8 (tvb, offset);
- ti=proto_tree_add_item(tree, hf_ifcp_protocol, tvb, offset, 1, ENC_BIG_ENDIAN);
- protocol_tree=proto_item_add_subtree(ti, ett_ifcp_protocol);
-
- offset++;
-
- /* version */
- ti=proto_tree_add_item(tree, hf_ifcp_version, tvb, offset, 1, ENC_BIG_ENDIAN);
- version_tree=proto_item_add_subtree(ti, ett_ifcp_version);
- offset++;
-
- /* protocol complement */
- proto_tree_add_item(protocol_tree, hf_ifcp_protocol_c, tvb, offset, 1, ENC_BIG_ENDIAN);
- offset++;
-
- /* version complement */
- proto_tree_add_item(version_tree, hf_ifcp_version_c, tvb, offset, 1, ENC_BIG_ENDIAN);
- offset++;
-
- /* 4 reserved bytes */
- offset+=4;
-
- /* iFCP specific fields */
- if(protocol==FCENCAP_PROTO_iFCP){
- /* LS_COMMAND_ACC */
- proto_tree_add_item(tree, hf_ifcp_ls_command_acc, tvb, offset, 1, ENC_BIG_ENDIAN);
- offset++;
-
- /* iFCP Flags */
- offset=dissect_ifcpflags(tvb, offset, tree);
-
- /* SOF */
- ti=proto_tree_add_item(tree, hf_ifcp_sof, tvb, offset, 1, ENC_BIG_ENDIAN);
- sof_tree=proto_item_add_subtree(ti, ett_ifcp_sof);
- offset++;
-
- /* EOF */
- ti=proto_tree_add_item(tree, hf_ifcp_eof, tvb, offset, 1, ENC_BIG_ENDIAN);
- eof_tree=proto_item_add_subtree(ti, ett_ifcp_eof);
- offset++;
- } else {
- offset+=4;
- sof_tree=tree; /* better than nothing */
- eof_tree=tree;
- }
-
- /* Common Flags */
- dissect_commonflags(tvb, offset, tree);
-
- /* frame len */
- ti=proto_tree_add_item(tree, hf_ifcp_framelen, tvb, offset, 2, ENC_BIG_ENDIAN);
- frame_len_tree=proto_item_add_subtree(ti, ett_ifcp_frame_len);
- offset+=2;
-
- /* complement of flags and frame len */
- proto_tree_add_item(frame_len_tree, hf_ifcp_encap_flags_c, tvb, offset, 1, ENC_BIG_ENDIAN);
- proto_tree_add_item(frame_len_tree, hf_ifcp_framelen_c, tvb, offset, 2, ENC_BIG_ENDIAN);
- offset+=2;
-
- /* timestamp seconds */
- proto_tree_add_item(tree, hf_ifcp_tsec, tvb, offset, 4, ENC_BIG_ENDIAN);
- offset+=4;
-
- /* timestamp fractions */
- proto_tree_add_item(tree, hf_ifcp_tusec, tvb, offset, 4, ENC_BIG_ENDIAN);
- offset+=4;
-
- /* crc */
- proto_tree_add_item(tree, hf_ifcp_encap_crc, tvb, offset, 4, ENC_BIG_ENDIAN);
- offset+=4;
-
-
- /* FC SOF/-SOF */
- proto_tree_add_item(sof_tree, hf_ifcp_sof, tvb, offset, 1, ENC_BIG_ENDIAN);
- offset++;
- proto_tree_add_item(sof_tree, hf_ifcp_sof, tvb, offset, 1, ENC_BIG_ENDIAN);
- offset++;
- proto_tree_add_item(sof_tree, hf_ifcp_sof_c, tvb, offset, 1, ENC_BIG_ENDIAN);
- offset++;
- proto_tree_add_item(sof_tree, hf_ifcp_sof_c, tvb, offset, 1, ENC_BIG_ENDIAN);
- offset++;
-
- /* FC EOF/-EOF */
- if(tvb_bytes_exist(tvb, frame_len-4, 4)) {
- proto_tree_add_item(eof_tree, hf_ifcp_eof, tvb, frame_len-4, 1, ENC_BIG_ENDIAN);
- proto_tree_add_item(eof_tree, hf_ifcp_eof, tvb, frame_len-3, 1, ENC_BIG_ENDIAN);
- proto_tree_add_item(eof_tree, hf_ifcp_eof_c, tvb, frame_len-2, 1, ENC_BIG_ENDIAN);
- proto_tree_add_item(eof_tree, hf_ifcp_eof_c, tvb, frame_len-1, 1, ENC_BIG_ENDIAN);
+ /* The Common FC Encap header */
+ /* protocol */
+ protocol = tvb_get_guint8 (tvb, offset);
+ ti=proto_tree_add_item(tree, hf_ifcp_protocol, tvb, offset, 1, ENC_BIG_ENDIAN);
+ protocol_tree=proto_item_add_subtree(ti, ett_ifcp_protocol);
+
+ offset++;
+
+ /* version */
+ ti=proto_tree_add_item(tree, hf_ifcp_version, tvb, offset, 1, ENC_BIG_ENDIAN);
+ version_tree=proto_item_add_subtree(ti, ett_ifcp_version);
+ offset++;
+
+ /* protocol complement */
+ proto_tree_add_item(protocol_tree, hf_ifcp_protocol_c, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+
+ /* version complement */
+ proto_tree_add_item(version_tree, hf_ifcp_version_c, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+
+ /* 4 reserved bytes */
+ offset+=4;
+
+ /* iFCP specific fields */
+ if(protocol==FCENCAP_PROTO_iFCP){
+ /* LS_COMMAND_ACC */
+ proto_tree_add_item(tree, hf_ifcp_ls_command_acc, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+
+ /* iFCP Flags */
+ offset=dissect_ifcpflags(tvb, offset, tree);
+
+ /* SOF */
+ ti=proto_tree_add_item(tree, hf_ifcp_sof, tvb, offset, 1, ENC_BIG_ENDIAN);
+ sof_tree=proto_item_add_subtree(ti, ett_ifcp_sof);
+ offset++;
+
+ /* EOF */
+ ti=proto_tree_add_item(tree, hf_ifcp_eof, tvb, offset, 1, ENC_BIG_ENDIAN);
+ eof_tree=proto_item_add_subtree(ti, ett_ifcp_eof);
+ offset++;
+ } else {
+ offset+=4;
+ sof_tree=tree; /* better than nothing */
+ eof_tree=tree;
+ }
+
+ /* Common Flags */
+ dissect_commonflags(tvb, offset, tree);
+
+ /* frame len */
+ ti=proto_tree_add_item(tree, hf_ifcp_framelen, tvb, offset, 2, ENC_BIG_ENDIAN);
+ frame_len_tree=proto_item_add_subtree(ti, ett_ifcp_frame_len);
+ offset+=2;
+
+ /* complement of flags and frame len */
+ proto_tree_add_item(frame_len_tree, hf_ifcp_encap_flags_c, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(frame_len_tree, hf_ifcp_framelen_c, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset+=2;
+
+ /* timestamp seconds */
+ proto_tree_add_item(tree, hf_ifcp_tsec, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset+=4;
+
+ /* timestamp fractions */
+ proto_tree_add_item(tree, hf_ifcp_tusec, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset+=4;
+
+ /* crc */
+ proto_tree_add_item(tree, hf_ifcp_encap_crc, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset+=4;
+
+
+ /* FC SOF/-SOF */
+ proto_tree_add_item(sof_tree, hf_ifcp_sof, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ proto_tree_add_item(sof_tree, hf_ifcp_sof, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ proto_tree_add_item(sof_tree, hf_ifcp_sof_c, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ proto_tree_add_item(sof_tree, hf_ifcp_sof_c, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+
+ /* FC EOF/-EOF */
+ if(tvb_bytes_exist(tvb, frame_len-4, 4)) {
+ proto_tree_add_item(eof_tree, hf_ifcp_eof, tvb, frame_len-4, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(eof_tree, hf_ifcp_eof, tvb, frame_len-3, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(eof_tree, hf_ifcp_eof_c, tvb, frame_len-2, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(eof_tree, hf_ifcp_eof_c, tvb, frame_len-1, 1, ENC_BIG_ENDIAN);
}
- /* Call the FC Dissector if this is carrying an FC frame */
- /* Set the SOF/EOF flags in the packet_info header */
- fc_data.sof_eof = 0;
-
- switch(sof){
- case iFCP_SOFi3:
- case iFCP_SOFi2:
- case iFCP_SOFi4:
- fc_data.sof_eof = FC_DATA_SOF_FIRST_FRAME;
- break;
- case iFCP_SOFf:
- fc_data.sof_eof = FC_DATA_SOF_SOFF;
- break;
- default:
- if(sof){
- if (eof != iFCP_EOFn) {
- fc_data.sof_eof |= FC_DATA_EOF_LAST_FRAME;
- } else if (eof != iFCP_EOFt) {
- fc_data.sof_eof |= FC_DATA_EOF_INVALID;
- }
- }
- }
-
- next_tvb=tvb_new_subset_length(tvb, offset, frame_len-offset-4);
- fc_data.ethertype = 0;
-
- if(fc_handle){
- call_dissector_with_data(fc_handle, next_tvb, pinfo, parent_tree, &fc_data);
- } else if(data_handle){
- call_dissector(data_handle, next_tvb, pinfo, parent_tree);
- }
-
- return tvb_length(tvb);
+ /* Call the FC Dissector if this is carrying an FC frame */
+ /* Set the SOF/EOF flags in the packet_info header */
+ fc_data.sof_eof = 0;
+
+ switch(sof){
+ case iFCP_SOFi3:
+ case iFCP_SOFi2:
+ case iFCP_SOFi4:
+ fc_data.sof_eof = FC_DATA_SOF_FIRST_FRAME;
+ break;
+ case iFCP_SOFf:
+ fc_data.sof_eof = FC_DATA_SOF_SOFF;
+ break;
+ default:
+ if(sof){
+ if (eof != iFCP_EOFn) {
+ fc_data.sof_eof |= FC_DATA_EOF_LAST_FRAME;
+ } else if (eof != iFCP_EOFt) {
+ fc_data.sof_eof |= FC_DATA_EOF_INVALID;
+ }
+ }
+ }
+
+ next_tvb=tvb_new_subset_length(tvb, offset, frame_len-offset-4);
+ fc_data.ethertype = 0;
+
+ if(fc_handle){
+ call_dissector_with_data(fc_handle, next_tvb, pinfo, parent_tree, &fc_data);
+ } else if(data_handle){
+ call_dissector(data_handle, next_tvb, pinfo, parent_tree);
+ }
+
+ return tvb_length(tvb);
}
static guint
get_ifcp_pdu_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset)
{
- guint pdu_len;
+ guint pdu_len;
- if(!ifcp_header_test(tvb, offset)){
- return 0;
- }
+ if(!ifcp_header_test(tvb, offset)){
+ return 0;
+ }
- pdu_len=(tvb_get_ntohs(tvb, offset+12)&0x03FF)*4;
- return pdu_len;
+ pdu_len=(tvb_get_ntohs(tvb, offset+12)&0x03FF)*4;
+ return pdu_len;
}
static int
dissect_ifcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* data)
{
- tcp_dissect_pdus(tvb, pinfo, parent_tree, ifcp_desegment, iFCP_MIN_HEADER_LEN, get_ifcp_pdu_len, dissect_ifcp_pdu, data);
- return tvb_length(tvb);
+ tcp_dissect_pdus(tvb, pinfo, parent_tree, ifcp_desegment, iFCP_MIN_HEADER_LEN, get_ifcp_pdu_len, dissect_ifcp_pdu, data);
+ return tvb_length(tvb);
}
@@ -515,68 +515,68 @@ dissect_ifcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* d
static int
dissect_ifcp_handle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- return dissect_ifcp(tvb, pinfo, tree, data);
+ return dissect_ifcp(tvb, pinfo, tree, data);
}
static gboolean
dissect_ifcp_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
{
- if(!ifcp_header_test(tvb, 0)){
- return FALSE;
- }
+ if(!ifcp_header_test(tvb, 0)){
+ return FALSE;
+ }
- dissect_ifcp(tvb, pinfo, tree, data);
+ dissect_ifcp(tvb, pinfo, tree, data);
- /* our heuristics are so strong that if the heuristics above passed
- * and the dissection of the pdu did not cause any exceptions
- * then we can set this as our conversation dissector
- */
- if(ifcp_handle){
- conversation_t* ifcp_conv;
+ /* our heuristics are so strong that if the heuristics above passed
+ * and the dissection of the pdu did not cause any exceptions
+ * then we can set this as our conversation dissector
+ */
+ if(ifcp_handle){
+ conversation_t* ifcp_conv;
- ifcp_conv=find_or_create_conversation(pinfo);
- /* XXX why does this not work? it doesn't result in dissect_ifcp_handle being called look into later*/
- conversation_set_dissector(ifcp_conv, ifcp_handle);
- }
+ ifcp_conv=find_or_create_conversation(pinfo);
+ /* XXX why does this not work? it doesn't result in dissect_ifcp_handle being called look into later*/
+ conversation_set_dissector(ifcp_conv, ifcp_handle);
+ }
- return TRUE;
+ return TRUE;
}
void
proto_register_ifcp (void)
{
-
/* Setup list of header fields See Section 1.6.1 for details*/
static hf_register_info hf[] = {
{ &hf_ifcp_protocol,
- { "Protocol", "ifcp.encap.proto", FT_UINT8, BASE_DEC,
- VALS(fcencap_proto_vals), 0, NULL, HFILL }},
+ {"Protocol", "ifcp.encap.proto", FT_UINT8, BASE_DEC, VALS(fcencap_proto_vals), 0,
+ NULL, HFILL }},
{ &hf_ifcp_protocol_c,
- {"Protocol (1's Complement)", "ifcp.encap.protoc", FT_UINT8, BASE_DEC, NULL,
- 0, NULL, HFILL}},
+ {"Protocol (1's Complement)", "ifcp.encap.protoc", FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL}},
{ &hf_ifcp_version,
- {"Version", "ifcp.encap.version", FT_UINT8, BASE_DEC, NULL, 0, NULL,
- HFILL}},
+ {"Version", "ifcp.encap.version", FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL}},
{ &hf_ifcp_version_c,
- {"Version (1's Complement)", "ifcp.encap.versionc", FT_UINT8, BASE_DEC,
- NULL, 0, NULL, HFILL}},
+ {"Version (1's Complement)", "ifcp.encap.versionc", FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL}},
{ &hf_ifcp_encap_flags_c,
- {"iFCP Encapsulation Flags (1's Complement)", "ifcp.encap_flagsc", FT_UINT8, BASE_HEX,
- NULL, 0xFC, NULL, HFILL}},
+ {"iFCP Encapsulation Flags (1's Complement)", "ifcp.encap_flagsc", FT_UINT8, BASE_HEX, NULL, 0xFC,
+ NULL, HFILL}},
{ &hf_ifcp_framelen,
- {"Frame Length (in Words)", "ifcp.encap.framelen", FT_UINT16, BASE_DEC,
- NULL, 0x03FF, NULL, HFILL}},
+ {"Frame Length (in Words)", "ifcp.encap.framelen", FT_UINT16, BASE_DEC, NULL, 0x03FF,
+ NULL, HFILL}},
{ &hf_ifcp_framelen_c,
- {"Frame Length (1's Complement)", "ifcp.encap.framelenc", FT_UINT16,
- BASE_DEC, NULL, 0x03FF, NULL, HFILL}},
+ {"Frame Length (1's Complement)", "ifcp.encap.framelenc", FT_UINT16, BASE_DEC, NULL, 0x03FF,
+ NULL, HFILL}},
{ &hf_ifcp_tsec,
- {"Time (secs)", "ifcp.encap.tsec", FT_UINT32, BASE_DEC, NULL, 0, NULL,
- HFILL}},
+ {"Time (secs)", "ifcp.encap.tsec", FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL}},
{ &hf_ifcp_tusec,
{"Time (fraction)", "ifcp.encap.tusec", FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL}},
{ &hf_ifcp_encap_crc,
- {"CRC", "ifcp.encap.crc", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}},
+ {"CRC", "ifcp.encap.crc", FT_UINT32, BASE_HEX, NULL, 0,
+ NULL, HFILL}},
{ &hf_ifcp_sof,
{"SOF", "ifcp.sof", FT_UINT8, BASE_HEX, VALS (ifcp_sof_vals), 0,
NULL, HFILL}},
@@ -593,17 +593,23 @@ proto_register_ifcp (void)
{"Ls Command Acc", "ifcp.ls_command_acc", FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL}},
{ &hf_ifcp_common_flags,
- {"Flags", "ifcp.common_flags", FT_UINT8, BASE_HEX , NULL, 0xfc, NULL, HFILL }},
+ {"Flags", "ifcp.common_flags", FT_UINT8, BASE_HEX , NULL, 0xfc,
+ NULL, HFILL }},
{ &hf_ifcp_common_flags_crcv,
- {"CRCV", "ifcp.common_flags.crcv", FT_BOOLEAN, 8, TFS(&ifcp_common_flags_crcv_tfs), IFCP_COMMON_FLAGS_CRCV, "Is the CRC field valid?", HFILL }},
+ {"CRCV", "ifcp.common_flags.crcv", FT_BOOLEAN, 8, TFS(&ifcp_common_flags_crcv_tfs), IFCP_COMMON_FLAGS_CRCV,
+ "Is the CRC field valid?", HFILL }},
{ &hf_ifcp_flags,
- {"iFCP Flags", "ifcp.flags", FT_UINT8, BASE_HEX , NULL, 0, NULL, HFILL }},
+ {"iFCP Flags", "ifcp.flags", FT_UINT8, BASE_HEX , NULL, 0,
+ NULL, HFILL }},
{ &hf_ifcp_flags_ses,
- {"SES", "ifcp.flags.ses", FT_BOOLEAN, 8, TFS(&ifcp_flags_ses_tfs), IFCP_FLAGS_SES, "Is this a Session control frame", HFILL }},
+ {"SES", "ifcp.flags.ses", FT_BOOLEAN, 8, TFS(&ifcp_flags_ses_tfs), IFCP_FLAGS_SES,
+ "Is this a Session control frame", HFILL }},
{ &hf_ifcp_flags_trp,
- {"TRP", "ifcp.flags.trp", FT_BOOLEAN, 8, TFS(&ifcp_flags_trp_tfs), IFCP_FLAGS_TRP, "Is address transparent mode enabled", HFILL }},
+ {"TRP", "ifcp.flags.trp", FT_BOOLEAN, 8, TFS(&ifcp_flags_trp_tfs), IFCP_FLAGS_TRP,
+ "Is address transparent mode enabled", HFILL }},
{ &hf_ifcp_flags_spc,
- {"SPC", "ifcp.flags.spc", FT_BOOLEAN, 8, TFS(&ifcp_flags_spc_tfs), IFCP_FLAGS_SPC, "Is frame part of link service", HFILL }},
+ {"SPC", "ifcp.flags.spc", FT_BOOLEAN, 8, TFS(&ifcp_flags_spc_tfs), IFCP_FLAGS_SPC,
+ "Is frame part of link service", HFILL }},
};
static gint *ett[] = {
@@ -612,7 +618,7 @@ proto_register_ifcp (void)
&ett_ifcp_eof,
&ett_ifcp_protocol,
&ett_ifcp_version,
- &ett_ifcp_frame_len,
+ &ett_ifcp_frame_len,
&ett_ifcp_flags,
&ett_ifcp_common_flags,
};
@@ -622,8 +628,6 @@ proto_register_ifcp (void)
/* Register the protocol name and description */
proto_ifcp = proto_register_protocol("iFCP", "iFCP", "ifcp");
- /* Required function calls to register the header fields and
- * subtrees used */
proto_register_field_array(proto_ifcp, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
@@ -637,16 +641,6 @@ proto_register_ifcp (void)
prefs_register_obsolete_preference(ifcp_module, "target_port");
}
-
-/*
- * If this dissector uses sub-dissector registration add a
- * registration routine.
- */
-
-/*
- * This format is required because a script is used to find these
- * routines and create the code that calls these routines.
- */
void
proto_reg_handoff_ifcp (void)
{
@@ -658,3 +652,16 @@ proto_reg_handoff_ifcp (void)
data_handle = find_dissector("data");
fc_handle = find_dissector("fc_ifcp");
}
+
+/*
+ * Editor modelines - http://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */