From 1b306f4b54b0ec55a2e760d676e363771d37e0b7 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Wed, 25 Oct 2017 11:27:58 +0900 Subject: [PATCH] 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 Reviewed-on: https://review.gerrithub.io/383672 Reviewed-by: Daniel Verkamp Reviewed-by: Jim Harris Reviewed-by: Ben Walker Tested-by: SPDK Automated Test System --- lib/net/sock.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/lib/net/sock.c b/lib/net/sock.c index 3355941b2..125816756 100644 --- a/lib/net/sock.c +++ b/lib/net/sock.c @@ -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; + } - return 0; + 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;