diff --git a/app/nvmf_tgt/nvmf_rpc.c b/app/nvmf_tgt/nvmf_rpc.c index b2b9849a0..dda2cbde1 100644 --- a/app/nvmf_tgt/nvmf_rpc.c +++ b/app/nvmf_tgt/nvmf_rpc.c @@ -46,10 +46,9 @@ static void dump_nvmf_subsystem(struct spdk_json_write_ctx *w, struct nvmf_tgt_subsystem *tgt_subsystem) { - struct spdk_nvmf_listen_addr *listen_addr; struct spdk_nvmf_host *host; struct spdk_nvmf_subsystem *subsystem = tgt_subsystem->subsystem; - struct spdk_nvmf_subsystem_allowed_listener *allowed_listener; + struct spdk_nvmf_listener *listener; spdk_json_write_object_begin(w); @@ -68,21 +67,24 @@ dump_nvmf_subsystem(struct spdk_json_write_ctx *w, struct nvmf_tgt_subsystem *tg spdk_json_write_name(w, "listen_addresses"); spdk_json_write_array_begin(w); - TAILQ_FOREACH(allowed_listener, &subsystem->allowed_listeners, link) { - listen_addr = allowed_listener->listen_addr; + for (listener = spdk_nvmf_subsystem_get_first_listener(subsystem); listener != NULL; + listener = spdk_nvmf_subsystem_get_next_listener(subsystem, listener)) { + const struct spdk_nvme_transport_id *trid; + + trid = spdk_nvmf_listener_get_trid(listener); spdk_json_write_object_begin(w); /* NOTE: "transport" is kept for compatibility; new code should use "trtype" */ spdk_json_write_name(w, "transport"); - spdk_json_write_string(w, spdk_nvme_transport_id_trtype_str(listen_addr->trid.trtype)); + spdk_json_write_string(w, spdk_nvme_transport_id_trtype_str(trid->trtype)); spdk_json_write_name(w, "trtype"); - spdk_json_write_string(w, spdk_nvme_transport_id_trtype_str(listen_addr->trid.trtype)); + spdk_json_write_string(w, spdk_nvme_transport_id_trtype_str(trid->trtype)); spdk_json_write_name(w, "adrfam"); - spdk_json_write_string(w, spdk_nvme_transport_id_adrfam_str(listen_addr->trid.adrfam)); + spdk_json_write_string(w, spdk_nvme_transport_id_adrfam_str(trid->adrfam)); spdk_json_write_name(w, "traddr"); - spdk_json_write_string(w, listen_addr->trid.traddr); + spdk_json_write_string(w, trid->traddr); spdk_json_write_name(w, "trsvcid"); - spdk_json_write_string(w, listen_addr->trid.trsvcid); + spdk_json_write_string(w, trid->trsvcid); spdk_json_write_object_end(w); } spdk_json_write_array_end(w); diff --git a/include/spdk/nvmf.h b/include/spdk/nvmf.h index 7318bf839..2fec41507 100644 --- a/include/spdk/nvmf.h +++ b/include/spdk/nvmf.h @@ -62,6 +62,7 @@ struct spdk_nvmf_request; struct spdk_bdev; struct spdk_nvmf_request; struct spdk_nvmf_host; +struct spdk_nvmf_listener; typedef void (*spdk_nvmf_subsystem_connect_fn)(void *cb_ctx, struct spdk_nvmf_request *req); typedef void (*spdk_nvmf_subsystem_disconnect_fn)(void *cb_ctx, struct spdk_nvmf_qpair *qpair); @@ -71,11 +72,6 @@ struct spdk_nvmf_listen_addr { TAILQ_ENTRY(spdk_nvmf_listen_addr) link; }; -struct spdk_nvmf_subsystem_allowed_listener { - struct spdk_nvmf_listen_addr *listen_addr; - TAILQ_ENTRY(spdk_nvmf_subsystem_allowed_listener) link; -}; - struct spdk_nvmf_ns { struct spdk_bdev *bdev; struct spdk_bdev_desc *desc; @@ -108,7 +104,7 @@ struct spdk_nvmf_subsystem { TAILQ_HEAD(, spdk_nvmf_host) hosts; - TAILQ_HEAD(, spdk_nvmf_subsystem_allowed_listener) allowed_listeners; + TAILQ_HEAD(, spdk_nvmf_listener) listeners; TAILQ_ENTRY(spdk_nvmf_subsystem) entries; }; @@ -177,13 +173,54 @@ 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 + * + * \param subsystem Subsystem to add listener to + * \param listen_addr The address to listen on. + * \return 0 on success. Negated errno value on failure. + */ int spdk_nvmf_subsystem_add_listener(struct spdk_nvmf_subsystem *subsystem, struct spdk_nvmf_listen_addr *listen_addr); +/** + * Check if connections originated from the given address are allowed to connect to the subsystem. + * + * \param subsystem The subsystem to query + * \param listen_addr The listen address + * \return true if allowed, false if not. + */ bool spdk_nvmf_subsystem_listener_allowed(struct spdk_nvmf_subsystem *subsystem, struct spdk_nvmf_listen_addr *listen_addr); +/** + * Return the first allowed listen address in the subsystem. + * + * \param subsystem Subsystem to query. + * \return First allowed listen address in this subsystem, or NULL if none allowed. + */ +struct spdk_nvmf_listener *spdk_nvmf_subsystem_get_first_listener( + struct spdk_nvmf_subsystem *subsystem); +/** + * Return the next allowed listen address in a subsystem. + * + * \param subsystem Subsystem to query. + * \param prev_listener Previous listen address for this subsystem + * \return Next allowed listen address in this subsystem, or NULL if prev_listener was the last address. + */ +struct spdk_nvmf_listener *spdk_nvmf_subsystem_get_next_listener( + struct spdk_nvmf_subsystem *subsystem, + struct spdk_nvmf_listener *prev_listener); + +/** + * Get a listen address' transport ID + * + * \param listener This listener + * \return The transport ID for this listener + */ +const struct spdk_nvme_transport_id *spdk_nvmf_listener_get_trid( + struct spdk_nvmf_listener *listener); void spdk_nvmf_subsystem_poll(struct spdk_nvmf_subsystem *subsystem); diff --git a/lib/nvmf/ctrlr_discovery.c b/lib/nvmf/ctrlr_discovery.c index ff010a4a3..87209fd13 100644 --- a/lib/nvmf/ctrlr_discovery.c +++ b/lib/nvmf/ctrlr_discovery.c @@ -55,7 +55,7 @@ nvmf_update_discovery_log(void) { uint64_t numrec = 0; struct spdk_nvmf_subsystem *subsystem; - struct spdk_nvmf_subsystem_allowed_listener *allowed_listener; + struct spdk_nvmf_listener *listener; struct spdk_nvmf_listen_addr *listen_addr; struct spdk_nvmf_discovery_log_page_entry *entry; struct spdk_nvmf_transport *transport; @@ -77,7 +77,8 @@ nvmf_update_discovery_log(void) continue; } - TAILQ_FOREACH(allowed_listener, &subsystem->allowed_listeners, link) { + for (listener = spdk_nvmf_subsystem_get_first_listener(subsystem); listener != NULL; + listener = spdk_nvmf_subsystem_get_next_listener(subsystem, listener)) { size_t new_size = cur_size + sizeof(*entry); void *new_log_page = realloc(disc_log, new_size); @@ -86,7 +87,7 @@ nvmf_update_discovery_log(void) break; } - listen_addr = allowed_listener->listen_addr; + listen_addr = listener->listen_addr; disc_log = new_log_page; cur_size = new_size; diff --git a/lib/nvmf/nvmf_internal.h b/lib/nvmf/nvmf_internal.h index f61f90d95..cd9a826a7 100644 --- a/lib/nvmf/nvmf_internal.h +++ b/lib/nvmf/nvmf_internal.h @@ -64,6 +64,11 @@ struct spdk_nvmf_host { TAILQ_ENTRY(spdk_nvmf_host) link; }; +struct spdk_nvmf_listener { + struct spdk_nvmf_listen_addr *listen_addr; + TAILQ_ENTRY(spdk_nvmf_listener) link; +}; + struct spdk_nvmf_poll_group { struct spdk_nvmf_transport *transport; TAILQ_ENTRY(spdk_nvmf_poll_group) link; diff --git a/lib/nvmf/subsystem.c b/lib/nvmf/subsystem.c index 2061d2e17..597dd8e22 100644 --- a/lib/nvmf/subsystem.c +++ b/lib/nvmf/subsystem.c @@ -173,7 +173,7 @@ spdk_nvmf_create_subsystem(const char *nqn, subsystem->connect_cb = connect_cb; subsystem->disconnect_cb = disconnect_cb; snprintf(subsystem->subnqn, sizeof(subsystem->subnqn), "%s", nqn); - TAILQ_INIT(&subsystem->allowed_listeners); + TAILQ_INIT(&subsystem->listeners); TAILQ_INIT(&subsystem->hosts); TAILQ_INIT(&subsystem->ctrlrs); @@ -186,7 +186,7 @@ spdk_nvmf_create_subsystem(const char *nqn, void spdk_nvmf_delete_subsystem(struct spdk_nvmf_subsystem *subsystem) { - struct spdk_nvmf_subsystem_allowed_listener *allowed_listener, *allowed_listener_tmp; + struct spdk_nvmf_listener *listener, *listener_tmp; struct spdk_nvmf_host *host, *host_tmp; struct spdk_nvmf_ctrlr *ctrlr, *ctrlr_tmp; @@ -196,11 +196,9 @@ spdk_nvmf_delete_subsystem(struct spdk_nvmf_subsystem *subsystem) SPDK_TRACELOG(SPDK_TRACE_NVMF, "subsystem is %p\n", subsystem); - TAILQ_FOREACH_SAFE(allowed_listener, - &subsystem->allowed_listeners, link, allowed_listener_tmp) { - TAILQ_REMOVE(&subsystem->allowed_listeners, allowed_listener, link); - - free(allowed_listener); + TAILQ_FOREACH_SAFE(listener, &subsystem->listeners, link, listener_tmp) { + TAILQ_REMOVE(&subsystem->listeners, listener, link); + free(listener); } TAILQ_FOREACH_SAFE(host, &subsystem->hosts, link, host_tmp) { @@ -336,16 +334,16 @@ int spdk_nvmf_subsystem_add_listener(struct spdk_nvmf_subsystem *subsystem, struct spdk_nvmf_listen_addr *listen_addr) { - struct spdk_nvmf_subsystem_allowed_listener *allowed_listener; + struct spdk_nvmf_listener *listener; - allowed_listener = calloc(1, sizeof(*allowed_listener)); - if (!allowed_listener) { + listener = calloc(1, sizeof(*listener)); + if (!listener) { return -1; } - allowed_listener->listen_addr = listen_addr; + listener->listen_addr = listen_addr; - TAILQ_INSERT_HEAD(&subsystem->allowed_listeners, allowed_listener, link); + TAILQ_INSERT_HEAD(&subsystem->listeners, listener, link); return 0; } @@ -357,14 +355,14 @@ bool spdk_nvmf_subsystem_listener_allowed(struct spdk_nvmf_subsystem *subsystem, struct spdk_nvmf_listen_addr *listen_addr) { - struct spdk_nvmf_subsystem_allowed_listener *allowed_listener; + struct spdk_nvmf_listener *listener; - if (TAILQ_EMPTY(&subsystem->allowed_listeners)) { + if (TAILQ_EMPTY(&subsystem->listeners)) { return true; } - TAILQ_FOREACH(allowed_listener, &subsystem->allowed_listeners, link) { - if (allowed_listener->listen_addr == listen_addr) { + TAILQ_FOREACH(listener, &subsystem->listeners, link) { + if (listener->listen_addr == listen_addr) { return true; } } @@ -372,6 +370,26 @@ spdk_nvmf_subsystem_listener_allowed(struct spdk_nvmf_subsystem *subsystem, return false; } +struct spdk_nvmf_listener * +spdk_nvmf_subsystem_get_first_listener(struct spdk_nvmf_subsystem *subsystem) +{ + return TAILQ_FIRST(&subsystem->listeners); +} + +struct spdk_nvmf_listener * +spdk_nvmf_subsystem_get_next_listener(struct spdk_nvmf_subsystem *subsystem, + struct spdk_nvmf_listener *prev_listener) +{ + return TAILQ_NEXT(prev_listener, link); +} + + +const struct spdk_nvme_transport_id * +spdk_nvmf_listener_get_trid(struct spdk_nvmf_listener *listener) +{ + return &listener->listen_addr->trid; +} + static void spdk_nvmf_ctrlr_hot_remove(void *remove_ctx) { struct spdk_nvmf_subsystem *subsystem = (struct spdk_nvmf_subsystem *)remove_ctx;