Commit b0e128db authored by Daniel Verkamp's avatar Daniel Verkamp
Browse files

nvmf/rpc: add adrfam to listen address



This allows the user to optionally specify the address family for
construct_nvmf_subsystem (default is IPv4).

Note that the RDMA transport still only supports IPv4 because of the way
it binds to the listen address; this will be fixed in a separate patch.

Change-Id: I534ed75f6f81e53559d1bebcd2f34f1a2b210a97
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/367429


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
parent ca2a1f29
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -496,6 +496,8 @@ spdk_nvmf_construct_subsystem(const char *name,
	for (i = 0; i < num_listen_addresses; i++) {
		int nic_numa_node = spdk_get_ifaddr_numa_node(addresses[i].traddr);
		unsigned subsys_numa_node = spdk_env_get_socket_id(app_subsys->lcore);
		const char *adrfam_str;
		enum spdk_nvmf_adrfam adrfam;

		if (nic_numa_node >= 0) {
			if (subsys_numa_node != (unsigned)nic_numa_node) {
@@ -514,11 +516,22 @@ spdk_nvmf_construct_subsystem(const char *name,
			goto error;
		}

		listen_addr = spdk_nvmf_tgt_listen(addresses[i].transport,
		adrfam_str = addresses[i].adrfam;
		if (adrfam_str == NULL) {
			adrfam_str = "IPv4";
		}

		if (spdk_nvme_transport_id_parse_adrfam(&adrfam, adrfam_str)) {
			SPDK_ERRLOG("Unknown address family '%s'\n", adrfam_str);
			goto error;
		}

		listen_addr = spdk_nvmf_tgt_listen(addresses[i].transport, adrfam,
						   addresses[i].traddr, addresses[i].trsvcid);
		if (listen_addr == NULL) {
			SPDK_ERRLOG("Failed to listen on transport %s, traddr %s, trsvcid %s\n",
			SPDK_ERRLOG("Failed to listen on transport %s, adrfam %s, traddr %s, trsvcid %s\n",
				    addresses[i].transport,
				    adrfam_str,
				    addresses[i].traddr,
				    addresses[i].trsvcid);
			goto error;
+10 −0
Original line number Diff line number Diff line
@@ -78,12 +78,20 @@ dump_nvmf_subsystem(struct spdk_json_write_ctx *w, struct nvmf_tgt_subsystem *tg

	TAILQ_FOREACH(allowed_listener, &subsystem->allowed_listeners, link) {
		listen_addr = allowed_listener->listen_addr;
		const char *adrfam = spdk_nvme_transport_id_adrfam_str(listen_addr->adrfam);

		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, listen_addr->trname);
		spdk_json_write_name(w, "trtype");
		spdk_json_write_string(w, listen_addr->trname);

		if (adrfam) {
			spdk_json_write_name(w, "adrfam");
			spdk_json_write_string(w, adrfam);
		}

		spdk_json_write_name(w, "traddr");
		spdk_json_write_string(w, listen_addr->traddr);
		spdk_json_write_name(w, "trsvcid");
@@ -180,6 +188,7 @@ static const struct spdk_json_object_decoder rpc_listen_address_decoders[] = {
	/* NOTE: "transport" is kept for compatibility; new code should use "trtype" */
	{"transport", offsetof(struct rpc_listen_address, transport), spdk_json_decode_string, true},
	{"trtype", offsetof(struct rpc_listen_address, transport), spdk_json_decode_string, true},
	{"adrfam", offsetof(struct rpc_listen_address, adrfam), spdk_json_decode_string, true},
	{"traddr", offsetof(struct rpc_listen_address, traddr), spdk_json_decode_string},
	{"trsvcid", offsetof(struct rpc_listen_address, trsvcid), spdk_json_decode_string},
};
@@ -254,6 +263,7 @@ free_rpc_listen_addresses(struct rpc_listen_addresses *r)

	for (i = 0; i < r->num_listen_address; i++) {
		free(r->addresses[i].transport);
		free(r->addresses[i].adrfam);
		free(r->addresses[i].traddr);
		free(r->addresses[i].trsvcid);
	}
+1 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@

struct rpc_listen_address {
	char *transport;
	char *adrfam;
	char *traddr;
	char *trsvcid;
};
+3 −2
Original line number Diff line number Diff line
@@ -76,6 +76,7 @@ struct spdk_nvmf_listen_addr {
	char					*traddr;
	char					*trsvcid;
	char					*trname;
	enum spdk_nvmf_adrfam			adrfam;
	TAILQ_ENTRY(spdk_nvmf_listen_addr)	link;
};

@@ -152,8 +153,8 @@ struct spdk_nvmf_subsystem *spdk_nvmf_find_subsystem(const char *subnqn);

bool spdk_nvmf_subsystem_host_allowed(struct spdk_nvmf_subsystem *subsystem, const char *hostnqn);

struct spdk_nvmf_listen_addr *spdk_nvmf_tgt_listen(const char *trname, const char *traddr,
		const char *trsvcid);
struct spdk_nvmf_listen_addr *spdk_nvmf_tgt_listen(const char *trname, enum spdk_nvmf_adrfam adrfam,
		const char *traddr, const char *trsvcid);

int spdk_nvmf_subsystem_add_listener(struct spdk_nvmf_subsystem *subsystem,
				     struct spdk_nvmf_listen_addr *listen_addr);
+4 −1
Original line number Diff line number Diff line
@@ -97,7 +97,8 @@ spdk_nvmf_tgt_fini(void)
}

struct spdk_nvmf_listen_addr *
spdk_nvmf_listen_addr_create(const char *trname, const char *traddr, const char *trsvcid)
spdk_nvmf_listen_addr_create(const char *trname, enum spdk_nvmf_adrfam adrfam, const char *traddr,
			     const char *trsvcid)
{
	struct spdk_nvmf_listen_addr *listen_addr;
	const struct spdk_nvmf_transport *transport;
@@ -112,6 +113,8 @@ spdk_nvmf_listen_addr_create(const char *trname, const char *traddr, const char
		return NULL;
	}

	listen_addr->adrfam = adrfam;

	listen_addr->traddr = strdup(traddr);
	if (!listen_addr->traddr) {
		free(listen_addr);
Loading