diff options
author | Bill Meier <wmeier@newsguy.com> | 2014-10-04 11:28:35 -0400 |
---|---|---|
committer | Bill Meier <wmeier@newsguy.com> | 2014-10-04 15:34:02 +0000 |
commit | ebfe8f6d289e3d2649dcfd5a3902ba038b0ee2bd (patch) | |
tree | d7cfeb5eb4592086744dbfaa71f1163932bc43a8 /epan/dissectors/packet-ifcp.c | |
parent | 20795925ffb2f9687e960de8d6798e53482cb175 (diff) |
Add editor modelines; Reformat as appropriate.
Change-Id: I8e9c58b75eea85877d22024201e5d8d0e9a3dbfd
Reviewed-on: https://code.wireshark.org/review/4459
Reviewed-by: Bill Meier <wmeier@newsguy.com>
Diffstat (limited to 'epan/dissectors/packet-ifcp.c')
-rw-r--r-- | epan/dissectors/packet-ifcp.c | 707 |
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: + */ |