aboutsummaryrefslogtreecommitdiff
path: root/platform/impl/network_interface_mac.cc
diff options
context:
space:
mode:
Diffstat (limited to 'platform/impl/network_interface_mac.cc')
-rw-r--r--platform/impl/network_interface_mac.cc10
1 files changed, 10 insertions, 0 deletions
diff --git a/platform/impl/network_interface_mac.cc b/platform/impl/network_interface_mac.cc
index bb7bd583..e101beba 100644
--- a/platform/impl/network_interface_mac.cc
+++ b/platform/impl/network_interface_mac.cc
@@ -6,6 +6,7 @@
#include <net/if_dl.h>
#include <net/if_media.h>
#include <netinet/in.h>
+#include <netinet/in_var.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
@@ -133,6 +134,15 @@ std::vector<InterfaceInfo> ProcessInterfacesList(ifaddrs* interfaces) {
memcpy(&interface->hardware_address[0], &lladdr[0],
sizeof(interface->hardware_address));
} else if (cur->ifa_addr->sa_family == AF_INET6) { // Ipv6 address.
+ struct in6_ifreq ifr = {};
+ // Reject network interfaces that have a deprecated flag set.
+ strncpy(ifr.ifr_name, cur->ifa_name, sizeof(ifr.ifr_name) - 1);
+ memcpy(&ifr.ifr_ifru.ifru_addr, cur->ifa_addr, cur->ifa_addr->sa_len);
+ if (ioctl(ioctl_socket.get(), SIOCGIFAFLAG_IN6, &ifr) != 0 ||
+ ifr.ifr_ifru.ifru_flags & IN6_IFF_DEPRECATED) {
+ continue;
+ }
+
auto* const addr_in6 =
reinterpret_cast<const sockaddr_in6*>(cur->ifa_addr);
uint8_t tmp[sizeof(addr_in6->sin6_addr.s6_addr)];