diff options
author | Constantine Gavrilov <constg@il.ibm.com> | 2021-06-13 20:23:24 +0300 |
---|---|---|
committer | Wireshark GitLab Utility <gerald+gitlab-utility@wireshark.org> | 2021-06-14 06:21:46 +0000 |
commit | c7e082c6de8afaa1f804da060c6edc1e17a6eb4b (patch) | |
tree | 1b78e4d0a9ec16a1ee915dd7b43f727787b997c6 /epan | |
parent | 8bc0924c25ab0832522809b352aa2b9ff001c423 (diff) |
NVMe: use common block for decoding CQEs for fabric and IO commands.
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-nvme.c | 93 |
1 files changed, 40 insertions, 53 deletions
diff --git a/epan/dissectors/packet-nvme.c b/epan/dissectors/packet-nvme.c index 4b17e35af0..6b89673525 100644 --- a/epan/dissectors/packet-nvme.c +++ b/epan/dissectors/packet-nvme.c @@ -107,11 +107,6 @@ static int hf_nvmeof_prop_get_ccap[17] = { NEG_LST_17 }; /* NVMe Fabric CQE */ static int hf_nvmeof_cqe = -1; static int hf_nvmeof_cqe_sts = -1; -static int hf_nvmeof_cqe_sqhd = -1; -static int hf_nvmeof_cqe_rsvd = -1; -static int hf_nvmeof_cqe_cid = -1; -static int hf_nvmeof_cqe_status = -1; -static int hf_nvmeof_cqe_status_rsvd = -1; static int hf_nvmeof_cqe_connect_cntlid = -1; static int hf_nvmeof_cqe_connect_authreq = -1; @@ -623,6 +618,7 @@ static int hf_nvme_cqe_sqhd = -1; static int hf_nvme_cqe_sqid = -1; static int hf_nvme_cqe_cid = -1; static int hf_nvme_cqe_status[7] = { NEG_LST_7 }; +static int hf_nvme_cqe_status_rsvd = -1; /* tracking Cmd and its respective CQE */ static int hf_nvme_cmd_pkt = -1; @@ -3583,6 +3579,8 @@ const gchar *get_nvmeof_cmd_string(guint8 fctype) return val_to_str(fctype, fctype_tbl, "Unknown Fabric Command"); } +static void dissect_nvme_cqe_common(tvbuff_t *nvme_tvb, proto_tree *cqe_tree, guint off, gboolean nvmeof); + void dissect_nvmeof_fabric_cqe(tvbuff_t *nvme_tvb, proto_tree *nvme_tree, @@ -3604,16 +3602,7 @@ dissect_nvmeof_fabric_cqe(tvbuff_t *nvme_tvb, dissect_nvmeof_cqe_status_8B(cqe_tree, nvme_tvb, cmd, off); - proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_sqhd, nvme_tvb, - 8+off, 2, ENC_NA); - proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_rsvd, nvme_tvb, - 10+off, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_cid, nvme_tvb, - 12+off, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_status, nvme_tvb, - 14+off, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_status_rsvd, nvme_tvb, - 14+off, 2, ENC_LITTLE_ENDIAN); + dissect_nvme_cqe_common(nvme_tvb, cqe_tree, off, TRUE); } static void dissect_nvme_unhandled_cmd(tvbuff_t *nvme_tvb, proto_tree *cmd_tree) @@ -3626,7 +3615,6 @@ static void dissect_nvme_unhandled_cmd(tvbuff_t *nvme_tvb, proto_tree *cmd_tree) proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, nvme_tvb, 60, 4, ENC_LITTLE_ENDIAN); } - void 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) @@ -3742,11 +3730,13 @@ static const value_string nvme_cqe_sc_sf_err_dword0_tbl[] = { { 0, NULL }, }; -static void decode_dword0_cqe(tvbuff_t *nvme_tvb, proto_tree *cqe_tree, guint sc, struct nvme_cmd_ctx *cmd_ctx) +static void decode_dword0_cqe(tvbuff_t *nvme_tvb, proto_tree *cqe_tree, struct nvme_cmd_ctx *cmd_ctx) { switch (cmd_ctx->opcode) { case NVME_AQ_OPC_SET_FEATURES: { + guint16 sc = tvb_get_guint16(nvme_tvb, 14, ENC_LITTLE_ENDIAN); + sc = ((sc & 0x1fe) >> 9); if (sc) { proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword0_sf_err, nvme_tvb, 0, 4, ENC_LITTLE_ENDIAN); } else { @@ -3772,12 +3762,36 @@ static void decode_dword0_cqe(tvbuff_t *nvme_tvb, proto_tree *cqe_tree, guint sc } } -void dissect_nvme_cqe(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_tree, struct nvme_cmd_ctx *cmd_ctx) +static void dissect_nvme_cqe_common(tvbuff_t *nvme_tvb, proto_tree *cqe_tree, guint off, gboolean nvmeof) { - proto_tree *cqe_tree, *grp; proto_item *ti; - guint i; + proto_tree *grp; guint16 val; + guint i; + + val = tvb_get_guint16(nvme_tvb, off+14, ENC_LITTLE_ENDIAN); + proto_tree_add_item(cqe_tree, hf_nvme_cqe_sqhd, nvme_tvb, off+8, 2, ENC_LITTLE_ENDIAN); + proto_tree_add_item(cqe_tree, hf_nvme_cqe_sqid, nvme_tvb, off+10, 2, ENC_LITTLE_ENDIAN); + proto_tree_add_item(cqe_tree, hf_nvme_cqe_cid, nvme_tvb, off+12, 2, ENC_LITTLE_ENDIAN); + + ti = proto_tree_add_item(cqe_tree, hf_nvme_cqe_status[0], nvme_tvb, off+14, 2, ENC_LITTLE_ENDIAN); + grp = proto_item_add_subtree(ti, ett_data); + if (nvmeof) + proto_tree_add_item(grp, hf_nvme_cqe_status_rsvd, nvme_tvb, off+14, 2, ENC_LITTLE_ENDIAN); + else + proto_tree_add_item(grp, hf_nvme_cqe_status[1], nvme_tvb, off+14, 2, ENC_LITTLE_ENDIAN); + + ti = proto_tree_add_item(grp, hf_nvme_cqe_status[2], nvme_tvb, off+14, 2, ENC_LITTLE_ENDIAN); + proto_item_append_text(ti, " (%s)", get_cqe_sc_string((val & 0xE00) >> 1, (val & 0x1FE) >> 9)); + + for (i = 3; i < array_length(hf_nvme_cqe_status); i++) + proto_tree_add_item(grp, hf_nvme_cqe_status[i], nvme_tvb, off+14, 2, ENC_LITTLE_ENDIAN); +} + +void dissect_nvme_cqe(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_tree, struct nvme_cmd_ctx *cmd_ctx) +{ + proto_tree *cqe_tree; + proto_item *ti; col_set_str(pinfo->cinfo, COL_PROTOCOL, "NVMe"); ti = proto_tree_add_item(root_tree, proto_nvme, nvme_tvb, 0, @@ -3788,20 +3802,9 @@ void dissect_nvme_cqe(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_t nvme_publish_to_cmd_link(cqe_tree, nvme_tvb, hf_nvme_cmd_pkt, cmd_ctx); nvme_publish_cmd_latency(cqe_tree, cmd_ctx, hf_nvme_cmd_latency); - val = tvb_get_guint16(nvme_tvb, 14, ENC_LITTLE_ENDIAN); - decode_dword0_cqe(nvme_tvb, cqe_tree, ((val & 0x1fe) >> 9), cmd_ctx); + decode_dword0_cqe(nvme_tvb, cqe_tree, cmd_ctx); proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword1, nvme_tvb, 4, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cqe_tree, hf_nvme_cqe_sqhd, nvme_tvb, 8, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cqe_tree, hf_nvme_cqe_sqid, nvme_tvb, 10, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cqe_tree, hf_nvme_cqe_cid, nvme_tvb, 12, 2, ENC_LITTLE_ENDIAN); - - ti = proto_tree_add_item(cqe_tree, hf_nvme_cqe_status[0], nvme_tvb, 14, 2, ENC_LITTLE_ENDIAN); - grp = proto_item_add_subtree(ti, ett_data); - for (i = 1; i < array_length(hf_nvme_cqe_status); i++) { - ti = proto_tree_add_item(grp, hf_nvme_cqe_status[i], nvme_tvb, 14, 2, ENC_LITTLE_ENDIAN); - if (i == 2) - proto_item_append_text(ti, " (%s)", get_cqe_sc_string((val & 0xE00) >> 1, (val & 0x1fe) >> 9)); - } + dissect_nvme_cqe_common(nvme_tvb, cqe_tree, 0, FALSE); } void @@ -4046,22 +4049,6 @@ proto_register_nvme(void) { "Cmd specific Status", "nvmeof.cqe.sts", FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} }, - { &hf_nvmeof_cqe_sqhd, - { "SQ Head Pointer", "nvmeof.cqe.sqhd", - FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} - }, - { &hf_nvmeof_cqe_rsvd, - { "Reserved", "nvmeof.cqe.rsvd", - FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} - }, - { &hf_nvmeof_cqe_cid, - { "Command ID", "nvmeof.cqe.cid", - FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} - }, - { &hf_nvmeof_cqe_status, - { "Status", "nvmeof.cqe.status", - FT_UINT16, BASE_HEX, NULL, 0xfffe, NULL, HFILL} - }, { &hf_nvmeof_prop_get_ccap[0], { "Controller Capabilities", "nvmeof.prop_get.ccap", FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL} @@ -4146,10 +4133,6 @@ proto_register_nvme(void) { "Major Version", "nvmeof.prop_get.vs.mjr", FT_UINT32, BASE_DEC, NULL, 0xffff0000, NULL, HFILL} }, - { &hf_nvmeof_cqe_status_rsvd, - { "Reserved", "nvmeof.cqe.status.rsvd", - FT_UINT16, BASE_HEX, NULL, 0x1, NULL, HFILL} - }, { &hf_nvmeof_cqe_connect_cntlid, { "Controller ID", "nvmeof.cqe.connect.cntrlid", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} @@ -7247,6 +7230,10 @@ proto_register_nvme(void) { "Phase Tag", "nvme.cqe.status.p", FT_UINT16, BASE_HEX, NULL, 0x1, NULL, HFILL} }, + { &hf_nvme_cqe_status_rsvd, + { "Reserved", "nvme.cqe.status.rsvd", + FT_UINT16, BASE_HEX, NULL, 0x1, NULL, HFILL} + }, { &hf_nvme_cqe_status[2], { "Status Code", "nvme.cqe.status.sc", FT_UINT16, BASE_HEX, NULL, 0x1fe, NULL, HFILL} |