Commit 1b306f4b authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Daniel Verkamp
Browse files

net: spdk_sock_getaddr() support IPv6 transparently



spdk_sock_getaddr() (in lib/net/sock.c) only support IPv4.
Hence IPv6 cannot be used in SPDK iSCSI target.
By adding the code to support IPv6 transparently, IPv6 becomes
available in SPDK iSCSI target.

Change-Id: I236f2c6cb1e61283dde090729fecd8f743cec3fc
Signed-off-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-on: https://review.gerrithub.io/383672


Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
parent 2e7c008f
Loading
Loading
Loading
Loading
+21 −8
Original line number Diff line number Diff line
@@ -39,17 +39,30 @@
#define MAX_TMPBUF 1024
#define PORTNUMLEN 32

static int get_addr_str(struct sockaddr_in *paddr, char *host, size_t hlen)
static int get_addr_str(struct sockaddr *sa, char *host, size_t hlen)
{
	uint8_t *pa;
	const char *result = NULL;

	if (paddr == NULL || host == NULL)
	if (sa == NULL || host == NULL)
		return -1;

	pa = (uint8_t *)&paddr->sin_addr.s_addr;
	snprintf(host, hlen, "%u.%u.%u.%u", pa[0], pa[1], pa[2], pa[3]);
	switch (sa->sa_family) {
	case AF_INET:
		result = inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr),
				   host, hlen);
		break;
	case AF_INET6:
		result = inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr),
				   host, hlen);
		break;
	default:
		break;
	}

	if (result != NULL)
		return 0;
	else
		return -1;
}

int
@@ -80,7 +93,7 @@ spdk_sock_getaddr(int sock, char *saddr, int slen, char *caddr, int clen)
		return -1;
	}

	rc = get_addr_str((struct sockaddr_in *)&sa, saddr, slen);
	rc = get_addr_str((struct sockaddr *)&sa, saddr, slen);
	if (rc != 0) {
		SPDK_ERRLOG("getnameinfo() failed (errno=%d)\n", errno);
		return -1;
@@ -94,7 +107,7 @@ spdk_sock_getaddr(int sock, char *saddr, int slen, char *caddr, int clen)
		return -1;
	}

	rc = get_addr_str((struct sockaddr_in *)&sa, caddr, clen);
	rc = get_addr_str((struct sockaddr *)&sa, caddr, clen);
	if (rc != 0) {
		SPDK_ERRLOG("getnameinfo() failed (errno=%d)\n", errno);
		return -1;