Commit c7b8b414 authored by Daniel Verkamp's avatar Daniel Verkamp Committed by Jim Harris
Browse files

nvmf_tgt: add IPv6 listen address support



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


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 808a2b05
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -215,6 +215,12 @@ spdk_nvmf_parse_subsystem(struct spdk_conf_section *sp)
			continue;
		}

		if (strchr(listen_addrs[num_listen_addrs].traddr, ':')) {
			listen_addrs[num_listen_addrs].adrfam = "IPv6";
		} else {
			listen_addrs[num_listen_addrs].adrfam = "IPv4";
		}

		num_listen_addrs++;
	}

+35 −8
Original line number Diff line number Diff line
@@ -1259,7 +1259,9 @@ spdk_nvmf_rdma_listen(struct spdk_nvmf_transport *transport,
	struct spdk_nvmf_rdma_transport	*rtransport;
	struct spdk_nvmf_rdma_device	*device;
	struct spdk_nvmf_rdma_port 	*port_tmp, *port;
	struct sockaddr_in saddr;
	struct addrinfo			*res;
	struct addrinfo			hints;
	int				family;
	int				rc;

	rtransport = SPDK_CONTAINEROF(transport, struct spdk_nvmf_rdma_transport, transport);
@@ -1297,11 +1299,36 @@ spdk_nvmf_rdma_listen(struct spdk_nvmf_transport *transport,
		return rc;
	}

	memset(&saddr, 0, sizeof(saddr));
	saddr.sin_family = AF_INET;
	saddr.sin_addr.s_addr = inet_addr(port->trid.traddr);
	saddr.sin_port = htons((uint16_t)strtoul(port->trid.trsvcid, NULL, 10));
	rc = rdma_bind_addr(port->id, (struct sockaddr *)&saddr);
	switch (port->trid.adrfam) {
	case SPDK_NVMF_ADRFAM_IPV4:
		family = AF_INET;
		break;
	case SPDK_NVMF_ADRFAM_IPV6:
		family = AF_INET6;
		break;
	default:
		SPDK_ERRLOG("Unhandled ADRFAM %d\n", port->trid.adrfam);
		free(port);
		pthread_mutex_unlock(&rtransport->lock);
		return -EINVAL;
	}

	memset(&hints, 0, sizeof(hints));
	hints.ai_family = family;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_protocol = 0;

	rc = getaddrinfo(port->trid.traddr, port->trid.trsvcid, &hints, &res);
	if (rc) {
		SPDK_ERRLOG("getaddrinfo failed: %s (%d)\n", gai_strerror(rc), rc);
		free(port);
		pthread_mutex_unlock(&rtransport->lock);
		return -EINVAL;
	}

	rc = rdma_bind_addr(port->id, res->ai_addr);
	freeaddrinfo(res);

	if (rc < 0) {
		SPDK_ERRLOG("rdma_bind_addr() failed\n");
		rdma_destroy_id(port->id);