diff options
author | Shane Kearns <shane.kearns@accenture.com> | 2012-05-09 17:06:47 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-05-24 13:48:51 +0200 |
commit | 3c63d78cdf56f719b7d27a589389b5eda399f28a (patch) | |
tree | afb4f7cec5397f38184f02198bbcf5eb3139156e /src/network | |
parent | 7be85320379f49f04da3860fa14c9929e329acdd (diff) |
Include scope ids in QHostAddress from QNetworkInterface
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>
(cherry picked from commit b72c8dd8a248d67b1192e3baa1fca07244a3719d)
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/kernel/qnetworkinterface_unix.cpp | 13 | ||||
-rw-r--r-- | src/network/kernel/qnetworkinterface_win.cpp | 7 |
2 files changed, 17 insertions, 3 deletions
diff --git a/src/network/kernel/qnetworkinterface_unix.cpp b/src/network/kernel/qnetworkinterface_unix.cpp index 8545e6ebfb..1d2c5770c8 100644 --- a/src/network/kernel/qnetworkinterface_unix.cpp +++ b/src/network/kernel/qnetworkinterface_unix.cpp @@ -81,8 +81,19 @@ static QHostAddress addressFromSockaddr(sockaddr *sa) if (sa->sa_family == AF_INET) address.setAddress(htonl(((sockaddr_in *)sa)->sin_addr.s_addr)); #ifndef QT_NO_IPV6 - 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)); + } + } #endif return address; diff --git a/src/network/kernel/qnetworkinterface_win.cpp b/src/network/kernel/qnetworkinterface_win.cpp index f2bb172967..5224fd203e 100644 --- a/src/network/kernel/qnetworkinterface_win.cpp +++ b/src/network/kernel/qnetworkinterface_win.cpp @@ -82,9 +82,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; |