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

Reply via email to