NVMe: decode Async Event Req CQE.

This commit is contained in:
Constantine Gavrilov 2021-09-22 15:50:03 +03:00 committed by Wireshark GitLab Utility
parent 9f9afc0e86
commit 9bce34ca67
1 changed files with 94 additions and 2 deletions

View File

@ -622,6 +622,7 @@ static int hf_nvme_get_logpage_sanitize_rsvd = -1;
/* NVMe CQE fields */ /* NVMe CQE fields */
static int hf_nvme_cqe_dword0 = -1; static int hf_nvme_cqe_dword0 = -1;
static int hf_nvme_cqe_aev_dword0[6] = { NEG_LST_6 };
static int hf_nvme_cqe_dword0_sf_pm[4] = { NEG_LST_4 }; static int hf_nvme_cqe_dword0_sf_pm[4] = { NEG_LST_4 };
static int hf_nvme_cqe_dword0_sf_lbart[3] = { NEG_LST_3 }; static int hf_nvme_cqe_dword0_sf_lbart[3] = { NEG_LST_3 };
static int hf_nvme_cqe_dword0_sf_nq[3] = { NEG_LST_3 }; static int hf_nvme_cqe_dword0_sf_nq[3] = { NEG_LST_3 };
@ -1850,7 +1851,7 @@ static void dissect_nvme_identify_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree)
} }
static const value_string logpage_tbl[] = { static const value_string logpage_tbl[] = {
{ 0, "Reserved" }, { 0, "Unspecified" },
{ 1, "Error Information" }, { 1, "Error Information" },
{ 2, "SMART/Health Information" }, { 2, "SMART/Health Information" },
{ 3, "Firmware Slot Information" }, { 3, "Firmware Slot Information" },
@ -1882,7 +1883,6 @@ static const char *get_logpage_name(guint lid)
return "Vendor Specific Page"; return "Vendor Specific Page";
else else
return val_to_str_const(lid, logpage_tbl, "Reserved Page Name"); return val_to_str_const(lid, logpage_tbl, "Reserved Page Name");
} }
static void add_logpage_lid(gchar *result, guint32 val) static void add_logpage_lid(gchar *result, guint32 val)
@ -3832,6 +3832,51 @@ static const value_string nvme_cqe_sc_sf_err_dword0_tbl[] = {
{ 0, NULL }, { 0, NULL },
}; };
static const value_string nvme_cqe_aev_aet_dword0_tbl[] = {
{ 0x0, "Error status" },
{ 0x1, "SMART / Health status" },
{ 0x2, "Notice" },
{ 0x6, "IO Command Set specific status" },
{ 0x7, "Vendor specific" },
{ 0, NULL },
};
static const value_string nvme_cqe_aev_status_error_tbl[] = {
{ 0x0, "Write to Invalid Doorbell Register" },
{ 0x1, "Invalid Doorbell Write Value" },
{ 0x2, "Diagnostic Failure" },
{ 0x3, "Persistent Internal Error"},
{ 0x3, "Transient Internal Error"},
{ 0x4, "Persistent Internal Error"},
{ 0x5, "Firmware Image Load Error"},
{ 0, NULL },
};
static const value_string nvme_cqe_aev_status_smart_tbl[] = {
{ 0x0, "NVM subsystem Reliability" },
{ 0x1, "Temperature Threshold" },
{ 0x2, "Spare Below Threshold" },
{ 0, NULL },
};
static const value_string nvme_cqe_aev_status_notice_tbl[] = {
{ 0x0, "Namespace Attribute Changed" },
{ 0x1, "Firmware Activation Starting" },
{ 0x2, "Telemetry Log Changed" },
{ 0x3, "Asymmetric Namespace Access Change" },
{ 0x4, "Predictable Latency Event Aggregate Log Change" },
{ 0x5, "LBA Status Information Alert" },
{ 0x6, "Endurance Group Event Aggregate Log Page Change" },
{ 0, NULL },
};
static const value_string nvme_cqe_aev_status_nvm_tbl[] = {
{ 0x0, "Reservation Log Page Available" },
{ 0x1, "Sanitize Operation Completed" },
{ 0x2, "Sanitize Operation Completed With Unexpected Deallocation" },
{ 0, NULL },
};
static void decode_dword0_cqe(tvbuff_t *nvme_tvb, proto_tree *cqe_tree, 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) { switch (cmd_ctx->opcode) {
@ -3858,6 +3903,29 @@ static void decode_dword0_cqe(tvbuff_t *nvme_tvb, proto_tree *cqe_tree, struct n
} }
break; break;
} }
case NVME_AQ_OPC_ASYNC_EVE_REQ:
{
proto_item *ti;
proto_tree *grp;
guint i;
guint8 aet;
guint8 aei;
ti = proto_tree_add_item(cqe_tree, hf_nvme_cqe_aev_dword0[0], nvme_tvb, 0, 4, ENC_LITTLE_ENDIAN);
grp = proto_item_add_subtree(ti, ett_data);
for (i = 1; i < 4; i++)
ti = proto_tree_add_item(grp, hf_nvme_cqe_aev_dword0[i], nvme_tvb, 0, 4, ENC_LITTLE_ENDIAN);
aet = tvb_get_guint8(nvme_tvb, 0) & 0x7;
aei = tvb_get_guint8(nvme_tvb, 2);
switch (aet) {
case 0: proto_item_append_text(ti, " (%s)", val_to_str_const(aei, nvme_cqe_aev_status_error_tbl, "Unknown")); break;
case 1: proto_item_append_text(ti, " (%s)", val_to_str_const(aei, nvme_cqe_aev_status_smart_tbl, "Unknown")); break;
case 2: proto_item_append_text(ti, " (%s)", val_to_str_const(aei, nvme_cqe_aev_status_notice_tbl, "Unknown")); break;
case 6: proto_item_append_text(ti, " (%s)", val_to_str_const(aei, nvme_cqe_aev_status_nvm_tbl, "Unknown")); break;
}
proto_tree_add_item(grp, hf_nvme_cqe_aev_dword0[4], nvme_tvb, 0, 4, ENC_LITTLE_ENDIAN);
proto_tree_add_item(grp, hf_nvme_cqe_aev_dword0[5], nvme_tvb, 0, 4, ENC_LITTLE_ENDIAN);
break;
}
default: default:
proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword0, nvme_tvb, 0, 4, ENC_LITTLE_ENDIAN); proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword0, nvme_tvb, 0, 4, ENC_LITTLE_ENDIAN);
break; break;
@ -7323,6 +7391,30 @@ proto_register_nvme(void)
{ "Set Features Error Specific Code", "nvme.cqe.dword0.set_features.err", { "Set Features Error Specific Code", "nvme.cqe.dword0.set_features.err",
FT_UINT32, BASE_HEX, VALS(nvme_cqe_sc_sf_err_dword0_tbl), 0x0, NULL, HFILL} FT_UINT32, BASE_HEX, VALS(nvme_cqe_sc_sf_err_dword0_tbl), 0x0, NULL, HFILL}
}, },
{ &hf_nvme_cqe_aev_dword0[0],
{ "DWORD0", "nvme.cqe.dword0.aev",
FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvme_cqe_aev_dword0[1],
{ "Asynchronous Event Type", "nvme.cqe.dword0.aev.aet",
FT_UINT32, BASE_HEX, VALS(nvme_cqe_aev_aet_dword0_tbl), 0x7, NULL, HFILL}
},
{ &hf_nvme_cqe_aev_dword0[2],
{ "Reserved", "nvme.cqe.dword0.aev.rsvd0",
FT_UINT32, BASE_HEX, NULL, 0xf8, NULL, HFILL}
},
{ &hf_nvme_cqe_aev_dword0[3],
{ "Asynchronous Event Information", "nvme.cqe.dword0.aev.aei",
FT_UINT32, BASE_HEX, NULL, 0xff00, NULL, HFILL}
},
{ &hf_nvme_cqe_aev_dword0[4],
{ "Log Page Identifier", "nvme.cqe.dword0.aev.lpi",
FT_UINT32, BASE_CUSTOM, CF_FUNC(add_logpage_lid), 0xff0000, NULL, HFILL}
},
{ &hf_nvme_cqe_aev_dword0[5],
{ "Reserved", "nvme.cqe.dword0.aev.rsvd1",
FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL}
},
{ &hf_nvme_cqe_dword0_sf_pm[0], { &hf_nvme_cqe_dword0_sf_pm[0],
{ "DWORD0: Set Feature Power Management Result", "nvme.cqe.dword0.set_features.pm", { "DWORD0: Set Feature Power Management Result", "nvme.cqe.dword0.set_features.pm",
FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}