Turn on IPv6 for WebRTC as default as required before ramping the experiment to 30%.

BUG=
R=juberti@webrtc.org

Committed: https://code.google.com/p/webrtc/source/detail?r=8582

Committed: https://code.google.com/p/webrtc/source/detail?r=8607

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

Cr-Commit-Position: refs/heads/master@{#8609}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8609 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/talk/app/webrtc/peerconnection.cc b/talk/app/webrtc/peerconnection.cc
index 2dce562..d0c4cc2 100644
--- a/talk/app/webrtc/peerconnection.cc
+++ b/talk/app/webrtc/peerconnection.cc
@@ -341,17 +341,18 @@
   int portallocator_flags = port_allocator_->flags();
   portallocator_flags |= cricket::PORTALLOCATOR_ENABLE_BUNDLE |
                          cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG |
-                         cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET;
+                         cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET |
+                         cricket::PORTALLOCATOR_ENABLE_IPV6;
   bool value;
   // If IPv6 flag was specified, we'll not override it by experiment.
   if (FindConstraint(
           constraints, MediaConstraintsInterface::kEnableIPv6, &value, NULL)) {
-    if (value) {
-      portallocator_flags |= cricket::PORTALLOCATOR_ENABLE_IPV6;
+    if (!value) {
+      portallocator_flags &= ~(cricket::PORTALLOCATOR_ENABLE_IPV6);
     }
   } else if (webrtc::field_trial::FindFullName("WebRTC-IPv6Default") ==
-             "Enabled") {
-    portallocator_flags |= cricket::PORTALLOCATOR_ENABLE_IPV6;
+             "Disabled") {
+    portallocator_flags &= ~(cricket::PORTALLOCATOR_ENABLE_IPV6);
   }
 
   port_allocator_->set_flags(portallocator_flags);
diff --git a/webrtc/base/ipaddress.cc b/webrtc/base/ipaddress.cc
index 300c69b..be709c8 100644
--- a/webrtc/base/ipaddress.cc
+++ b/webrtc/base/ipaddress.cc
@@ -432,6 +432,12 @@
   return IPIsHelper(ip, k6To4Prefix, 16);
 }
 
+bool IPIsLinkLocal(const IPAddress& ip) {
+  // Can't use the helper because the prefix is 10 bits.
+  in6_addr addr = ip.ipv6_address();
+  return addr.s6_addr[0] == 0xFE && (addr.s6_addr[1] & 0x80) == 0x80;
+}
+
 bool IPIsSiteLocal(const IPAddress& ip) {
   // Can't use the helper because the prefix is 10 bits.
   in6_addr addr = ip.ipv6_address();
diff --git a/webrtc/base/ipaddress.h b/webrtc/base/ipaddress.h
index 12db5c5..3d77c28 100644
--- a/webrtc/base/ipaddress.h
+++ b/webrtc/base/ipaddress.h
@@ -162,6 +162,7 @@
 // These are only really applicable for IPv6 addresses.
 bool IPIs6Bone(const IPAddress& ip);
 bool IPIs6To4(const IPAddress& ip);
+bool IPIsLinkLocal(const IPAddress& ip);
 bool IPIsSiteLocal(const IPAddress& ip);
 bool IPIsTeredo(const IPAddress& ip);
 bool IPIsULA(const IPAddress& ip);
diff --git a/webrtc/base/network.cc b/webrtc/base/network.cc
index bbebe8a..613dcad 100644
--- a/webrtc/base/network.cc
+++ b/webrtc/base/network.cc
@@ -601,6 +601,14 @@
   if (network.prefix().family() == AF_INET) {
     return (network.prefix().v4AddressAsHostOrderInteger() < 0x01000000);
   }
+
+  // Linklocal addresses require scope id to be bound successfully. However, our
+  // IPAddress structure doesn't carry that so the information is lost and
+  // causes binding failure.
+  if (network.prefix().family() == AF_INET6 &&
+      IPIsLinkLocal(network.GetBestIP())) {
+    return true;
+  }
   return false;
 }
 
diff --git a/webrtc/base/network_unittest.cc b/webrtc/base/network_unittest.cc
index 662dc70..fdf75ca 100644
--- a/webrtc/base/network_unittest.cc
+++ b/webrtc/base/network_unittest.cc
@@ -285,13 +285,13 @@
 void SetupNetworks(NetworkManager::NetworkList* list) {
   IPAddress ip;
   IPAddress prefix;
-  EXPECT_TRUE(IPFromString("fe80::1234:5678:abcd:ef12", &ip));
-  EXPECT_TRUE(IPFromString("fe80::", &prefix));
+  EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:ef12", &ip));
+  EXPECT_TRUE(IPFromString("abcd::", &prefix));
   // First, fake link-locals.
   Network ipv6_eth0_linklocalnetwork("test_eth0", "Test NetworkAdapter 1",
                                      prefix, 64);
   ipv6_eth0_linklocalnetwork.AddIP(ip);
-  EXPECT_TRUE(IPFromString("fe80::5678:abcd:ef12:3456", &ip));
+  EXPECT_TRUE(IPFromString("abcd::5678:abcd:ef12:3456", &ip));
   Network ipv6_eth1_linklocalnetwork("test_eth1", "Test NetworkAdapter 2",
                                      prefix, 64);
   ipv6_eth1_linklocalnetwork.AddIP(ip);