Include scope ids in QHostAddress from QNetworkInterface
authorShane Kearns <shane.kearns@accenture.com>
Wed, 9 May 2012 16:06:47 +0000 (17:06 +0100)
committerQt by Nokia <qt-info@nokia.com>
Fri, 11 May 2012 15:39:13 +0000 (17:39 +0200)
The scope ID is a required part of the address for link local
addresses (to solve the problem of the same link local address
being created by two machines on different networks).
It is required to send packets to a link local address on Mac and
Windows, although Linux multicasts if scope is missing.

Task-number: QTBUG-25634
Change-Id: Ie2bb09df8d261eefcb81716bafeb1475f0bed5fe
Reviewed-by: Martin Petersson <Martin.Petersson@nokia.com>
src/network/kernel/qnetworkinterface_unix.cpp
src/network/kernel/qnetworkinterface_win.cpp

index db031fc..5087e76 100644 (file)
@@ -89,9 +89,19 @@ static QHostAddress addressFromSockaddr(sockaddr *sa)
 
     if (sa->sa_family == AF_INET)
         address.setAddress(htonl(((sockaddr_in *)sa)->sin_addr.s_addr));
-    else if (sa->sa_family == AF_INET6)
+    else if (sa->sa_family == AF_INET6) {
         address.setAddress(((sockaddr_in6 *)sa)->sin6_addr.s6_addr);
-
+        int scope = ((sockaddr_in6 *)sa)->sin6_scope_id;
+        if (scope) {
+#ifndef QT_NO_IPV6IFNAME
+            char scopeid[IFNAMSIZ];
+            if (::if_indextoname(scope, scopeid)) {
+                address.setScopeId(QLatin1String(scopeid));
+            } else
+#endif
+                address.setScopeId(QString::number(scope));
+        }
+    }
     return address;
 
 }
index d1d2659..1f4ac7f 100644 (file)
@@ -91,9 +91,12 @@ static QHostAddress addressFromSockaddr(sockaddr *sa)
 
     if (sa->sa_family == AF_INET)
         address.setAddress(htonl(((sockaddr_in *)sa)->sin_addr.s_addr));
-    else if (sa->sa_family == AF_INET6)
+    else if (sa->sa_family == AF_INET6) {
         address.setAddress(((qt_sockaddr_in6 *)sa)->sin6_addr.qt_s6_addr);
-    else
+        int scope = ((qt_sockaddr_in6 *)sa)->sin6_scope_id;
+        if (scope)
+            address.setScopeId(QString::number(scope));
+    } else
         qWarning("Got unknown socket family %d", sa->sa_family);
     return address;