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

nvme/rdma: use getaddrinfo() to parse service ID



Also remove unreachable code handling addr == NULL.

Change-Id: Ia6b5639853bbb6f4193a1b4352d465829b1293d1
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent e15a704e
Loading
Loading
Loading
Loading
+11 −18
Original line number Diff line number Diff line
@@ -660,24 +660,23 @@ nvme_rdma_connect(struct nvme_rdma_qpair *rqpair)
}

static int
nvme_rdma_parse_ipaddr(struct sockaddr_in *sin, const char *addr)
nvme_rdma_parse_addr(struct sockaddr_storage *sa, const char *addr, const char *service)
{
	struct addrinfo *res;
	int ret;

	if (addr == NULL) {
		sin->sin_addr.s_addr = htonl(INADDR_ANY);
		sin->sin_family = AF_INET;
		return 0;
	}

	ret = getaddrinfo(addr, NULL, NULL, &res);
	ret = getaddrinfo(addr, service, NULL, &res);
	if (ret) {
		SPDK_ERRLOG("getaddrinfo failed - invalid hostname or IP address\n");
		return ret;
	}

	*sin = *(struct sockaddr_in *) res->ai_addr;
	if (res->ai_addrlen > sizeof(*sa)) {
		SPDK_ERRLOG("getaddrinfo() ai_addrlen %zu too large\n", (size_t)res->ai_addrlen);
		ret = EINVAL;
	} else {
		memcpy(sa, res->ai_addr, res->ai_addrlen);
	}

	freeaddrinfo(res);
	return ret;
@@ -712,18 +711,12 @@ nvme_rdma_qpair_connect(struct nvme_rdma_qpair *rqpair)
	ctrlr = rqpair->qpair.ctrlr;
	memset(&sin, 0, sizeof(struct sockaddr_storage));

	SPDK_TRACELOG(SPDK_TRACE_DEBUG, "port is %s\n", ctrlr->probe_info.trsvcid);
	rc = nvme_rdma_parse_ipaddr((struct sockaddr_in *)&sin, ctrlr->probe_info.traddr);
	if (rc < 0) {
	SPDK_TRACELOG(SPDK_TRACE_DEBUG, "trsvcid is %s\n", ctrlr->probe_info.trsvcid);
	rc = nvme_rdma_parse_addr(&sin, ctrlr->probe_info.traddr, ctrlr->probe_info.trsvcid);
	if (rc != 0) {
		goto err;
	}

	/* need to tranfer the host*/
	if (sin.ss_family == AF_INET)
		((struct sockaddr_in *) &sin)->sin_port = htons(atoi(ctrlr->probe_info.trsvcid));
	else
		((struct sockaddr_in6 *) &sin)->sin6_port = htons(atoi(ctrlr->probe_info.trsvcid));

	rc = rdma_create_id(rqpair->cm_channel, &rqpair->cm_id, rqpair, RDMA_PS_TCP);
	if (rc < 0) {
		goto err;