Avoid one extra if_indextoname per address in QNetworkInterface
Given an IPv6 address associated with a network interface, there's a fairly high chance (of 100%) that any scope ID found is that of the interface. Change-Id: Id7315473f39b68ee4c169207168dc2e60fd7d570 Reviewed-by: Richard J. Moore <rich@kde.org> Reviewed-by: Peter Hartmann <phartmann@blackberry.com> Reviewed-by: Jonas Gastal <gastal@intel.com>
This commit is contained in:
parent
7a3653887c
commit
dae087b30f
@ -81,7 +81,7 @@
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
static QHostAddress addressFromSockaddr(sockaddr *sa)
|
||||
static QHostAddress addressFromSockaddr(sockaddr *sa, int ifindex = 0, const QString &ifname = QString())
|
||||
{
|
||||
QHostAddress address;
|
||||
if (!sa)
|
||||
@ -92,7 +92,11 @@ static QHostAddress addressFromSockaddr(sockaddr *sa)
|
||||
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) {
|
||||
if (scope && scope == ifindex) {
|
||||
// this is the most likely scenario:
|
||||
// a scope ID in a socket is that of the interface this address came from
|
||||
address.setScopeId(ifname);
|
||||
} else if (scope) {
|
||||
#ifndef QT_NO_IPV6IFNAME
|
||||
char scopeid[IFNAMSIZ];
|
||||
if (::if_indextoname(scope, scopeid)) {
|
||||
@ -434,14 +438,14 @@ static QList<QNetworkInterfacePrivate *> interfaceListing()
|
||||
}
|
||||
|
||||
QNetworkAddressEntry entry;
|
||||
entry.setIp(addressFromSockaddr(ptr->ifa_addr));
|
||||
entry.setIp(addressFromSockaddr(ptr->ifa_addr, iface->index, iface->name));
|
||||
if (entry.ip().isNull())
|
||||
// could not parse the address
|
||||
continue;
|
||||
|
||||
entry.setNetmask(addressFromSockaddr(ptr->ifa_netmask));
|
||||
entry.setNetmask(addressFromSockaddr(ptr->ifa_netmask, iface->index, iface->name));
|
||||
if (iface->flags & QNetworkInterface::CanBroadcast)
|
||||
entry.setBroadcast(addressFromSockaddr(ptr->ifa_broadaddr));
|
||||
entry.setBroadcast(addressFromSockaddr(ptr->ifa_broadaddr, iface->index, iface->name));
|
||||
|
||||
iface->addressEntries << entry;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user