Commit 656e443d authored by Ben Walker's avatar Ben Walker Committed by Jim Harris
Browse files

nvmf: spdk_nvmf_tgt_listen now takes a target parameter



Also, move the implementation into the appropriate
compilation unit.

Change-Id: Ie1c56bc5e077b81d744414716f9267ceaf591e49
Signed-off-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/375034


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 70bc390c
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -427,7 +427,7 @@ spdk_nvmf_construct_subsystem(const char *name, int32_t lcore,
		snprintf(trid.traddr, sizeof(trid.traddr), "%s", addresses[i].traddr);
		snprintf(trid.trsvcid, sizeof(trid.trsvcid), "%s", addresses[i].trsvcid);

		listen_addr = spdk_nvmf_tgt_listen(&trid);
		listen_addr = spdk_nvmf_tgt_listen(g_tgt, &trid);
		if (listen_addr == NULL) {
			SPDK_ERRLOG("Failed to listen on transport %s, adrfam %s, traddr %s, trsvcid %s\n",
				    addresses[i].transport,
+10 −2
Original line number Diff line number Diff line
@@ -74,6 +74,16 @@ struct spdk_nvmf_tgt *spdk_nvmf_tgt_create(struct spdk_nvmf_tgt_opts *opts);
 */
void spdk_nvmf_tgt_destroy(struct spdk_nvmf_tgt *tgt);

/**
 * Begin accepting new connections at the address provided.
 *
 * The connections will be matched with a subsystem, which may or may not allow
 * the connection based on a subsystem-specific whitelist. See
 * spdk_nvmf_subsystem_add_host() and spdk_nvmf_subsystem_add_listener()
 */
struct spdk_nvmf_listen_addr *spdk_nvmf_tgt_listen(struct spdk_nvmf_tgt *tgt,
		struct spdk_nvme_transport_id *trid);

int spdk_nvmf_check_pools(void);

struct spdk_nvmf_subsystem;
@@ -165,8 +175,6 @@ struct spdk_nvmf_host *spdk_nvmf_subsystem_get_next_host(struct spdk_nvmf_subsys
 */
const char *spdk_nvmf_host_get_nqn(struct spdk_nvmf_host *host);

struct spdk_nvmf_listen_addr *spdk_nvmf_tgt_listen(struct spdk_nvme_transport_id *trid);

/**
 * Accept new connections on the address provided
 *
+43 −0
Original line number Diff line number Diff line
@@ -112,6 +112,49 @@ spdk_nvmf_tgt_destroy(struct spdk_nvmf_tgt *tgt)
	}
}

struct spdk_nvmf_listen_addr *
spdk_nvmf_tgt_listen(struct spdk_nvmf_tgt *tgt,
		     struct spdk_nvme_transport_id *trid)
{
	struct spdk_nvmf_listen_addr *listen_addr;
	struct spdk_nvmf_transport *transport;
	int rc;

	TAILQ_FOREACH(listen_addr, &tgt->listen_addrs, link) {
		if (spdk_nvme_transport_id_compare(&listen_addr->trid, trid) == 0) {
			return listen_addr;
		}
	}

	transport = spdk_nvmf_tgt_get_transport(tgt, trid->trtype);
	if (!transport) {
		transport = spdk_nvmf_transport_create(tgt, trid->trtype);
		if (!transport) {
			SPDK_ERRLOG("Transport initialization failed\n");
			return NULL;
		}
		TAILQ_INSERT_TAIL(&tgt->transports, transport, link);
	}


	listen_addr = spdk_nvmf_listen_addr_create(trid);
	if (!listen_addr) {
		return NULL;
	}

	rc = spdk_nvmf_transport_listen(transport, trid);
	if (rc < 0) {
		free(listen_addr);
		SPDK_ERRLOG("Unable to listen on address '%s'\n", trid->traddr);
		return NULL;
	}

	TAILQ_INSERT_HEAD(&tgt->listen_addrs, listen_addr, link);
	tgt->discovery_genctr++;

	return listen_addr;
}

struct spdk_nvmf_subsystem *
spdk_nvmf_tgt_find_subsystem(struct spdk_nvmf_tgt *tgt, const char *subnqn)
{
+0 −42
Original line number Diff line number Diff line
@@ -273,48 +273,6 @@ spdk_nvmf_host_get_nqn(struct spdk_nvmf_host *host)
	return host->nqn;
}

struct spdk_nvmf_listen_addr *
spdk_nvmf_tgt_listen(struct spdk_nvme_transport_id *trid)
{
	struct spdk_nvmf_listen_addr *listen_addr;
	struct spdk_nvmf_transport *transport;
	int rc;

	TAILQ_FOREACH(listen_addr, &g_nvmf_tgt.listen_addrs, link) {
		if (spdk_nvme_transport_id_compare(&listen_addr->trid, trid) == 0) {
			return listen_addr;
		}
	}

	transport = spdk_nvmf_tgt_get_transport(&g_nvmf_tgt, trid->trtype);
	if (!transport) {
		transport = spdk_nvmf_transport_create(&g_nvmf_tgt, trid->trtype);
		if (!transport) {
			SPDK_ERRLOG("Transport initialization failed\n");
			return NULL;
		}
		TAILQ_INSERT_TAIL(&g_nvmf_tgt.transports, transport, link);
	}


	listen_addr = spdk_nvmf_listen_addr_create(trid);
	if (!listen_addr) {
		return NULL;
	}

	rc = spdk_nvmf_transport_listen(transport, trid);
	if (rc < 0) {
		free(listen_addr);
		SPDK_ERRLOG("Unable to listen on address '%s'\n", trid->traddr);
		return NULL;
	}

	TAILQ_INSERT_HEAD(&g_nvmf_tgt.listen_addrs, listen_addr, link);
	g_nvmf_tgt.discovery_genctr++;

	return listen_addr;
}

int
spdk_nvmf_subsystem_add_listener(struct spdk_nvmf_subsystem *subsystem,
				 struct spdk_nvmf_listen_addr *listen_addr)
+8 −12
Original line number Diff line number Diff line
@@ -186,8 +186,7 @@ test_discovery_log(void)
	uint8_t buffer[8192];
	struct spdk_nvmf_discovery_log_page *disc_log;
	struct spdk_nvmf_discovery_log_page_entry *entry;
	struct spdk_nvmf_listen_addr *listen_addr;
	struct spdk_nvme_transport_id trid = {};
	struct spdk_nvmf_listen_addr listen_addr = {};

	/* Reset discovery-related globals */
	g_nvmf_tgt.discovery_genctr = 0;
@@ -201,26 +200,23 @@ test_discovery_log(void)
					       NULL, NULL, NULL);
	SPDK_CU_ASSERT_FATAL(subsystem != NULL);

	trid.trtype = SPDK_NVME_TRANSPORT_RDMA;
	trid.adrfam = SPDK_NVMF_ADRFAM_IPV4;
	snprintf(trid.traddr, sizeof(trid.traddr), "1234");
	snprintf(trid.trsvcid, sizeof(trid.trsvcid), "5678");
	listen_addr = spdk_nvmf_tgt_listen(&trid);
	SPDK_CU_ASSERT_FATAL(listen_addr != NULL);

	SPDK_CU_ASSERT_FATAL(spdk_nvmf_subsystem_add_listener(subsystem, listen_addr) == 0);
	listen_addr.trid.trtype = SPDK_NVME_TRANSPORT_RDMA;
	listen_addr.trid.adrfam = SPDK_NVMF_ADRFAM_IPV4;
	snprintf(listen_addr.trid.traddr, sizeof(listen_addr.trid.traddr), "1234");
	snprintf(listen_addr.trid.trsvcid, sizeof(listen_addr.trid.trsvcid), "5678");
	SPDK_CU_ASSERT_FATAL(spdk_nvmf_subsystem_add_listener(subsystem, &listen_addr) == 0);

	/* Get only genctr (first field in the header) */
	memset(buffer, 0xCC, sizeof(buffer));
	disc_log = (struct spdk_nvmf_discovery_log_page *)buffer;
	spdk_nvmf_get_discovery_log_page(buffer, 0, sizeof(disc_log->genctr));
	CU_ASSERT(disc_log->genctr == 2); /* one added subsystem + one added listen address */
	CU_ASSERT(disc_log->genctr == 1); /* one added subsystem */

	/* Get only the header, no entries */
	memset(buffer, 0xCC, sizeof(buffer));
	disc_log = (struct spdk_nvmf_discovery_log_page *)buffer;
	spdk_nvmf_get_discovery_log_page(buffer, 0, sizeof(*disc_log));
	CU_ASSERT(disc_log->genctr == 2);
	CU_ASSERT(disc_log->genctr == 1);
	CU_ASSERT(disc_log->numrec == 1);

	/* Offset 0, exact size match */
Loading