NVMe: refactor CQE decoding to decode all fields and decode comand status.

This commit is contained in:
Constantine Gavrilov 2021-05-25 16:15:20 +03:00 committed by Wireshark GitLab Utility
parent 12ddec82bf
commit d5c1bd9d93
1 changed files with 301 additions and 59 deletions

View File

@ -448,12 +448,12 @@ static int hf_nvme_get_logpage_sanitize_etcend = -1;
static int hf_nvme_get_logpage_sanitize_rsvd = -1;
/* NVMe CQE fields */
static int hf_nvme_cqe_sts = -1;
static int hf_nvme_cqe_dword0 = -1;
static int hf_nvme_cqe_dword1 = -1;
static int hf_nvme_cqe_sqhd = -1;
static int hf_nvme_cqe_rsvd = -1;
static int hf_nvme_cqe_sqid = -1;
static int hf_nvme_cqe_cid = -1;
static int hf_nvme_cqe_status = -1;
static int hf_nvme_cqe_status_rsvd = -1;
static int hf_nvme_cqe_status[7] = { NEG_LST_7 };
/* tracking Cmd and its respective CQE */
static int hf_nvme_cmd_pkt = -1;
@ -463,7 +463,6 @@ static int hf_nvme_cmd_latency = -1;
/* Data response fields */
static int hf_nvme_gen_data = -1;
/* Initialize the subtree pointers */
static gint ett_data = -1;
@ -499,39 +498,242 @@ static gint ett_data = -1;
#define NVME_IDENTIFY_CNS_IDENTIFY_CTRL 0x1
#define NVME_IDENTIFY_CNS_IDENTIFY_NSLIST 0x2
typedef enum {
NVME_CQE_SCT_GENERIC = 0x0,
NVME_CQE_SCT_COMMAND = 0x1,
NVME_CQE_SCT_MEDIA = 0x2,
NVME_CQE_SCT_PATH = 0x3,
NVME_CQE_SCT_VENDOR = 0x7,
} nvme_cqe_sct_t;
#define NVME_CQE_SCT_GENERIC 0x0
#define NVME_CQE_SCT_SPECIFIC 0x1
#define NVME_CQE_SCT_MDI 0x2
#define NVME_CQE_SCT_VENDOR 0x7
typedef enum {
NVME_CQE_SC_GEN_CMD_OK = 0x00,
NVME_CQE_SC_CMD_INVALID_OPCODE = 0x01,
NVME_CQE_SC_GEN_CMD_INVALID_FIELD = 0x02,
NVME_CQE_SC_GEN_CMD_CID_CONFLICT = 0x03,
NVME_CQE_SC_GEN_DATA_TRANSFER_ERR = 0x04,
NVME_CQE_SC_GEN_ABORT_DUE_TO_POWER_LOSS = 0x05,
NVME_CQE_SC_GEN_INTERNAL_ERROR = 0x06,
NVME_CQE_SC_GEN_ABORT_REQUESTED = 0x07,
NVME_CQE_SC_GEN_ABORT_DUE_TO_SQ_DELETE = 0x08,
NVME_CQE_SC_GEN_ABORT_DUE_TO_FAILED_FUSE = 0x09,
NVME_CQE_SC_GEN_ABORT_DUE_TO_MISSED_FUSE = 0x0A,
NVME_CQE_SC_GEN_INVALID_NAMESPACE_OR_FMT = 0x0B,
NVME_CQE_SC_GEN_COMMAND_SEQUENCE_ERR = 0x0C,
NVME_CQE_SC_GEN_INVALID_SGL_SD = 0x0D,
NVME_CQE_SC_GEN_INVALID_SGL_SD_NUM = 0x0E,
NVME_CQE_SC_GEN_INVALID_SGL_LEN = 0x0F,
NVME_CQE_SC_GEN_INVALID_MDATA_SGL_LEN = 0x10,
NVME_CQE_SC_GEN_INVALID_SGL_SD_TYPE = 0x11,
NVME_CQE_SC_GEN_INVALID_USE_OF_MC_BUF = 0x12,
NVME_CQE_SC_GEN_INVALID_PRP_OFFSET = 0x13,
NVME_CQE_SC_GEN_ATOMIC_WRITE_UNIT_EXCEED = 0x14,
NVME_CQE_SC_GEN_OPERATION_DENIED = 0x15,
NVME_CQE_SC_GEN_INVALID_SGL_OFFSET = 0x16,
NVME_CQE_SC_GEN_RESERVED_17H = 0x17,
NVME_CQE_SC_GEN_HOST_ID_INVALID_FMT = 0x18,
NVME_CQE_SC_GEN_KEEP_ALLIVE_EXPIRED = 0x19,
NVME_CQE_SC_GEN_KEEP_ALIVE_INVALID = 0x1A,
NVME_CQE_SC_GEN_ABORT_DUE_TO_PREEMPT_ABRT = 0x1B,
NVME_CQE_SC_GEN_SANITIZE_FAILED = 0x1C,
NVME_CQE_SC_GEN_SANITZE_IN_PROGRESS = 0x1D,
NVME_CQE_SC_GEN_SGL_BLOCK_GRAN_INVALID = 0x1E,
NVME_CQE_SC_GEN_CMD_NOT_SUPP_IN_CMB = 0x1F,
NVME_CQE_SC_GEN_NAMESPACE_IS_WP = 0x20,
NVME_CQE_SC_GEN_COMMAND_INTERRUPTED = 0x21,
NVME_CQE_SC_GEN_TRANSIENT_TRASPORT_ERROR = 0x22,
NVME_CQE_SC_GEN_LBA_OUT_OF_RANGE = 0x80,
NVME_CQE_SC_GEN_CAPACITY_EXCEED = 0x81,
NVME_CQE_SC_GEN_NAMESPACE_NOT_ERADY = 0x82,
NVME_CQE_SC_GEN_RESERVATION_CONFLICT = 0x83,
NVME_CQE_SC_GEN_FMT_IN_PROGRESS = 0x84,
} nvme_cqe_sc_gen_t;
#define NVME_CQE_SCODE_SUCCESS 0x0
#define NVME_CQE_SCODE_INVALID_OPCODE 0x1
#define NVME_CQE_SCODE_INVALID_FIELD 0x2
#define NVME_CQE_SCODE_CID_CONFLICT 0x3
#define NVME_CQE_SCODE_DATA_XFER_ERR 0x4
#define NVME_CQE_SCODE_CMD_ABORTED 0x5
#define NVME_CQE_SCODE_INTERNAL_ERR 0x6
#define NVME_CQE_SCODE_CMD_ABORT_REQ 0x7
#define NVME_CQE_SCODE_CMD_ABORT_SQD 0x8
#define NVME_CQE_SCODE_CMD_ABORT_FF 0x9
#define NVME_CQE_SCODE_CMD_ABORT_MF 0xa
#define NVME_CQE_SCODE_INVALID_NS 0xb
#define NVME_CQE_SCODE_CMD_SEQ_ERR 0xc
typedef enum {
NVME_CQE_SC_CMD_INVALID_CQ = 0x00,
NVME_CQE_SC_CMD_INVALID_QID = 0x01,
NVME_CQE_SC_CMD_INVALID_QUEUE_SIZE = 0x02,
NVME_CQE_SC_CMD_ABORT_LIMIT_EXCEED = 0x03,
NVME_CQE_SC_CMD_RESERVED_4H = 0x04,
NVME_CQE_SC_CMD_ASYNC_REQ_LIMIT_EXCEED = 0x05,
NVME_CQE_SC_CMD_INVALID_FW_SLOT = 0x06,
NVME_CQE_SC_CMD_INVALID_FW_IMAGE = 0x07,
NVME_CQE_SC_CMD_INVALID_IRQ_VECTOR = 0x08,
NVME_CQE_SC_CMD_INVALID_LOG_PAGE = 0x09,
NVME_CQE_SC_CMD_INVALID_FMT = 0x0A,
NVME_CQE_SC_CMD_FW_ACTIVATION_NEEDS_RESET = 0x0B,
NVME_CQE_SC_CMD_INVALID_QUEUE_DELETE = 0x0C,
NVME_CQE_SC_CMD_FEATURE_ID_NOT_SAVEABLE = 0x0D,
NVME_CQE_SC_CMD_FEATURE_NOT_CHANGEABLE = 0x0E,
NVME_CQE_SC_CMD_FEATURE_NOT_NAMESPACE = 0x0F,
NVME_CQE_SC_CMD_FEATURE_ACTIVATION_NEEDS_NVM_RESET = 0x10,
NVME_CQE_SC_CMD_FEATURE_ACTIVATION_NEEDS_CNTRL_RESET = 0x11,
NVME_CQE_SC_CMD_FW_ACTIVATION_NEED_MAX_TIME = 0x12,
NVME_CQE_SC_CMD_FW_ACTIVATION_PROHIBITED = 0x13,
NVME_CQE_SC_CMD_OVERLAPPING_RANGE = 0x14,
NVME_CQE_SC_CMD_NAMESPACE_INSUF_CAPACITY = 0x15,
NVME_CQE_SC_CMD_NAMESPACE_ID_NOT_AVAILABLE = 0x16,
NVME_CQE_SC_CMD_RESERVED_17H = 0x17,
NVME_CQE_SC_CMD_NAMESPACE_ALREADY_ATATCHED = 0x18,
NVME_CQE_SC_CMD_NAMESPACE_IS_PRIVATE = 0x19,
NVME_CQE_SC_CMD_NAMESPACE_NOT_ATTACHED = 0x1A,
NVME_CQE_SC_CMD_THIN_PROVISION_NOT_SUPP = 0x1B,
NVME_CQE_SC_CMD_INVALID_CNTRL_LIST = 0x1C,
NVME_CQE_SC_CMD_SELF_TEST_IN_PROGRESS = 0x1D,
NVME_CQE_SC_CMD_BOOT_PART_WRITE_PROHIBIT = 0x1E,
NVME_CQE_SC_CMD_INVALID_CNTRL_ID = 0x1F,
NVME_CQE_SC_CMD_INVALID_SECOND_CNTRL_STATE = 0x20,
NVME_CQE_SC_CMD_IBVALID_CNRL_RES_NUM = 0x21,
NVME_CQE_SC_CMD_INVALID_RESOURSE_ID = 0x22,
NVME_CQE_SC_CMD_SANITIZE_PROHIBIT_WITH_PMR = 0x23,
NVME_CQE_SC_CMD_INVALID_ANA_GROUP_ID = 0x24,
NVME_CQE_SC_CMD_ANA_ATTACH_FAILED = 0x25,
NVME_CQE_SC_CMD_CONFLICTING_ATTRS = 0x80,
NVME_CQE_SC_CMD_INVALID_PROTECTION_INF = 0x81,
NVME_CQE_SC_CMD_WRITE_TO_RO_REGION = 0x82,
} nvme_cqe_sc_cmd_t;
#define NVME_CQE_SCODE_INVALID_SGL_DESC 0xd
#define NVME_CQE_SCODE_INVALID_NUM_SGLS 0xe
#define NVME_CQE_SCODE_INVALID_SGL_LEN 0xf
#define NVME_CQE_SCODE_INVALID_MD_SGL_LEN 0x10
#define NVME_CQE_SCODE_INVALID_SGL_DESC_TYPE 0x11
#define NVME_CQE_SCODE_INVALID_CMB_USE 0x12
#define NVME_CQE_SCODE_INVALID_PRP_OFFSET 0x13
#define NVME_CQE_SCODE_INVALID_ATOMIC_WRITE_EXCEEDED 0x14
#define NVME_CQE_SCODE_INVALID_SGL_OFFSET 0x16
#define NVME_CQE_SCODE_INVALID_SGL_SUB_TYPE 0x17
#define NVME_CQE_SCODE_INVALID_INCONSISTENT_HOSTID 0x18
#define NVME_CQE_SCODE_INVALID_KA_TIMER_EXPIRED 0x19
#define NVME_CQE_SCODE_INVALID_KA_TIMEOUT_INVALID 0x1a
typedef enum {
NVME_CQE_SC_MEDIA_WRITE_FAULT = 0x80,
NVME_CQE_SC_MEDIA_READ_FAULT = 0x81,
NVME_CQE_SC_MEDIA_ETE_GUARD_CHECK_ERR = 0x82,
NVME_CQE_SC_MEDIA_ETE_APPTAG_CHECK_ERR = 0x83,
NVME_CQE_SC_MEDIA_ETE_REFTAG_CHECK_ERR = 0x84,
NVME_CQE_SC_MEDIA_COMPARE_FAILURE = 0x85,
NVME_CQE_SC_MEDIA_ACCESS_DENIED = 0x86,
NVME_CQE_SC_MEDIA_DEALLOCATED_LBA = 0x87,
} nvme_cqe_sc_media_t;
typedef enum {
NVME_CQE_SC_PATH_INTERNAL_PATH_ERROR = 0x00,
NVME_CQE_SC_PATH_ANA_PERSISTENT_LOSS = 0x01,
NVME_CQE_SC_PATH_ANA_INACCESSIBLE = 0x02,
NVME_CQE_SC_PATH_ANA_TRANSIENT = 0x03,
NVME_CQE_SC_PATH_CNTRL_PATH_ERROR = 0x60,
NVME_CQE_SC_PATH_HOST_PATH_ERROR = 0x70,
NVME_CQE_SC_PATH_CMD_ABORT = 0x71,
} nvme_cqe_sc_path_t;
static const value_string nvme_cqe_sct_tbl[] = {
{ NVME_CQE_SCT_GENERIC, "Generic Command Status" },
{ NVME_CQE_SCT_COMMAND, "Command Specific Status" },
{ NVME_CQE_SCT_MEDIA, "Media and Data Integrity Errors" },
{ NVME_CQE_SCT_PATH, "Path Related Status" },
{ NVME_CQE_SCT_VENDOR, "Vendor Specific" },
{ 0, NULL },
};
static const value_string nvme_cqe_sc_gen_tbl[] = {
{ NVME_CQE_SC_GEN_CMD_OK, "Successful Completion" },
{ NVME_CQE_SC_CMD_INVALID_OPCODE, "Invalid opcode field" },
{ NVME_CQE_SC_GEN_CMD_INVALID_FIELD, "Invalid Field in Command" },
{ NVME_CQE_SC_GEN_CMD_CID_CONFLICT, "Command ID Conflict" },
{ NVME_CQE_SC_GEN_DATA_TRANSFER_ERR, "Data Transfer Error" },
{ NVME_CQE_SC_GEN_ABORT_DUE_TO_POWER_LOSS, "Commands Aborted due to Power Loss Notification" },
{ NVME_CQE_SC_GEN_INTERNAL_ERROR, "Internal Error" },
{ NVME_CQE_SC_GEN_ABORT_REQUESTED, "Command Abort Requested" },
{ NVME_CQE_SC_GEN_ABORT_DUE_TO_SQ_DELETE, "Command Aborted due to SQ Deletion" },
{ NVME_CQE_SC_GEN_ABORT_DUE_TO_FAILED_FUSE, "Command Aborted due to Failed Fused Command" },
{ NVME_CQE_SC_GEN_ABORT_DUE_TO_MISSED_FUSE, "Command Aborted due to Missing Fused Command" },
{ NVME_CQE_SC_GEN_INVALID_NAMESPACE_OR_FMT, "Invalid Namespace or Format" },
{ NVME_CQE_SC_GEN_COMMAND_SEQUENCE_ERR, "Command Sequence Error" },
{ NVME_CQE_SC_GEN_INVALID_SGL_SD, "Invalid SGL Segment Descriptor" },
{ NVME_CQE_SC_GEN_INVALID_SGL_SD_NUM, "Invalid Number of SGL Descriptors" },
{ NVME_CQE_SC_GEN_INVALID_SGL_LEN, "Data SGL Length Invalid" },
{ NVME_CQE_SC_GEN_INVALID_MDATA_SGL_LEN, "Metadata SGL Length Invalid" },
{ NVME_CQE_SC_GEN_INVALID_SGL_SD_TYPE, "SGL Descriptor Type Invalid" },
{ NVME_CQE_SC_GEN_INVALID_USE_OF_MC_BUF, "Invalid Use of Controller Memory Buffer" },
{ NVME_CQE_SC_GEN_INVALID_PRP_OFFSET, "PRP Offset Invalid" },
{ NVME_CQE_SC_GEN_ATOMIC_WRITE_UNIT_EXCEED, "Atomic Write Unit Exceeded" },
{ NVME_CQE_SC_GEN_OPERATION_DENIED, "Operation Denied" },
{ NVME_CQE_SC_GEN_INVALID_SGL_OFFSET, "SGL Offset Invalid" },
{ NVME_CQE_SC_GEN_RESERVED_17H, "Reserved" },
{ NVME_CQE_SC_GEN_HOST_ID_INVALID_FMT, "Host Identifier Inconsistent Format" },
{ NVME_CQE_SC_GEN_KEEP_ALLIVE_EXPIRED, "Keep Alive Timer Expired" },
{ NVME_CQE_SC_GEN_KEEP_ALIVE_INVALID, "Keep Alive Timeout Invalid" },
{ NVME_CQE_SC_GEN_ABORT_DUE_TO_PREEMPT_ABRT, "Command Aborted due to Preempt and Abort" },
{ NVME_CQE_SC_GEN_SANITIZE_FAILED, "Sanitize Failed" },
{ NVME_CQE_SC_GEN_SANITZE_IN_PROGRESS,"Sanitize In Progress" },
{ NVME_CQE_SC_GEN_SGL_BLOCK_GRAN_INVALID, "SGL Data Block Granularity Invalid" },
{ NVME_CQE_SC_GEN_CMD_NOT_SUPP_IN_CMB, "Command Not Supported for Queue in CMB" },
{ NVME_CQE_SC_GEN_NAMESPACE_IS_WP, "Namespace is Write Protected" },
{ NVME_CQE_SC_GEN_COMMAND_INTERRUPTED,"Command Interrupted" },
{ NVME_CQE_SC_GEN_TRANSIENT_TRASPORT_ERROR, "Transient Transport Error"},
{ NVME_CQE_SC_GEN_LBA_OUT_OF_RANGE, "LBA Out of Range" },
{ NVME_CQE_SC_GEN_CAPACITY_EXCEED, "Capacity Exceeded" },
{ NVME_CQE_SC_GEN_NAMESPACE_NOT_ERADY, "Namespace Not Ready" },
{ NVME_CQE_SC_GEN_RESERVATION_CONFLICT, "Reservation Conflict" },
{ NVME_CQE_SC_GEN_FMT_IN_PROGRESS, "Format In Progress"},
{ 0, NULL },
};
static const value_string nvme_cqe_sc_cmd_tbl[] = {
{ NVME_CQE_SC_CMD_INVALID_CQ, "Completion Queue Invalid" },
{ NVME_CQE_SC_CMD_INVALID_QID, "Invalid Queue Identifier" },
{ NVME_CQE_SC_CMD_INVALID_QUEUE_SIZE, "Invalid Queue Size" },
{ NVME_CQE_SC_CMD_ABORT_LIMIT_EXCEED, "Abort Command Limit Exceeded" },
{ NVME_CQE_SC_CMD_RESERVED_4H, "Reserved" },
{ NVME_CQE_SC_CMD_ASYNC_REQ_LIMIT_EXCEED, "Asynchronous Event Request Limit Exceeded" },
{ NVME_CQE_SC_CMD_INVALID_FW_SLOT, "Invalid Firmware Slot" },
{ NVME_CQE_SC_CMD_INVALID_FW_IMAGE, "Invalid Firmware Image" },
{ NVME_CQE_SC_CMD_INVALID_IRQ_VECTOR, "Invalid Interrupt Vector" },
{ NVME_CQE_SC_CMD_INVALID_LOG_PAGE, "Invalid Log Page" },
{ NVME_CQE_SC_CMD_INVALID_FMT, "Invalid Format" },
{ NVME_CQE_SC_CMD_FW_ACTIVATION_NEEDS_RESET, "Firmware Activation Requires Conventional Reset" },
{ NVME_CQE_SC_CMD_INVALID_QUEUE_DELETE, "Invalid Queue Deletion" },
{ NVME_CQE_SC_CMD_FEATURE_ID_NOT_SAVEABLE, "Feature Identifier Not Saveable" },
{ NVME_CQE_SC_CMD_FEATURE_NOT_CHANGEABLE, "Feature Not Changeable" },
{ NVME_CQE_SC_CMD_FEATURE_NOT_NAMESPACE, "Feature Not Namespace Specific" },
{ NVME_CQE_SC_CMD_FEATURE_ACTIVATION_NEEDS_NVM_RESET, "Firmware Activation Requires NVM Subsystem Reset" },
{ NVME_CQE_SC_CMD_FEATURE_ACTIVATION_NEEDS_CNTRL_RESET, "Firmware Activation Requires Controller Level Reset" },
{ NVME_CQE_SC_CMD_FW_ACTIVATION_NEED_MAX_TIME, "Firmware Activation Requires Maximum Time Violation" },
{ NVME_CQE_SC_CMD_FW_ACTIVATION_PROHIBITED, "Firmware Activation Prohibited" },
{ NVME_CQE_SC_CMD_OVERLAPPING_RANGE, "Overlapping Range" },
{ NVME_CQE_SC_CMD_NAMESPACE_INSUF_CAPACITY, "Namespace Insufficient Capacity" },
{ NVME_CQE_SC_CMD_NAMESPACE_ID_NOT_AVAILABLE, "Namespace Identifier Unavailable" },
{ NVME_CQE_SC_CMD_RESERVED_17H, "Reserved" },
{ NVME_CQE_SC_CMD_NAMESPACE_ALREADY_ATATCHED, "Namespace Already Attached" },
{ NVME_CQE_SC_CMD_NAMESPACE_IS_PRIVATE, "Namespace Is Private" },
{ NVME_CQE_SC_CMD_NAMESPACE_NOT_ATTACHED, "Namespace Not Attached" },
{ NVME_CQE_SC_CMD_THIN_PROVISION_NOT_SUPP, "Thin Provisioning Not Supported" },
{ NVME_CQE_SC_CMD_INVALID_CNTRL_LIST, "Controller List Invalid" },
{ NVME_CQE_SC_CMD_SELF_TEST_IN_PROGRESS, "Device Self-test In Progress" },
{ NVME_CQE_SC_CMD_BOOT_PART_WRITE_PROHIBIT, "Boot Partition Write Prohibited" },
{ NVME_CQE_SC_CMD_INVALID_CNTRL_ID, "Invalid Controller Identifier" },
{ NVME_CQE_SC_CMD_INVALID_SECOND_CNTRL_STATE, "Invalid Secondary Controller State" },
{ NVME_CQE_SC_CMD_IBVALID_CNRL_RES_NUM, "Invalid Number of Controller Resources" },
{ NVME_CQE_SC_CMD_INVALID_RESOURSE_ID, "Invalid Resource Identifier" },
{ NVME_CQE_SC_CMD_SANITIZE_PROHIBIT_WITH_PMR, "Sanitize Prohibited While Persistent Memory Region is Enabled" },
{ NVME_CQE_SC_CMD_INVALID_ANA_GROUP_ID, "ANA Group Identifier Invalid" },
{ NVME_CQE_SC_CMD_ANA_ATTACH_FAILED, "ANA Attach Failed" },
{ NVME_CQE_SC_CMD_CONFLICTING_ATTRS, "Conflicting Attributes" },
{ NVME_CQE_SC_CMD_INVALID_PROTECTION_INF, "Invalid Protection Information" },
{ NVME_CQE_SC_CMD_WRITE_TO_RO_REGION, "Attempted Write to Read Only Range" },
{ 0, NULL },
};
static const value_string nvme_cqe_sc_media_tbl[] = {
{ NVME_CQE_SC_MEDIA_WRITE_FAULT, "Write Fault" },
{ NVME_CQE_SC_MEDIA_READ_FAULT, "Unrecovered Read Error" },
{ NVME_CQE_SC_MEDIA_ETE_GUARD_CHECK_ERR, "End-to-end Guard Check Error" },
{ NVME_CQE_SC_MEDIA_ETE_APPTAG_CHECK_ERR, "End-to-end Application Tag Check Error" },
{ NVME_CQE_SC_MEDIA_ETE_REFTAG_CHECK_ERR, "End-to-end Reference Tag Check Error" },
{ NVME_CQE_SC_MEDIA_COMPARE_FAILURE, "Compare Failure" },
{ NVME_CQE_SC_MEDIA_ACCESS_DENIED, "Access Denied" },
{ NVME_CQE_SC_MEDIA_DEALLOCATED_LBA, "Deallocated or Unwritten Logical Block" },
{ 0, NULL },
};
static const value_string nvme_cqe_sc_path_tbl[] = {
{ NVME_CQE_SC_PATH_INTERNAL_PATH_ERROR, "Internal Path Error" },
{ NVME_CQE_SC_PATH_ANA_PERSISTENT_LOSS, "Asymmetric Access Persistent Loss" },
{ NVME_CQE_SC_PATH_ANA_INACCESSIBLE, "Asymmetric Access Inaccessible" },
{ NVME_CQE_SC_PATH_ANA_TRANSIENT, "Asymmetric Access Transition" },
{ NVME_CQE_SC_PATH_CNTRL_PATH_ERROR, "Controller Pathing Error" },
{ NVME_CQE_SC_PATH_HOST_PATH_ERROR, "Host Pathing Error" },
{ NVME_CQE_SC_PATH_CMD_ABORT, "Command Aborted By Host" },
{ 0, NULL },
};
static const value_string aq_opc_tbl[] = {
{ NVME_AQ_OPC_DELETE_SQ, "Delete SQ"},
@ -2974,12 +3176,26 @@ nvme_is_io_queue_opcode(guint8 opcode)
(opcode == NVME_IOQ_OPC_RESV_RELEASE));
}
static const char *get_cqe_sc_string(guint sct, guint sc)
{
switch (sct) {
case NVME_CQE_SCT_GENERIC: return val_to_str_const(sc, nvme_cqe_sc_gen_tbl, "Uknown Status Code");
case NVME_CQE_SCT_COMMAND: return val_to_str_const(sc, nvme_cqe_sc_cmd_tbl, "Uknown Status Code");
case NVME_CQE_SCT_MEDIA: return val_to_str_const(sc, nvme_cqe_sc_media_tbl, "Uknown Status Code");
case NVME_CQE_SCT_PATH: return val_to_str_const(sc, nvme_cqe_sc_path_tbl, "Uknown Status Code");
case NVME_CQE_SCT_VENDOR: return "Vendor Error";
default: return "Uknown Status Code";
}
}
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;
proto_item *ti, *grp;
guint i;
guint16 val;
col_set_str(pinfo->cinfo, COL_PROTOCOL, "NVMe");
ti = proto_tree_add_item(root_tree, proto_nvme, nvme_tvb, 0,
@ -2990,18 +3206,20 @@ dissect_nvme_cqe(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_tree,
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);
proto_tree_add_item(cqe_tree, hf_nvme_cqe_sts, nvme_tvb,
0, 8, 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_rsvd, nvme_tvb,
10, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cqe_tree, hf_nvme_cqe_cid, nvme_tvb,
12, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cqe_tree, hf_nvme_cqe_status, nvme_tvb,
14, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cqe_tree, hf_nvme_cqe_status_rsvd, nvme_tvb,
14, 2, ENC_LITTLE_ENDIAN);
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_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);
val = tvb_get_guint16(nvme_tvb, 14, ENC_LITTLE_ENDIAN);
ti = proto_tree_add_item(root_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));
}
}
void
@ -5855,30 +6073,54 @@ proto_register_nvme(void)
FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
},
/* NVMe Response fields */
{ &hf_nvme_cqe_sts,
{ "Cmd specific Status", "nvme.cqe.sts",
FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
{ &hf_nvme_cqe_dword0,
{ "DWORD0", "nvme.cqe.dword0",
FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvme_cqe_dword1,
{ "DWORD1", "nvme.cqe.dword1",
FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvme_cqe_sqhd,
{ "SQ Head Pointer", "nvme.cqe.sqhd",
FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvme_cqe_rsvd,
{ "Reserved", "nvme.cqe.rsvd",
{ &hf_nvme_cqe_sqid,
{ "SQ Identifier", "nvme.cqe.sqid",
FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvme_cqe_cid,
{ "Command ID", "nvme.cqe.cid",
{ "Command Identifier", "nvme.cqe.cid",
FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvme_cqe_status,
{ "Status", "nvme.cqe.status",
FT_UINT16, BASE_HEX, NULL, 0xfffe, NULL, HFILL}
{ &hf_nvme_cqe_status[0],
{ "Status Field", "nvme.cqe.status",
FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvme_cqe_status_rsvd,
{ "Reserved", "nvme.cqe.status.rsvd",
{ &hf_nvme_cqe_status[1],
{ "Phase Tag", "nvme.cqe.status.p",
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}
},
{ &hf_nvme_cqe_status[3],
{ "Status Code Type", "nvme.cqe.status.sct",
FT_UINT16, BASE_HEX, VALS(nvme_cqe_sct_tbl), 0xE00, NULL, HFILL}
},
{ &hf_nvme_cqe_status[4],
{ "Command Retry Delay", "nvme.cqe.status.crd",
FT_UINT16, BASE_HEX, NULL, 0x3000, NULL, HFILL}
},
{ &hf_nvme_cqe_status[5],
{ "More Infornation in Log Page", "nvme.cqe.status.m",
FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL}
},
{ &hf_nvme_cqe_status[6],
{ "Do not Retry", "nvme.cqe.status.dnr",
FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL}
},
{ &hf_nvme_cmd_pkt,
{ "Cmd in", "nvme.cmd_pkt",
FT_FRAMENUM, BASE_NONE, NULL, 0,