nvme: Dissect NVMe Identify Namespace (CNS 0x0) data response
On NVMe specification, calling NVMe "Identify Namespace" command (Identify with CNS 0x0) is responded with 4K data structure which holds all namespace's capabilities/attributes. This commits dissects the main fields in this data structure. Change-Id: Ibba48ea0e6ecc24b0138e017094fa9d09ec13350 Signed-off-by: Nitzan Carmi <nitzanc@mellanox.com> Reviewed-on: https://code.wireshark.org/review/34932 Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com> Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
parent
ddff1ab4fa
commit
fa535b3fcd
|
@ -69,6 +69,20 @@ static int hf_nvme_cmd_rsvd3 = -1;
|
|||
static int hf_nvme_identify_cntid = -1;
|
||||
static int hf_nvme_identify_rsvd = -1;
|
||||
static int hf_nvme_identify_cns = -1;
|
||||
static int hf_nvme_identify_ns_nsze = -1;
|
||||
static int hf_nvme_identify_ns_ncap = -1;
|
||||
static int hf_nvme_identify_ns_nuse = -1;
|
||||
static int hf_nvme_identify_ns_nsfeat = -1;
|
||||
static int hf_nvme_identify_ns_nlbaf = -1;
|
||||
static int hf_nvme_identify_ns_flbas = -1;
|
||||
static int hf_nvme_identify_ns_mc = -1;
|
||||
static int hf_nvme_identify_ns_dpc = -1;
|
||||
static int hf_nvme_identify_ns_dps = -1;
|
||||
static int hf_nvme_identify_ns_nmic = -1;
|
||||
static int hf_nvme_identify_ns_nguid = -1;
|
||||
static int hf_nvme_identify_ns_eui64 = -1;
|
||||
static int hf_nvme_identify_ns_lbafs = -1;
|
||||
static int hf_nvme_identify_ns_lbaf = -1;
|
||||
static int hf_nvme_identify_ctrl_vid = -1;
|
||||
static int hf_nvme_identify_ctrl_ssvid = -1;
|
||||
static int hf_nvme_identify_ctrl_sn = -1;
|
||||
|
@ -137,6 +151,7 @@ static gint ett_data = -1;
|
|||
#define NVME_IOQ_OPC_RESV_ACQUIRE 0x11
|
||||
#define NVME_IOQ_OPC_RESV_RELEASE 0x15
|
||||
|
||||
#define NVME_IDENTIFY_CNS_IDENTIFY_NS 0x0
|
||||
#define NVME_IDENTIFY_CNS_IDENTIFY_CTRL 0x1
|
||||
|
||||
|
||||
|
@ -567,6 +582,64 @@ dissect_nvme_rwc_common_word_10_11_12_14_15(tvbuff_t *cmd_tvb, proto_tree *cmd_t
|
|||
62, 2, ENC_LITTLE_ENDIAN);
|
||||
}
|
||||
|
||||
static void dissect_nvme_identify_ns_lbafs(tvbuff_t *cmd_tvb, proto_tree *cmd_tree)
|
||||
{
|
||||
proto_item *ti, *lbafs_tree, *item;
|
||||
int lbaf_off, i;
|
||||
guint8 nlbaf, lbads;
|
||||
guint16 ms;
|
||||
guint32 lbaf_raw;
|
||||
|
||||
nlbaf = tvb_get_guint8(cmd_tvb, 25) + 1; // +1 for zero-base value
|
||||
|
||||
ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_lbafs, cmd_tvb,
|
||||
128, 64, ENC_NA);
|
||||
lbafs_tree = proto_item_add_subtree(ti, ett_data);
|
||||
|
||||
for (i = 0; i < nlbaf; i++) {
|
||||
lbaf_off = 128 + i * 4;
|
||||
|
||||
lbaf_raw = tvb_get_guint32(cmd_tvb, lbaf_off, ENC_LITTLE_ENDIAN);
|
||||
ms = lbaf_raw & 0xFF;
|
||||
lbads = (lbaf_raw >> 16) & 0xF;
|
||||
item = proto_tree_add_item(lbafs_tree, hf_nvme_identify_ns_lbaf,
|
||||
cmd_tvb, lbaf_off, 4, ENC_LITTLE_ENDIAN);
|
||||
proto_item_set_text(item, "LBAF%d: lbads %d ms %d", i, lbads, ms);
|
||||
}
|
||||
}
|
||||
|
||||
static void dissect_nvme_identify_ns_resp(tvbuff_t *cmd_tvb,
|
||||
proto_tree *cmd_tree)
|
||||
{
|
||||
proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nsze, cmd_tvb,
|
||||
0, 8, ENC_LITTLE_ENDIAN);
|
||||
proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_ncap, cmd_tvb,
|
||||
8, 8, ENC_LITTLE_ENDIAN);
|
||||
proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nuse, cmd_tvb,
|
||||
16, 8, ENC_LITTLE_ENDIAN);
|
||||
proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nsfeat, cmd_tvb,
|
||||
24, 1, ENC_LITTLE_ENDIAN);
|
||||
proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nlbaf, cmd_tvb,
|
||||
25, 1, ENC_LITTLE_ENDIAN);
|
||||
proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_flbas, cmd_tvb,
|
||||
26, 1, ENC_LITTLE_ENDIAN);
|
||||
proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_mc, cmd_tvb,
|
||||
27, 1, ENC_LITTLE_ENDIAN);
|
||||
proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_dpc, cmd_tvb,
|
||||
28, 1, ENC_LITTLE_ENDIAN);
|
||||
proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_dps, cmd_tvb,
|
||||
29, 1, ENC_LITTLE_ENDIAN);
|
||||
proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nmic, cmd_tvb,
|
||||
30, 1, ENC_LITTLE_ENDIAN);
|
||||
proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nguid, cmd_tvb,
|
||||
104, 16, ENC_NA);
|
||||
proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_eui64, cmd_tvb,
|
||||
120, 8, ENC_NA);
|
||||
|
||||
dissect_nvme_identify_ns_lbafs(cmd_tvb, cmd_tree);
|
||||
|
||||
}
|
||||
|
||||
static void dissect_nvme_identify_ctrl_resp(tvbuff_t *cmd_tvb,
|
||||
proto_tree *cmd_tree)
|
||||
{
|
||||
|
@ -625,6 +698,9 @@ static void dissect_nvme_identify_resp(tvbuff_t *cmd_tvb, proto_tree *cmd_tree,
|
|||
struct nvme_cmd_ctx *cmd_ctx)
|
||||
{
|
||||
switch(cmd_ctx->resp_type) {
|
||||
case NVME_IDENTIFY_CNS_IDENTIFY_NS:
|
||||
dissect_nvme_identify_ns_resp(cmd_tvb, cmd_tree);
|
||||
break;
|
||||
case NVME_IDENTIFY_CNS_IDENTIFY_CTRL:
|
||||
dissect_nvme_identify_ctrl_resp(cmd_tvb, cmd_tree);
|
||||
break;
|
||||
|
@ -997,6 +1073,64 @@ proto_register_nvme(void)
|
|||
FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
|
||||
},
|
||||
|
||||
/* Identify NS response */
|
||||
{ &hf_nvme_identify_ns_nsze,
|
||||
{ "Namespace Size (NSZE)", "nvme.cmd.identify.ns.nsze",
|
||||
FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
|
||||
},
|
||||
{ &hf_nvme_identify_ns_ncap,
|
||||
{ "Namespace Capacity (NCAP)", "nvme.cmd.identify.ns.ncap",
|
||||
FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
|
||||
},
|
||||
{ &hf_nvme_identify_ns_nuse,
|
||||
{ "Namespace Utilization (NUSE)", "nvme.cmd.identify.ns.nuse",
|
||||
FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
|
||||
},
|
||||
{ &hf_nvme_identify_ns_nsfeat,
|
||||
{ "Namespace Features (NSFEAT)", "nvme.cmd.identify.ns.nsfeat",
|
||||
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
|
||||
},
|
||||
{ &hf_nvme_identify_ns_nlbaf,
|
||||
{ "Number of LBA Formats (NLBAF)", "nvme.cmd.identify.ns.nlbaf",
|
||||
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
|
||||
},
|
||||
{ &hf_nvme_identify_ns_flbas,
|
||||
{ "Formatted LBA Size (FLBAS)", "nvme.cmd.identify.ns.flbas",
|
||||
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
|
||||
},
|
||||
{ &hf_nvme_identify_ns_mc,
|
||||
{ "Metadata Capabilities (MC)", "nvme.cmd.identify.ns.mc",
|
||||
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
|
||||
},
|
||||
{ &hf_nvme_identify_ns_dpc,
|
||||
{ "End-to-end Data Protection Capabilities (DPC)", "nvme.cmd.identify.ns.dpc",
|
||||
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
|
||||
},
|
||||
{ &hf_nvme_identify_ns_dps,
|
||||
{ "End-to-end Data Protection Type Settings (DPS)", "nvme.cmd.identify.ns.dps",
|
||||
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
|
||||
},
|
||||
{ &hf_nvme_identify_ns_nmic,
|
||||
{ "Namespace Multi-path I/O and Namespace Sharing Capabilities (NMIC)",
|
||||
"nvme.cmd.identify.ns.nmic", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
|
||||
},
|
||||
{ &hf_nvme_identify_ns_nguid,
|
||||
{ "Namespace Globally Unique Identifier (NGUID)", "nvme.cmd.identify.ns.nguid",
|
||||
FT_BYTES, STR_ASCII, NULL, 0x0, NULL, HFILL}
|
||||
},
|
||||
{ &hf_nvme_identify_ns_eui64,
|
||||
{ "IEEE Extended Unique Identifier (EUI64)", "nvme.cmd.identify.ns.eui64",
|
||||
FT_BYTES, STR_ASCII, NULL, 0x0, NULL, HFILL}
|
||||
},
|
||||
{ &hf_nvme_identify_ns_lbafs,
|
||||
{ "LBA Formats", "nvme.cmd.identify.ns.lbafs",
|
||||
FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL}
|
||||
},
|
||||
{ &hf_nvme_identify_ns_lbaf,
|
||||
{ "LBA Format", "nvme.cmd.identify.ns.lbaf",
|
||||
FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
|
||||
},
|
||||
|
||||
/* Identify Ctrl response */
|
||||
{ &hf_nvme_identify_ctrl_vid,
|
||||
{ "PCI Vendor ID (VID)", "nvme.cmd.identify.ctrl.vid",
|
||||
|
|
Loading…
Reference in New Issue