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: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-on: https://review.gerrithub.io/383672
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
This commit is contained in:
Shuhei Matsumoto 2017-10-25 11:27:58 +09:00 committed by Daniel Verkamp
parent 2e7c008fe2
commit 1b306f4b54

View File

@ -39,17 +39,30 @@
#define MAX_TMPBUF 1024 #define MAX_TMPBUF 1024
#define PORTNUMLEN 32 #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; return -1;
pa = (uint8_t *)&paddr->sin_addr.s_addr; switch (sa->sa_family) {
snprintf(host, hlen, "%u.%u.%u.%u", pa[0], pa[1], pa[2], pa[3]); 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;
}
return 0; if (result != NULL)
return 0;
else
return -1;
} }
int int
@ -80,7 +93,7 @@ spdk_sock_getaddr(int sock, char *saddr, int slen, char *caddr, int clen)
return -1; return -1;
} }
rc = get_addr_str((struct sockaddr_in *)&sa, saddr, slen); rc = get_addr_str((struct sockaddr *)&sa, saddr, slen);
if (rc != 0) { if (rc != 0) {
SPDK_ERRLOG("getnameinfo() failed (errno=%d)\n", errno); SPDK_ERRLOG("getnameinfo() failed (errno=%d)\n", errno);
return -1; return -1;
@ -94,7 +107,7 @@ spdk_sock_getaddr(int sock, char *saddr, int slen, char *caddr, int clen)
return -1; return -1;
} }
rc = get_addr_str((struct sockaddr_in *)&sa, caddr, clen); rc = get_addr_str((struct sockaddr *)&sa, caddr, clen);
if (rc != 0) { if (rc != 0) {
SPDK_ERRLOG("getnameinfo() failed (errno=%d)\n", errno); SPDK_ERRLOG("getnameinfo() failed (errno=%d)\n", errno);
return -1; return -1;