Commit 32e3e269 authored by Anil Veerabhadrappa's avatar Anil Veerabhadrappa Committed by Tomasz Zawadzki
Browse files

nvmf/rdma: parse listen address directive for rdma and tcp transport



  Package ip address parsing code into a separate function. This change
is the first patch in the series to enable FC listen address support.

Signed-off-by: default avatarAnil Veerabhadrappa <anil.veerabhadrappa@broadcom.com>
Change-Id: Ia86c61d001a091dfb9f825b68f76cdaf94537303
Signed-off-by: default avatarAnil Veerabhadrappa <anil.veerabhadrappa@broadcom.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/471024


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Reviewed-by: default avatarAlexey Marchuk <alexeymar@mellanox.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent 8ed9e0a1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -232,7 +232,7 @@
# - NQN is required and must be unique.
# - Between 1 and 255 Listen directives are allowed. This defines
#   the addresses on which new connections may be accepted. The format
#   is Listen <type> <address> where type currently can only be RDMA.
#   is Listen <type> <address> where type can be RDMA or TCP.
# - Between 0 and 255 Host directives are allowed. This defines the
#   NQNs of allowed hosts. If no Host directive is specified, all hosts
#   are allowed to connect.
+32 −18
Original line number Diff line number Diff line
@@ -240,12 +240,37 @@ spdk_nvmf_tgt_listen_done(void *cb_arg, int status)
	}
}

static int
spdk_nvmf_tgt_parse_listen_ip_addr(char *address,
				   struct spdk_nvme_transport_id *trid)
{
	char *host;
	char *port;

	if (spdk_parse_ip_addr(address, &host, &port) < 0) {
		SPDK_ERRLOG("Unable to parse listen address '%s'\n", address);
		return -1;
	}

	if (strchr(host, ':')) {
		trid->adrfam = SPDK_NVMF_ADRFAM_IPV6;
	} else {
		trid->adrfam = SPDK_NVMF_ADRFAM_IPV4;
	}

	snprintf(trid->traddr, sizeof(trid->traddr), "%s", host);
	if (port) {
		snprintf(trid->trsvcid, sizeof(trid->trsvcid), "%s", port);
	}

	return 0;
}

static int
spdk_nvmf_parse_subsystem(struct spdk_conf_section *sp)
{
	const char *nqn, *mode;
	size_t i;
	int ret;
	int lcore;
	bool allow_any_host;
	const char *sn;
@@ -391,8 +416,6 @@ spdk_nvmf_parse_subsystem(struct spdk_conf_section *sp)
		const char *transport;
		const char *address;
		char *address_dup;
		char *host;
		char *port;

		transport = spdk_conf_section_get_nmval(sp, "Listen", i, 0);
		if (!transport) {
@@ -414,23 +437,14 @@ spdk_nvmf_parse_subsystem(struct spdk_conf_section *sp)
			break;
		}

		ret = spdk_parse_ip_addr(address_dup, &host, &port);
		if (ret < 0) {
			SPDK_ERRLOG("Unable to parse listen address '%s'\n", address);
		if (trid.trtype == SPDK_NVME_TRANSPORT_RDMA ||
		    trid.trtype == SPDK_NVME_TRANSPORT_TCP) {
			if (spdk_nvmf_tgt_parse_listen_ip_addr(address_dup, &trid)) {
				free(address_dup);
				continue;
			}

		if (strchr(host, ':')) {
			trid.adrfam = SPDK_NVMF_ADRFAM_IPV6;
		} else {
			trid.adrfam = SPDK_NVMF_ADRFAM_IPV4;
		}

		snprintf(trid.traddr, sizeof(trid.traddr), "%s", host);
		if (port) {
			snprintf(trid.trsvcid, sizeof(trid.trsvcid), "%s", port);
		}
		free(address_dup);

		spdk_nvmf_tgt_listen(g_spdk_nvmf_tgt, &trid, spdk_nvmf_tgt_listen_done, NULL);