Extending UsagePattern and private IP addresses.

Adding additional usage bits to the UsagePattern to:
- Track whether a mDNS candidate was collected
- Track whether a mDNS candidate was received from the remote peer
- Track whether a private IP address was received from the remote peer

The definition of a private IP address is extended to include 100.64/10 addresses.


Bug: None
Change-Id: I77182685120413d5c13c5f67e480d33fdcaefc6a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/134000
Commit-Queue: Jeroen de Borst <jeroendb@webrtc.org>
Reviewed-by: Justin Uberti <juberti@google.com>
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Reviewed-by: Qingsi Wang <qingsi@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27747}
diff --git a/rtc_base/ip_address.cc b/rtc_base/ip_address.cc
index ff0be13..96d1001 100644
--- a/rtc_base/ip_address.cc
+++ b/rtc_base/ip_address.cc
@@ -235,6 +235,18 @@
   return false;
 }
 
+static bool IPIsSharedNetworkV4(const IPAddress& ip) {
+  uint32_t ip_in_host_order = ip.v4AddressAsHostOrderInteger();
+  return (ip_in_host_order >> 22) == ((100 << 2) | 1);
+}
+
+bool IPIsSharedNetwork(const IPAddress& ip) {
+  if (ip.family() == AF_INET) {
+    return IPIsSharedNetworkV4(ip);
+  }
+  return false;
+}
+
 in_addr ExtractMappedAddress(const in6_addr& in6) {
   in_addr ipv4;
   ::memcpy(&ipv4.s_addr, &in6.s6_addr[12], sizeof(ipv4.s_addr));
@@ -319,7 +331,8 @@
 }
 
 bool IPIsPrivate(const IPAddress& ip) {
-  return IPIsLinkLocal(ip) || IPIsLoopback(ip) || IPIsPrivateNetwork(ip);
+  return IPIsLinkLocal(ip) || IPIsLoopback(ip) || IPIsPrivateNetwork(ip) ||
+         IPIsSharedNetwork(ip);
 }
 
 bool IPIsUnspec(const IPAddress& ip) {
@@ -407,7 +420,9 @@
       bits = (i * 32);
       break;
     }
-    default: { return 0; }
+    default: {
+      return 0;
+    }
   }
   if (word_to_count == 0) {
     return bits;
diff --git a/rtc_base/ip_address.h b/rtc_base/ip_address.h
index 49dea68..2a52e1a 100644
--- a/rtc_base/ip_address.h
+++ b/rtc_base/ip_address.h
@@ -22,6 +22,7 @@
 #include <ws2tcpip.h>
 #endif
 #include <string.h>
+
 #include <string>
 
 #include "rtc_base/byte_order.h"
@@ -157,8 +158,12 @@
 // Identify a private network address like "192.168.111.222"
 // (see https://en.wikipedia.org/wiki/Private_network )
 bool IPIsPrivateNetwork(const IPAddress& ip);
+// Identify a shared network address like "100.72.16.122"
+// (see RFC6598)
+bool IPIsSharedNetwork(const IPAddress& ip);
 // Identify if an IP is "private", that is a loopback
-// or an address belonging to a link-local or a private network.
+// or an address belonging to a link-local, a private network or a shared
+// network.
 bool IPIsPrivate(const IPAddress& ip);
 bool IPIsUnspec(const IPAddress& ip);
 size_t HashIP(const IPAddress& ip);
diff --git a/rtc_base/ip_address_unittest.cc b/rtc_base/ip_address_unittest.cc
index c93244d..d79a7b4 100644
--- a/rtc_base/ip_address_unittest.cc
+++ b/rtc_base/ip_address_unittest.cc
@@ -18,6 +18,7 @@
 static const unsigned int kIPv6AddrSize = 16;
 static const unsigned int kIPv4RFC1918Addr = 0xC0A80701;
 static const unsigned int kIPv4PublicAddr = 0x01020304;
+static const unsigned int kIPv4RFC6598Addr = 0x64410801;
 static const unsigned int kIPv4LinkLocalAddr = 0xA9FE10C1;  // 169.254.16.193
 static const in6_addr kIPv6LinkLocalAddr = {
     {{0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x30, 0x5b, 0xff,
@@ -41,6 +42,7 @@
 static const std::string kIPv4AnyAddrString = "0.0.0.0";
 static const std::string kIPv4LoopbackAddrString = "127.0.0.1";
 static const std::string kIPv4RFC1918AddrString = "192.168.7.1";
+static const std::string kIPv4RFC6598AddrString = "100.65.8.1";
 static const std::string kIPv4PublicAddrString = "1.2.3.4";
 static const std::string kIPv4PublicAddrAnonymizedString = "1.2.3.x";
 static const std::string kIPv6AnyAddrString = "::";
@@ -179,6 +181,7 @@
   addr = IPAddress(v4addr);
   EXPECT_FALSE(IPIsAny(addr));
   EXPECT_TRUE(IPIsLoopback(addr));
+  EXPECT_FALSE(IPIsSharedNetwork(addr));
   EXPECT_TRUE(IPIsPrivate(addr));
   EXPECT_EQ(kIPv4AddrSize, addr.Size());
   EXPECT_EQ(kIPv4LoopbackAddrString, addr.ToString());
@@ -188,10 +191,21 @@
   addr = IPAddress(v4addr);
   EXPECT_FALSE(IPIsAny(addr));
   EXPECT_FALSE(IPIsLoopback(addr));
+  EXPECT_FALSE(IPIsSharedNetwork(addr));
   EXPECT_TRUE(IPIsPrivate(addr));
   EXPECT_EQ(kIPv4AddrSize, addr.Size());
   EXPECT_EQ(kIPv4RFC1918AddrString, addr.ToString());
 
+  // Test an shared (RFC6598) address.
+  v4addr.s_addr = htonl(kIPv4RFC6598Addr);
+  addr = IPAddress(v4addr);
+  EXPECT_FALSE(IPIsAny(addr));
+  EXPECT_FALSE(IPIsLoopback(addr));
+  EXPECT_TRUE(IPIsPrivate(addr));
+  EXPECT_TRUE(IPIsSharedNetwork(addr));
+  EXPECT_EQ(kIPv4AddrSize, addr.Size());
+  EXPECT_EQ(kIPv4RFC6598AddrString, addr.ToString());
+
   // Test a 'normal' v4 address.
   v4addr.s_addr = htonl(kIPv4PublicAddr);
   addr = IPAddress(v4addr);
@@ -215,6 +229,7 @@
   addr = IPAddress(in6addr_loopback);
   EXPECT_FALSE(IPIsAny(addr));
   EXPECT_TRUE(IPIsLoopback(addr));
+  EXPECT_FALSE(IPIsSharedNetwork(addr));
   EXPECT_TRUE(IPIsPrivate(addr));
   EXPECT_EQ(kIPv6AddrSize, addr.Size());
   EXPECT_EQ(kIPv6LoopbackAddrString, addr.ToString());
@@ -223,6 +238,7 @@
   addr = IPAddress(kIPv6LinkLocalAddr);
   EXPECT_FALSE(IPIsAny(addr));
   EXPECT_FALSE(IPIsLoopback(addr));
+  EXPECT_FALSE(IPIsSharedNetwork(addr));
   EXPECT_TRUE(IPIsPrivate(addr));
   EXPECT_EQ(kIPv6AddrSize, addr.Size());
   EXPECT_EQ(kIPv6LinkLocalAddrString, addr.ToString());
@@ -249,6 +265,7 @@
   addr = IPAddress(INADDR_LOOPBACK);
   EXPECT_FALSE(IPIsAny(addr));
   EXPECT_TRUE(IPIsLoopback(addr));
+  EXPECT_FALSE(IPIsSharedNetwork(addr));
   EXPECT_TRUE(IPIsPrivate(addr));
   EXPECT_EQ(kIPv4AddrSize, addr.Size());
   EXPECT_EQ(kIPv4LoopbackAddrString, addr.ToString());
@@ -257,6 +274,7 @@
   addr = IPAddress(kIPv4RFC1918Addr);
   EXPECT_FALSE(IPIsAny(addr));
   EXPECT_FALSE(IPIsLoopback(addr));
+  EXPECT_FALSE(IPIsSharedNetwork(addr));
   EXPECT_TRUE(IPIsPrivate(addr));
   EXPECT_EQ(kIPv4AddrSize, addr.Size());
   EXPECT_EQ(kIPv4RFC1918AddrString, addr.ToString());
@@ -537,6 +555,7 @@
   EXPECT_FALSE(IPIsPrivate(IPAddress(kIPv4MappedPublicAddr)));
 
   EXPECT_TRUE(IPIsPrivate(IPAddress(kIPv4RFC1918Addr)));
+  EXPECT_TRUE(IPIsPrivate(IPAddress(kIPv4RFC6598Addr)));
   EXPECT_TRUE(IPIsPrivate(IPAddress(INADDR_LOOPBACK)));
   EXPECT_TRUE(IPIsPrivate(IPAddress(in6addr_loopback)));
   EXPECT_TRUE(IPIsPrivate(IPAddress(kIPv6LinkLocalAddr)));
@@ -559,6 +578,7 @@
   EXPECT_FALSE(IPIsLoopback(IPAddress(INADDR_ANY)));
   EXPECT_FALSE(IPIsLoopback(IPAddress(kIPv4PublicAddr)));
   EXPECT_FALSE(IPIsLoopback(IPAddress(in6addr_any)));
+  EXPECT_FALSE(IPIsLoopback(IPAddress(kIPv4RFC6598Addr)));
   EXPECT_FALSE(IPIsLoopback(IPAddress(kIPv6PublicAddr)));
   EXPECT_FALSE(IPIsLoopback(IPAddress(kIPv4MappedAnyAddr)));
   EXPECT_FALSE(IPIsLoopback(IPAddress(kIPv4MappedPublicAddr)));
@@ -577,6 +597,8 @@
   // loopback addresses
   EXPECT_FALSE(IPIsLinkLocal(IPAddress(INADDR_LOOPBACK)));
   EXPECT_FALSE(IPIsLinkLocal(IPAddress(in6addr_loopback)));
+  // shared addresses
+  EXPECT_FALSE(IPIsLinkLocal(IPAddress(kIPv4RFC6598Addr)));
   // public addresses
   EXPECT_FALSE(IPIsLinkLocal(IPAddress(kIPv4PublicAddr)));
   EXPECT_FALSE(IPIsLinkLocal(IPAddress(kIPv6PublicAddr)));