diff options
author | Jordan Bayles <jophba@chromium.org> | 2021-06-29 12:04:17 -0700 |
---|---|---|
committer | Openscreen LUCI CQ <openscreen-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2021-06-29 19:51:57 +0000 |
commit | 082e0e3df7fcaeed60e49ac212e180b4dac6a39d (patch) | |
tree | 5d14a7e64b1e6085aa4e9e56cc4bfb134e45e70a | |
parent | 8a7173ad36859154874c17b107b450ee261a3697 (diff) | |
download | openscreen-082e0e3df7fcaeed60e49ac212e180b4dac6a39d.tar.gz |
Add filtering for deprecated IPv6 addresses
On MacOSX, some specific IPv6 addresses are considered deprecated. This
patch filters them from the network interface getters.
Bug: b/155337148
Change-Id: Ib04f4ed64ec330fef9625fb42d474658213d9646
Reviewed-on: https://chromium-review.googlesource.com/c/openscreen/+/2995022
Reviewed-by: Brandon Tolsch <btolsch@chromium.org>
Commit-Queue: Jordan Bayles <jophba@chromium.org>
-rw-r--r-- | platform/impl/network_interface_mac.cc | 10 |
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)]; |