Detect Tailscale interfaces as VPN

Tailscale uses tailscale<index> on Linux, which GetAdapterTypeFromName
did not match, so the tunnel was reported as ADAPTER_TYPE_UNKNOWN. On
macOS and iOS it uses utun<index> and was already detected, so the same
tunnel was classified differently depending on the platform.

See also
  https://github.com/tailscale/tailscale/blob/cd34d441be2f277221e81672125f73ec3e8cb16d/cmd/tailscaled/tailscaled.go#L71

Bug: chromium:474435503
Change-Id: I5ac3c7d00891ad74a640c3b74443095e82ac13f0
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/491340
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Fredrik Solenberg <solenberg@webrtc.org>
Commit-Queue: Philipp Hancke <philipp.hancke@googlemail.com>
Cr-Commit-Position: refs/heads/main@{#48235}
diff --git a/rtc_base/network.cc b/rtc_base/network.cc
index e023bc8..ec8e8a3 100644
--- a/rtc_base/network.cc
+++ b/rtc_base/network.cc
@@ -284,7 +284,11 @@
   if (MatchTypeNameWithIndexPattern(network_name, "ipsec") ||
       MatchTypeNameWithIndexPattern(network_name, "tun") ||
       MatchTypeNameWithIndexPattern(network_name, "utun") ||
-      MatchTypeNameWithIndexPattern(network_name, "tap")) {
+      MatchTypeNameWithIndexPattern(network_name, "tap") ||
+      // Tailscale on Linux; on macOS and iOS it uses utun<index>.
+      MatchTypeNameWithIndexPattern(network_name, "tailscale") ||
+      // Tailscale on Windows.
+      MatchTypeNameWithIndexPattern(network_name, "Tailscale")) {
     return ADAPTER_TYPE_VPN;
   }
 #if defined(WEBRTC_IOS)
diff --git a/rtc_base/network_unittest.cc b/rtc_base/network_unittest.cc
index 2baef17..0759523 100644
--- a/rtc_base/network_unittest.cc
+++ b/rtc_base/network_unittest.cc
@@ -964,6 +964,13 @@
   ClearNetworks(manager);
   ReleaseIfAddrs(addr_list);
 
+  // Tailscale interface; name is in form "tailscale<index>".
+  strcpy(if_name, "tailscale0");
+  addr_list = InstallIpv4Network(if_name, ipv4_address1, ipv4_mask, manager);
+  EXPECT_EQ(ADAPTER_TYPE_VPN, GetAdapterType(manager));
+  ClearNetworks(manager);
+  ReleaseIfAddrs(addr_list);
+
   strcpy(if_name, "lo0");
   addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
   EXPECT_EQ(ADAPTER_TYPE_LOOPBACK, GetAdapterType(manager));