static void test_nvmf_process_discovery_cmd(void) { struct spdk_nvmf_request req = {}; int ret; /* random request length value for testing */ int req_length = 122; struct spdk_nvmf_conn req_conn = {}; struct spdk_nvmf_session req_sess = {}; struct spdk_nvme_ctrlr_data req_data = {}; struct spdk_nvmf_discovery_log_page req_page = {}; union nvmf_h2c_msg req_cmd = {}; union nvmf_c2h_msg req_rsp = {}; req.conn = &req_conn; req.cmd = &req_cmd; req.rsp = &req_rsp; /* no request data check */ ret = nvmf_process_discovery_cmd(&req); CU_ASSERT_EQUAL(ret, SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); CU_ASSERT_EQUAL(req.rsp->nvme_cpl.status.sc, SPDK_NVME_SC_INVALID_FIELD); /* IDENTIFY opcode return value check */ req.cmd->nvme_cmd.opc = SPDK_NVME_OPC_IDENTIFY; req.cmd->nvme_cmd.cdw10 = SPDK_NVME_IDENTIFY_CTRLR; req.conn->sess = &req_sess; req.data = &req_data; ret = nvmf_process_discovery_cmd(&req); CU_ASSERT_EQUAL(req.rsp->nvme_cpl.status.sc, SPDK_NVME_SC_SUCCESS); CU_ASSERT_EQUAL(ret, SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); /* GET_LOG_PAGE opcode return value check */ req.cmd->nvme_cmd.opc = SPDK_NVME_OPC_GET_LOG_PAGE; req.cmd->nvme_cmd.cdw10 = SPDK_NVME_LOG_DISCOVERY; req.data = &req_page; req.length = req_length; ret = nvmf_process_discovery_cmd(&req); CU_ASSERT_EQUAL(req.rsp->nvme_cpl.status.sc, SPDK_NVME_SC_SUCCESS); CU_ASSERT_EQUAL(ret, SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); req.cmd->nvme_cmd.cdw10 = 15; ret = nvmf_process_discovery_cmd(&req); CU_ASSERT_EQUAL(req.rsp->nvme_cpl.status.sc, SPDK_NVME_SC_INVALID_FIELD); CU_ASSERT_EQUAL(ret, SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); /* Invalid opcode return value check */ req.cmd->nvme_cmd.opc = 100; ret = nvmf_process_discovery_cmd(&req); CU_ASSERT_EQUAL(req.rsp->nvme_cpl.status.sc, SPDK_NVME_SC_INVALID_OPCODE); CU_ASSERT_EQUAL(ret, SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); }
int spdk_nvmf_request_exec(struct spdk_nvmf_request *req) { struct spdk_nvmf_session *session = req->conn->sess; struct spdk_nvme_cmd *cmd = &req->cmd->nvme_cmd; struct spdk_nvme_cpl *rsp = &req->rsp->nvme_cpl; spdk_nvmf_request_exec_status status; nvmf_trace_command(req->cmd, req->conn->type); if (cmd->opc == SPDK_NVME_OPC_FABRIC) { status = nvmf_process_fabrics_command(req); } else if (session == NULL || !session->vcprop.cc.bits.en) { /* Only Fabric commands are allowed when the controller is disabled */ SPDK_ERRLOG("Non-Fabric command sent to disabled controller\n"); rsp->status.sc = SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR; status = SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; } else if (req->conn->type == CONN_TYPE_AQ) { struct spdk_nvmf_subsystem *subsystem; subsystem = session->subsys; assert(subsystem != NULL); if (subsystem->subtype == SPDK_NVMF_SUBTYPE_DISCOVERY) { status = nvmf_process_discovery_cmd(req); } else { status = session->subsys->ops->process_admin_cmd(req); } } else { status = session->subsys->ops->process_io_cmd(req); } switch (status) { case SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE: return spdk_nvmf_request_complete(req); case SPDK_NVMF_REQUEST_EXEC_STATUS_RELEASE: if (req->conn->transport->req_release(req)) { SPDK_ERRLOG("Transport request release error!\n"); return -1; } return 0; case SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS: return 0; default: SPDK_ERRLOG("Unknown request exec status: 0x%x\n", status); return -1; } return 0; }