Revert 8532 "Ensure only temporary IPv6 address is selected as t..."

> Ensure only temporary IPv6 address is selected as the best IP.
> 
> The current logic of IPv6 selection could still have a small chance for non-temporary address to be selected for candidate. The scenario is that when there is no non-deprecated temporary IP, the global ones could be selected.
> 
> Global ones don't necessarily carry MAC. However, instead of comparing whether it has the MAC in it (sometimes 5 out of 6 elements from a MAC are the same, only one diffs), we should just err on the safe side.
> 
> BUG=4348
> R=juberti@webrtc.org, pthatcher@webrtc.org
> 
> Review URL: https://webrtc-codereview.appspot.com/38289004

TBR=guoweis@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/38319004

Cr-Commit-Position: refs/heads/master@{#8534}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8534 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
aluebs@webrtc.org 2015-02-27 18:42:22 +00:00
parent 21ad37528e
commit 07dcf60ee0
3 changed files with 44 additions and 17 deletions

View File

@ -719,8 +719,7 @@ bool Network::SetIPs(const std::vector<InterfaceAddress>& ips, bool changed) {
return changed;
}
// Select the best IP address to use from this Network. For IPv6 addresses, we
// only allow temporary IPv6 addresses to be selected to prevent MAC tracking.
// Select the best IP address to use from this Network.
IPAddress Network::GetBestIP() const {
if (ips_.size() == 0) {
return IPAddress();
@ -730,17 +729,32 @@ IPAddress Network::GetBestIP() const {
return static_cast<IPAddress>(ips_.at(0));
}
InterfaceAddress selected_ip, ula_ip;
for (const InterfaceAddress& ip : ips_) {
// Ignore all deprecated and non-temporary addresses.
if ((ip.ipv6_flags() & IPV6_ADDRESS_FLAG_DEPRECATED) ||
!(ip.ipv6_flags() & IPV6_ADDRESS_FLAG_TEMPORARY)) {
// Ignore any address which has been deprecated already.
if (ip.ipv6_flags() & IPV6_ADDRESS_FLAG_DEPRECATED)
continue;
// ULA address should only be returned when we have no other
// global IP.
if (IPIsULA(static_cast<const IPAddress&>(ip))) {
ula_ip = ip;
continue;
}
selected_ip = ip;
return static_cast<IPAddress>(ip);
// Search could stop once a temporary non-deprecated one is found.
if (ip.ipv6_flags() & IPV6_ADDRESS_FLAG_TEMPORARY)
break;
}
return IPAddress();
// No proper global IPv6 address found, use ULA instead.
if (IPIsUnspec(selected_ip) && !IPIsUnspec(ula_ip)) {
selected_ip = ula_ip;
}
return static_cast<IPAddress>(selected_ip);
}
std::string Network::ToString() const {

View File

@ -236,9 +236,24 @@ class Network {
// interfaces. Key is derived from interface name and it's prefix.
std::string key() const { return key_; }
// Returns the Network's current idea of the 'best' IP it has. For privacy
// reasons, in the case of IPv6, only temporary addresses will be selected.
// Additionally, the unique local address (ULA) will never be selected.
// Returns the Network's current idea of the 'best' IP it has.
// Or return an unset IP if this network has no active addresses.
// Here is the rule on how we mark the IPv6 address as ignorable for WebRTC.
// 1) return all global temporary dynamic and non-deprecrated ones.
// 2) if #1 not available, return global ones.
// 3) if #2 not available, use ULA ipv6 as last resort. (ULA stands
// for unique local address, which is not route-able in open
// internet but might be useful for a close WebRTC deployment.
// TODO(guoweis): rule #3 actually won't happen at current
// implementation. The reason being that ULA address starting with
// 0xfc 0r 0xfd will be grouped into its own Network. The result of
// that is WebRTC will have one extra Network to generate candidates
// but the lack of rule #3 shouldn't prevent turning on IPv6 since
// ULA should only be tried in a close deployment anyway.
// Note that when not specifying any flag, it's treated as case global
// IPv6 address
IPAddress GetBestIP() const;
// Keep the original function here for now.

View File

@ -759,20 +759,18 @@ TEST_F(NetworkTest, TestIPv6Selection) {
ipv6_network.AddIP(ip);
EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
// Add ULA one. ULA is the unique local address which starts with either 0xfc
// or 0xfd. Since it doesn't have the temporary address attribute, it'll be
// ignored.
// Add ULA one. ULA is unique local address which is starting either
// with 0xfc or 0xfd.
ipstr = "fd00:fa00:4:1000:be30:5bff:fee5:c4";
ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
ipv6_network.AddIP(ip);
EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
// Add global one. Since it doesn't have the temporary address attribute,
// it'll be ignored.
// Add global one.
ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c5";
ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
ipv6_network.AddIP(ip);
EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
// Add global dynamic temporary one.
ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c6";