aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorConstantine Gavrilov <constg@il.ibm.com>2021-06-13 00:46:27 +0300
committerWireshark GitLab Utility <gerald+gitlab-utility@wireshark.org>2021-06-14 06:21:46 +0000
commit0b101d54da2867c037836ae610b43e961ff56a7e (patch)
treec30ccd6ecaf0207b3de598f3cb03d4e9b862484c
parentd576719df4131d8fd2a0f2b46e467e4a784283a9 (diff)
NVMeOF fabric commands: support offset in commands and completions dissectors.
-rw-r--r--epan/dissectors/packet-nvme-rdma.c4
-rw-r--r--epan/dissectors/packet-nvme-tcp.c2
-rw-r--r--epan/dissectors/packet-nvme.c188
-rw-r--r--epan/dissectors/packet-nvme.h6
4 files changed, 100 insertions, 100 deletions
diff --git a/epan/dissectors/packet-nvme-rdma.c b/epan/dissectors/packet-nvme-rdma.c
index 6115b37176..12ecb77bb0 100644
--- a/epan/dissectors/packet-nvme-rdma.c
+++ b/epan/dissectors/packet-nvme-rdma.c
@@ -403,7 +403,7 @@ dissect_nvme_rdma_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_t
cmd_ctx = bind_cmd_to_qctx(pinfo, &q_ctx->n_q_ctx, cmd_id);
if (opcode == NVME_FABRIC_OPC) {
cmd_ctx->n_cmd_ctx.fabric = TRUE;
- dissect_nvmeof_fabric_cmd(nvme_tvb, pinfo, nvme_tree, &q_ctx->n_q_ctx, &cmd_ctx->n_cmd_ctx);
+ dissect_nvmeof_fabric_cmd(nvme_tvb, pinfo, nvme_tree, &q_ctx->n_q_ctx, &cmd_ctx->n_cmd_ctx, 0);
} else {
cmd_ctx->n_cmd_ctx.fabric = FALSE;
dissect_nvme_cmd(nvme_tvb, pinfo, root_tree, &q_ctx->n_q_ctx, &cmd_ctx->n_cmd_ctx);
@@ -507,7 +507,7 @@ dissect_nvme_rdma_cqe(tvbuff_t *nvme_tvb, packet_info *pinfo,
nvme_update_cmd_end_info(pinfo, &cmd_ctx->n_cmd_ctx);
if (cmd_ctx->n_cmd_ctx.fabric)
- dissect_nvmeof_fabric_cqe(nvme_tvb, nvme_tree, &cmd_ctx->n_cmd_ctx);
+ dissect_nvmeof_fabric_cqe(nvme_tvb, nvme_tree, &cmd_ctx->n_cmd_ctx, 0);
else
dissect_nvme_cqe(nvme_tvb, pinfo, root_tree, &cmd_ctx->n_cmd_ctx);
return;
diff --git a/epan/dissectors/packet-nvme-tcp.c b/epan/dissectors/packet-nvme-tcp.c
index a58fd547da..1ac78d2680 100644
--- a/epan/dissectors/packet-nvme-tcp.c
+++ b/epan/dissectors/packet-nvme-tcp.c
@@ -422,7 +422,7 @@ dissect_nvme_fabric_connect_cmd(struct nvme_tcp_q_ctx *queue, packet_info *pinfo
proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_connect_rsvd2, cmd_tvb,
offset + 5, 19, ENC_NA);
dissect_nvme_cmd_sgl(cmd_tvb, cmd_tree, hf_nvme_fabrics_cmd_connect_sgl1,
- NULL, NULL, PINFO_FD_VISITED(pinfo));
+ NULL, NULL, offset, PINFO_FD_VISITED(pinfo));
proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_connect_recfmt, cmd_tvb,
offset + 40, 2, ENC_LITTLE_ENDIAN);
diff --git a/epan/dissectors/packet-nvme.c b/epan/dissectors/packet-nvme.c
index 475ce4cf2f..731086d9ce 100644
--- a/epan/dissectors/packet-nvme.c
+++ b/epan/dissectors/packet-nvme.c
@@ -1350,11 +1350,11 @@ void nvme_publish_to_data_resp_link(proto_tree *tree, tvbuff_t *tvb,
}
void dissect_nvme_cmd_sgl(tvbuff_t *cmd_tvb, proto_tree *cmd_tree,
- int field_index, struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx, gboolean visited)
+ int field_index, struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx, guint cmd_off, gboolean visited)
{
proto_item *ti, *sgl_tree, *type_item, *sub_type_item;
guint8 sgl_identifier, desc_type, desc_sub_type;
- int offset = 24;
+ int offset = 24 + cmd_off;
ti = proto_tree_add_item(cmd_tree, field_index, cmd_tvb, offset,
16, ENC_NA);
@@ -3486,26 +3486,26 @@ static void add_zero_base(gchar *result, guint32 val)
static
void dissect_nvmeof_fabric_connect_cmd(proto_tree *cmd_tree, packet_info *pinfo, tvbuff_t *cmd_tvb,
- struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd)
+ struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd, guint off)
{
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_rsvd1, cmd_tvb,
- 5, 19, ENC_NA);
+ 5+off, 19, ENC_NA);
dissect_nvme_cmd_sgl(cmd_tvb, cmd_tree, hf_nvmeof_cmd_connect_sgl1,
- q_ctx, cmd, PINFO_FD_VISITED(pinfo));
+ q_ctx, cmd, off, PINFO_FD_VISITED(pinfo));
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_recfmt, cmd_tvb,
- 40, 2, ENC_LITTLE_ENDIAN);
+ 40+off, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_qid, cmd_tvb,
- 42, 2, ENC_LITTLE_ENDIAN);
+ 42+off, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_sqsize, cmd_tvb,
- 44, 2, ENC_LITTLE_ENDIAN);
+ 44+off, 2, ENC_LITTLE_ENDIAN);
- add_group_mask_entry(cmd_tvb, cmd_tree, 46, 1, ASPEC(hf_nvmeof_cmd_connect_cattr));
+ add_group_mask_entry(cmd_tvb, cmd_tree, 46+off, 1, ASPEC(hf_nvmeof_cmd_connect_cattr));
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_rsvd2, cmd_tvb,
- 47, 1, ENC_NA);
+ 47+off, 1, ENC_NA);
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_kato, cmd_tvb,
- 48, 4, ENC_LITTLE_ENDIAN);
+ 48+off, 4, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_rsvd3, cmd_tvb,
- 52, 12, ENC_NA);
+ 52+off, 12, ENC_NA);
}
static void
@@ -3562,78 +3562,78 @@ dissect_nvmeof_prop_nssr(proto_tree *tree, tvbuff_t *tvb, const struct prop_nssr
proto_tree_add_item(tree, nssrc_ctx->rsvd, tvb, offset+4, 4, ENC_NA);
}
-static guint8 dissect_nvme_fabric_prop_cmd_common(proto_tree *cmd_tree, tvbuff_t *cmd_tvb)
+static guint8 dissect_nvme_fabric_prop_cmd_common(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, guint off)
{
proto_item *attr_item, *offset_item;
guint32 offset;
guint8 attr;
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_attr_rsvd, cmd_tvb,
- 5, 35, ENC_NA);
+ 5+off, 35, ENC_NA);
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_attr_rsvd1, cmd_tvb,
- 40, 1, ENC_LITTLE_ENDIAN);
+ 40+off, 1, ENC_LITTLE_ENDIAN);
attr_item = proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_attr_size, cmd_tvb,
- 40, 1, ENC_LITTLE_ENDIAN);
- attr = tvb_get_guint8(cmd_tvb, 40) & 0x7;
+ 40+off, 1, ENC_LITTLE_ENDIAN);
+ attr = tvb_get_guint8(cmd_tvb, 40+off) & 0x7;
proto_item_append_text(attr_item, " %s",
val_to_str(attr, attr_size_tbl, "Reserved"));
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_attr_rsvd2, cmd_tvb,
- 41, 3, ENC_NA);
+ 41+off, 3, ENC_NA);
offset_item = proto_tree_add_item_ret_uint(cmd_tree, hf_nvmeof_cmd_prop_attr_offset,
- cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN, &offset);
+ cmd_tvb, 44+off, 4, ENC_LITTLE_ENDIAN, &offset);
proto_item_append_text(offset_item, " %s",
val_to_str(offset, prop_offset_tbl, "Unknown Property"));
return attr;
}
-static void dissect_nvmeof_fabric_prop_get_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd)
+static void dissect_nvmeof_fabric_prop_get_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd, guint off)
{
- cmd->cmd_ctx.fabric_cmd.prop_get.offset = tvb_get_guint8(cmd_tvb, 44);
- dissect_nvme_fabric_prop_cmd_common(cmd_tree, cmd_tvb);
+ cmd->cmd_ctx.fabric_cmd.prop_get.offset = tvb_get_guint8(cmd_tvb, 44+off);
+ dissect_nvme_fabric_prop_cmd_common(cmd_tree, cmd_tvb, off);
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_attr_get_rsvd3, cmd_tvb,
- 48, 16, ENC_NA);
+ 48+off, 16, ENC_NA);
}
-static void dissect_nvmeof_fabric_prop_set_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb)
+static void dissect_nvmeof_fabric_prop_set_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, guint off)
{
guint8 attr;
guint32 offset;
- attr = dissect_nvme_fabric_prop_cmd_common(cmd_tree, cmd_tvb);
- offset = tvb_get_guint32(cmd_tvb, 44, ENC_LITTLE_ENDIAN);
+ attr = dissect_nvme_fabric_prop_cmd_common(cmd_tree, cmd_tvb, off);
+ offset = tvb_get_guint32(cmd_tvb, 44+off, ENC_LITTLE_ENDIAN);
switch(offset) {
- case 0x14: dissect_nvmeof_prop_cc(cmd_tree, cmd_tvb, &hf_nvmeof_cmd_sprop_cc, 48); break;
- case 0x1c: dissect_nvmeof_prop_csts(cmd_tree, cmd_tvb, &hf_nvmeof_cmd_sprop_csts, 48); break;
- case 0x20: dissect_nvmeof_prop_nssr(cmd_tree, cmd_tvb, &hf_nvmeof_cmd_sprop_nssr, 48); break;
+ case 0x14: dissect_nvmeof_prop_cc(cmd_tree, cmd_tvb, &hf_nvmeof_cmd_sprop_cc, 48+off); break;
+ case 0x1c: dissect_nvmeof_prop_csts(cmd_tree, cmd_tvb, &hf_nvmeof_cmd_sprop_csts, 48+off); break;
+ case 0x20: dissect_nvmeof_prop_nssr(cmd_tree, cmd_tvb, &hf_nvmeof_cmd_sprop_nssr, 48+off); break;
default:
{
if (attr == 0) {
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_attr_set_4B_value, cmd_tvb,
- 48, 4, ENC_LITTLE_ENDIAN);
+ 48+off, 4, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_attr_set_4B_value_rsvd, cmd_tvb,
- 52, 4, ENC_LITTLE_ENDIAN);
+ 52+off, 4, ENC_LITTLE_ENDIAN);
} else {
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_attr_set_8B_value, cmd_tvb,
- 48, 8, ENC_LITTLE_ENDIAN);
+ 48+off, 8, ENC_LITTLE_ENDIAN);
}
}
}
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_attr_set_rsvd3, cmd_tvb,
- 56, 8, ENC_NA);
+ 56+off, 8, ENC_NA);
}
-static void dissect_nvmeof_fabric_generic_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb)
+static void dissect_nvmeof_fabric_generic_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, guint off)
{
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_generic_rsvd1, cmd_tvb,
- 5, 35, ENC_NA);
+ 5+off, 35, ENC_NA);
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_generic_field, cmd_tvb,
- 40, 24, ENC_NA);
+ 40+off, 24, ENC_NA);
}
void dissect_nvmeof_fabric_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *nvme_tree,
- struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd)
+ struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd, guint off)
{
proto_tree *cmd_tree;
proto_item *ti;
@@ -3642,11 +3642,11 @@ void dissect_nvmeof_fabric_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tre
fctype = tvb_get_guint8(nvme_tvb, 4);
cmd->cmd_ctx.fabric_cmd.fctype = fctype;
- ti = proto_tree_add_item(nvme_tree, hf_nvmeof_cmd, nvme_tvb, 0,
+ ti = proto_tree_add_item(nvme_tree, hf_nvmeof_cmd, nvme_tvb, off,
NVME_CMD_SIZE, ENC_NA);
cmd_tree = proto_item_add_subtree(ti, ett_data);
- proto_tree_add_bytes_format(cmd_tree, hf_nvmeof_cmd_opc, nvme_tvb, 0, 1, NULL, "Opcode: 0x%x (Fabric Command)",
+ proto_tree_add_bytes_format(cmd_tree, hf_nvmeof_cmd_opc, nvme_tvb, off, 1, NULL, "Opcode: 0x%x (Fabric Command)",
NVME_FABRIC_OPC);
cmd->opcode = NVME_FABRIC_OPC;
@@ -3654,25 +3654,25 @@ void dissect_nvmeof_fabric_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tre
nvme_publish_to_cqe_link(cmd_tree, nvme_tvb, hf_nvmeof_cqe_pkt, cmd);
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_rsvd, nvme_tvb,
- 1, 1, ENC_NA);
+ 1+off, 1, ENC_NA);
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_cid, nvme_tvb,
- 2, 2, ENC_LITTLE_ENDIAN);
+ 2+off, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_fctype, nvme_tvb,
- 4, 1, ENC_LITTLE_ENDIAN);
+ 4+off, 1, ENC_LITTLE_ENDIAN);
switch(fctype) {
case NVME_FCTYPE_CONNECT:
- dissect_nvmeof_fabric_connect_cmd(cmd_tree, pinfo, nvme_tvb, q_ctx, cmd);
+ dissect_nvmeof_fabric_connect_cmd(cmd_tree, pinfo, nvme_tvb, q_ctx, cmd, off);
break;
case NVME_FCTYPE_PROP_GET:
- dissect_nvmeof_fabric_prop_get_cmd(cmd_tree, nvme_tvb, cmd);
+ dissect_nvmeof_fabric_prop_get_cmd(cmd_tree, nvme_tvb, cmd, off);
break;
case NVME_FCTYPE_PROP_SET:
- dissect_nvmeof_fabric_prop_set_cmd(cmd_tree, nvme_tvb);
+ dissect_nvmeof_fabric_prop_set_cmd(cmd_tree, nvme_tvb, off);
break;
case NVME_FCTYPE_AUTH_RECV:
default:
- dissect_nvmeof_fabric_generic_cmd(cmd_tree, nvme_tvb);
+ dissect_nvmeof_fabric_generic_cmd(cmd_tree, nvme_tvb, off);
break;
}
}
@@ -3704,28 +3704,28 @@ dissect_nvmeof_cmd_data(tvbuff_t *data_tvb, proto_tree *data_tree,
}
static void
-dissect_nvmeof_status_prop_get_cap(proto_tree *cqe_tree, tvbuff_t *cqe_tvb)
+dissect_nvmeof_status_prop_get_cap(proto_tree *cqe_tree, tvbuff_t *cqe_tvb, guint off)
{
proto_item *ti;
guint8 order, set;
- proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.mqes, cqe_tvb, 0, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.cqr, cqe_tvb, 2, 1, ENC_LITTLE_ENDIAN);
- ti = proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.ams, cqe_tvb, 2, 1, ENC_LITTLE_ENDIAN);
- set = (tvb_get_guint8(cqe_tvb, 3)) & 0x3;
+ proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.mqes, cqe_tvb, 0+off, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.cqr, cqe_tvb, 2+off, 1, ENC_LITTLE_ENDIAN);
+ ti = proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.ams, cqe_tvb, 2+off, 1, ENC_LITTLE_ENDIAN);
+ set = (tvb_get_guint8(cqe_tvb, 3+off)) & 0x3;
switch (set) {
case 0: proto_item_append_text(ti, " (None)"); break;
case 1: proto_item_append_text(ti, " (Weighted Round Robin with Urgent Priority Class"); break;
case 2: proto_item_append_text(ti, " (Vendor Specific)"); break;
case 3: proto_item_append_text(ti, " (Weighted Round Robin with Urgent Priority Class, Vendor Specific)"); break;
};
- proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.rsvd, cqe_tvb, 2, 1, ENC_LITTLE_ENDIAN);
- ti = proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.to, cqe_tvb, 3, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(ti, " (%u milliseconds)", 500U * tvb_get_guint8(cqe_tvb, 3));
- proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.dstrd, cqe_tvb, 4, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.nssrs, cqe_tvb, 4, 2, ENC_LITTLE_ENDIAN);
- ti = proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.css, cqe_tvb, 4, 2, ENC_LITTLE_ENDIAN);
- set = (tvb_get_guint16(cqe_tvb, 4, ENC_LITTLE_ENDIAN) >> 5) & 0xFF;
+ proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.rsvd, cqe_tvb, 2+off, 1, ENC_LITTLE_ENDIAN);
+ ti = proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.to, cqe_tvb, 3+off, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%u milliseconds)", 500U * tvb_get_guint8(cqe_tvb, 3+off));
+ proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.dstrd, cqe_tvb, 4+off, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.nssrs, cqe_tvb, 4+off, 2, ENC_LITTLE_ENDIAN);
+ ti = proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.css, cqe_tvb, 4+off, 2, ENC_LITTLE_ENDIAN);
+ set = (tvb_get_guint16(cqe_tvb, 4+off, ENC_LITTLE_ENDIAN) >> 5) & 0xFF;
if (set) {
if (set & 0x1)
proto_item_append_text(ti, " (NVM IO Command Set)");
@@ -3734,66 +3734,66 @@ dissect_nvmeof_status_prop_get_cap(proto_tree *cqe_tree, tvbuff_t *cqe_tvb)
else
proto_item_append_text(ti, "(Reserved)");
}
- proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.bps, cqe_tvb, 4, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.rsvd1, cqe_tvb, 4, 2, ENC_LITTLE_ENDIAN);
- ti = proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.mpsmin, cqe_tvb, 6, 1, ENC_LITTLE_ENDIAN);
- order = 12 + (tvb_get_guint8(cqe_tvb, 6) & 0xF);
+ proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.bps, cqe_tvb, 4+off, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.rsvd1, cqe_tvb, 4+off, 2, ENC_LITTLE_ENDIAN);
+ ti = proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.mpsmin, cqe_tvb, 6+off, 1, ENC_LITTLE_ENDIAN);
+ order = 12 + (tvb_get_guint8(cqe_tvb, 6+off) & 0xF);
proto_item_append_text(ti, " (%lu bytes)", 1UL << order);
- ti = proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.mpsmax, cqe_tvb, 6, 1, ENC_LITTLE_ENDIAN);
- order = 12 + ((tvb_get_guint8(cqe_tvb, 6) & 0xF0) >> 4);
+ ti = proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.mpsmax, cqe_tvb, 6+off, 1, ENC_LITTLE_ENDIAN);
+ order = 12 + ((tvb_get_guint8(cqe_tvb, 6+off) & 0xF0) >> 4);
proto_item_append_text(ti, " (%lu bytes)", 1UL << order);
- proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.pmrs, cqe_tvb, 7, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.cmbs, cqe_tvb, 7, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.rsvd2, cqe_tvb, 7, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.rsvd3, cqe_tvb, 8, 1, ENC_NA);
+ proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.pmrs, cqe_tvb, 7+off, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.cmbs, cqe_tvb, 7+off, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.rsvd2, cqe_tvb, 7+off, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_cap.rsvd3, cqe_tvb, 8+off, 1, ENC_NA);
}
static void
-dissect_nvmeof_status_prop_get_vs(proto_tree *cqe_tree, tvbuff_t *cqe_tvb)
+dissect_nvmeof_status_prop_get_vs(proto_tree *cqe_tree, tvbuff_t *cqe_tvb, guint off)
{
- proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_ver.ter, cqe_tvb, 0, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_ver.mnr, cqe_tvb, 1, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_ver.mjr, cqe_tvb, 2, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_ver.ter, cqe_tvb, 0+off, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_ver.mnr, cqe_tvb, 1+off, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(cqe_tree, hf_nvmeof_cmd_gprop_ver.mjr, cqe_tvb, 2+off, 2, ENC_LITTLE_ENDIAN);
}
static void
-dissect_nvmeof_status_prop_get(proto_tree *cqe_tree, tvbuff_t *cqe_tvb, struct nvme_cmd_ctx *cmd)
+dissect_nvmeof_status_prop_get(proto_tree *cqe_tree, tvbuff_t *cqe_tvb, struct nvme_cmd_ctx *cmd, guint off)
{
proto_item *ti = proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_sts, cqe_tvb, 0, 8, ENC_LITTLE_ENDIAN);
proto_item_append_text(ti, " (value for property: %s)", val_to_str(cmd->cmd_ctx.fabric_cmd.prop_get.offset, prop_offset_tbl, "Unknown Property"));
switch (cmd->cmd_ctx.fabric_cmd.prop_get.offset) {
- case 0: dissect_nvmeof_status_prop_get_cap(cqe_tree, cqe_tvb); break;
- case 8: dissect_nvmeof_status_prop_get_vs(cqe_tree, cqe_tvb); break;
- case 0x14: dissect_nvmeof_prop_cc(cqe_tree, cqe_tvb, &hf_nvmeof_cmd_gprop_cc, 0); break;
- case 0x1c: dissect_nvmeof_prop_csts(cqe_tree, cqe_tvb, &hf_nvmeof_cmd_gprop_csts, 0); break;
- case 0x20: dissect_nvmeof_prop_nssr(cqe_tree, cqe_tvb, &hf_nvmeof_cmd_gprop_nssr, 0); break;
+ case 0: dissect_nvmeof_status_prop_get_cap(cqe_tree, cqe_tvb, off); break;
+ case 8: dissect_nvmeof_status_prop_get_vs(cqe_tree, cqe_tvb, off); break;
+ case 0x14: dissect_nvmeof_prop_cc(cqe_tree, cqe_tvb, &hf_nvmeof_cmd_gprop_cc, off); break;
+ case 0x1c: dissect_nvmeof_prop_csts(cqe_tree, cqe_tvb, &hf_nvmeof_cmd_gprop_csts, off); break;
+ case 0x20: dissect_nvmeof_prop_nssr(cqe_tree, cqe_tvb, &hf_nvmeof_cmd_gprop_nssr, off); break;
}
};
static void
dissect_nvmeof_cqe_status_8B(proto_tree *cqe_tree, tvbuff_t *cqe_tvb,
- struct nvme_cmd_ctx *cmd)
+ struct nvme_cmd_ctx *cmd, guint off)
{
switch (cmd->cmd_ctx.fabric_cmd.fctype) {
case NVME_FCTYPE_CONNECT:
proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_connect_cntlid, cqe_tvb,
- 0, 2, ENC_LITTLE_ENDIAN);
+ 0+off, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_connect_authreq, cqe_tvb,
- 2, 2, ENC_LITTLE_ENDIAN);
+ 2+off, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_connect_rsvd, cqe_tvb,
- 4, 4, ENC_NA);
+ 4+off, 4, ENC_NA);
break;
case NVME_FCTYPE_PROP_GET:
- dissect_nvmeof_status_prop_get(cqe_tree, cqe_tvb, cmd);
+ dissect_nvmeof_status_prop_get(cqe_tree, cqe_tvb, cmd, off);
break;
case NVME_FCTYPE_PROP_SET:
proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_prop_set_rsvd, cqe_tvb,
- 0, 8, ENC_NA);
+ 0+off, 8, ENC_NA);
break;
case NVME_FCTYPE_AUTH_RECV:
default:
proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_sts, cqe_tvb,
- 0, 8, ENC_LITTLE_ENDIAN);
+ 0+off, 8, ENC_LITTLE_ENDIAN);
break;
};
}
@@ -3801,13 +3801,13 @@ dissect_nvmeof_cqe_status_8B(proto_tree *cqe_tree, tvbuff_t *cqe_tvb,
void
dissect_nvmeof_fabric_cqe(tvbuff_t *nvme_tvb,
proto_tree *nvme_tree,
- struct nvme_cmd_ctx *cmd)
+ struct nvme_cmd_ctx *cmd, guint off)
{
proto_tree *cqe_tree;
proto_item *ti;
ti = proto_tree_add_item(nvme_tree, hf_nvmeof_cqe, nvme_tvb,
- 0, NVME_CQE_SIZE, ENC_NA);
+ 0+off, NVME_CQE_SIZE, ENC_NA);
proto_item_append_text(ti, " (For Cmd: %s)", val_to_str(cmd->cmd_ctx.fabric_cmd.fctype,
fctype_tbl, "Unknown Cmd"));
@@ -3817,18 +3817,18 @@ dissect_nvmeof_fabric_cqe(tvbuff_t *nvme_tvb,
cmd);
nvme_publish_cmd_latency(cqe_tree, cmd, hf_nvmeof_cmd_latency);
- dissect_nvmeof_cqe_status_8B(cqe_tree, nvme_tvb, cmd);
+ dissect_nvmeof_cqe_status_8B(cqe_tree, nvme_tvb, cmd, off);
proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_sqhd, nvme_tvb,
- 8, 2, ENC_NA);
+ 8+off, 2, ENC_NA);
proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_rsvd, nvme_tvb,
- 10, 2, ENC_LITTLE_ENDIAN);
+ 10+off, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_cid, nvme_tvb,
- 12, 2, ENC_LITTLE_ENDIAN);
+ 12+off, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_status, nvme_tvb,
- 14, 2, ENC_LITTLE_ENDIAN);
+ 14+off, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_status_rsvd, nvme_tvb,
- 14, 2, ENC_LITTLE_ENDIAN);
+ 14+off, 2, ENC_LITTLE_ENDIAN);
}
static void dissect_nvme_unhandled_cmd(tvbuff_t *nvme_tvb, proto_tree *cmd_tree)
@@ -3883,7 +3883,7 @@ dissect_nvme_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_tree,
proto_tree_add_item(cmd_tree, hf_nvme_cmd_mptr, nvme_tvb,
16, 8, ENC_LITTLE_ENDIAN);
- dissect_nvme_cmd_sgl(nvme_tvb, cmd_tree, hf_nvme_cmd_sgl, q_ctx, cmd_ctx, PINFO_FD_VISITED(pinfo));
+ dissect_nvme_cmd_sgl(nvme_tvb, cmd_tree, hf_nvme_cmd_sgl, q_ctx, cmd_ctx, 0, PINFO_FD_VISITED(pinfo));
if (q_ctx->qid) { //IOQ
switch (cmd_ctx->opcode) {
diff --git a/epan/dissectors/packet-nvme.h b/epan/dissectors/packet-nvme.h
index 2607b314ce..9c2fef19c1 100644
--- a/epan/dissectors/packet-nvme.h
+++ b/epan/dissectors/packet-nvme.h
@@ -98,14 +98,14 @@ struct keyed_data_req
void
dissect_nvmeof_fabric_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *nvme_tree,
- struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd);
+ struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd, guint off);
void
dissect_nvmeof_cmd_data(tvbuff_t *data_tvb, proto_tree *data_tree,
guint offset, struct nvme_cmd_ctx *cmd, guint len);
void
dissect_nvmeof_fabric_cqe(tvbuff_t *nvme_tvb,
proto_tree *nvme_tree,
- struct nvme_cmd_ctx *cmd_ctx);
+ struct nvme_cmd_ctx *cmd_ctx, guint off);
void
nvme_add_data_request(struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx,
@@ -129,7 +129,7 @@ nvme_lookup_cmd_in_done_list(packet_info *pinfo, struct nvme_q_ctx *q_ctx,
guint16 cmd_id);
void dissect_nvme_cmd_sgl(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, int field_index,
- struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx, gboolean visited);
+ struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx, guint cmd_off, gboolean visited);
void
dissect_nvme_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_tree,