Commit 6ca517d4 authored by Daniel Verkamp's avatar Daniel Verkamp
Browse files

nvmf: split subsystem lookup from host check



This allows us to print better error messages when connecting to a
subsystem that exists but does not allow a specific host.

Additionally, we can now return the correct error code for a host that
is not allowed.

Change-Id: I16cd4ac2745cf50bb54601b464b0d23954f86fda
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent aa3d7381
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -167,9 +167,12 @@ struct spdk_nvmf_subsystem *spdk_nvmf_create_subsystem(const char *nqn,
void spdk_nvmf_delete_subsystem(struct spdk_nvmf_subsystem *subsystem);

struct spdk_nvmf_subsystem *
nvmf_find_subsystem(const char *subnqn, const char *hostnqn);
nvmf_find_subsystem(const char *subnqn);

bool spdk_nvmf_subsystem_exists(const char *subnqn);

bool spdk_nvmf_subsystem_host_allowed(struct spdk_nvmf_subsystem *subsystem, const char *hostnqn);

int
spdk_nvmf_subsystem_add_listener(struct spdk_nvmf_subsystem *subsystem,
				 char *trname, char *traddr, char *trsvcid);
+9 −2
Original line number Diff line number Diff line
@@ -215,14 +215,21 @@ nvmf_process_connect(struct spdk_nvmf_request *req)
		INVALID_CONNECT_DATA(hostnqn);
		return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
	}
	/* Look up the requested subsystem */
	subsystem = nvmf_find_subsystem(data->subnqn, data->hostnqn);

	subsystem = nvmf_find_subsystem(data->subnqn);
	if (subsystem == NULL) {
		SPDK_ERRLOG("Could not find subsystem '%s'\n", data->subnqn);
		INVALID_CONNECT_DATA(subnqn);
		return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
	}

	if (!spdk_nvmf_subsystem_host_allowed(subsystem, data->hostnqn)) {
		SPDK_ERRLOG("Subsystem '%s' does not allow host '%s'\n", data->subnqn, data->hostnqn);
		rsp->status.sct = SPDK_NVME_SCT_COMMAND_SPECIFIC;
		rsp->status.sc = SPDK_NVMF_FABRIC_SC_INVALID_HOST;
		return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
	}

	subsystem->connect_cb(subsystem->cb_ctx, req);

	return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS;
+1 −1
Original line number Diff line number Diff line
@@ -217,7 +217,7 @@ spdk_nvmf_session_connect(struct spdk_nvmf_conn *conn,
	SPDK_TRACELOG(SPDK_TRACE_NVMF, "  subnqn: \"%s\"\n", data->subnqn);
	SPDK_TRACELOG(SPDK_TRACE_NVMF, "  hostnqn: \"%s\"\n", data->hostnqn);

	subsystem = nvmf_find_subsystem(data->subnqn, data->hostnqn);
	subsystem = nvmf_find_subsystem(data->subnqn);
	if (subsystem == NULL) {
		SPDK_ERRLOG("Could not find subsystem '%s'\n", data->subnqn);
		INVALID_CONNECT_DATA(subnqn);
+26 −13
Original line number Diff line number Diff line
@@ -66,31 +66,44 @@ spdk_nvmf_subsystem_exists(const char *subnqn)
}

struct spdk_nvmf_subsystem *
nvmf_find_subsystem(const char *subnqn, const char *hostnqn)
nvmf_find_subsystem(const char *subnqn)
{
	struct spdk_nvmf_subsystem	*subsystem;
	struct spdk_nvmf_host		*host;

	if (!subnqn || !hostnqn) {
	if (!subnqn) {
		return NULL;
	}

	TAILQ_FOREACH(subsystem, &g_subsystems, entries) {
		if (strcmp(subnqn, subsystem->subnqn) == 0) {
			return subsystem;
		}
	}

	return NULL;
}

bool
spdk_nvmf_subsystem_host_allowed(struct spdk_nvmf_subsystem *subsystem, const char *hostnqn)
{
	struct spdk_nvmf_host *host;

	if (!hostnqn) {
		return false;
	}

	if (subsystem->num_hosts == 0) {
		/* No hosts means any host can connect */
				return subsystem;
		return true;
	}

	TAILQ_FOREACH(host, &subsystem->hosts, link) {
		if (strcmp(hostnqn, host->nqn) == 0) {
					return subsystem;
				}
			}
			return true;
		}
	}

	return NULL;
	return false;
}

void
+7 −1
Original line number Diff line number Diff line
@@ -124,11 +124,17 @@ spdk_format_discovery_log(struct spdk_nvmf_discovery_log_page *disc_log, uint32_
}

struct spdk_nvmf_subsystem *
nvmf_find_subsystem(const char *subnqn, const char *hostnqn)
nvmf_find_subsystem(const char *subnqn)
{
	return NULL;
}

bool
spdk_nvmf_subsystem_host_allowed(struct spdk_nvmf_subsystem *subsystem, const char *hostnqn)
{
	return false;
}

static void
test_nvmf_process_discovery_cmd(void)
{
Loading