aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-fcswils.c
diff options
context:
space:
mode:
authoretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>2005-09-14 18:40:16 +0000
committeretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>2005-09-14 18:40:16 +0000
commit6d7f790c1712dcf5eab1955decdd96f3e95ead02 (patch)
tree17aad87511ddab2c93bdda55a6e5a6001ba8e4f1 /epan/dissectors/packet-fcswils.c
parentf251df8d8407a699e74627524badca0a302e920c (diff)
From Dinesh G Dutt
Support some new messages and fix a couple of bugs. packet-fc.h - Added a #define for a Cisco MDS-specific frame called OHMS (online health mgmt srv) packet-fc.c - Support for OHMS frame, fixed an incorrect "malformed frame" error caused on ACK1 frames (they don't contain anything but (encap hdr + FC hdr + encap trailer), fixed incorrect detection of last-data-frame packet-fcct.h - Support for new service type, "Fabric Controller", used in conjunction with FC-SW3 ESS message, exported the service name value string definitions and packet-fcct.c - Support for recognizing "Fabric Controller" service type and "vendor-specific" service packet-fcswils.h - Support for ESS & MRRA messages, defined as part of FC-SW3 packet-fcswils.c - Support for ESS & MRRA messages, defined as part of FC-SW3 packet-scsi.c - Support for Verify and Write&Verify SBC commands. git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@15799 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/dissectors/packet-fcswils.c')
-rw-r--r--epan/dissectors/packet-fcswils.c568
1 files changed, 507 insertions, 61 deletions
diff --git a/epan/dissectors/packet-fcswils.c b/epan/dissectors/packet-fcswils.c
index 8b0f5e7929..eb2ed777ba 100644
--- a/epan/dissectors/packet-fcswils.c
+++ b/epan/dissectors/packet-fcswils.c
@@ -47,6 +47,7 @@
#include "etypes.h"
#include "packet-fc.h"
#include "packet-fcswils.h"
+#include "packet-fcct.h"
/*
* See the FC-SW specifications.
@@ -147,6 +148,49 @@ static int hf_swils_rjt = -1;
static int hf_swils_rjtdet = -1;
static int hf_swils_rjtvendor = -1;
static int hf_swils_zone_mbrid_lun = -1;
+static int hf_swils_ess_rev = -1;
+static int hf_swils_ess_len = -1;
+static int hf_swils_ess_numobj = -1;
+static int hf_swils_interconnect_list_len = -1;
+static int hf_swils_ess_vendorname = -1;
+static int hf_swils_ess_modelname = -1;
+static int hf_swils_ess_relcode = -1;
+static int hf_swils_ess_vendorspecific = -1;
+static int hf_swils_ess_cap_type = -1;
+static int hf_swils_ess_cap_subtype = -1;
+static int hf_swils_ess_cap_numentries = -1;
+static int hf_swils_ess_cap_svc = -1;
+static int hf_swils_ess_dns_obj0h = -1;
+static int hf_swils_ess_dns_obj1h = -1;
+static int hf_swils_ess_dns_obj2h = -1;
+static int hf_swils_ess_dns_obj3h = -1;
+static int hf_swils_ess_dns_zlacc = -1;
+static int hf_swils_ess_dns_vendor = -1;
+static int hf_swils_ess_fctlr_rscn = -1;
+static int hf_swils_ess_fctlr_vendor = -1;
+static int hf_swils_ess_fcs_basic = -1;
+static int hf_swils_ess_fcs_platform = -1;
+static int hf_swils_ess_fcs_topology = -1;
+static int hf_swils_ess_fcs_enhanced = -1;
+static int hf_swils_ess_fzs_enh_supp = -1;
+static int hf_swils_ess_fzs_enh_ena = -1;
+static int hf_swils_ess_fzs_mr = -1;
+static int hf_swils_ess_fzs_zsdb_supp = -1;
+static int hf_swils_ess_fzs_zsdb_ena = -1;
+static int hf_swils_ess_fzs_adc_supp = -1;
+static int hf_swils_ess_fzs_hardzone = -1;
+static int hf_swils_mrra_rev = -1;
+static int hf_swils_mrra_size = -1;
+static int hf_swils_mrra_vendorid = -1;
+static int hf_swils_mrra_reply = -1;
+static int hf_swils_mrra_reply_size = -1;
+static int hf_swils_mrra_waittime = -1;
+static int hf_swils_ess_cap_t10 = -1;
+static int hf_swils_ess_cap_vendorobj = -1;
+static int hf_swils_ess_fzs_defzone = -1;
+static int hf_swils_ess_cap_len = -1;
+static int hf_swils_mrra_vendorinfo = -1;
+
/* Initialize the subtree pointers */
static gint ett_fcswils = -1;
@@ -179,6 +223,8 @@ static gint ett_fcswils_sfc = -1;
static gint ett_fcswils_ufc = -1;
static gint ett_fcswils_esc = -1;
static gint ett_fcswils_esc_pdesc = -1;
+static gint ett_fcswils_ieinfo = -1;
+static gint ett_fcswils_capinfo = -1;
static const value_string fc_swils_opcode_key_val[] = {
{FC_SWILS_SWRJT , "SW_RJT"},
@@ -202,6 +248,8 @@ static const value_string fc_swils_opcode_key_val[] = {
{FC_SWILS_SFC , "SFC"},
{FC_SWILS_UFC , "UFC"},
{FC_SWILS_ESC , "ESC"},
+ {FC_SWILS_ESS , "ESS"},
+ {FC_SWILS_MRRA , "MRRA"},
{FC_SWILS_AUTH_ILS, "AUTH_ILS"},
{0, NULL},
};
@@ -383,6 +431,13 @@ typedef struct _fcswils_conv_data {
GHashTable *fcswils_req_hash = NULL;
+/* list of commands for each commandset */
+typedef void (*fcswils_dissector_t)(tvbuff_t *tvb, proto_tree *tree, guint8 isreq);
+
+typedef struct _fcswils_func_table_t {
+ fcswils_dissector_t func;
+} fcswils_func_table_t;
+
static dissector_handle_t data_handle, fcsp_handle;
static gint get_zoneobj_len (tvbuff_t *tvb, gint offset);
@@ -420,6 +475,7 @@ fcswils_init_protocol(void)
g_hash_table_destroy (fcswils_req_hash);
fcswils_req_hash = g_hash_table_new(fcswils_hash, fcswils_equal);
+
}
static guint8 *
@@ -469,6 +525,189 @@ get_zoneobj_len (tvbuff_t *tvb, gint offset)
return len;
}
+#define MAX_INTERCONNECT_ELEMENT_INFO_LEN 252
+static int
+dissect_swils_interconnect_element_info (tvbuff_t *tvb, proto_tree *tree, int offset)
+{
+
+ int len, max_len = MAX_INTERCONNECT_ELEMENT_INFO_LEN;
+
+ if (tree) {
+ proto_tree_add_item (tree, hf_swils_interconnect_list_len, tvb, offset+3, 1, 0);
+ len = tvb_strsize (tvb, offset+4);
+ proto_tree_add_item (tree, hf_swils_ess_vendorname, tvb, offset+4, len, FALSE);
+ offset += (4 + len);
+ max_len -= len;
+ len = tvb_strsize (tvb, offset);
+ proto_tree_add_item (tree, hf_swils_ess_modelname, tvb, offset, len, FALSE);
+ offset += len;
+ max_len -= len;
+ len = tvb_strsize (tvb, offset);
+ proto_tree_add_item (tree, hf_swils_ess_relcode, tvb, offset, len, FALSE);
+ offset += len;
+ max_len -= len;
+ while (max_len > 0) {
+ /* Vendor specific field is a set of one or more null-terminated
+ * strings
+ */
+ len = tvb_strsize (tvb, offset);
+ proto_tree_add_item (tree, hf_swils_ess_vendorspecific, tvb, offset, len, FALSE);
+ offset += len;
+ max_len -= len;
+ }
+ }
+
+ return TRUE;
+}
+
+static void
+dissect_swils_ess_capability (tvbuff_t *tvb, proto_tree *tree, int offset,
+ guint8 srvr_type)
+{
+ if (tree) {
+ switch (srvr_type) {
+ case FCCT_GSRVR_DNS:
+ proto_tree_add_item (tree, hf_swils_ess_dns_zlacc, tvb, offset+3,
+ 1, 0);
+ proto_tree_add_item (tree, hf_swils_ess_dns_obj3h, tvb, offset+3,
+ 1, 0);
+ proto_tree_add_item (tree, hf_swils_ess_dns_obj2h, tvb, offset+3,
+ 1, 0);
+ proto_tree_add_item (tree, hf_swils_ess_dns_obj1h, tvb, offset+3,
+ 1, 0);
+ proto_tree_add_item (tree, hf_swils_ess_dns_obj0h, tvb, offset+3,
+ 1, 0);
+ proto_tree_add_item (tree, hf_swils_ess_dns_vendor, tvb,
+ offset+4, 4, 0);
+ break;
+ case FCCT_GSRVR_FCTLR:
+ proto_tree_add_item (tree, hf_swils_ess_fctlr_rscn, tvb,
+ offset+3, 1, 0);
+ proto_tree_add_item (tree, hf_swils_ess_fctlr_vendor, tvb,
+ offset+4, 4, 0);
+ break;
+ case FCCT_GSRVR_FCS:
+ proto_tree_add_item (tree, hf_swils_ess_fcs_basic, tvb,
+ offset+3, 1, 0);
+ proto_tree_add_item (tree, hf_swils_ess_fcs_platform, tvb,
+ offset+3, 1, 0);
+ proto_tree_add_item (tree, hf_swils_ess_fcs_topology, tvb,
+ offset+3, 1, 0);
+ proto_tree_add_item (tree, hf_swils_ess_fcs_enhanced, tvb,
+ offset+3, 1, 0);
+ break;
+ case FCCT_GSRVR_FZS:
+ proto_tree_add_item (tree, hf_swils_ess_fzs_enh_supp, tvb,
+ offset+3, 1, 0);
+ proto_tree_add_item (tree, hf_swils_ess_fzs_enh_ena, tvb,
+ offset+3, 1, 0);
+ proto_tree_add_item (tree, hf_swils_ess_fzs_mr, tvb, offset+3,
+ 1, 0);
+ proto_tree_add_item (tree, hf_swils_ess_fzs_defzone, tvb,
+ offset+3, 1, 0);
+ proto_tree_add_item (tree, hf_swils_ess_fzs_zsdb_supp, tvb,
+ offset+3, 1, 0);
+ proto_tree_add_item (tree, hf_swils_ess_fzs_zsdb_ena, tvb,
+ offset+3, 1, 0);
+ proto_tree_add_item (tree, hf_swils_ess_fzs_adc_supp, tvb,
+ offset+3, 1, 0);
+ proto_tree_add_item (tree, hf_swils_ess_fzs_hardzone, tvb,
+ offset+3, 1, 0);
+ break;
+ default:
+ break;
+ }
+ }
+
+ return;
+}
+
+static int
+dissect_swils_ess_capability_obj (tvbuff_t *tvb, proto_tree *tree, int offset)
+{
+ int i, num_entries, len = 0, total_len = 0;
+ guint8 type, subtype, srvr_type;
+ proto_item *ti = NULL;
+ proto_tree *capinfo_tree = NULL;
+
+ if (tree) {
+ /*
+ * Structure of capability object is: WK type (2B), WK subtype(2),
+ * rsvd (1), num_cap_entries (1), entry_1 (8) ... entry_n (8)
+ */
+ /* Compute length first to create subtree of cap object */
+ type = tvb_get_guint8 (tvb, offset);
+ if (type != FCCT_GSTYPE_VENDOR) {
+ num_entries = tvb_get_guint8 (tvb, offset+3);
+ total_len = 4 + (num_entries*8);
+ ti = proto_tree_add_text (tree, tvb, offset,
+ total_len, "Capabilty Object (%s)",
+ val_to_str (type, fc_ct_gstype_vals,
+ "Unknown (0x%x)"));
+ capinfo_tree = proto_item_add_subtree (ti, ett_fcswils_capinfo);
+
+ } else {
+ i = tvb_get_guint8 (tvb, offset+3);
+ i += 12;
+
+ ti = proto_tree_add_text (tree, tvb, offset,
+ i, "Capabilty Object (Vendor-specific 0x%x)",
+ type);
+ capinfo_tree = proto_item_add_subtree (ti, ett_fcswils_capinfo);
+ }
+
+ proto_tree_add_item (capinfo_tree, hf_swils_ess_cap_type, tvb, offset, 1, 0);
+ proto_tree_add_item (capinfo_tree, hf_swils_ess_cap_subtype, tvb, offset+1,
+ 1, 0);
+ subtype = tvb_get_guint8 (tvb, offset+1);
+
+ if (type != FCCT_GSTYPE_VENDOR) {
+ srvr_type = get_gs_server (type, subtype);
+ proto_tree_add_uint (capinfo_tree, hf_swils_ess_cap_svc, tvb, offset, 2,
+ srvr_type);
+ proto_tree_add_item (capinfo_tree, hf_swils_ess_cap_numentries, tvb,
+ offset+3, 1, 0);
+ offset += 4;
+ len += 4;
+
+ while ((num_entries > 0) && tvb_bytes_exist (tvb, offset, 8)) {
+ dissect_swils_ess_capability (tvb, capinfo_tree, offset, srvr_type);
+ num_entries--;
+ offset += 8;
+ len += 8;
+ }
+ } else {
+ /* Those damn T11 guys defined another format for
+ * Vendor-specific objects.
+ */
+ proto_tree_add_item (capinfo_tree, hf_swils_ess_cap_len, tvb, offset+3,
+ 1, 0);
+ proto_tree_add_item (capinfo_tree, hf_swils_ess_cap_t10, tvb, offset+4,
+ 8, 0);
+ i -= 8; /* reduce length by t10 object size */
+ offset += 12;
+ len += 12;
+
+ while ((i > 0) && tvb_bytes_exist (tvb, offset, 8)) {
+ proto_tree_add_item (capinfo_tree, hf_swils_ess_cap_vendorobj,
+ tvb, offset, 8, 0);
+ i -= 8;
+ offset += 8;
+ len += 12;
+ }
+ }
+ }
+ return len;
+}
+
+static void
+dissect_swils_nullpayload (tvbuff_t *tvb _U_, proto_tree *tree _U_,
+ guint8 isreq _U_)
+{
+ /* Common dissector for those ILSs without a payload */
+ return;
+}
+
static void
dissect_swils_elp (tvbuff_t *tvb, proto_tree *elp_tree, guint8 isreq _U_)
{
@@ -1411,7 +1650,7 @@ dissect_swils_drlir (tvbuff_t *tvb _U_, proto_tree *drlir_tree _U_,
}
static void
-dissect_swils_swrjt (tvbuff_t *tvb, proto_tree *swrjt_tree)
+dissect_swils_swrjt (tvbuff_t *tvb, proto_tree *swrjt_tree, guint8 isreq _U_)
{
/* Set up structures needed to add the protocol subtree and manage it */
int offset = 0;
@@ -1424,6 +1663,132 @@ dissect_swils_swrjt (tvbuff_t *tvb, proto_tree *swrjt_tree)
}
}
+static void
+dissect_swils_ess (tvbuff_t *tvb, proto_tree *ess_tree, guint8 isreq _U_)
+{
+ int offset = 0;
+ gint16 numcapobj = 0;
+ gint len = 0;
+ gint capobjlen = 0;
+ proto_item *ti = NULL;
+ proto_tree *ieinfo_tree = NULL;
+
+ if (!ess_tree) {
+ return;
+ }
+
+ proto_tree_add_item (ess_tree, hf_swils_ess_rev, tvb, offset+4, 4, 0);
+ proto_tree_add_item (ess_tree, hf_swils_ess_len, tvb, offset+8, 4, 0);
+ len = tvb_get_ntohl (tvb, offset+8);
+
+ ti = proto_tree_add_text (ess_tree, tvb, offset+12,
+ MAX_INTERCONNECT_ELEMENT_INFO_LEN+4,
+ "Interconnect Element Info");
+ ieinfo_tree = proto_item_add_subtree (ti, ett_fcswils_ieinfo);
+ dissect_swils_interconnect_element_info (tvb, ieinfo_tree, offset+12);
+ len -= 256; /* the interconnect obj above is 256 bytes */
+ offset += 268;
+
+ proto_tree_add_item (ess_tree, hf_swils_ess_numobj, tvb, offset, 2, 0);
+ numcapobj = tvb_get_ntohs (tvb, offset);
+
+ len -= 4; /* 2B numcapobj + 2B rsvd */
+ offset += 4;
+
+ while ((len > 0) && (numcapobj > 0)) {
+ capobjlen = dissect_swils_ess_capability_obj (tvb, ess_tree, offset);
+ numcapobj--;
+ len -= capobjlen;
+ offset += capobjlen;
+ }
+}
+
+static void
+dissect_swils_mrra (tvbuff_t *tvb, proto_tree *tree, guint8 isreq)
+{
+
+ int offset = 0;
+
+ if (!tree) {
+ return;
+ }
+
+ if (isreq) {
+ proto_tree_add_item (tree, hf_swils_mrra_rev, tvb, offset+4, 4, 0);
+ proto_tree_add_item (tree, hf_swils_mrra_size, tvb, offset+8, 4, 0);
+ proto_tree_add_item (tree, hf_swils_mrra_vendorid, tvb, offset+12, 8, 0);
+ proto_tree_add_item (tree, hf_swils_mrra_vendorinfo, tvb, offset+20,
+ 8, 0);
+ } else {
+ proto_tree_add_item (tree, hf_swils_mrra_vendorid, tvb, offset+4,
+ 8, 0);
+ proto_tree_add_item (tree, hf_swils_mrra_reply, tvb, offset+12,
+ 4, 0);
+ proto_tree_add_item (tree, hf_swils_mrra_reply_size, tvb, offset+16,
+ 4, 0);
+ proto_tree_add_item (tree, hf_swils_mrra_waittime, tvb, offset+20,
+ 4, 0);
+ }
+
+
+}
+
+static fcswils_func_table_t fcswils_func_table[FC_SWILS_MAXCODE] = {
+ /* 0x00 */ {NULL},
+ /* 0x01 */ {dissect_swils_swrjt},
+ /* 0x02 */ {NULL},
+ /* 0x03 */ {NULL},
+ /* 0x04 */ {NULL},
+ /* 0x05 */ {NULL},
+ /* 0x06 */ {NULL},
+ /* 0x07 */ {NULL},
+ /* 0x08 */ {NULL},
+ /* 0x09 */ {NULL},
+ /* 0x0a */ {NULL},
+ /* 0x0b */ {NULL},
+ /* 0x0c */ {NULL},
+ /* 0x0d */ {NULL},
+ /* 0x0e */ {NULL},
+ /* 0x0f */ {NULL},
+ /* 0x10 */ {dissect_swils_elp},
+ /* 0x11 */ {dissect_swils_efp},
+ /* 0x12 */ {dissect_swils_dia},
+ /* 0x13 */ {dissect_swils_rdi},
+ /* 0x14 */ {dissect_swils_hello},
+ /* 0x15 */ {dissect_swils_lsupdate},
+ /* 0x16 */ {dissect_swils_lsack},
+ /* 0x17 */ {dissect_swils_nullpayload},
+ /* 0x18 */ {dissect_swils_nullpayload},
+ /* 0x19 */ {NULL},
+ /* 0x1a */ {NULL},
+ /* 0x1b */ {dissect_swils_rscn},
+ /* 0x1c */ {NULL},
+ /* 0x1d */ {NULL},
+ /* 0x1e */ {dissect_swils_drlir},
+ /* 0x1f */ {NULL},
+ /* 0x20 */ {NULL /*dissect_swils_dscn*/},
+ /* 0x21 */ {NULL /*dissect_swils_loopd*/},
+ /* 0x22 */ {dissect_swils_mergereq},
+ /* 0x23 */ {dissect_swils_aca},
+ /* 0x24 */ {dissect_swils_rca},
+ /* 0x25 */ {dissect_swils_sfc},
+ /* 0x26 */ {dissect_swils_ufc},
+ /* 0x27 */ {NULL},
+ /* 0x28 */ {NULL},
+ /* 0x29 */ {NULL},
+ /* 0x2a */ {NULL},
+ /* 0x2b */ {NULL},
+ /* 0x2c */ {NULL},
+ /* 0x2d */ {NULL},
+ /* 0x2e */ {NULL},
+ /* 0x2f */ {NULL},
+ /* 0x30 */ {dissect_swils_esc},
+ /* 0x31 */ {dissect_swils_ess},
+ /* 0x32 */ {NULL},
+ /* 0x33 */ {NULL},
+ /* 0x34 */ {dissect_swils_mrra}
+};
+
/* Code to actually dissect the packets */
static void
dissect_fcswils (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
@@ -1540,66 +1905,16 @@ dissect_fcswils (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree_add_item (swils_tree, hf_swils_opcode, tvb, offset, 1, 0);
}
- switch (opcode) {
- case FC_SWILS_SWRJT:
- dissect_swils_swrjt (tvb, swils_tree);
- break;
- case FC_SWILS_ELP:
- dissect_swils_elp (tvb, swils_tree, isreq);
- break;
- case FC_SWILS_EFP:
- dissect_swils_efp (tvb, swils_tree, isreq);
- break;
- case FC_SWILS_DIA:
- dissect_swils_dia (tvb, swils_tree, isreq);
- break;
- case FC_SWILS_RDI:
- dissect_swils_rdi (tvb, swils_tree, isreq);
- break;
- case FC_SWILS_HLO:
- dissect_swils_hello (tvb, swils_tree, isreq);
- break;
- case FC_SWILS_LSU:
- dissect_swils_lsupdate (tvb, swils_tree, isreq);
- break;
- case FC_SWILS_LSA:
- dissect_swils_lsack (tvb, swils_tree, isreq);
- break;
- case FC_SWILS_BF:
- case FC_SWILS_RCF:
- /* Nothing to be displayed for these two commands */
- break;
- case FC_SWILS_RSCN:
- dissect_swils_rscn (tvb, swils_tree, isreq);
- break;
- case FC_SWILS_DRLIR:
- dissect_swils_drlir (tvb, swils_tree, isreq);
- break;
- case FC_SWILS_MR:
- dissect_swils_mergereq (tvb, swils_tree, isreq);
- break;
- case FC_SWILS_ACA:
- dissect_swils_aca (tvb, swils_tree, isreq);
- break;
- case FC_SWILS_RCA:
- dissect_swils_rca (tvb, swils_tree, isreq);
- break;
- case FC_SWILS_SFC:
- dissect_swils_sfc (tvb, swils_tree, isreq);
- break;
- case FC_SWILS_UFC:
- dissect_swils_ufc (tvb, swils_tree, isreq);
- break;
- case FC_SWILS_ESC:
- dissect_swils_esc (tvb, swils_tree, isreq);
- break;
- case FC_SWILS_AUTH_ILS:
- if (isreq && fcsp_handle)
- call_dissector (fcsp_handle, tvb, pinfo, swils_tree);
- break;
- default:
- next_tvb = tvb_new_subset (tvb, offset+4, -1, -1);
- call_dissector (data_handle, next_tvb, pinfo, tree);
+ if ((opcode < FC_SWILS_MAXCODE) && fcswils_func_table[opcode].func) {
+ fcswils_func_table[opcode].func (tvb, swils_tree, isreq);
+ } else if (opcode == FC_SWILS_AUTH_ILS) {
+ /* This is treated differently */
+ if (isreq && fcsp_handle)
+ call_dissector (fcsp_handle, tvb, pinfo, swils_tree);
+ } else {
+ /* data dissector */
+ next_tvb = tvb_new_subset (tvb, offset+4, -1, -1);
+ call_dissector (data_handle, next_tvb, pinfo, tree);
}
}
@@ -1864,6 +2179,135 @@ proto_register_fcswils (void)
{ &hf_swils_zone_mbrid_lun,
{"LUN", "swils.zone.lun", FT_BYTES, BASE_HEX, NULL, 0x0, "",
HFILL}},
+ { &hf_swils_ess_rev,
+ {"Revision", "swils.ess.revision", FT_UINT32, BASE_DEC, NULL, 0x0, "",
+ HFILL}},
+ { &hf_swils_ess_len,
+ {"Payload Length", "swils.ess.leb", FT_UINT32, BASE_DEC, NULL, 0x0,
+ "", HFILL}},
+ { &hf_swils_ess_numobj,
+ {"Number of Capability Objects", "swils.ess.numobj", FT_UINT16, BASE_DEC,
+ NULL, 0x0, "", HFILL}},
+ { &hf_swils_interconnect_list_len,
+ {"List Length", "swils.ess.listlen", FT_UINT8, BASE_DEC, NULL, 0x0, "",
+ HFILL}},
+ { &hf_swils_ess_vendorname,
+ {"Vendor Name", "swils.ess.vendorname", FT_STRING, BASE_DEC, NULL,
+ 0x0, "", HFILL}},
+ { &hf_swils_ess_modelname,
+ {"Model Name", "swils.ess.modelname", FT_STRING, BASE_DEC, NULL, 0x0,
+ "", HFILL}},
+ { &hf_swils_ess_relcode,
+ {"Release Code", "swils.ess.relcode", FT_STRING, BASE_DEC, NULL, 0x0,
+ "", HFILL}},
+ { &hf_swils_ess_vendorspecific,
+ {"Vendor Specific", "swils.ess.vendorspecific", FT_STRING, BASE_HEX,
+ NULL, 0x0, "", HFILL}},
+ { &hf_swils_ess_cap_type,
+ {"Type", "swils.ess.capability.type", FT_UINT8, BASE_DEC,
+ VALS (fc_ct_gstype_vals), 0x0, "", HFILL}},
+ { &hf_swils_ess_cap_subtype,
+ {"Subtype", "swils.ess.capability.subtype", FT_UINT8, BASE_DEC, NULL,
+ 0x0, "", HFILL}},
+ { &hf_swils_ess_cap_numentries,
+ {"Number of Entries", "swils.ess.capability.numentries", FT_UINT8,
+ BASE_DEC, NULL, 0x0, "", HFILL}},
+ { &hf_swils_ess_cap_svc,
+ {"Service Name", "swils.ess.capability.service", FT_UINT8, BASE_DEC,
+ VALS (fc_ct_gsserver_vals), 0x0, "", HFILL}},
+ { &hf_swils_ess_dns_obj0h,
+ {"Name Server Entry Object 00h Support", "swils.ess.capability.dns.obj0h",
+ FT_BOOLEAN, BASE_HEX, NULL, 0x1, "", HFILL}},
+ { &hf_swils_ess_dns_obj1h,
+ {"Name Server Entry Object 01h Support", "swils.ess.capability.dns.obj1h",
+ FT_BOOLEAN, BASE_HEX, NULL, 0x2, "", HFILL}},
+ { &hf_swils_ess_dns_obj2h,
+ {"Name Server Entry Object 02h Support", "swils.ess.capability.dns.obj2h",
+ FT_BOOLEAN, BASE_HEX, NULL, 0x4, "", HFILL}},
+ { &hf_swils_ess_dns_obj3h,
+ {"Name Server Entry Object 03h Support", "swils.ess.capability.dns.obj3h",
+ FT_BOOLEAN, BASE_HEX, NULL, 0x8, "", HFILL}},
+ { &hf_swils_ess_dns_zlacc,
+ {"GE_PT Zero Length Accepted", "swils.ess.capability.dns.zlacc",
+ FT_BOOLEAN, BASE_HEX, NULL, 0x10, "", HFILL}},
+ { &hf_swils_ess_dns_vendor,
+ {"Vendor Specific Flags", "swils.ess.capability.dns.vendor", FT_UINT32,
+ BASE_HEX, NULL, 0x0, "", HFILL}},
+ { &hf_swils_ess_fctlr_rscn,
+ {"SW_RSCN Supported", "swils.ess.capability.fctlr.rscn", FT_BOOLEAN,
+ BASE_HEX, NULL, 0x1, "", HFILL}},
+ { &hf_swils_ess_fctlr_vendor,
+ {"Vendor Specific Flags", "swils.ess.capability.fctlr.vendor",
+ FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL}},
+ { &hf_swils_ess_fcs_basic,
+ {"Basic Configuration Services", "swils.ess.capability.fcs.basic",
+ FT_BOOLEAN, BASE_HEX, NULL, 0x1, "", HFILL}},
+ { &hf_swils_ess_fcs_platform,
+ {"Platform Configuration Services",
+ "swils.ess.capability.fcs.platform", FT_BOOLEAN, BASE_HEX, NULL,
+ 0x2, "", HFILL}},
+ { &hf_swils_ess_fcs_topology,
+ {"Topology Discovery Services", "swils.ess.capability.fcs.topology",
+ FT_BOOLEAN, BASE_HEX, NULL, 0x4, "", HFILL}},
+ { &hf_swils_ess_fcs_enhanced,
+ {"Enhanced Configuration Services",
+ "swils.ess.capability.fcs.enhanced", FT_BOOLEAN, BASE_HEX, NULL, 0x8,
+ "", HFILL}},
+ { &hf_swils_ess_fzs_enh_supp,
+ {"Enhanced Zoning Supported", "swils.ess.capability.fzs.ezonesupp",
+ FT_BOOLEAN, BASE_HEX, NULL, 0x1, "", HFILL}},
+ { &hf_swils_ess_fzs_enh_ena,
+ {"Enhanced Zoning Enabled", "swils.ess.capability.fzs.ezoneena",
+ FT_BOOLEAN, BASE_HEX, NULL, 0x2, "", HFILL}},
+ { &hf_swils_ess_fzs_mr,
+ {"Merge Control Setting", "swils.ess.capability.fzs.mr", FT_BOOLEAN,
+ BASE_HEX, NULL, 0x4, "", HFILL}},
+ { &hf_swils_ess_fzs_defzone,
+ {"Default Zone Setting", "swils.ess.capability.fzs.defzone",
+ FT_BOOLEAN, BASE_HEX, NULL, 0x8, "", HFILL}},
+ { &hf_swils_ess_fzs_zsdb_supp,
+ {"Zoneset Database Supported", "swils.ess.capability.fzs.zsdbsupp",
+ FT_BOOLEAN, BASE_HEX, NULL, 0x10, "", HFILL}},
+ { &hf_swils_ess_fzs_zsdb_ena,
+ {"Zoneset Database Enabled", "swils.ess.capability.fzs.zsdbena",
+ FT_BOOLEAN, BASE_HEX, NULL, 0x20, "", HFILL}},
+ { &hf_swils_ess_fzs_adc_supp,
+ {"Active Direct Command Supported",
+ "swils.ess.capability.fzs.adcsupp", FT_BOOLEAN, BASE_HEX, NULL,
+ 0x40, "", HFILL}},
+ { &hf_swils_ess_fzs_hardzone,
+ {"Hard Zoning Supported", "swils.ess.capability.fzs.hardzone",
+ FT_BOOLEAN, BASE_HEX, NULL, 0x80, "", HFILL}},
+ { &hf_swils_ess_cap_len,
+ {"Length", "swils.ess.capability.length", FT_UINT8, BASE_DEC, NULL,
+ 0x0, "", HFILL}},
+ { &hf_swils_ess_cap_t10,
+ {"T10 Vendor ID", "swils.ess.capability.t10id", FT_STRING, BASE_HEX,
+ NULL, 0x0, "", HFILL}},
+ { &hf_swils_ess_cap_vendorobj,
+ {"Vendor-Specific Info", "swils.ess.capability.vendorobj", FT_BYTES,
+ BASE_HEX, NULL, 0x0, "", HFILL}},
+ { &hf_swils_mrra_rev,
+ {"Revision", "swils.mrra.revision", FT_UINT32, BASE_DEC, NULL,
+ 0x0, "", HFILL}},
+ { &hf_swils_mrra_size,
+ {"Merge Request Size", "swils.mrra.size", FT_UINT32, BASE_DEC, NULL,
+ 0x0, "", HFILL}},
+ { &hf_swils_mrra_vendorid,
+ {"Vendor ID", "swils.mrra.vendorid", FT_STRING, BASE_HEX,
+ NULL, 0x0, "", HFILL}},
+ { &hf_swils_mrra_vendorinfo,
+ {"Vendor-Specific Info", "swils.mrra.vendorinfo", FT_BYTES, BASE_HEX,
+ NULL, 0x0, "", HFILL}},
+ { &hf_swils_mrra_reply,
+ {"MRRA Response", "swils.mrra.reply", FT_UINT32, BASE_DEC, NULL, 0x0,
+ "", HFILL}},
+ { &hf_swils_mrra_reply_size,
+ {"Maximum Resources Available", "swils.mrra.replysize", FT_UINT32,
+ BASE_DEC, NULL, 0x0, "", HFILL}},
+ { &hf_swils_mrra_waittime,
+ {"Waiting Period (secs)", "swils.mrra.waittime", FT_UINT32, BASE_DEC,
+ NULL, 0x0, "", HFILL}},
};
/* Setup protocol subtree array */
@@ -1898,6 +2342,8 @@ proto_register_fcswils (void)
&ett_fcswils_ufc,
&ett_fcswils_esc,
&ett_fcswils_esc_pdesc,
+ &ett_fcswils_ieinfo,
+ &ett_fcswils_capinfo
};
/* Register the protocol name and description */