nvmf: factor out invalid connect response helpers

These were duplicated in ctrlr.c and request.c; pull them into
nvmf_internal.h so there's only one copy.

Change-Id: I00d499dd17689e907c182d01e61bde075d217af8
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/376020
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ziye Yang <optimistyzy@gmail.com>
This commit is contained in:
Daniel Verkamp 2017-08-28 12:36:22 -07:00
parent e83f976743
commit 1e714cfe22
3 changed files with 27 additions and 35 deletions

View File

@ -154,15 +154,6 @@ spdk_nvmf_ctrlr_destruct(struct spdk_nvmf_ctrlr *ctrlr)
ctrlr_destruct(ctrlr);
}
static void
invalid_connect_response(struct spdk_nvmf_fabric_connect_rsp *rsp, uint8_t iattr, uint16_t ipo)
{
rsp->status.sct = SPDK_NVME_SCT_COMMAND_SPECIFIC;
rsp->status.sc = SPDK_NVMF_FABRIC_SC_INVALID_PARAM;
rsp->status_code_specific.invalid.iattr = iattr;
rsp->status_code_specific.invalid.ipo = ipo;
}
void
spdk_nvmf_ctrlr_connect(struct spdk_nvmf_qpair *qpair,
struct spdk_nvmf_fabric_connect_cmd *cmd,
@ -173,9 +164,6 @@ spdk_nvmf_ctrlr_connect(struct spdk_nvmf_qpair *qpair,
struct spdk_nvmf_ctrlr *ctrlr;
struct spdk_nvmf_subsystem *subsystem;
#define INVALID_CONNECT_CMD(field) invalid_connect_response(rsp, 0, offsetof(struct spdk_nvmf_fabric_connect_cmd, field))
#define INVALID_CONNECT_DATA(field) invalid_connect_response(rsp, 1, offsetof(struct spdk_nvmf_fabric_connect_data, field))
SPDK_DEBUGLOG(SPDK_TRACE_NVMF, "recfmt 0x%x qid %u sqsize %u\n",
cmd->recfmt, cmd->qid, cmd->sqsize);
@ -200,7 +188,7 @@ spdk_nvmf_ctrlr_connect(struct spdk_nvmf_qpair *qpair,
subsystem = spdk_nvmf_tgt_find_subsystem(tgt, data->subnqn);
if (subsystem == NULL) {
SPDK_ERRLOG("Could not find subsystem '%s'\n", data->subnqn);
INVALID_CONNECT_DATA(subnqn);
SPDK_NVMF_INVALID_CONNECT_DATA(rsp, subnqn);
return;
}
@ -211,7 +199,7 @@ spdk_nvmf_ctrlr_connect(struct spdk_nvmf_qpair *qpair,
if (cmd->sqsize == 0 || cmd->sqsize >= tgt->opts.max_queue_depth) {
SPDK_ERRLOG("Invalid SQSIZE %u (min 1, max %u)\n",
cmd->sqsize, tgt->opts.max_queue_depth - 1);
INVALID_CONNECT_CMD(sqsize);
SPDK_NVMF_INVALID_CONNECT_CMD(rsp, sqsize);
return;
}
qpair->sq_head_max = cmd->sqsize;
@ -225,7 +213,7 @@ spdk_nvmf_ctrlr_connect(struct spdk_nvmf_qpair *qpair,
if (data->cntlid != 0xFFFF) {
/* This NVMf target only supports dynamic mode. */
SPDK_ERRLOG("The NVMf target only supports dynamic mode (CNTLID = 0x%x).\n", data->cntlid);
INVALID_CONNECT_DATA(cntlid);
SPDK_NVMF_INVALID_CONNECT_DATA(rsp, cntlid);
return;
}
@ -251,33 +239,33 @@ spdk_nvmf_ctrlr_connect(struct spdk_nvmf_qpair *qpair,
}
if (ctrlr == NULL) {
SPDK_ERRLOG("Unknown controller ID 0x%x\n", data->cntlid);
INVALID_CONNECT_DATA(cntlid);
SPDK_NVMF_INVALID_CONNECT_DATA(rsp, cntlid);
return;
}
if (ctrlr->subsys->subtype == SPDK_NVMF_SUBTYPE_DISCOVERY) {
SPDK_ERRLOG("I/O connect not allowed on discovery controller\n");
INVALID_CONNECT_CMD(qid);
SPDK_NVMF_INVALID_CONNECT_CMD(rsp, qid);
return;
}
if (!ctrlr->vcprop.cc.bits.en) {
SPDK_ERRLOG("Got I/O connect before ctrlr was enabled\n");
INVALID_CONNECT_CMD(qid);
SPDK_NVMF_INVALID_CONNECT_CMD(rsp, qid);
return;
}
if (1u << ctrlr->vcprop.cc.bits.iosqes != sizeof(struct spdk_nvme_cmd)) {
SPDK_ERRLOG("Got I/O connect with invalid IOSQES %u\n",
ctrlr->vcprop.cc.bits.iosqes);
INVALID_CONNECT_CMD(qid);
SPDK_NVMF_INVALID_CONNECT_CMD(rsp, qid);
return;
}
if (1u << ctrlr->vcprop.cc.bits.iocqes != sizeof(struct spdk_nvme_cpl)) {
SPDK_ERRLOG("Got I/O connect with invalid IOCQES %u\n",
ctrlr->vcprop.cc.bits.iocqes);
INVALID_CONNECT_CMD(qid);
SPDK_NVMF_INVALID_CONNECT_CMD(rsp, qid);
return;
}
@ -290,7 +278,7 @@ spdk_nvmf_ctrlr_connect(struct spdk_nvmf_qpair *qpair,
}
if (spdk_nvmf_poll_group_add(ctrlr->group, qpair)) {
INVALID_CONNECT_CMD(qid);
SPDK_NVMF_INVALID_CONNECT_CMD(rsp, qid);
return;
}
}

View File

@ -259,6 +259,21 @@ _spdk_nvmf_subsystem_get_ns(struct spdk_nvmf_subsystem *subsystem, uint32_t nsid
return ns;
}
static inline void
spdk_nvmf_invalid_connect_response(struct spdk_nvmf_fabric_connect_rsp *rsp,
uint8_t iattr, uint16_t ipo)
{
rsp->status.sct = SPDK_NVME_SCT_COMMAND_SPECIFIC;
rsp->status.sc = SPDK_NVMF_FABRIC_SC_INVALID_PARAM;
rsp->status_code_specific.invalid.iattr = iattr;
rsp->status_code_specific.invalid.ipo = ipo;
}
#define SPDK_NVMF_INVALID_CONNECT_CMD(rsp, field) \
spdk_nvmf_invalid_connect_response(rsp, 0, offsetof(struct spdk_nvmf_fabric_connect_cmd, field))
#define SPDK_NVMF_INVALID_CONNECT_DATA(rsp, field) \
spdk_nvmf_invalid_connect_response(rsp, 1, offsetof(struct spdk_nvmf_fabric_connect_data, field))
#define OBJECT_NVMF_IO 0x30
#define TRACE_GROUP_NVMF 0x3

View File

@ -108,15 +108,6 @@ nvmf_process_property_set(struct spdk_nvmf_request *req)
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
}
static void
invalid_connect_response(struct spdk_nvmf_fabric_connect_rsp *rsp, uint8_t iattr, uint16_t ipo)
{
rsp->status.sct = SPDK_NVME_SCT_COMMAND_SPECIFIC;
rsp->status.sc = SPDK_NVMF_FABRIC_SC_INVALID_PARAM;
rsp->status_code_specific.invalid.iattr = iattr;
rsp->status_code_specific.invalid.ipo = ipo;
}
static spdk_nvmf_request_exec_status
nvmf_process_connect(struct spdk_nvmf_request *req)
{
@ -128,8 +119,6 @@ nvmf_process_connect(struct spdk_nvmf_request *req)
struct spdk_nvmf_fabric_connect_rsp *rsp = &req->rsp->connect_rsp;
void *end;
#define INVALID_CONNECT_DATA(field) invalid_connect_response(rsp, 1, offsetof(struct spdk_nvmf_fabric_connect_data, field))
if (cmd->recfmt != 0) {
SPDK_ERRLOG("Connect command unsupported RECFMT %u\n", cmd->recfmt);
rsp->status.sct = SPDK_NVME_SCT_COMMAND_SPECIFIC;
@ -147,14 +136,14 @@ nvmf_process_connect(struct spdk_nvmf_request *req)
end = memchr(data->subnqn, '\0', SPDK_NVMF_NQN_MAX_LEN + 1);
if (!end) {
SPDK_ERRLOG("Connect SUBNQN is not null terminated\n");
INVALID_CONNECT_DATA(subnqn);
SPDK_NVMF_INVALID_CONNECT_DATA(rsp, subnqn);
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
}
end = memchr(data->hostnqn, '\0', SPDK_NVMF_NQN_MAX_LEN + 1);
if (!end) {
SPDK_ERRLOG("Connect HOSTNQN is not null terminated\n");
INVALID_CONNECT_DATA(hostnqn);
SPDK_NVMF_INVALID_CONNECT_DATA(rsp, hostnqn);
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
}
@ -163,7 +152,7 @@ nvmf_process_connect(struct spdk_nvmf_request *req)
subsystem = spdk_nvmf_tgt_find_subsystem(tgt, data->subnqn);
if (subsystem == NULL) {
SPDK_ERRLOG("Could not find subsystem '%s'\n", data->subnqn);
INVALID_CONNECT_DATA(subnqn);
SPDK_NVMF_INVALID_CONNECT_DATA(rsp, subnqn);
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
}