12#include <QtCore/private/qduplicatetracker_p.h>
14#ifndef QT_NO_NETWORKINTERFACE
16#if defined(QT_NO_CLOCK_MONOTONIC)
20#if QT_CONFIG(getifaddrs)
25# include <arpa/inet.h>
26# ifndef SIOCGIFBRDADDR
27# define SIOCGIFBRDADDR 0x8919
31#include <qplatformdefs.h>
41 if (sa->sa_family == AF_INET)
43 else if (sa->sa_family ==
AF_INET6) {
44 address.setAddress(((sockaddr_in6 *)sa)->sin6_addr.s6_addr);
45 int scope = ((sockaddr_in6 *)sa)->sin6_scope_id;
46 if (scope && scope == ifindex) {
57template <
typename Req> [[maybe_unused]]
58static auto &
ifreq_index(Req &req, std::enable_if_t<
sizeof(std::declval<Req>().ifr_index) != 0,
int> = 0)
63template <
typename Req> [[maybe_unused]]
64static auto &
ifreq_index(Req &req, std::enable_if_t<
sizeof(std::declval<Req>().ifr_ifindex) != 0,
int> = 0)
66 return req.ifr_ifindex;
71#if QT_CONFIG(ipv6ifname)
72 return ::if_nametoindex(
name.toLatin1().constData());
73#elif defined(SIOCGIFINDEX)
80 memset(&req, 0,
sizeof(ifreq));
81 if (!name8bit.isNull())
82 memcpy(req.ifr_name, name8bit.data(),
qMin(
size_t(name8bit.length()) + 1,
sizeof(req.ifr_name) - 1));
97#if QT_CONFIG(ipv6ifname)
98 char buf[IF_NAMESIZE];
101#elif defined(SIOCGIFNAME)
105 memset(&req, 0,
sizeof(ifreq));
126#if !QT_CONFIG(getifaddrs)
132#if !QT_CONFIG(ipv6ifname)
134 struct ifconf interfaceList;
135 static const int STORAGEBUFFER_GROWTH = 256;
139 storageBuffer.resize(storageBuffer.size() + STORAGEBUFFER_GROWTH);
140 interfaceList.ifc_buf = storageBuffer.data();
141 interfaceList.ifc_len = storageBuffer.size();
145 if (
int(interfaceList.ifc_len +
sizeof(ifreq) + 64) < storageBuffer.size()) {
147 storageBuffer.resize(interfaceList.ifc_len);
154 if (storageBuffer.size() > 100000) {
160 int interfaceCount = interfaceList.ifc_len /
sizeof(ifreq);
161 for (
int i = 0;
i < interfaceCount; ++
i) {
172 struct if_nameindex *interfaceList = ::if_nameindex();
173 for (
struct if_nameindex *
ptr = interfaceList;
ptr &&
ptr->if_name; ++
ptr)
176 if_freenameindex(interfaceList);
187#if QT_CONFIG(ipv6ifname) || defined(SIOCGIFINDEX)
193 ifindex = if_nametoindex(req.ifr_name);
198 for ( ; if_it != interfaces.end(); ++if_it)
199 if ((*if_it)->index == ifindex) {
208 for ( ; if_it != interfaces.end(); ++if_it)
219 iface->index = ifindex;
228 QList<QNetworkInterfacePrivate *> interfaces;
238 memset(&req, 0,
sizeof(ifreq));
240 memcpy(req.ifr_name,
it->constData(),
qMin(
size_t(
it->length()) + 1,
sizeof(req.ifr_name) - 1));
251 if (!oldName.isNull())
252 memcpy(req.ifr_name, oldName.constData(),
qMin(
size_t(oldName.length()) + 1,
sizeof(req.ifr_name) - 1));
270 iface->hardwareAddress = iface->makeHwAddress(6,
addr);
277 sockaddr *sa = &req.ifr_addr;
283 sockaddr *sa = &req.ifr_addr;
284 if (sa->sa_family == AF_INET)
291 sockaddr *sa = &req.ifr_addr;
295 iface->addressEntries <<
entry;
309# include <features.h>
313# if defined(Q_OS_LINUX) && __GLIBC__ - 0 >= 2 && __GLIBC_MINOR__ - 0 >= 1 && !defined(QT_LINUXBASE)
314# include <netpacket/packet.h>
316static QList<QNetworkInterfacePrivate *> createInterfaces(ifaddrs *rawList)
319 QList<QNetworkInterfacePrivate *> interfaces;
320 QDuplicateTracker<QString> seenInterfaces;
321 QDuplicateTracker<int> seenIndexes;
330 for (ifaddrs *
ptr = rawList;
ptr;
ptr =
ptr->ifa_next) {
331 if (
ptr->ifa_addr &&
ptr->ifa_addr->sa_family == AF_PACKET) {
332 sockaddr_ll *sll = (sockaddr_ll *)
ptr->ifa_addr;
335 iface->index = sll->sll_ifindex;
338 iface->hardwareAddress =
iface->makeHwAddress(sll->sll_halen, (
uchar*)sll->sll_addr);
340 const bool sawIfaceIndex = seenIndexes.hasSeen(
iface->index);
342 (
void)seenInterfaces.hasSeen(
iface->name);
349 for (ifaddrs *
ptr = rawList;
ptr;
ptr =
ptr->ifa_next) {
350 if (!
ptr->ifa_addr ||
ptr->ifa_addr->sa_family != AF_PACKET) {
352 if (seenInterfaces.hasSeen(
name))
355 int ifindex = if_nametoindex(
ptr->ifa_name);
356 if (seenIndexes.hasSeen(ifindex))
363 iface->index = ifindex;
377# elif defined(Q_OS_BSD4)
379# include <net/if_dl.h>
380#if defined(QT_PLATFORM_UIKIT)
382# include <net/if_types.h>
384# include <net/if_media.h>
385# include <net/if_types.h>
386# include <netinet/in_var.h>
390static int openSocket(
int &
socket)
430 switch (
IFM_TYPE(req->ifm_current)) {
447static QList<QNetworkInterfacePrivate *> createInterfaces(ifaddrs *rawList)
449 QList<QNetworkInterfacePrivate *> interfaces;
451 struct ifmediareq mediareq;
455 memset(&mediareq, 0,
sizeof(mediareq));
458 static_assert(
sizeof(mediareq.ifm_name) ==
sizeof(req.ifr_name));
459 static_assert(offsetof(
struct ifmediareq, ifm_name) == 0);
460 static_assert(offsetof(
struct ifreq, ifr_name) == 0);
465 if (
ptr->ifa_addr &&
ptr->ifa_addr->sa_family == AF_LINK) {
469 sockaddr_dl *sdl = (sockaddr_dl *)
ptr->ifa_addr;
470 iface->index = sdl->sdl_index;
473 iface->hardwareAddress =
iface->makeHwAddress(sdl->sdl_alen, (
uchar*)LLADDR(sdl));
475 qstrncpy(mediareq.ifm_name,
ptr->ifa_name,
sizeof(mediareq.ifm_name));
495 qErrnoWarning(
"QNetworkInterface: could not create IPv6 socket");
499 qstrncpy(ifr.ifr_name, ifname,
sizeof(ifr.ifr_name));
502 ifr.ifr_addr = *
reinterpret_cast<struct sockaddr_in6 *
>(sa);
507 int flags = ifr.ifr_ifru.ifru_flags6;
513 ifr.ifr_addr = *
reinterpret_cast<struct sockaddr_in6 *
>(sa);
520 auto toDeadline = [](time_t when) {
523#if defined(QT_NO_CLOCK_MONOTONIC)
532 entry->setAddressLifetime(toDeadline(ifr.ifr_ifru.ifru_lifetime.ia6t_preferred),
533 toDeadline(ifr.ifr_ifru.ifru_lifetime.ia6t_expire));
538static QList<QNetworkInterfacePrivate *> createInterfaces(ifaddrs *rawList)
541 QList<QNetworkInterfacePrivate *> interfaces;
544 for (ifaddrs *
ptr = rawList;
ptr;
ptr =
ptr->ifa_next) {
546 int ifindex = if_nametoindex(
ptr->ifa_name);
549 for ( ; if_it != interfaces.end(); ++if_it)
550 if ((*if_it)->index == ifindex)
554 if (if_it == interfaces.end()) {
559 iface->index = ifindex;
578 QList<QNetworkInterfacePrivate *> interfaces;
592 for ( ; if_it != interfaces.end(); ++if_it)
593 if ((*if_it)->name ==
name) {
601 int ifindex = if_nametoindex(
ptr->ifa_name);
602 for (if_it = interfaces.begin(); if_it != interfaces.end(); ++if_it)
603 if ((*if_it)->index == ifindex) {
617 if (
entry.ip().isNull())
624 getAddressExtraInfo(&
entry,
ptr->ifa_addr,
name.latin1());
634QList<QNetworkInterfacePrivate *> QNetworkInterfaceManager::scan()
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.
void setAddress(quint32 ip4Addr)
Set the IPv4 address specified by ip4Addr.
The QNetworkAddressEntry class stores one IP address supported by a network interface,...
void setIp(const QHostAddress &newIp)
Sets the IP address the QNetworkAddressEntry object contains to newIp.
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
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
static ControlElement< T > * ptr(QWidget *widget)
constexpr const T & qMin(const T &a, const T &b)
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 QList< QNetworkInterfacePrivate * > interfaceListing()
static QNetworkInterfacePrivate * findInterface(int socket, QList< QNetworkInterfacePrivate * > &interfaces, struct ifreq &req)
static QT_BEGIN_NAMESPACE QHostAddress addressFromSockaddr(sockaddr *sa, int ifindex=0, const QString &ifname=QString())
static int getMtu(int socket, struct ifreq *req)
static QSet< QByteArray > interfaceNames(int socket)
static auto & ifreq_index(Req &req, std::enable_if_t< sizeof(std::declval< Req >().ifr_index) !=0, int >=0)
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)