diff --git a/app/nvmf_tgt/conf.c b/app/nvmf_tgt/conf.c index fec431536..7751cbed5 100644 --- a/app/nvmf_tgt/conf.c +++ b/app/nvmf_tgt/conf.c @@ -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, diff --git a/include/spdk/nvmf.h b/include/spdk/nvmf.h index 83f6385df..9ac656ca7 100644 --- a/include/spdk/nvmf.h +++ b/include/spdk/nvmf.h @@ -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 * diff --git a/lib/nvmf/nvmf.c b/lib/nvmf/nvmf.c index f7491b110..ab398fc5f 100644 --- a/lib/nvmf/nvmf.c +++ b/lib/nvmf/nvmf.c @@ -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) { diff --git a/lib/nvmf/subsystem.c b/lib/nvmf/subsystem.c index 9b0ac0400..a136ffb52 100644 --- a/lib/nvmf/subsystem.c +++ b/lib/nvmf/subsystem.c @@ -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) diff --git a/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c b/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c index 864ded7ea..4296c58b5 100644 --- a/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c +++ b/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c @@ -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 */ diff --git a/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c b/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c index 755ecc0ff..fd1f95f53 100644 --- a/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c +++ b/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c @@ -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();