From 2870b0a57e68be61331ba9b8b38e762d41a242ba Mon Sep 17 00:00:00 2001 From: Daniel Lazarenko Date: Thu, 25 Jan 2018 10:30:22 +0100 Subject: Expose a link-local network interfaces enumeration option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The bug 8432 is caused by trying to connect through a "link-local" interface (IP address 169.254.0.x/16), which is listed among the iPhone network interfaces. The bug is not happening if the link-local network interfaces are skipped in the ICE candidate gethering process. To control this behaviour an option - disable_link_local_networks - is added inside the RTCConfiguration. It is used to set the new BasicPortAllocatorSession flag - PORTALLOCATOR_DISABLE_LINK_LOCAL_NETWORKS. The port allocator flag is added if the configuration option is set. IPIsLinkLocal IPAddress function and its friends (IPIsLoopback, IPIsPrivate) are refactored to work on both IPv4 and IPv6. Unit test IPIsLinkLocal. Bonus: fix a bug in IPIsLinkLocalV6: take into account just 10 network mask bits instead of 16. Bug: webrtc:8432 Change-Id: Ibe8f677a36098057b7fcad5c798380727b23359b Reviewed-on: https://webrtc-review.googlesource.com/36380 Reviewed-by: Taylor Brandstetter Reviewed-by: Peter Thatcher Reviewed-by: Kári Helgason Reviewed-by: Zhi Huang Commit-Queue: Taylor Brandstetter Cr-Commit-Position: refs/heads/master@{#21922} --- p2p/base/portallocator.h | 4 ++++ p2p/client/basicportallocator.cc | 8 ++++++++ 2 files changed, 12 insertions(+) (limited to 'p2p') diff --git a/p2p/base/portallocator.h b/p2p/base/portallocator.h index f8e813f502..1081448918 100644 --- a/p2p/base/portallocator.h +++ b/p2p/base/portallocator.h @@ -87,6 +87,10 @@ enum { // the application to work in a wider variety of environments, at the expense // of having to allocate additional candidates. PORTALLOCATOR_ENABLE_ANY_ADDRESS_PORTS = 0x8000, + + // Exclude link-local network interfaces + // from considertaion after adapter enumeration. + PORTALLOCATOR_DISABLE_LINK_LOCAL_NETWORKS = 0x10000, }; // Defines various reasons that have caused ICE regathering. diff --git a/p2p/client/basicportallocator.cc b/p2p/client/basicportallocator.cc index 339e007766..86cec8fb34 100644 --- a/p2p/client/basicportallocator.cc +++ b/p2p/client/basicportallocator.cc @@ -633,6 +633,14 @@ std::vector BasicPortAllocatorSession::GetNetworks() { network_manager->GetAnyAddressNetworks(&networks); } } + // Filter out link-local networks if needed. + if (flags() & PORTALLOCATOR_DISABLE_LINK_LOCAL_NETWORKS) { + networks.erase(std::remove_if(networks.begin(), networks.end(), + [](rtc::Network* network) { + return IPIsLinkLocal(network->prefix()); + }), + networks.end()); + } // Do some more filtering, depending on the network ignore mask and "disable // costly networks" flag. networks.erase(std::remove_if(networks.begin(), networks.end(), -- cgit v1.2.3