diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2017-08-10 00:22:56 -0700 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2017-11-07 22:15:39 +0000 |
commit | 05012f4285ac38c7975138b7f839e158a6f961a3 (patch) | |
tree | dd9bfc554ee34feb74084fae87bbad65aa50dfef /src/network/kernel/qnetworkinterface_unix.cpp | |
parent | 18ec85a80c06d770c3943d98f3981ac829fd75ca (diff) |
QNetworkInterface: add MTU
[ChangeLog][QtNetwork][QNetworkInterface] Added maxTransmissionUnit().
Change-Id: Iaf4157b7efa2416d898cfffd14d96b2970d6af87
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Diffstat (limited to 'src/network/kernel/qnetworkinterface_unix.cpp')
-rw-r--r-- | src/network/kernel/qnetworkinterface_unix.cpp | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/network/kernel/qnetworkinterface_unix.cpp b/src/network/kernel/qnetworkinterface_unix.cpp index 1c2f5d335a..2f3c940d25 100644 --- a/src/network/kernel/qnetworkinterface_unix.cpp +++ b/src/network/kernel/qnetworkinterface_unix.cpp @@ -139,6 +139,15 @@ QString QNetworkInterfaceManager::interfaceNameFromIndex(uint index) return QString::number(uint(index)); } +static int getMtu(int socket, struct ifreq *req) +{ +#ifdef SIOCGIFMTU + if (qt_safe_ioctl(socket, SIOCGIFMTU, req) == 0) + return req->ifr_mtu; +#endif + return 0; +} + #ifdef QT_NO_GETIFADDRS // getifaddrs not available @@ -278,6 +287,7 @@ static QList<QNetworkInterfacePrivate *> interfaceListing() if (qt_safe_ioctl(socket, SIOCGIFFLAGS, &req) >= 0) { iface->flags = convertFlags(req.ifr_flags); } + iface->mtu = getMtu(socket, &req); #ifdef SIOCGIFHWADDR // Get the HW address @@ -458,9 +468,16 @@ static QNetworkInterface::InterfaceType probeIfType(int socket, int iftype, stru static QList<QNetworkInterfacePrivate *> createInterfaces(ifaddrs *rawList) { QList<QNetworkInterfacePrivate *> interfaces; - struct ifmediareq mediareq; + union { + struct ifmediareq mediareq; + struct ifreq req; + }; int socket = -1; + // ensure both structs start with the name field, of size IFNAMESIZ + Q_STATIC_ASSERT(sizeof(mediareq.ifm_name) == sizeof(req.ifr_name)); + Q_ASSERT(&mediareq.ifm_name == &req.ifr_name); + // on NetBSD we use AF_LINK and sockaddr_dl // scan the list for that family for (ifaddrs *ptr = rawList; ptr; ptr = ptr->ifa_next) @@ -476,6 +493,7 @@ static QList<QNetworkInterfacePrivate *> createInterfaces(ifaddrs *rawList) strlcpy(mediareq.ifm_name, ptr->ifa_name, sizeof(mediareq.ifm_name)); iface->type = probeIfType(openSocket(socket), sdl->sdl_type, &mediareq); + iface->mtu = getMtu(socket, &req); } if (socket != -1) |