nvmf: Encapsulate spdk_nvmf_listener
Hide the implementation of spdk_nvmf_listener. Change-Id: I62d46c76be0962b4246d1b7774ce8249b5baa039 Signed-off-by: Ben Walker <benjamin.walker@intel.com> Reviewed-on: https://review.gerrithub.io/374871 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:
parent
45f04c8907
commit
683d4a4cad
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user