Commit 1e714cfe authored by Daniel Verkamp's avatar Daniel Verkamp
Browse files

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: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/376020


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarZiye Yang <optimistyzy@gmail.com>
parent e83f9767
Loading
Loading
Loading
Loading
+9 −21
Original line number Diff line number Diff line
@@ -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;
		}
	}
+15 −0
Original line number Diff line number Diff line
@@ -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
+3 −14
Original line number Diff line number Diff line
@@ -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;
	}