Package: libiscsi7 Version: 1.18.0-2 Severity: important Tags: ipv6 patch Dear Maintainer,
trying to connect to IPv6 hosts with applications using libiscsi7 does not work and results in the following error message: > Failed to start full connect Couldn't connect transport No IPv6 traffic is sent by the application since the connect() syscall fails. This is easily testable with the following command: > iscsi-inq --initiator-name iqn.1993-08.org.debian:01:f4242424242f > iscsi://[fec0:2727::3]:3260/iqn.foo.test/1 This is a blocker for accessing disks via -disk iscsi//... in qemu. -- System Information: Debian Release: 10.1 APT prefers stable APT policy: (500, 'stable') Architecture: amd64 (x86_64) Kernel: Linux 4.19.0-6-amd64 (SMP w/2 CPU cores) Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8), LANGUAGE=en_GB.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: systemd (via /run/systemd/system) LSM: AppArmor: enabled Versions of packages libiscsi7 depends on: ii libc6 2.28-10 ii libibverbs1 22.1-1 ii librdmacm1 22.1-1 libiscsi7 recommends no packages. libiscsi7 suggests no packages. -- no debconf information
>From 179f6b33d43f26cbca133ff03fa1bacc7e8a6120 Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg <ronniesahlb...@gmail.com> Date: Sun, 8 Jan 2017 12:57:12 -0800 Subject: [PATCH] Fix IPV6 Signed-off-by: Ronnie Sahlberg <ronniesahlb...@gmail.com> --- lib/socket.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/socket.c b/lib/socket.c index 926e474..41b68c0 100644 --- a/lib/socket.c +++ b/lib/socket.c @@ -188,6 +188,20 @@ static int iscsi_tcp_connect(struct iscsi_context *iscsi, union socket_address * int socksize; + switch (ai_family) { + case AF_INET: + socksize = sizeof(struct sockaddr_in); + break; + case AF_INET6: + socksize = sizeof(struct sockaddr_in6); + break; + default: + iscsi_set_error(iscsi, "Unknown address family :%d. " + "Only IPv4/IPv6 supported so far.", + ai_family); + return -1; + } + iscsi->fd = socket(ai_family, SOCK_STREAM, 0); if (iscsi->fd == -1) { iscsi_set_error(iscsi, "Failed to open iscsi socket. " @@ -246,8 +260,6 @@ static int iscsi_tcp_connect(struct iscsi_context *iscsi, union socket_address * ISCSI_LOG(iscsi,3,"TCP_NODELAY set to 1"); } - socksize = sizeof(struct sockaddr_in); // Work-around for now, need to fix it - if (connect(iscsi->fd, &sa->sa, socksize) != 0 && errno != EINPROGRESS) { iscsi_set_error(iscsi, "Connect failed with errno : " @@ -332,6 +344,7 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal, case AF_INET: socksize = sizeof(struct sockaddr_in); memcpy(&sa.sin, ai->ai_addr, socksize); + sa.sin.sin_family = AF_INET; sa.sin.sin_port = htons(port); #ifdef HAVE_SOCK_SIN_LEN sa.sin.sin_len = socksize; @@ -341,6 +354,7 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal, case AF_INET6: socksize = sizeof(struct sockaddr_in6); memcpy(&sa.sin6, ai->ai_addr, socksize); + sa.sin6.sin6_family = AF_INET6; sa.sin6.sin6_port = htons(port); #ifdef HAVE_SOCK_SIN_LEN sa.sin6.sin6_len = socksize; -- 2.20.1
>From 179f6b33d43f26cbca133ff03fa1bacc7e8a6120 Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg <ronniesahlb...@gmail.com> Date: Sun, 8 Jan 2017 12:57:12 -0800 Subject: [PATCH] Fix IPV6 Signed-off-by: Ronnie Sahlberg <ronniesahlb...@gmail.com> --- lib/socket.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/socket.c b/lib/socket.c index 926e474..41b68c0 100644 --- a/lib/socket.c +++ b/lib/socket.c @@ -188,6 +188,20 @@ static int iscsi_tcp_connect(struct iscsi_context *iscsi, union socket_address * int socksize; + switch (ai_family) { + case AF_INET: + socksize = sizeof(struct sockaddr_in); + break; + case AF_INET6: + socksize = sizeof(struct sockaddr_in6); + break; + default: + iscsi_set_error(iscsi, "Unknown address family :%d. " + "Only IPv4/IPv6 supported so far.", + ai_family); + return -1; + } + iscsi->fd = socket(ai_family, SOCK_STREAM, 0); if (iscsi->fd == -1) { iscsi_set_error(iscsi, "Failed to open iscsi socket. " @@ -246,8 +260,6 @@ static int iscsi_tcp_connect(struct iscsi_context *iscsi, union socket_address * ISCSI_LOG(iscsi,3,"TCP_NODELAY set to 1"); } - socksize = sizeof(struct sockaddr_in); // Work-around for now, need to fix it - if (connect(iscsi->fd, &sa->sa, socksize) != 0 && errno != EINPROGRESS) { iscsi_set_error(iscsi, "Connect failed with errno : " @@ -332,6 +344,7 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal, case AF_INET: socksize = sizeof(struct sockaddr_in); memcpy(&sa.sin, ai->ai_addr, socksize); + sa.sin.sin_family = AF_INET; sa.sin.sin_port = htons(port); #ifdef HAVE_SOCK_SIN_LEN sa.sin.sin_len = socksize; @@ -341,6 +354,7 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal, case AF_INET6: socksize = sizeof(struct sockaddr_in6); memcpy(&sa.sin6, ai->ai_addr, socksize); + sa.sin6.sin6_family = AF_INET6; sa.sin6.sin6_port = htons(port); #ifdef HAVE_SOCK_SIN_LEN sa.sin6.sin6_len = socksize; -- 2.20.1