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: Ben Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/375034
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Ben Walker 2017-08-21 11:41:51 -07:00 committed by Jim Harris
parent 70bc390c82
commit 656e443dd1
6 changed files with 62 additions and 81 deletions

View File

@ -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,

View File

@ -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
*

View File

@ -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)
{

View File

@ -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)

View File

@ -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 */

View File

@ -185,29 +185,6 @@ spdk_bdev_get_name(const struct spdk_bdev *bdev)
return "test";
}
static void
test_spdk_nvmf_tgt_listen(void)
{
struct spdk_nvmf_listen_addr *listen_addr;
struct spdk_nvme_transport_id trid = {};
/* Invalid trtype */
trid.trtype = 55;
trid.adrfam = SPDK_NVMF_ADRFAM_IPV4;
snprintf(trid.traddr, sizeof(trid.traddr), "192.168.100.1");
snprintf(trid.trsvcid, sizeof(trid.trsvcid), "4420");
CU_ASSERT(spdk_nvmf_tgt_listen(&trid) == NULL);
trid.trtype = SPDK_NVME_TRANSPORT_RDMA;
trid.adrfam = SPDK_NVMF_ADRFAM_IPV4;
snprintf(trid.traddr, sizeof(trid.traddr), "192.168.100.1");
snprintf(trid.trsvcid, sizeof(trid.trsvcid), "4420");
listen_addr = spdk_nvmf_tgt_listen(&trid);
SPDK_CU_ASSERT_FATAL(listen_addr != NULL);
spdk_nvmf_listen_addr_destroy(listen_addr);
}
static void
test_spdk_nvmf_subsystem_add_ns(void)
{
@ -290,7 +267,6 @@ int main(int argc, char **argv)
if (
CU_add_test(suite, "create_subsystem", nvmf_test_create_subsystem) == NULL ||
CU_add_test(suite, "nvmf_tgt_listen", test_spdk_nvmf_tgt_listen) == NULL ||
CU_add_test(suite, "nvmf_subsystem_add_ns", test_spdk_nvmf_subsystem_add_ns) == NULL) {
CU_cleanup_registry();
return CU_get_error();