Add more IceCandidatePairType for host-host CandidatePair

This is to help to differentiate endpoints which are behind NAT or on the public internet.

BUG=520101
R=pthatcher@webrtc.org

Review URL: https://codereview.webrtc.org/1328453003 .

Cr-Commit-Position: refs/heads/master@{#9864}
diff --git a/talk/app/webrtc/umametrics.h b/talk/app/webrtc/umametrics.h
index 37e7b6d..8eaed6d 100644
--- a/talk/app/webrtc/umametrics.h
+++ b/talk/app/webrtc/umametrics.h
@@ -95,6 +95,8 @@
 // type of candidate pair used when the PeerConnection first goes to a completed
 // state. When BUNDLE is enabled, only the first transport gets recorded.
 enum IceCandidatePairType {
+  // HostHost is deprecated. It was replaced with the set of types at the bottom
+  // to report private or public host IP address.
   kIceCandidatePairHostHost,
   kIceCandidatePairHostSrflx,
   kIceCandidatePairHostRelay,
@@ -110,6 +112,13 @@
   kIceCandidatePairPrflxHost,
   kIceCandidatePairPrflxSrflx,
   kIceCandidatePairPrflxRelay,
+
+  // The following 4 types tell whether local and remote hosts have private or
+  // public IP addresses.
+  kIceCandidatePairHostPrivateHostPrivate,
+  kIceCandidatePairHostPrivateHostPublic,
+  kIceCandidatePairHostPublicHostPrivate,
+  kIceCandidatePairHostPublicHostPublic,
   kIceCandidatePairMax
 };
 
diff --git a/talk/app/webrtc/webrtcsession.cc b/talk/app/webrtc/webrtcsession.cc
index 9102e78..6a761e6 100644
--- a/talk/app/webrtc/webrtcsession.cc
+++ b/talk/app/webrtc/webrtcsession.cc
@@ -97,8 +97,23 @@
   const auto& srflx = STUN_PORT_TYPE;
   const auto& relay = RELAY_PORT_TYPE;
   const auto& prflx = PRFLX_PORT_TYPE;
-  if (l == host && r == host)
-    return kIceCandidatePairHostHost;
+  if (l == host && r == host) {
+    bool local_private = IPIsPrivate(local.address().ipaddr());
+    bool remote_private = IPIsPrivate(remote.address().ipaddr());
+    if (local_private) {
+      if (remote_private) {
+        return kIceCandidatePairHostPrivateHostPrivate;
+      } else {
+        return kIceCandidatePairHostPrivateHostPublic;
+      }
+    } else {
+      if (remote_private) {
+        return kIceCandidatePairHostPublicHostPrivate;
+      } else {
+        return kIceCandidatePairHostPublicHostPublic;
+      }
+    }
+  }
   if (l == host && r == srflx)
     return kIceCandidatePairHostSrflx;
   if (l == host && r == relay)
diff --git a/talk/app/webrtc/webrtcsession_unittest.cc b/talk/app/webrtc/webrtcsession_unittest.cc
index 0322eff..582bdc6 100644
--- a/talk/app/webrtc/webrtcsession_unittest.cc
+++ b/talk/app/webrtc/webrtcsession_unittest.cc
@@ -1043,6 +1043,10 @@
       EXPECT_EQ(metrics_observer->GetEnumCounter(
                     webrtc::kEnumCounterIceCandidatePairTypeUdp,
                     webrtc::kIceCandidatePairHostHost),
+                0);
+      EXPECT_EQ(metrics_observer->GetEnumCounter(
+                    webrtc::kEnumCounterIceCandidatePairTypeUdp,
+                    webrtc::kIceCandidatePairHostPublicHostPublic),
                 1);
     }
   };