packet-nvme-rdma: Support Dissecting connect cmd & inline data.

This patch adds support to dissect data of the connect command which
comes along with the cmd in same packet.

It also removed unwanted tvb addition for rdma fabric commands,
completion and nvme commands.

Bug: 13201
Change-Id: I33062f67a69cdca4b909ed8c08201dea5e0aa095
Tested-by: paravpandit@yahoo.com
Reviewed-on: https://code.wireshark.org/review/19632
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
This commit is contained in:
Parav Pandit 2017-01-14 00:11:28 -05:00 committed by Michael Mann
parent f27734f3a2
commit 5f76627ef2
2 changed files with 114 additions and 40 deletions

View File

@ -180,6 +180,13 @@ static int hf_nvme_rdma_cmd_connect_cattr = -1;
static int hf_nvme_rdma_cmd_connect_rsvd2 = -1;
static int hf_nvme_rdma_cmd_connect_kato = -1;
static int hf_nvme_rdma_cmd_connect_rsvd3 = -1;
static int hf_nvme_rdma_cmd_data = -1;
static int hf_nvme_rdma_cmd_connect_data_hostid = -1;
static int hf_nvme_rdma_cmd_connect_data_cntlid = -1;
static int hf_nvme_rdma_cmd_connect_data_rsvd = -1;
static int hf_nvme_rdma_cmd_connect_data_subnqn = -1;
static int hf_nvme_rdma_cmd_connect_data_hostnqn = -1;
static int hf_nvme_rdma_cmd_connect_data_rsvd1 = -1;
static int hf_nvme_rdma_cmd_prop_attr_rsvd = -1;
static int hf_nvme_rdma_cmd_prop_attr_rsvd1 = -1;
@ -530,56 +537,96 @@ dissect_nvme_fabric_cmd(tvbuff_t *nvme_tvb, proto_tree *nvme_tree,
struct nvme_rdma_cmd_ctx *cmd_ctx)
{
proto_tree *cmd_tree;
tvbuff_t *cmd_tvb;
proto_item *ti, *opc_item, *fctype_item;
guint8 fctype;
fctype = tvb_get_guint8(nvme_tvb, 4);
cmd_ctx->fctype = fctype;
cmd_tvb = tvb_new_subset_length(nvme_tvb, 0, NVME_FABRIC_CMD_SIZE);
ti = proto_tree_add_item(nvme_tree, hf_nvme_rdma_cmd, cmd_tvb, 0,
ti = proto_tree_add_item(nvme_tree, hf_nvme_rdma_cmd, nvme_tvb, 0,
NVME_FABRIC_CMD_SIZE, ENC_NA);
cmd_tree = proto_item_add_subtree(ti, ett_data);
opc_item = proto_tree_add_item(cmd_tree, hf_nvme_rdma_cmd_opc, cmd_tvb,
opc_item = proto_tree_add_item(cmd_tree, hf_nvme_rdma_cmd_opc, nvme_tvb,
0, 1, ENC_LITTLE_ENDIAN);
proto_item_append_text(opc_item, "%s", " Fabric Cmd");
nvme_publish_cmd_to_cqe_link(cmd_tree, cmd_tvb, hf_nvme_rdma_cqe_pkt,
nvme_publish_cmd_to_cqe_link(cmd_tree, nvme_tvb, hf_nvme_rdma_cqe_pkt,
&cmd_ctx->n_cmd_ctx);
proto_tree_add_item(cmd_tree, hf_nvme_rdma_cmd_rsvd, cmd_tvb,
proto_tree_add_item(cmd_tree, hf_nvme_rdma_cmd_rsvd, nvme_tvb,
1, 1, ENC_NA);
proto_tree_add_item(cmd_tree, hf_nvme_rdma_cmd_cid, cmd_tvb,
proto_tree_add_item(cmd_tree, hf_nvme_rdma_cmd_cid, nvme_tvb,
2, 2, ENC_LITTLE_ENDIAN);
fctype_item = proto_tree_add_item(cmd_tree, hf_nvme_rdma_cmd_fctype, cmd_tvb,
fctype_item = proto_tree_add_item(cmd_tree, hf_nvme_rdma_cmd_fctype,
nvme_tvb,
4, 1, ENC_LITTLE_ENDIAN);
proto_item_append_text(fctype_item, " %s",
val_to_str(fctype, fctype_tbl, "Unknown FcType"));
switch(fctype) {
case NVME_FCTYPE_CONNECT:
dissect_nvme_fabric_connect_cmd(cmd_tree, cmd_tvb);
dissect_nvme_fabric_connect_cmd(cmd_tree, nvme_tvb);
break;
case NVME_FCTYPE_PROP_GET:
dissect_nvme_fabric_prop_get_cmd(cmd_tree, cmd_tvb);
dissect_nvme_fabric_prop_get_cmd(cmd_tree, nvme_tvb);
break;
case NVME_FCTYPE_PROP_SET:
dissect_nvme_fabric_prop_set_cmd(cmd_tree, cmd_tvb);
dissect_nvme_fabric_prop_set_cmd(cmd_tree, nvme_tvb);
break;
case NVME_FCTYPE_AUTH_RECV:
default:
dissect_nvme_fabric_generic_cmd(cmd_tree, cmd_tvb);
dissect_nvme_fabric_generic_cmd(cmd_tree, nvme_tvb);
break;
}
}
static void
dissect_nvme_fabric_connect_cmd_data(tvbuff_t *data_tvb, proto_tree *data_tree,
guint offset)
{
proto_tree_add_item(data_tree, hf_nvme_rdma_cmd_connect_data_hostid, data_tvb,
offset, 16, ENC_NA);
proto_tree_add_item(data_tree, hf_nvme_rdma_cmd_connect_data_cntlid, data_tvb,
offset + 16, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(data_tree, hf_nvme_rdma_cmd_connect_data_rsvd, data_tvb,
offset + 18, 238, ENC_NA);
proto_tree_add_item(data_tree, hf_nvme_rdma_cmd_connect_data_subnqn, data_tvb,
offset + 256, 256, ENC_ASCII | ENC_NA);
proto_tree_add_item(data_tree, hf_nvme_rdma_cmd_connect_data_hostnqn, data_tvb,
offset + 512, 256, ENC_ASCII | ENC_NA);
proto_tree_add_item(data_tree, hf_nvme_rdma_cmd_connect_data_rsvd1, data_tvb,
offset + 768, 256, ENC_NA);
}
static void
dissect_nvme_fabric_data(tvbuff_t *nvme_tvb, proto_tree *nvme_tree,
guint len, guint8 fctype)
{
proto_tree *data_tree;
proto_item *ti;
ti = proto_tree_add_item(nvme_tree, hf_nvme_rdma_cmd_data, nvme_tvb, 0,
len, ENC_NA);
data_tree = proto_item_add_subtree(ti, ett_data);
switch (fctype) {
case NVME_FCTYPE_CONNECT:
dissect_nvme_fabric_connect_cmd_data(nvme_tvb, data_tree,
NVME_FABRIC_CMD_SIZE);
break;
default:
proto_tree_add_item(data_tree, hf_nvme_rdma_from_host_unknown_data,
nvme_tvb, 0, len, ENC_NA);
break;
}
}
static void
dissect_nvme_rdma_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_tree,
proto_tree *nvme_tree, struct nvme_rdma_q_ctx *q_ctx)
proto_tree *nvme_tree, struct nvme_rdma_q_ctx *q_ctx,
guint len)
{
struct nvme_rdma_cmd_ctx *cmd_ctx;
guint16 cmd_id;
@ -591,6 +638,9 @@ dissect_nvme_rdma_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_t
if (opcode == NVME_FABRIC_OPC) {
cmd_ctx->n_cmd_ctx.fabric = TRUE;
dissect_nvme_fabric_cmd(nvme_tvb, nvme_tree, cmd_ctx);
len -= NVME_FABRIC_CMD_SIZE;
if (len)
dissect_nvme_fabric_data(nvme_tvb, nvme_tree, len, cmd_ctx->fctype);
} else {
cmd_ctx->n_cmd_ctx.fabric = FALSE;
dissect_nvme_cmd(nvme_tvb, pinfo, root_tree, &q_ctx->n_q_ctx,
@ -608,8 +658,8 @@ dissect_nvme_from_host(tvbuff_t *nvme_tvb, packet_info *pinfo,
{
switch (info->opCode) {
case RC_SEND_ONLY:
if (len == NVME_FABRIC_CMD_SIZE)
dissect_nvme_rdma_cmd(nvme_tvb, pinfo, root_tree, nvme_tree, q_ctx);
if (len >= NVME_FABRIC_CMD_SIZE)
dissect_nvme_rdma_cmd(nvme_tvb, pinfo, root_tree, nvme_tree, q_ctx, len);
else
proto_tree_add_item(nvme_tree, hf_nvme_rdma_from_host_unknown_data, nvme_tvb,
0, len, ENC_NA);
@ -657,9 +707,6 @@ dissect_nvme_fabric_cqe(tvbuff_t *nvme_tvb,
{
proto_tree *cqe_tree;
proto_item *ti;
tvbuff_t *cqe_tvb;
cqe_tvb = tvb_new_subset_length(nvme_tvb, 0, NVME_FABRIC_CQE_SIZE);
ti = proto_tree_add_item(nvme_tree, hf_nvme_rdma_cqe, nvme_tvb,
0, NVME_FABRIC_CQE_SIZE, ENC_NA);
@ -668,20 +715,21 @@ dissect_nvme_fabric_cqe(tvbuff_t *nvme_tvb,
cqe_tree = proto_item_add_subtree(ti, ett_data);
nvme_publish_cqe_to_cmd_link(cqe_tree, cqe_tvb, hf_nvme_rdma_cmd_pkt, &cmd_ctx->n_cmd_ctx);
nvme_publish_cqe_to_cmd_link(cqe_tree, nvme_tvb, hf_nvme_rdma_cmd_pkt,
&cmd_ctx->n_cmd_ctx);
nvme_publish_cmd_latency(cqe_tree, &cmd_ctx->n_cmd_ctx, hf_nvme_rdma_cmd_latency);
dissect_nvme_rdma_cqe_status_8B(cqe_tree, cqe_tvb, cmd_ctx);
dissect_nvme_rdma_cqe_status_8B(cqe_tree, nvme_tvb, cmd_ctx);
proto_tree_add_item(cqe_tree, hf_nvme_rdma_cqe_sqhd, cqe_tvb,
proto_tree_add_item(cqe_tree, hf_nvme_rdma_cqe_sqhd, nvme_tvb,
8, 2, ENC_NA);
proto_tree_add_item(cqe_tree, hf_nvme_rdma_cqe_rsvd, cqe_tvb,
proto_tree_add_item(cqe_tree, hf_nvme_rdma_cqe_rsvd, nvme_tvb,
10, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cqe_tree, hf_nvme_rdma_cqe_cid, cqe_tvb,
proto_tree_add_item(cqe_tree, hf_nvme_rdma_cqe_cid, nvme_tvb,
12, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cqe_tree, hf_nvme_rdma_cqe_status, cqe_tvb,
proto_tree_add_item(cqe_tree, hf_nvme_rdma_cqe_status, nvme_tvb,
14, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cqe_tree, hf_nvme_rdma_cqe_status_rsvd, cqe_tvb,
proto_tree_add_item(cqe_tree, hf_nvme_rdma_cqe_status_rsvd, nvme_tvb,
14, 2, ENC_LITTLE_ENDIAN);
}
@ -895,6 +943,34 @@ proto_register_nvme_rdma(void)
{ "Reserved", "nvme-rdma.cmd.connect.rsvd3",
FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvme_rdma_cmd_data,
{ "Data", "nvme-rdma.cmd.data",
FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvme_rdma_cmd_connect_data_hostid,
{ "Host Identifer", "nvme-rdma.cmd.connect.data.hostid",
FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvme_rdma_cmd_connect_data_cntlid,
{ "Controller ID", "nvme-rdma.cmd.connect.data.cntrlid",
FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvme_rdma_cmd_connect_data_rsvd,
{ "Reserved", "nvme-rdma.cmd.connect.data.rsvd",
FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvme_rdma_cmd_connect_data_subnqn,
{ "Subsystem NQN", "nvme-rdma.cmd.connect.data.subnqn",
FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvme_rdma_cmd_connect_data_hostnqn,
{ "Host NQN", "nvme-rdma.cmd.connect.data.hostnqn",
FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvme_rdma_cmd_connect_data_rsvd1,
{ "Reserved", "nvme-rdma.cmd.connect.data.rsvd1",
FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvme_rdma_cmd_prop_attr_rsvd,
{ "Reserved", "nvme-rdma.cmd.prop_attr.rsvd",
FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}

View File

@ -519,7 +519,6 @@ dissect_nvme_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_tree,
struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx)
{
proto_tree *cmd_tree;
tvbuff_t *cmd_tvb;
proto_item *ti, *opc_item;
guint8 opcode;
@ -528,10 +527,9 @@ dissect_nvme_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_tree,
NVME_CMD_SIZE, ENC_NA);
proto_item_append_text(ti, " (Cmd)");
cmd_tree = proto_item_add_subtree(ti, ett_data);
cmd_tvb = tvb_new_subset_length(nvme_tvb, 0, NVME_CMD_SIZE);
opcode = tvb_get_guint8(cmd_tvb, 0);
opc_item = proto_tree_add_item(cmd_tree, hf_nvme_cmd_opc, cmd_tvb,
opcode = tvb_get_guint8(nvme_tvb, 0);
opc_item = proto_tree_add_item(cmd_tree, hf_nvme_cmd_opc, nvme_tvb,
0, 1, ENC_LITTLE_ENDIAN);
if (q_ctx->qid)
proto_item_append_text(opc_item, " %s",
@ -540,29 +538,29 @@ dissect_nvme_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_tree,
proto_item_append_text(opc_item, " %s",
val_to_str(opcode, aq_opc_tbl, "Reserved"));
nvme_publish_cmd_to_cqe_link(cmd_tree, cmd_tvb, hf_nvme_cqe_pkt, cmd_ctx);
nvme_publish_cmd_to_cqe_link(cmd_tree, nvme_tvb, hf_nvme_cqe_pkt, cmd_ctx);
proto_tree_add_item(cmd_tree, hf_nvme_cmd_fuse_op, cmd_tvb,
proto_tree_add_item(cmd_tree, hf_nvme_cmd_fuse_op, nvme_tvb,
1, 1, ENC_NA);
proto_tree_add_item(cmd_tree, hf_nvme_cmd_rsvd, cmd_tvb,
proto_tree_add_item(cmd_tree, hf_nvme_cmd_rsvd, nvme_tvb,
1, 1, ENC_NA);
proto_tree_add_item(cmd_tree, hf_nvme_cmd_psdt, cmd_tvb,
proto_tree_add_item(cmd_tree, hf_nvme_cmd_psdt, nvme_tvb,
1, 1, ENC_NA);
proto_tree_add_item(cmd_tree, hf_nvme_cmd_cid, cmd_tvb,
proto_tree_add_item(cmd_tree, hf_nvme_cmd_cid, nvme_tvb,
2, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cmd_tree, hf_nvme_cmd_nsid, cmd_tvb,
proto_tree_add_item(cmd_tree, hf_nvme_cmd_nsid, nvme_tvb,
4, 4, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cmd_tree, hf_nvme_cmd_rsvd1, cmd_tvb,
proto_tree_add_item(cmd_tree, hf_nvme_cmd_rsvd1, nvme_tvb,
8, 8, ENC_NA);
proto_tree_add_item(cmd_tree, hf_nvme_cmd_mptr, cmd_tvb,
proto_tree_add_item(cmd_tree, hf_nvme_cmd_mptr, nvme_tvb,
16, 8, ENC_LITTLE_ENDIAN);
dissect_nvme_cmd_sgl(cmd_tvb, cmd_tree, hf_nvme_cmd_sgl);
dissect_nvme_cmd_sgl(nvme_tvb, cmd_tree, hf_nvme_cmd_sgl);
switch (opcode) {
case NVME_IOQ_OPC_READ:
case NVME_IOQ_OPC_WRITE:
dissect_nvme_rw_cmd(cmd_tvb, cmd_tree);
dissect_nvme_rw_cmd(nvme_tvb, cmd_tree);
break;
default:
break;