79 QList<QNetworkInterfacePrivate *> interfaces;
80 IP_ADAPTER_ADDRESSES staticBuf[2];
81 PIP_ADAPTER_ADDRESSES pAdapter = staticBuf;
82 ULONG bufSize =
sizeof staticBuf;
84 ULONG flags = GAA_FLAG_INCLUDE_PREFIX |
85 GAA_FLAG_SKIP_DNS_SERVER |
86 GAA_FLAG_SKIP_MULTICAST;
87 ULONG retval = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, pAdapter, &bufSize);
88 if (retval == ERROR_BUFFER_OVERFLOW) {
90 pAdapter =
reinterpret_cast<IP_ADAPTER_ADDRESSES *>(malloc(bufSize));
94 if (GetAdaptersAddresses(AF_UNSPEC, flags, NULL, pAdapter, &bufSize) != ERROR_SUCCESS) {
98 }
else if (retval != ERROR_SUCCESS) {
104 for (PIP_ADAPTER_ADDRESSES ptr = pAdapter; ptr; ptr = ptr->Next) {
108 Q_ASSERT(ptr->Length >= offsetof(IP_ADAPTER_ADDRESSES, Luid));
109 Q_ASSERT(ptr->Length >= offsetof(IP_ADAPTER_ADDRESSES, Ipv6IfIndex));
115 if (ptr->Ipv6IfIndex != 0)
116 iface
->index = ptr->Ipv6IfIndex;
117 else if (ptr->IfIndex != 0)
120 iface->mtu = qMin<qint64>(ptr->Mtu, INT_MAX);
121 iface->flags = QNetworkInterface::CanBroadcast;
122 if (ptr->OperStatus == IfOperStatusUp)
123 iface->flags |= QNetworkInterface::IsUp | QNetworkInterface::IsRunning;
124 if ((ptr->Flags & IP_ADAPTER_NO_MULTICAST) == 0)
125 iface->flags |= QNetworkInterface::CanMulticast;
126 if (ptr->IfType == IF_TYPE_PPP)
127 iface->flags |= QNetworkInterface::IsPointToPoint;
129 switch (ptr->IfType) {
130 case IF_TYPE_ETHERNET_CSMACD:
131 iface->type = QNetworkInterface::Ethernet;
135 iface->type = QNetworkInterface::Fddi;
139 iface->type = QNetworkInterface::Ppp;
143 iface->type = QNetworkInterface::Slip;
146 case IF_TYPE_SOFTWARE_LOOPBACK:
147 iface->type = QNetworkInterface::Loopback;
148 iface->flags |= QNetworkInterface::IsLoopBack;
151 case IF_TYPE_IEEE80211:
152 iface->type = QNetworkInterface::Ieee80211;
155 case IF_TYPE_IEEE1394:
156 iface->type = QNetworkInterface::Ieee1394;
160 iface->type = QNetworkInterface::Ieee80216;
164 iface->type = QNetworkInterface::Ieee802154;
170 WCHAR buf[IF_MAX_STRING_SIZE + 1];
171 if (ConvertInterfaceLuidToNameW(&ptr->Luid, buf,
sizeof(buf)/
sizeof(buf[0])) == NO_ERROR)
172 iface->name = QString::fromWCharArray(buf);
173 if (iface->name.isEmpty())
174 iface->name = QString::fromLocal8Bit(ptr->AdapterName);
176 iface->friendlyName = QString::fromWCharArray(ptr->FriendlyName);
177 if (ptr->PhysicalAddressLength)
178 iface->hardwareAddress = iface->makeHwAddress(ptr->PhysicalAddressLength,
179 ptr->PhysicalAddress);
182 for (PIP_ADAPTER_UNICAST_ADDRESS addr = ptr->FirstUnicastAddress; addr; addr = addr->Next) {
183 Q_ASSERT(addr->Length >= offsetof(IP_ADAPTER_UNICAST_ADDRESS, OnLinkPrefixLength));
186 if (addr->DadState == IpDadStateInvalid)
190 entry.setIp(addressFromSockaddr(addr->Address.lpSockaddr));
191 entry.setPrefixLength(addr->OnLinkPrefixLength);
193 auto toDeadline = [](ULONG lifetime) -> QDeadlineTimer {
194 if (lifetime == 0xffffffffUL)
195 return QDeadlineTimer::Forever;
196 return QDeadlineTimer(lifetime * 1000);
198 entry.setAddressLifetime(toDeadline(addr->ValidLifetime), toDeadline(addr->PreferredLifetime));
199 entry.setDnsEligibility(addr->Flags & IP_ADAPTER_ADDRESS_DNS_ELIGIBLE ?
200 QNetworkAddressEntry::DnsEligible :
201 QNetworkAddressEntry::DnsIneligible);
203 iface->addressEntries << entry;
207 if (pAdapter != staticBuf)
The QNetworkAddressEntry class stores one IP address supported by a network interface,...