diff options
author | Constantine Gavrilov <constg@il.ibm.com> | 2021-06-13 02:13:29 +0300 |
---|---|---|
committer | Wireshark GitLab Utility <gerald+gitlab-utility@wireshark.org> | 2021-06-14 06:21:46 +0000 |
commit | 45201049e09ee04e7d7f600430f0166ca8ade23b (patch) | |
tree | 7bd134bd9a5ee9042e33be574037e1e914d952e5 | |
parent | 0b101d54da2867c037836ae610b43e961ff56a7e (diff) |
NVMeOF fabric commands: switch TCP dissect to common NVMe code.
-rw-r--r-- | epan/dissectors/packet-nvme-rdma.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-nvme-tcp.c | 555 | ||||
-rw-r--r-- | epan/dissectors/packet-nvme.c | 11 | ||||
-rw-r--r-- | epan/dissectors/packet-nvme.h | 4 |
4 files changed, 33 insertions, 539 deletions
diff --git a/epan/dissectors/packet-nvme-rdma.c b/epan/dissectors/packet-nvme-rdma.c index 12ecb77bb0..10bc8e7f1d 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, 0); + dissect_nvmeof_fabric_cmd(nvme_tvb, pinfo, nvme_tree, &q_ctx->n_q_ctx, &cmd_ctx->n_cmd_ctx, 0, TRUE); } 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); diff --git a/epan/dissectors/packet-nvme-tcp.c b/epan/dissectors/packet-nvme-tcp.c index 1ac78d2680..31385e7b7b 100644 --- a/epan/dissectors/packet-nvme-tcp.c +++ b/epan/dissectors/packet-nvme-tcp.c @@ -110,54 +110,12 @@ enum nvme_tcp_pdu_flags { NVME_TCP_F_DATA_SUCCESS = (1 << 3), }; -enum nvmf_capsule_command { - nvme_fabrics_type_property_set = 0x00, - nvme_fabrics_type_connect = 0x01, - nvme_fabrics_type_property_get = 0x04, -}; - -static const value_string nvme_fabrics_cmd_type_vals[] = { - { nvme_fabrics_type_connect, "Connect" }, - { nvme_fabrics_type_property_get, "Property Get" }, - { nvme_fabrics_type_property_set, "Property Set" }, - { 0, NULL } -}; - -static const value_string attr_size_tbl[] = { - { 0, "4 bytes" }, - { 1, "8 bytes" }, - { 0, NULL } -}; - -static const value_string prop_offset_tbl[] = { - { 0x0, "Controller Capabilities" }, - { 0x8, "Version" }, - { 0xc, "Reserved" }, - { 0x10, "Reserved" }, - { 0x14, "Controller Configuration" }, - { 0x18, "Reserved" }, - { 0x1c, "Controller Status" }, - { 0x20, "NVM Subsystem Reset" }, - { 0x24, "Reserved" }, - { 0x28, "Reserved" }, - { 0x30, "Reserved" }, - { 0x38, "Reserved" }, - { 0x3c, "Reserved" }, - { 0x40, "Reserved" }, - { 0, NULL } -}; enum nvme_tcp_digest_option { NVME_TCP_HDR_DIGEST_ENABLE = (1 << 0), NVME_TCP_DATA_DIGEST_ENABLE = (1 << 1), }; -/* - * Fabrics subcommands. - */ -enum nvmf_fabrics_opcode { - nvme_fabrics_command = 0x7f, -}; #define NVME_FABRIC_CMD_SIZE NVME_CMD_SIZE #define NVME_FABRIC_CQE_SIZE NVME_CQE_SIZE @@ -169,7 +127,6 @@ struct nvme_tcp_q_ctx { struct nvme_tcp_cmd_ctx { struct nvme_cmd_ctx n_cmd_ctx; - guint8 fctype; /* fabric cmd type */ }; void proto_reg_handoff_nvme_tcp(void); @@ -228,72 +185,21 @@ static int hf_nvme_tcp_h2ctermreq_reserved = -1; static int hf_nvme_tcp_h2ctermreq_data = -1; /* NVMe fabrics command */ -static int hf_nvme_fabrics_cmd = -1; -static int hf_nvme_fabrics_cmd_opc = -1; -static int hf_nvme_fabrics_cmd_rsvd1 = -1; static int hf_nvme_fabrics_cmd_cid = -1; -static int hf_nvme_fabrics_cmd_fctype = -1; -static int hf_nvme_fabrics_cmd_generic_rsvd1 = -1; -static int hf_nvme_fabrics_cmd_generic_field = -1; - -/* NVMe fabrics connect command */ -static int hf_nvme_fabrics_cmd_connect_rsvd2 = -1; -static int hf_nvme_fabrics_cmd_connect_sgl1 = -1; -static int hf_nvme_fabrics_cmd_connect_recfmt = -1; -static int hf_nvme_fabrics_cmd_connect_qid = -1; -static int hf_nvme_fabrics_cmd_connect_sqsize = -1; -static int hf_nvme_fabrics_cmd_connect_cattr = -1; -static int hf_nvme_fabrics_cmd_connect_rsvd3 = -1; -static int hf_nvme_fabrics_cmd_connect_kato = -1; -static int hf_nvme_fabrics_cmd_connect_rsvd4 = -1; - -static int hf_nvme_tcp_unknown_data = -1; -/* NVMe fabrics connect command data*/ +/* NVMe fabrics command data*/ static int hf_nvme_fabrics_cmd_data = -1; -static int hf_nvme_fabrics_cmd_connect_data_hostid = -1; -static int hf_nvme_fabrics_cmd_connect_data_cntlid = -1; -static int hf_nvme_fabrics_cmd_connect_data_rsvd4 = -1; -static int hf_nvme_fabrics_cmd_connect_data_subnqn = -1; -static int hf_nvme_fabrics_cmd_connect_data_hostnqn = -1; -static int hf_nvme_fabrics_cmd_connect_data_rsvd5 = -1; +static int hf_nvme_tcp_unknown_data = -1; static int hf_nvme_tcp_r2t_pdu = -1; static int hf_nvme_tcp_r2t_offset = -1; static int hf_nvme_tcp_r2t_length = -1; static int hf_nvme_tcp_r2t_resvd = -1; -static int hf_nvme_fabrics_cmd_prop_attr_rsvd1 = -1; -static int hf_nvme_fabrics_cmd_prop_attr_size = -1; -static int hf_nvme_fabrics_cmd_prop_attr_rsvd2 = -1; -static int hf_nvme_fabrics_cmd_prop_attr_offset = -1; -static int hf_nvme_fabrics_cmd_prop_attr_rsvd3 = -1; -static int hf_nvme_fabrics_cmd_prop_attr_get_rsvd4 = -1; -static int hf_nvme_fabrics_cmd_prop_attr_set_4B_value = -1; -static int hf_nvme_fabrics_cmd_prop_attr_set_4B_value_rsvd = -1; -static int hf_nvme_fabrics_cmd_prop_attr_set_8B_value = -1; -static int hf_nvme_fabrics_cmd_prop_attr_set_rsvd3 = -1; - /* tracking Cmd and its respective CQE */ -static int hf_nvme_fabrics_cmd_pkt = -1; static int hf_nvme_tcp_cmd_pkt = -1; -static int hf_nvme_fabrics_cqe_pkt = -1; -static int hf_nvme_fabrics_cmd_latency = -1; static int hf_nvme_fabrics_cmd_qid = -1; -/* NVMe Fabric CQE */ -static int hf_nvme_fabrics_cqe = -1; -static int hf_nvme_fabrics_cqe_sts = -1; -static int hf_nvme_fabrics_cqe_sqhd = -1; -static int hf_nvme_fabrics_cqe_rsvd = -1; -static int hf_nvme_fabrics_cqe_status = -1; -static int hf_nvme_fabrics_cqe_status_rsvd = -1; - -static int hf_nvme_fabrics_cqe_connect_cntlid = -1; -static int hf_nvme_fabrics_cqe_connect_authreq = -1; -static int hf_nvme_fabrics_cqe_connect_rsvd = -1; -static int hf_nvme_fabrics_cqe_prop_set_rsvd = -1; - /* Data response fields */ static int hf_nvme_tcp_data_pdu = -1; static int hf_nvme_tcp_pdu_ttag = -1; @@ -358,206 +264,6 @@ dissect_nvme_tcp_icresp(tvbuff_t *tvb, offset + 4, 4, ENC_LITTLE_ENDIAN); } -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_fabrics_cmd_connect_data_hostid, - data_tvb, offset, 16, ENC_NA); - proto_tree_add_item(data_tree, hf_nvme_fabrics_cmd_connect_data_cntlid, - data_tvb, offset + 16, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(data_tree, hf_nvme_fabrics_cmd_connect_data_rsvd4, - data_tvb, offset + 18, 238, ENC_NA); - proto_tree_add_item(data_tree, hf_nvme_fabrics_cmd_connect_data_subnqn, - data_tvb, offset + 256, 256, ENC_ASCII | ENC_NA); - proto_tree_add_item(data_tree, hf_nvme_fabrics_cmd_connect_data_hostnqn, - data_tvb, offset + 512, 256, ENC_ASCII | ENC_NA); - proto_tree_add_item(data_tree, hf_nvme_fabrics_cmd_connect_data_rsvd5, - data_tvb, offset + 768, 256, ENC_NA); -} - -static void -dissect_nvme_fabric_data(tvbuff_t *nvme_tvb, - proto_tree *nvme_tree, - guint32 len, - guint8 fctype, - int offset) -{ - proto_tree *data_tree; - proto_item *ti; - - ti = proto_tree_add_item(nvme_tree, hf_nvme_fabrics_cmd_data, nvme_tvb, - offset, len, ENC_NA); - data_tree = proto_item_add_subtree(ti, ett_nvme_tcp); - - switch (fctype) { - case nvme_fabrics_type_connect: - dissect_nvme_fabric_connect_cmd_data(nvme_tvb, data_tree, offset); - break; - default: - proto_tree_add_item(data_tree, hf_nvme_tcp_unknown_data, nvme_tvb, offset, - len, ENC_NA); - break; - } -} - -static void -dissect_nvme_fabric_generic_cmd(proto_tree *cmd_tree, - tvbuff_t *cmd_tvb, - int offset) -{ - proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_generic_rsvd1, cmd_tvb, - offset + 5, 35, ENC_NA); - proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_generic_field, cmd_tvb, - offset + 40, 24, ENC_NA); -} - -static void -dissect_nvme_fabric_connect_cmd(struct nvme_tcp_q_ctx *queue, packet_info *pinfo, - proto_tree *cmd_tree, - tvbuff_t *cmd_tvb, - int offset) -{ - 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, 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); - - queue->n_q_ctx.qid = tvb_get_guint16(cmd_tvb, offset + 42, - ENC_LITTLE_ENDIAN); - proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_connect_qid, cmd_tvb, - offset + 42, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_connect_sqsize, cmd_tvb, - offset + 44, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_connect_cattr, cmd_tvb, - offset + 46, 1, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_connect_rsvd3, cmd_tvb, - offset + 47, 1, ENC_NA); - proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_connect_kato, cmd_tvb, - offset + 48, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_connect_rsvd4, cmd_tvb, - offset + 52, 12, ENC_NA); -} - -static guint8 -dissect_nvme_fabric_prop_cmd_common(proto_tree *cmd_tree, - tvbuff_t *cmd_tvb, - int offset) -{ - proto_item *attr_item, *offset_item; - guint32 offset_in_string; - guint8 attr; - - proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_prop_attr_rsvd1, cmd_tvb, - offset + 5, 35, ENC_NA); - proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_prop_attr_rsvd2, cmd_tvb, - offset + 40, 1, ENC_LITTLE_ENDIAN); - attr_item = proto_tree_add_item(cmd_tree, - hf_nvme_fabrics_cmd_prop_attr_size, cmd_tvb, offset + 40, 1, - ENC_LITTLE_ENDIAN); - attr = tvb_get_guint8(cmd_tvb, offset + 40) & 0x7; - proto_item_append_text(attr_item, "%s", - val_to_str_const(attr, attr_size_tbl, "Reserved")); - - proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_prop_attr_rsvd3, cmd_tvb, - offset + 41, 3, ENC_NA); - - offset_item = proto_tree_add_item_ret_uint(cmd_tree, - hf_nvme_fabrics_cmd_prop_attr_offset, cmd_tvb, offset + 44, 4, - ENC_LITTLE_ENDIAN, &offset_in_string); - proto_item_append_text(offset_item, "%s", - val_to_str_const(offset_in_string, prop_offset_tbl, "Unknown Property")); - return attr; -} - -static void -dissect_nvme_fabric_prop_get_cmd(proto_tree *cmd_tree, - tvbuff_t *cmd_tvb, - int offset) -{ - dissect_nvme_fabric_prop_cmd_common(cmd_tree, cmd_tvb, offset); - proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_prop_attr_get_rsvd4, - cmd_tvb, offset + 48, 16, ENC_NA); -} - -static void -dissect_nvme_fabric_prop_set_cmd(proto_tree *cmd_tree, - tvbuff_t *cmd_tvb, - int offset) -{ - guint8 attr; - - attr = dissect_nvme_fabric_prop_cmd_common(cmd_tree, cmd_tvb, offset); - if (attr == 0) { - proto_tree_add_item(cmd_tree, - hf_nvme_fabrics_cmd_prop_attr_set_4B_value, cmd_tvb, - offset + 48, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cmd_tree, - hf_nvme_fabrics_cmd_prop_attr_set_4B_value_rsvd, cmd_tvb, - offset + 52, 4, ENC_LITTLE_ENDIAN); - } else { - proto_tree_add_item(cmd_tree, - hf_nvme_fabrics_cmd_prop_attr_set_8B_value, cmd_tvb, - offset + 48, 8, ENC_LITTLE_ENDIAN); - } - proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_prop_attr_set_rsvd3, - cmd_tvb, offset + 56, 8, ENC_NA); -} - -static void -dissect_nvme_fabric_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, - proto_tree *nvme_tree, - struct nvme_tcp_q_ctx *queue, - struct nvme_tcp_cmd_ctx *cmd_ctx, - int offset) -{ - proto_tree *cmd_tree; - proto_item *ti, *opc_item; - guint8 fctype; - - fctype = tvb_get_guint8(nvme_tvb, offset + 4); - cmd_ctx->fctype = fctype; - - ti = proto_tree_add_item(nvme_tree, hf_nvme_fabrics_cmd, nvme_tvb, - NVME_TCP_HEADER_SIZE, - NVME_FABRIC_CMD_SIZE, ENC_NA); - cmd_tree = proto_item_add_subtree(ti, ett_nvme_tcp); - - opc_item = proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_opc, nvme_tvb, - offset, 1, ENC_NA); - proto_item_append_text(opc_item, "%s", " Fabric Cmd"); - - nvme_publish_to_cqe_link(cmd_tree, nvme_tvb, hf_nvme_fabrics_cqe_pkt, - &cmd_ctx->n_cmd_ctx); - - proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_rsvd1, nvme_tvb, - offset + 1, 1, ENC_NA); - - proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_cid, nvme_tvb, offset + 2, - 2, ENC_LITTLE_ENDIAN); - - proto_tree_add_item(cmd_tree, hf_nvme_fabrics_cmd_fctype, - nvme_tvb, offset + 4, 1, ENC_LITTLE_ENDIAN); - - switch (fctype) { - case nvme_fabrics_type_connect: - dissect_nvme_fabric_connect_cmd(queue, pinfo, cmd_tree, nvme_tvb, offset); - break; - case nvme_fabrics_type_property_get: - dissect_nvme_fabric_prop_get_cmd(cmd_tree, nvme_tvb, offset); - break; - case nvme_fabrics_type_property_set: - dissect_nvme_fabric_prop_set_cmd(cmd_tree, nvme_tvb, offset); - break; - default: - dissect_nvme_fabric_generic_cmd(cmd_tree, nvme_tvb, offset); - break; - } -} - static struct nvme_tcp_cmd_ctx* bind_cmd_to_qctx(packet_info *pinfo, struct nvme_q_ctx *q_ctx, @@ -610,23 +316,21 @@ dissect_nvme_tcp_command(tvbuff_t *tvb, if ((queue->n_q_ctx.qid == G_MAXUINT16) && !nvme_is_io_queue_opcode(opcode)) queue->n_q_ctx.qid = 0; - if (opcode == nvme_fabrics_command) { - guint8 fctype; - + if (opcode == NVME_FABRIC_OPC) { cmd_ctx->n_cmd_ctx.fabric = TRUE; - fctype = tvb_get_guint8(tvb, offset + 4); - dissect_nvme_fabric_cmd(tvb, pinfo, nvme_tcp_tree, queue, cmd_ctx, offset); - cmd_string = val_to_str_const(fctype, nvme_fabrics_cmd_type_vals, - "Unknown FcType"); - col_append_sep_fstr(pinfo->cinfo, COL_INFO, " | ", "Fabrics %s Request", - cmd_string); + dissect_nvmeof_fabric_cmd(tvb, pinfo, nvme_tcp_tree, &queue->n_q_ctx, &cmd_ctx->n_cmd_ctx, offset, FALSE); + cmd_string = get_nvmeof_cmd_string(cmd_ctx->n_cmd_ctx.cmd_ctx.fabric_cmd.fctype); + col_append_sep_fstr(pinfo->cinfo, COL_INFO, " | ", "Fabrics %s Request", cmd_string); proto_item_append_text(nvme_tcp_ti, ", Fabrics Type: %s (0x%02x) Cmd ID: 0x%04x", cmd_string, - fctype, cmd_id); - + cmd_ctx->n_cmd_ctx.cmd_ctx.fabric_cmd.fctype, cmd_id); if (incapsuled_data_size > 0) { - dissect_nvme_fabric_data(tvb, nvme_tcp_tree, incapsuled_data_size, - cmd_ctx->fctype, offset + NVME_FABRIC_CMD_SIZE + data_offset); + proto_tree *data_tree; + proto_item *ti; + + ti = proto_tree_add_item(nvme_tcp_tree, hf_nvme_fabrics_cmd_data, tvb, offset, incapsuled_data_size, ENC_NA); + data_tree = proto_item_add_subtree(ti, ett_nvme_tcp); + dissect_nvmeof_cmd_data(tvb, data_tree, offset + NVME_FABRIC_CMD_SIZE + data_offset, &cmd_ctx->n_cmd_ctx, incapsuled_data_size); } return; } @@ -655,73 +359,6 @@ dissect_nvme_tcp_command(tvbuff_t *tvb, } } -static void -dissect_nvme_fabrics_cqe_status_8B(proto_tree *cqe_tree, - tvbuff_t *cqe_tvb, - struct nvme_tcp_cmd_ctx *cmd_ctx, - int offset) -{ - switch (cmd_ctx->fctype) { - case nvme_fabrics_type_connect: - proto_tree_add_item(cqe_tree, hf_nvme_fabrics_cqe_connect_cntlid, - cqe_tvb, offset + 0, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cqe_tree, hf_nvme_fabrics_cqe_connect_authreq, - cqe_tvb, offset + 2, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cqe_tree, hf_nvme_fabrics_cqe_connect_rsvd, cqe_tvb, - offset + 4, 4, ENC_NA); - break; - case nvme_fabrics_type_property_get: - proto_tree_add_item(cqe_tree, hf_nvme_fabrics_cqe_sts, cqe_tvb, - offset + 0, 8, ENC_LITTLE_ENDIAN); - break; - case nvme_fabrics_type_property_set: - proto_tree_add_item(cqe_tree, hf_nvme_fabrics_cqe_prop_set_rsvd, - cqe_tvb, offset + 0, 8, ENC_NA); - break; - }; -} - -static void -dissect_nvme_fabric_cqe(tvbuff_t *nvme_tvb, - packet_info *pinfo, - proto_tree *nvme_tree, - struct nvme_tcp_cmd_ctx *cmd_ctx, - const gchar *fctype_cmd, - int offset) -{ - proto_tree *cqe_tree; - proto_item *ti; - - ti = proto_tree_add_item(nvme_tree, hf_nvme_fabrics_cqe, nvme_tvb, offset, - NVME_FABRIC_CQE_SIZE, ENC_NA); - - proto_item_append_text(ti, " (For Cmd: %s)", - val_to_str_const(cmd_ctx->fctype, nvme_fabrics_cmd_type_vals, - "Unknown Cmd")); - - col_add_fstr(pinfo->cinfo, COL_INFO, "Fabrics %s Response", fctype_cmd); - - cqe_tree = proto_item_add_subtree(ti, ett_nvme_tcp); - - nvme_publish_to_cmd_link(cqe_tree, nvme_tvb, hf_nvme_fabrics_cmd_pkt, - &cmd_ctx->n_cmd_ctx); - nvme_publish_cmd_latency(cqe_tree, &cmd_ctx->n_cmd_ctx, - hf_nvme_fabrics_cmd_latency); - - dissect_nvme_fabrics_cqe_status_8B(cqe_tree, nvme_tvb, cmd_ctx, offset); - - proto_tree_add_item(cqe_tree, hf_nvme_fabrics_cqe_sqhd, nvme_tvb, - offset + 8, 2, ENC_NA); - proto_tree_add_item(cqe_tree, hf_nvme_fabrics_cqe_rsvd, nvme_tvb, - offset + 10, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cqe_tree, hf_nvme_fabrics_cmd_cid, nvme_tvb, - offset + 12, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cqe_tree, hf_nvme_fabrics_cqe_status, nvme_tvb, - offset + 14, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cqe_tree, hf_nvme_fabrics_cqe_status_rsvd, nvme_tvb, - offset + 14, 2, ENC_LITTLE_ENDIAN); -} - static guint32 dissect_nvme_tcp_data_pdu(tvbuff_t *tvb, packet_info *pinfo, @@ -803,11 +440,10 @@ dissect_nvme_tcp_c2h_data(tvbuff_t *tvb, hf_nvme_tcp_cmd_pkt, &cmd_ctx->n_cmd_ctx); if (cmd_ctx->n_cmd_ctx.fabric) { - cmd_string = val_to_str_const(cmd_ctx->fctype, nvme_fabrics_cmd_type_vals, - "Unknown FcType"); + cmd_string = get_nvmeof_cmd_string(cmd_ctx->n_cmd_ctx.cmd_ctx.fabric_cmd.fctype); proto_item_append_text(nvme_tcp_ti, ", C2HData Fabrics Type: %s (0x%02x), Cmd ID: 0x%04x, Len: %u", - cmd_string, cmd_ctx->fctype, cmd_id, data_length); + cmd_string, cmd_ctx->n_cmd_ctx.cmd_ctx.fabric_cmd.fctype, cmd_id, data_length); } else { cmd_string = nvme_get_opcode_string(cmd_ctx->n_cmd_ctx.opcode, queue->n_q_ctx.qid); @@ -901,11 +537,10 @@ dissect_nvme_tcp_h2c_data(tvbuff_t *tvb, /* fabrics commands should not have h2cdata*/ if (cmd_ctx->n_cmd_ctx.fabric) { - cmd_string = val_to_str_const(cmd_ctx->fctype, nvme_fabrics_cmd_type_vals, - "Unknown FcType"); + cmd_string = get_nvmeof_cmd_string(cmd_ctx->n_cmd_ctx.cmd_ctx.fabric_cmd.fctype); proto_item_append_text(nvme_tcp_ti, ", H2CData Fabrics Type: %s (0x%02x), Cmd ID: 0x%04x, Len: %u", - cmd_string, cmd_ctx->fctype, cmd_id, data_length); + cmd_string, cmd_ctx->n_cmd_ctx.cmd_ctx.fabric_cmd.fctype, cmd_id, data_length); proto_tree_add_item(root_tree, hf_nvme_tcp_unknown_data, tvb, offset + 16, data_length, ENC_NA); return; @@ -1043,14 +678,12 @@ dissect_nvme_tcp_cqe(tvbuff_t *tvb, nvme_update_cmd_end_info(pinfo, &cmd_ctx->n_cmd_ctx); if (cmd_ctx->n_cmd_ctx.fabric) { - cmd_string = val_to_str_const(cmd_ctx->fctype, nvme_fabrics_cmd_type_vals, - "Unknown Cmd"); + cmd_string = get_nvmeof_cmd_string(cmd_ctx->n_cmd_ctx.cmd_ctx.fabric_cmd.fctype); proto_item_append_text(ti, ", Cqe Fabrics Cmd: %s (0x%02x) Cmd ID: 0x%04x", cmd_string, - cmd_ctx->fctype, cmd_id); + cmd_ctx->n_cmd_ctx.cmd_ctx.fabric_cmd.fctype , cmd_id); - dissect_nvme_fabric_cqe(tvb, pinfo, nvme_tree, cmd_ctx, cmd_string, - offset); + dissect_nvmeof_fabric_cqe(tvb, nvme_tree, &cmd_ctx->n_cmd_ctx, offset); } else { tvbuff_t *nvme_tvb; proto_item_set_len(ti, NVME_TCP_HEADER_SIZE); @@ -1390,162 +1023,14 @@ void proto_register_nvme_tcp(void) { { &hf_nvme_tcp_h2ctermreq_data, { "Terminated PDU header", "nvme-tcp.h2ctermreq.data", FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL } }, - /* NVMe fabrics command */ - { &hf_nvme_fabrics_cmd, - { "NVM Express Fabrics (Cmd)", "nvme-tcp.cmd", - FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_opc, - { "Opcode", "nvme-tcp.cmd.opc", - FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_rsvd1, - { "Reserved", "nvme-tcp.cmd.rsvd", - FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_cid, - { "Command ID", "nvme-tcp.cmd.cid", - FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_fctype, - { "Fabric Cmd Type", "nvme-tcp.cmd.fctype", - FT_UINT8, BASE_HEX, VALS(nvme_fabrics_cmd_type_vals), - 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_generic_rsvd1, - { "Reserved", "nvme-tcp.cmd.generic.rsvd1", - FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_generic_field, - { "Fabric Cmd specific field", "nvme-tcp.cmd.generic.field", - FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - - /* NVMe connect command fields */ - { &hf_nvme_fabrics_cmd_connect_rsvd2, - { "Reserved","nvme-tcp.cmd.connect.rsvd1", - FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_connect_sgl1, - { "SGL1", "nvme-tcp.cmd.connect.sgl1", - FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_connect_recfmt, - { "Record Format", "nvme-tcp.cmd.connect.recfmt", - FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_connect_qid, - { "Queue ID", "nvme-tcp.cmd.connect.qid", - FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_connect_sqsize, - { "SQ Size", "nvme-tcp.cmd.connect.sqsize", - FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_connect_cattr, - { "Connect Attributes", "nvme-tcp.cmd.connect.cattr", - FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - {&hf_nvme_fabrics_cmd_connect_rsvd3, - { "Reserved", "nvme-tcp.cmd.connect.rsvd2", - FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_connect_kato, - { "Keep Alive Timeout", "nvme-tcp.cmd.connect.kato", - FT_UINT32, BASE_DEC | BASE_UNIT_STRING, - &units_milliseconds, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_connect_rsvd4, - { "Reserved", "nvme-tcp.cmd.connect.rsvd4", FT_BYTES, - BASE_NONE, NULL, 0x0, NULL, HFILL } }, /* NVMe command data */ { &hf_nvme_fabrics_cmd_data, { "Data", "nvme-tcp.cmd.data", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_connect_data_hostid, - { "Host Identifier", - "nvme-tcp.cmd.connect.data.hostid", FT_GUID, - BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_connect_data_cntlid, - { "Controller ID", "nvme-tcp.cmd.connect.data.cntrlid", - FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_connect_data_rsvd4, - { "Reserved", "nvme-tcp.cmd.connect.data.rsvd4", - FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_connect_data_subnqn, - { "Subsystem NQN", "nvme-tcp.cmd.connect.data.subnqn", - FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_connect_data_hostnqn, - { "Host NQN", "nvme-tcp.cmd.connect.data.hostnqn", - FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_connect_data_rsvd5, - { "Reserved", "nvme-tcp.cmd.connect.data.rsvd5", - FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_tcp_unknown_data, - { "Unknown Data", "nvme-tcp.unknown_data", - FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_prop_attr_rsvd1, - { "Reserved", "nvme-tcp.cmd.prop_attr.rsvd1", - FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_prop_attr_rsvd2, - { "Reserved", "nvme-tcp.cmd.prop_attr.rsvd2", - FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_prop_attr_size, - { "Property Size", "nvme-tcp.cmd.prop_attr.size", - FT_UINT8, BASE_HEX, NULL, 0x7, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_prop_attr_rsvd3, - { "Reserved", "nvme-tcp.cmd.prop_attr.rsvd3", - FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_prop_attr_offset, - { "Offset", "nvme-tcp.cmd.prop_attr.offset", - FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_prop_attr_get_rsvd4, - { "Reserved", "nvme-tcp.cmd.prop_attr.get.rsvd4", - FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_prop_attr_set_4B_value, - { "Value", "nvme-tcp.cmd.prop_attr.set.value.4B", - FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_prop_attr_set_4B_value_rsvd, - { "Reserved", "nvme-tcp.cmd.prop_attr.set.value.rsvd", - FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_prop_attr_set_8B_value, - { "Value", "nvme-tcp.cmd.prop_attr.set.value.8B", - FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_prop_attr_set_rsvd3, - { "Reserved", "nvme-tcp.cmd.prop_attr.set.rsvd3", - FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - /* NVMe Response fields */ - { &hf_nvme_fabrics_cqe, - { "Cqe", "nvme-tcp.cqe", - FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cqe_sts, - { "Cmd specific Status", "nvme-tcp.cqe.sts", - FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cqe_sqhd, - { "SQ Head Pointer", "nvme-tcp.cqe.sqhd", - FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cqe_rsvd, - { "Reserved", "nvme-tcp.cqe.rsvd", - FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cqe_status, - { "Status", "nvme-tcp.cqe.status", - FT_UINT16, BASE_HEX, NULL, 0xfffe, NULL, HFILL } }, - { &hf_nvme_fabrics_cqe_status_rsvd, - { "Reserved", "nvme-tcp.cqe.status.rsvd", - FT_UINT16, BASE_HEX, NULL, 0x1, NULL, HFILL } }, - { &hf_nvme_fabrics_cqe_connect_cntlid, - { "Controller ID", "nvme-tcp.cqe.connect.cntrlid", - FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cqe_connect_authreq, - { "Authentication Required", "nvme-tcp.cqe.connect.authreq", - FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cqe_connect_rsvd, - { "Reserved", "nvme-tcp.cqe.connect.rsvd", - FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cqe_prop_set_rsvd, - { "Reserved", "nvme-tcp.cqe.prop_set.rsvd", - FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nvme_fabrics_cmd_pkt, - { "Fabric Cmd in", "nvme-tcp.cmd_pkt", - FT_FRAMENUM, BASE_NONE, NULL, 0, - "The Cmd for this transaction is in this frame", HFILL } }, { &hf_nvme_tcp_cmd_pkt, { "Cmd in", "nvme-tcp.cmd_pkt", FT_FRAMENUM, BASE_NONE, NULL, 0, "The Cmd for this transaction is in this frame", HFILL } }, - { &hf_nvme_fabrics_cqe_pkt, - { "Fabric Cqe in", "nvme-tcp.cqe_pkt", - FT_FRAMENUM, BASE_NONE, NULL, 0, - "The Cqe for this transaction is in this frame", HFILL } }, - { &hf_nvme_fabrics_cmd_latency, - { "Cmd Latency", "nvme-tcp.cmd_latency", - FT_DOUBLE, BASE_NONE, NULL, 0x0, - "The time between the command and completion, in usec", HFILL } }, { &hf_nvme_fabrics_cmd_qid, { "Cmd Qid", "nvme-tcp.cmd.qid", FT_UINT16, BASE_HEX, NULL, 0x0, diff --git a/epan/dissectors/packet-nvme.c b/epan/dissectors/packet-nvme.c index 731086d9ce..cab14e8941 100644 --- a/epan/dissectors/packet-nvme.c +++ b/epan/dissectors/packet-nvme.c @@ -3633,7 +3633,7 @@ static void dissect_nvmeof_fabric_generic_cmd(proto_tree *cmd_tree, tvbuff_t *cm } 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, guint off) + struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd, guint off, gboolean link_data_req) { proto_tree *cmd_tree; proto_item *ti; @@ -3650,7 +3650,8 @@ void dissect_nvmeof_fabric_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tre NVME_FABRIC_OPC); cmd->opcode = NVME_FABRIC_OPC; - nvme_publish_to_data_req_link(cmd_tree, nvme_tvb, hf_nvmeof_data_req, cmd); + if (link_data_req) + nvme_publish_to_data_req_link(cmd_tree, nvme_tvb, hf_nvmeof_data_req, cmd); 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, @@ -3798,6 +3799,12 @@ dissect_nvmeof_cqe_status_8B(proto_tree *cqe_tree, tvbuff_t *cqe_tvb, }; } + +const gchar *get_nvmeof_cmd_string(guint8 fctype) +{ + return val_to_str(fctype, fctype_tbl, "Unknown Fabric Command"); +} + void dissect_nvmeof_fabric_cqe(tvbuff_t *nvme_tvb, proto_tree *nvme_tree, diff --git a/epan/dissectors/packet-nvme.h b/epan/dissectors/packet-nvme.h index 9c2fef19c1..43020ba0f9 100644 --- a/epan/dissectors/packet-nvme.h +++ b/epan/dissectors/packet-nvme.h @@ -63,6 +63,8 @@ struct nvme_cmd_ctx { extern int hf_nvmeof_cmd_pkt; extern int hf_nvmeof_data_req; +const gchar *get_nvmeof_cmd_string(guint8 fctype); + void nvme_publish_qid(proto_tree *tree, int field_index, guint16 qid); @@ -98,7 +100,7 @@ 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, guint off); + struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd, guint off, gboolean link_data_req); void dissect_nvmeof_cmd_data(tvbuff_t *data_tvb, proto_tree *data_tree, guint offset, struct nvme_cmd_ctx *cmd, guint len); |