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:
Nitzan Carmi 2019-05-26 10:07:11 +00:00 committed by Anders Broman
parent ddff1ab4fa
commit fa535b3fcd
1 changed files with 134 additions and 0 deletions

View File

@ -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",