12#include <QtCore/private/qduplicatetracker_p.h>
14#ifndef QT_NO_NETWORKINTERFACE
16#if defined(QT_NO_CLOCK_MONOTONIC)
20#if defined(QT_LINUXBASE)
21# define QT_NO_GETIFADDRS
24#ifndef QT_NO_GETIFADDRS
29# include <arpa/inet.h>
30# ifndef SIOCGIFBRDADDR
31# define SIOCGIFBRDADDR 0x8919
35#include <qplatformdefs.h>
45 if (sa->sa_family == AF_INET)
46 address.setAddress(htonl(((sockaddr_in *)sa)->sin_addr.s_addr));
47 else if (sa->sa_family ==
AF_INET6) {
48 address.setAddress(((sockaddr_in6 *)sa)->sin6_addr.s6_addr);
49 int scope = ((sockaddr_in6 *)sa)->sin6_scope_id;
50 if (scope && scope == ifindex) {
64#ifndef QT_NO_IPV6IFNAME
65 return ::if_nametoindex(
name.toLatin1());
66#elif defined(SIOCGIFINDEX)
73 memset(&req, 0,
sizeof(ifreq));
74 memcpy(req.ifr_name, name8bit, qMin<int>(name8bit.
length() + 1,
sizeof(req.ifr_name) - 1));
78# if QT_CONFIG(ifr_index)
93#ifndef QT_NO_IPV6IFNAME
94 char buf[IF_NAMESIZE];
97#elif defined(SIOCGIFNAME)
101 memset(&req, 0,
sizeof(ifreq));
102# if QT_CONFIG(ifr_index)
103 req.ifr_index =
index;
105 req.ifr_ifindex =
index;
127#ifdef QT_NO_GETIFADDRS
133#ifdef QT_NO_IPV6IFNAME
135 struct ifconf interfaceList;
136 static const int STORAGEBUFFER_GROWTH = 256;
140 storageBuffer.
resize(storageBuffer.
size() + STORAGEBUFFER_GROWTH);
141 interfaceList.ifc_buf = storageBuffer.
data();
142 interfaceList.ifc_len = storageBuffer.
size();
146 if (
int(interfaceList.ifc_len +
sizeof(ifreq) + 64) < storageBuffer.
size()) {
148 storageBuffer.
resize(interfaceList.ifc_len);
155 if (storageBuffer.
size() > 100000) {
161 int interfaceCount = interfaceList.ifc_len /
sizeof(ifreq);
162 for (
int i = 0;
i < interfaceCount; ++
i) {
173 struct if_nameindex *interfaceList = ::if_nameindex();
174 for (
struct if_nameindex *
ptr = interfaceList;
ptr &&
ptr->if_name; ++
ptr)
177 if_freenameindex(interfaceList);
188#if !defined(QT_NO_IPV6IFNAME) || defined(SIOCGIFINDEX)
192# if QT_CONFIG(ifr_index)
193 ifindex = req.ifr_index;
195 ifindex = req.ifr_ifindex;
198 ifindex = if_nametoindex(req.ifr_name);
203 for ( ; if_it != interfaces.
end(); ++if_it)
204 if ((*if_it)->index == ifindex) {
213 for ( ; if_it != interfaces.
end(); ++if_it)
224 iface->index = ifindex;
243 memset(&req, 0,
sizeof(ifreq));
244 memcpy(req.ifr_name, *
it, qMin<int>(
it->length() + 1,
sizeof(req.ifr_name) - 1));
255 memcpy(req.ifr_name, oldName, qMin<int>(oldName.
length() + 1,
sizeof(req.ifr_name) - 1));
280 sockaddr *sa = &req.ifr_addr;
286 sockaddr *sa = &req.ifr_addr;
287 if (sa->sa_family == AF_INET)
294 sockaddr *sa = &req.ifr_addr;
312# include <features.h>
316# if defined(Q_OS_LINUX) && __GLIBC__ - 0 >= 2 && __GLIBC_MINOR__ - 0 >= 1 && !defined(QT_LINUXBASE)
317# include <netpacket/packet.h>
333 for (ifaddrs *
ptr = rawList;
ptr;
ptr =
ptr->ifa_next) {
334 if (
ptr->ifa_addr &&
ptr->ifa_addr->sa_family == AF_PACKET) {
335 sockaddr_ll *sll = (sockaddr_ll *)
ptr->ifa_addr;
338 iface->index = sll->sll_ifindex;
341 iface->hardwareAddress =
iface->makeHwAddress(sll->sll_halen, (
uchar*)sll->sll_addr);
343 const bool sawIfaceIndex = seenIndexes.
hasSeen(
iface->index);
352 for (ifaddrs *
ptr = rawList;
ptr;
ptr =
ptr->ifa_next) {
353 if (!
ptr->ifa_addr ||
ptr->ifa_addr->sa_family != AF_PACKET) {
358 int ifindex = if_nametoindex(
ptr->ifa_name);
359 if (seenIndexes.
hasSeen(ifindex))
366 iface->index = ifindex;
380# elif defined(Q_OS_BSD4)
382# include <net/if_dl.h>
383#if defined(QT_PLATFORM_UIKIT)
385# include <net/if_types.h>
387# include <net/if_media.h>
388# include <net/if_types.h>
389# include <netinet/in_var.h>
393static int openSocket(
int &
socket)
433 switch (
IFM_TYPE(req->ifm_current)) {
454 struct ifmediareq mediareq;
458 memset(&mediareq, 0,
sizeof(mediareq));
461 static_assert(
sizeof(mediareq.ifm_name) ==
sizeof(req.ifr_name));
462 static_assert(offsetof(
struct ifmediareq, ifm_name) == 0);
463 static_assert(offsetof(
struct ifreq, ifr_name) == 0);
468 if (
ptr->ifa_addr &&
ptr->ifa_addr->sa_family == AF_LINK) {
472 sockaddr_dl *sdl = (sockaddr_dl *)
ptr->ifa_addr;
473 iface->index = sdl->sdl_index;
476 iface->hardwareAddress =
iface->makeHwAddress(sdl->sdl_alen, (
uchar*)LLADDR(sdl));
478 qstrncpy(mediareq.ifm_name,
ptr->ifa_name,
sizeof(mediareq.ifm_name));
498 qErrnoWarning(
"QNetworkInterface: could not create IPv6 socket");
502 qstrncpy(ifr.ifr_name, ifname,
sizeof(ifr.ifr_name));
505 ifr.ifr_addr = *
reinterpret_cast<struct sockaddr_in6 *
>(sa);
510 int flags = ifr.ifr_ifru.ifru_flags6;
516 ifr.ifr_addr = *
reinterpret_cast<struct sockaddr_in6 *
>(sa);
523 auto toDeadline = [](time_t when) {
526#if defined(QT_NO_CLOCK_MONOTONIC)
535 entry->setAddressLifetime(toDeadline(ifr.ifr_ifru.ifru_lifetime.ia6t_preferred),
536 toDeadline(ifr.ifr_ifru.ifru_lifetime.ia6t_expire));
547 for (ifaddrs *
ptr = rawList;
ptr;
ptr =
ptr->ifa_next) {
549 int ifindex = if_nametoindex(
ptr->ifa_name);
552 for ( ; if_it != interfaces.
end(); ++if_it)
553 if ((*if_it)->index == ifindex)
557 if (if_it == interfaces.
end()) {
562 iface->index = ifindex;
595 for ( ; if_it != interfaces.
end(); ++if_it)
596 if ((*if_it)->name ==
name) {
604 int ifindex = if_nametoindex(
ptr->ifa_name);
605 for (if_it = interfaces.
begin(); if_it != interfaces.
end(); ++if_it)
606 if ((*if_it)->index == ifindex) {
620 if (
entry.ip().isNull())
629 iface->addressEntries <<
entry;
char * data()
\macro QT_NO_CAST_FROM_BYTEARRAY
qsizetype size() const noexcept
Returns the number of bytes in this byte array.
qsizetype length() const noexcept
Same as size().
void resize(qsizetype size)
Sets the size of the byte array to size bytes.
static qint64 currentSecsSinceEpoch() noexcept
void setPreciseRemainingTime(qint64 secs, qint64 nsecs=0, Qt::TimerType type=Qt::CoarseTimer) noexcept
Sets the remaining time for this QDeadlineTimer object to secs seconds plus nsecs nanoseconds from no...
static constexpr ForeverConstant Forever
void setPreciseDeadline(qint64 secs, qint64 nsecs=0, Qt::TimerType type=Qt::CoarseTimer) noexcept
Sets the deadline for this QDeadlineTimer object to be secs seconds and nsecs nanoseconds since the r...
The QHostAddress class provides an IP address.
The QNetworkAddressEntry class stores one IP address supported by a network interface,...
static uint interfaceIndexFromName(const QString &name)
static QString interfaceNameFromIndex(uint index)
static void calculateDnsEligibility(QNetworkAddressEntry *entry, bool isTemporary, bool isDeprecated)
InterfaceType
Specifies the type of hardware (PHY layer, OSI level 1) this interface is, if it could be determined.
const_iterator constBegin() const noexcept
const_iterator constEnd() const noexcept
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QSet< QString >::iterator it
void qErrnoWarning(const char *msg,...)
Combined button and popup list for selecting options.
constexpr QBindableInterface iface
Q_CORE_EXPORT char * qstrncpy(char *dst, const char *src, size_t len)
static int qt_safe_close(int fd)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
static ControlElement< T > * ptr(QWidget *widget)
static int qt_safe_ioctl(int sockfd, unsigned long request, T arg)
static int qt_safe_socket(int domain, int type, int protocol, int flags=0)
static QNetworkInterface::InterfaceType probeIfType(int socket, struct ifreq *req, short arptype)
#define IN6_IFF_DEPRECATED
#define IN6_IFF_TEMPORARY
#define SIOCGIFALIFETIME_IN6
static void getAddressExtraInfo(QNetworkAddressEntry *entry, struct sockaddr *sa, const char *ifname)
static QList< QNetworkInterfacePrivate * > interfaceListing()
static QT_BEGIN_NAMESPACE QHostAddress addressFromSockaddr(sockaddr *sa, int ifindex=0, const QString &ifname=QString())
static int getMtu(int socket, struct ifreq *req)
static QList< QNetworkInterfacePrivate * > createInterfaces(ifaddrs *rawList)
static QT_BEGIN_NAMESPACE QNetworkInterface::InterfaceFlags convertFlags(uint rawFlags)
GLenum GLuint GLenum GLsizei const GLchar * buf
GLuint GLuint64EXT address
#define QT_BEGIN_INCLUDE_NAMESPACE
#define QT_END_INCLUDE_NAMESPACE
QDeadlineTimer deadline(30s)