Move QuicIpAddress and IpAddressFamily to third_party/quiche.

Move them  from third_party/quic to third_party/quiche because
third_party/quiche/common/platform/api/quiche_test_loopback.h depends on them.
Move them outside platform because they are not actually platformized.

Leave aliases in place for the time being.  Users will be migrated and aliases
removed in a follow-up CL.

PiperOrigin-RevId: 472516696
diff --git a/build/source_list.bzl b/build/source_list.bzl
index 8c1584d..2f69820 100644
--- a/build/source_list.bzl
+++ b/build/source_list.bzl
@@ -48,6 +48,8 @@
     "common/quiche_data_reader.h",
     "common/quiche_data_writer.h",
     "common/quiche_endian.h",
+    "common/quiche_ip_address.h",
+    "common/quiche_ip_address_family.h",
     "common/quiche_linked_hash_map.h",
     "common/quiche_mem_slice_storage.h",
     "common/quiche_protocol_flags_list.h",
@@ -406,6 +408,8 @@
     "common/quiche_buffer_allocator.cc",
     "common/quiche_data_reader.cc",
     "common/quiche_data_writer.cc",
+    "common/quiche_ip_address.cc",
+    "common/quiche_ip_address_family.cc",
     "common/quiche_mem_slice_storage.cc",
     "common/quiche_text_utils.cc",
     "common/simple_buffer_allocator.cc",
@@ -662,8 +666,6 @@
     "quic/core/tls_server_handshaker.cc",
     "quic/core/uber_quic_stream_id_manager.cc",
     "quic/core/uber_received_packet_manager.cc",
-    "quic/platform/api/quic_ip_address.cc",
-    "quic/platform/api/quic_ip_address_family.cc",
     "quic/platform/api/quic_socket_address.cc",
     "spdy/core/array_output_buffer.cc",
     "spdy/core/hpack/hpack_constants.cc",
@@ -1064,6 +1066,7 @@
     "common/quiche_data_reader_test.cc",
     "common/quiche_data_writer_test.cc",
     "common/quiche_endian_test.cc",
+    "common/quiche_ip_address_test.cc",
     "common/quiche_linked_hash_map_test.cc",
     "common/quiche_mem_slice_storage_test.cc",
     "common/quiche_text_utils_test.cc",
@@ -1269,7 +1272,6 @@
     "quic/core/tls_server_handshaker_test.cc",
     "quic/core/uber_quic_stream_id_manager_test.cc",
     "quic/core/uber_received_packet_manager_test.cc",
-    "quic/platform/api/quic_ip_address_test.cc",
     "quic/platform/api/quic_socket_address_test.cc",
     "quic/test_tools/crypto_test_utils_test.cc",
     "quic/test_tools/quic_test_utils_test.cc",
diff --git a/build/source_list.gni b/build/source_list.gni
index 74e2d35..9defb90 100644
--- a/build/source_list.gni
+++ b/build/source_list.gni
@@ -48,6 +48,8 @@
     "src/quiche/common/quiche_data_reader.h",
     "src/quiche/common/quiche_data_writer.h",
     "src/quiche/common/quiche_endian.h",
+    "src/quiche/common/quiche_ip_address.h",
+    "src/quiche/common/quiche_ip_address_family.h",
     "src/quiche/common/quiche_linked_hash_map.h",
     "src/quiche/common/quiche_mem_slice_storage.h",
     "src/quiche/common/quiche_protocol_flags_list.h",
@@ -406,6 +408,8 @@
     "src/quiche/common/quiche_buffer_allocator.cc",
     "src/quiche/common/quiche_data_reader.cc",
     "src/quiche/common/quiche_data_writer.cc",
+    "src/quiche/common/quiche_ip_address.cc",
+    "src/quiche/common/quiche_ip_address_family.cc",
     "src/quiche/common/quiche_mem_slice_storage.cc",
     "src/quiche/common/quiche_text_utils.cc",
     "src/quiche/common/simple_buffer_allocator.cc",
@@ -662,8 +666,6 @@
     "src/quiche/quic/core/tls_server_handshaker.cc",
     "src/quiche/quic/core/uber_quic_stream_id_manager.cc",
     "src/quiche/quic/core/uber_received_packet_manager.cc",
-    "src/quiche/quic/platform/api/quic_ip_address.cc",
-    "src/quiche/quic/platform/api/quic_ip_address_family.cc",
     "src/quiche/quic/platform/api/quic_socket_address.cc",
     "src/quiche/spdy/core/array_output_buffer.cc",
     "src/quiche/spdy/core/hpack/hpack_constants.cc",
@@ -1064,6 +1066,7 @@
     "src/quiche/common/quiche_data_reader_test.cc",
     "src/quiche/common/quiche_data_writer_test.cc",
     "src/quiche/common/quiche_endian_test.cc",
+    "src/quiche/common/quiche_ip_address_test.cc",
     "src/quiche/common/quiche_linked_hash_map_test.cc",
     "src/quiche/common/quiche_mem_slice_storage_test.cc",
     "src/quiche/common/quiche_text_utils_test.cc",
@@ -1269,7 +1272,6 @@
     "src/quiche/quic/core/tls_server_handshaker_test.cc",
     "src/quiche/quic/core/uber_quic_stream_id_manager_test.cc",
     "src/quiche/quic/core/uber_received_packet_manager_test.cc",
-    "src/quiche/quic/platform/api/quic_ip_address_test.cc",
     "src/quiche/quic/platform/api/quic_socket_address_test.cc",
     "src/quiche/quic/test_tools/crypto_test_utils_test.cc",
     "src/quiche/quic/test_tools/quic_test_utils_test.cc",
diff --git a/build/source_list.json b/build/source_list.json
index 6e4aa67..8ab853a 100644
--- a/build/source_list.json
+++ b/build/source_list.json
@@ -47,6 +47,8 @@
     "quiche/common/quiche_data_reader.h",
     "quiche/common/quiche_data_writer.h",
     "quiche/common/quiche_endian.h",
+    "quiche/common/quiche_ip_address.h",
+    "quiche/common/quiche_ip_address_family.h",
     "quiche/common/quiche_linked_hash_map.h",
     "quiche/common/quiche_mem_slice_storage.h",
     "quiche/common/quiche_protocol_flags_list.h",
@@ -405,6 +407,8 @@
     "quiche/common/quiche_buffer_allocator.cc",
     "quiche/common/quiche_data_reader.cc",
     "quiche/common/quiche_data_writer.cc",
+    "quiche/common/quiche_ip_address.cc",
+    "quiche/common/quiche_ip_address_family.cc",
     "quiche/common/quiche_mem_slice_storage.cc",
     "quiche/common/quiche_text_utils.cc",
     "quiche/common/simple_buffer_allocator.cc",
@@ -661,8 +665,6 @@
     "quiche/quic/core/tls_server_handshaker.cc",
     "quiche/quic/core/uber_quic_stream_id_manager.cc",
     "quiche/quic/core/uber_received_packet_manager.cc",
-    "quiche/quic/platform/api/quic_ip_address.cc",
-    "quiche/quic/platform/api/quic_ip_address_family.cc",
     "quiche/quic/platform/api/quic_socket_address.cc",
     "quiche/spdy/core/array_output_buffer.cc",
     "quiche/spdy/core/hpack/hpack_constants.cc",
@@ -1063,6 +1065,7 @@
     "quiche/common/quiche_data_reader_test.cc",
     "quiche/common/quiche_data_writer_test.cc",
     "quiche/common/quiche_endian_test.cc",
+    "quiche/common/quiche_ip_address_test.cc",
     "quiche/common/quiche_linked_hash_map_test.cc",
     "quiche/common/quiche_mem_slice_storage_test.cc",
     "quiche/common/quiche_text_utils_test.cc",
@@ -1268,7 +1271,6 @@
     "quiche/quic/core/tls_server_handshaker_test.cc",
     "quiche/quic/core/uber_quic_stream_id_manager_test.cc",
     "quiche/quic/core/uber_received_packet_manager_test.cc",
-    "quiche/quic/platform/api/quic_ip_address_test.cc",
     "quiche/quic/platform/api/quic_socket_address_test.cc",
     "quiche/quic/test_tools/crypto_test_utils_test.cc",
     "quiche/quic/test_tools/quic_test_utils_test.cc",
diff --git a/quiche/quic/platform/api/quic_ip_address.cc b/quiche/common/quiche_ip_address.cc
similarity index 64%
rename from quiche/quic/platform/api/quic_ip_address.cc
rename to quiche/common/quiche_ip_address.cc
index ba7f6af..fd90deb 100644
--- a/quiche/quic/platform/api/quic_ip_address.cc
+++ b/quiche/common/quiche_ip_address.cc
@@ -2,21 +2,21 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "quiche/quic/platform/api/quic_ip_address.h"
+#include "quiche/common/quiche_ip_address.h"
 
 #include <algorithm>
 #include <cstdint>
 #include <cstring>
 #include <string>
 
-#include "quiche/quic/platform/api/quic_bug_tracker.h"
-#include "quiche/quic/platform/api/quic_ip_address_family.h"
-#include "quiche/quic/platform/api/quic_logging.h"
+#include "quiche/common/platform/api/quiche_bug_tracker.h"
+#include "quiche/common/platform/api/quiche_logging.h"
+#include "quiche/common/quiche_ip_address_family.h"
 
-namespace quic {
+namespace quiche {
 
-QuicIpAddress QuicIpAddress::Loopback4() {
-  QuicIpAddress result;
+QuicheIpAddress QuicheIpAddress::Loopback4() {
+  QuicheIpAddress result;
   result.family_ = IpAddressFamily::IP_V4;
   result.address_.bytes[0] = 127;
   result.address_.bytes[1] = 0;
@@ -25,8 +25,8 @@
   return result;
 }
 
-QuicIpAddress QuicIpAddress::Loopback6() {
-  QuicIpAddress result;
+QuicheIpAddress QuicheIpAddress::Loopback6() {
+  QuicheIpAddress result;
   result.family_ = IpAddressFamily::IP_V6;
   uint8_t* bytes = result.address_.bytes;
   memset(bytes, 0, 15);
@@ -34,63 +34,65 @@
   return result;
 }
 
-QuicIpAddress QuicIpAddress::Any4() {
+QuicheIpAddress QuicheIpAddress::Any4() {
   in_addr address;
   memset(&address, 0, sizeof(address));
-  return QuicIpAddress(address);
+  return QuicheIpAddress(address);
 }
 
-QuicIpAddress QuicIpAddress::Any6() {
+QuicheIpAddress QuicheIpAddress::Any6() {
   in6_addr address;
   memset(&address, 0, sizeof(address));
-  return QuicIpAddress(address);
+  return QuicheIpAddress(address);
 }
 
-QuicIpAddress::QuicIpAddress() : family_(IpAddressFamily::IP_UNSPEC) {}
+QuicheIpAddress::QuicheIpAddress() : family_(IpAddressFamily::IP_UNSPEC) {}
 
-QuicIpAddress::QuicIpAddress(const in_addr& ipv4_address)
+QuicheIpAddress::QuicheIpAddress(const in_addr& ipv4_address)
     : family_(IpAddressFamily::IP_V4) {
   address_.v4 = ipv4_address;
 }
-QuicIpAddress::QuicIpAddress(const in6_addr& ipv6_address)
+QuicheIpAddress::QuicheIpAddress(const in6_addr& ipv6_address)
     : family_(IpAddressFamily::IP_V6) {
   address_.v6 = ipv6_address;
 }
 
-bool operator==(QuicIpAddress lhs, QuicIpAddress rhs) {
+bool operator==(QuicheIpAddress lhs, QuicheIpAddress rhs) {
   if (lhs.family_ != rhs.family_) {
     return false;
   }
   switch (lhs.family_) {
     case IpAddressFamily::IP_V4:
       return std::equal(lhs.address_.bytes,
-                        lhs.address_.bytes + QuicIpAddress::kIPv4AddressSize,
+                        lhs.address_.bytes + QuicheIpAddress::kIPv4AddressSize,
                         rhs.address_.bytes);
     case IpAddressFamily::IP_V6:
       return std::equal(lhs.address_.bytes,
-                        lhs.address_.bytes + QuicIpAddress::kIPv6AddressSize,
+                        lhs.address_.bytes + QuicheIpAddress::kIPv6AddressSize,
                         rhs.address_.bytes);
     case IpAddressFamily::IP_UNSPEC:
       return true;
   }
-  QUIC_BUG(quic_bug_10126_2)
+  QUICHE_BUG(quiche_bug_10126_2)
       << "Invalid IpAddressFamily " << static_cast<int32_t>(lhs.family_);
   return false;
 }
 
-bool operator!=(QuicIpAddress lhs, QuicIpAddress rhs) { return !(lhs == rhs); }
+bool operator!=(QuicheIpAddress lhs, QuicheIpAddress rhs) {
+  return !(lhs == rhs);
+}
 
-bool QuicIpAddress::IsInitialized() const {
+bool QuicheIpAddress::IsInitialized() const {
   return family_ != IpAddressFamily::IP_UNSPEC;
 }
 
-IpAddressFamily QuicIpAddress::address_family() const { return family_; }
+IpAddressFamily QuicheIpAddress::address_family() const { return family_; }
 
-int QuicIpAddress::AddressFamilyToInt() const {
+int QuicheIpAddress::AddressFamilyToInt() const {
   return ToPlatformAddressFamily(family_);
 }
 
-std::string QuicIpAddress::ToPackedString() const {
+std::string QuicheIpAddress::ToPackedString() const {
   switch (family_) {
     case IpAddressFamily::IP_V4:
       return std::string(address_.chars, sizeof(address_.v4));
@@ -99,12 +101,12 @@
     case IpAddressFamily::IP_UNSPEC:
       return "";
   }
-  QUIC_BUG(quic_bug_10126_3)
+  QUICHE_BUG(quiche_bug_10126_3)
       << "Invalid IpAddressFamily " << static_cast<int32_t>(family_);
   return "";
 }
 
-std::string QuicIpAddress::ToString() const {
+std::string QuicheIpAddress::ToString() const {
   if (!IsInitialized()) {
     return "";
   }
@@ -112,7 +114,7 @@
   char buffer[INET6_ADDRSTRLEN] = {0};
   const char* result =
       inet_ntop(AddressFamilyToInt(), address_.bytes, buffer, sizeof(buffer));
-  QUIC_BUG_IF(quic_bug_10126_4, result == nullptr)
+  QUICHE_BUG_IF(quiche_bug_10126_4, result == nullptr)
       << "Failed to convert an IP address to string";
   return buffer;
 }
@@ -121,7 +123,7 @@
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
 
-QuicIpAddress QuicIpAddress::Normalized() const {
+QuicheIpAddress QuicheIpAddress::Normalized() const {
   if (!IsIPv6()) {
     return *this;
   }
@@ -132,15 +134,15 @@
 
   in_addr result;
   memcpy(&result, &address_.bytes[12], sizeof(result));
-  return QuicIpAddress(result);
+  return QuicheIpAddress(result);
 }
 
-QuicIpAddress QuicIpAddress::DualStacked() const {
+QuicheIpAddress QuicheIpAddress::DualStacked() const {
   if (!IsIPv4()) {
     return *this;
   }
 
-  QuicIpAddress result;
+  QuicheIpAddress result;
   result.family_ = IpAddressFamily::IP_V6;
   memcpy(result.address_.bytes, kMappedAddressPrefix,
          sizeof(kMappedAddressPrefix));
@@ -148,7 +150,7 @@
   return result;
 }
 
-bool QuicIpAddress::FromPackedString(const char* data, size_t length) {
+bool QuicheIpAddress::FromPackedString(const char* data, size_t length) {
   switch (length) {
     case kIPv4AddressSize:
       family_ = IpAddressFamily::IP_V4;
@@ -163,7 +165,7 @@
   return true;
 }
 
-bool QuicIpAddress::FromString(std::string str) {
+bool QuicheIpAddress::FromString(std::string str) {
   for (IpAddressFamily family :
        {IpAddressFamily::IP_V6, IpAddressFamily::IP_V4}) {
     int result =
@@ -176,19 +178,23 @@
   return false;
 }
 
-bool QuicIpAddress::IsIPv4() const { return family_ == IpAddressFamily::IP_V4; }
+bool QuicheIpAddress::IsIPv4() const {
+  return family_ == IpAddressFamily::IP_V4;
+}
 
-bool QuicIpAddress::IsIPv6() const { return family_ == IpAddressFamily::IP_V6; }
+bool QuicheIpAddress::IsIPv6() const {
+  return family_ == IpAddressFamily::IP_V6;
+}
 
-bool QuicIpAddress::InSameSubnet(const QuicIpAddress& other,
-                                 int subnet_length) {
+bool QuicheIpAddress::InSameSubnet(const QuicheIpAddress& other,
+                                   int subnet_length) {
   if (!IsInitialized()) {
-    QUIC_BUG(quic_bug_10126_5)
+    QUICHE_BUG(quiche_bug_10126_5)
         << "Attempting to do subnet matching on undefined address";
     return false;
   }
   if ((IsIPv4() && subnet_length > 32) || (IsIPv6() && subnet_length > 128)) {
-    QUIC_BUG(quic_bug_10126_6) << "Subnet mask is out of bounds";
+    QUICHE_BUG(quiche_bug_10126_6) << "Subnet mask is out of bounds";
     return false;
   }
 
@@ -207,14 +213,14 @@
   return (lhs[bytes_to_check] & mask) == (rhs[bytes_to_check] & mask);
 }
 
-in_addr QuicIpAddress::GetIPv4() const {
+in_addr QuicheIpAddress::GetIPv4() const {
   QUICHE_DCHECK(IsIPv4());
   return address_.v4;
 }
 
-in6_addr QuicIpAddress::GetIPv6() const {
+in6_addr QuicheIpAddress::GetIPv6() const {
   QUICHE_DCHECK(IsIPv6());
   return address_.v6;
 }
 
-}  // namespace quic
+}  // namespace quiche
diff --git a/quiche/common/quiche_ip_address.h b/quiche/common/quiche_ip_address.h
new file mode 100644
index 0000000..ef7714c
--- /dev/null
+++ b/quiche/common/quiche_ip_address.h
@@ -0,0 +1,98 @@
+// Copyright (c) 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef QUICHE_COMMON_QUICHE_IP_ADDRESS_H_
+#define QUICHE_COMMON_QUICHE_IP_ADDRESS_H_
+
+#if defined(_WIN32)
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#else
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#endif
+
+#include <ostream>
+#include <string>
+
+#include "quiche/common/platform/api/quiche_export.h"
+#include "quiche/common/quiche_ip_address_family.h"
+
+namespace quiche {
+
+// Represents an IP address.
+class QUICHE_EXPORT_PRIVATE QuicheIpAddress {
+ public:
+  // Sizes of IP addresses of different types, in bytes.
+  enum : size_t {
+    kIPv4AddressSize = 32 / 8,
+    kIPv6AddressSize = 128 / 8,
+    kMaxAddressSize = kIPv6AddressSize,
+  };
+
+  // TODO(fayang): Remove Loopback*() and use TestLoopback*() in tests.
+  static QuicheIpAddress Loopback4();
+  static QuicheIpAddress Loopback6();
+  static QuicheIpAddress Any4();
+  static QuicheIpAddress Any6();
+
+  QuicheIpAddress();
+  QuicheIpAddress(const QuicheIpAddress& other) = default;
+  explicit QuicheIpAddress(const in_addr& ipv4_address);
+  explicit QuicheIpAddress(const in6_addr& ipv6_address);
+  QuicheIpAddress& operator=(const QuicheIpAddress& other) = default;
+  QuicheIpAddress& operator=(QuicheIpAddress&& other) = default;
+  QUICHE_EXPORT_PRIVATE friend bool operator==(QuicheIpAddress lhs,
+                                               QuicheIpAddress rhs);
+  QUICHE_EXPORT_PRIVATE friend bool operator!=(QuicheIpAddress lhs,
+                                               QuicheIpAddress rhs);
+
+  bool IsInitialized() const;
+  IpAddressFamily address_family() const;
+  int AddressFamilyToInt() const;
+  // Returns the address as a sequence of bytes in network-byte-order. IPv4 will
+  // be 4 bytes. IPv6 will be 16 bytes.
+  std::string ToPackedString() const;
+  // Returns string representation of the address.
+  std::string ToString() const;
+  // Normalizes the address representation with respect to IPv4 addresses, i.e,
+  // mapped IPv4 addresses ("::ffff:X.Y.Z.Q") are converted to pure IPv4
+  // addresses.  All other IPv4, IPv6, and empty values are left unchanged.
+  QuicheIpAddress Normalized() const;
+  // Returns an address suitable for use in IPv6-aware contexts.  This is the
+  // opposite of NormalizeIPAddress() above.  IPv4 addresses are converted into
+  // their IPv4-mapped address equivalents (e.g. 192.0.2.1 becomes
+  // ::ffff:192.0.2.1).  IPv6 addresses are a noop (they are returned
+  // unchanged).
+  QuicheIpAddress DualStacked() const;
+  bool FromPackedString(const char* data, size_t length);
+  bool FromString(std::string str);
+  bool IsIPv4() const;
+  bool IsIPv6() const;
+  bool InSameSubnet(const QuicheIpAddress& other, int subnet_length);
+
+  in_addr GetIPv4() const;
+  in6_addr GetIPv6() const;
+
+ private:
+  union {
+    in_addr v4;
+    in6_addr v6;
+    uint8_t bytes[kMaxAddressSize];
+    char chars[kMaxAddressSize];
+  } address_;
+  IpAddressFamily family_;
+};
+
+inline std::ostream& operator<<(std::ostream& os,
+                                const QuicheIpAddress address) {
+  os << address.ToString();
+  return os;
+}
+
+}  // namespace quiche
+
+#endif  // QUICHE_COMMON_QUICHE_IP_ADDRESS_H_
diff --git a/quiche/quic/platform/api/quic_ip_address_family.cc b/quiche/common/quiche_ip_address_family.cc
similarity index 79%
rename from quiche/quic/platform/api/quic_ip_address_family.cc
rename to quiche/common/quiche_ip_address_family.cc
index c78abf2..885ddb6 100644
--- a/quiche/quic/platform/api/quic_ip_address_family.cc
+++ b/quiche/common/quiche_ip_address_family.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "quiche/quic/platform/api/quic_ip_address_family.h"
+#include "quiche/common/quiche_ip_address_family.h"
 
-#include "quiche/quic/platform/api/quic_bug_tracker.h"
+#include "quiche/common/platform/api/quiche_bug_tracker.h"
 
 #if defined(_WIN32)
 #include <winsock2.h>
@@ -12,7 +12,7 @@
 #include <sys/socket.h>
 #endif  // defined(_WIN32)
 
-namespace quic {
+namespace quiche {
 
 int ToPlatformAddressFamily(IpAddressFamily family) {
   switch (family) {
@@ -23,7 +23,7 @@
     case IpAddressFamily::IP_UNSPEC:
       return AF_UNSPEC;
     default:
-      QUIC_BUG(quic_bug_10126_1)
+      QUICHE_BUG(quic_bug_10126_1)
           << "Invalid IpAddressFamily " << static_cast<int32_t>(family);
       return AF_UNSPEC;
   }
@@ -38,10 +38,10 @@
     case AF_UNSPEC:
       return IpAddressFamily::IP_UNSPEC;
     default:
-      QUIC_BUG(quic_FromPlatformAddressFamily_unrecognized_family)
+      QUICHE_BUG(quic_FromPlatformAddressFamily_unrecognized_family)
           << "Invalid platform address family int " << family;
       return IpAddressFamily::IP_UNSPEC;
   }
 }
 
-}  // namespace quic
+}  // namespace quiche
diff --git a/quiche/common/quiche_ip_address_family.h b/quiche/common/quiche_ip_address_family.h
new file mode 100644
index 0000000..1fbec53
--- /dev/null
+++ b/quiche/common/quiche_ip_address_family.h
@@ -0,0 +1,23 @@
+// Copyright (c) 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef QUICHE_COMMON_QUICHE_IP_ADDRESS_FAMILY_H_
+#define QUICHE_COMMON_QUICHE_IP_ADDRESS_FAMILY_H_
+
+namespace quiche {
+
+// IP address family type used in QUIC. This hides platform dependant IP address
+// family types.
+enum class IpAddressFamily {
+  IP_V4,
+  IP_V6,
+  IP_UNSPEC,
+};
+
+int ToPlatformAddressFamily(IpAddressFamily family);
+IpAddressFamily FromPlatformAddressFamily(int family);
+
+}  // namespace quiche
+
+#endif  // QUICHE_COMMON_QUICHE_IP_ADDRESS_FAMILY_H_
diff --git a/quiche/quic/platform/api/quic_ip_address_test.cc b/quiche/common/quiche_ip_address_test.cc
similarity index 80%
rename from quiche/quic/platform/api/quic_ip_address_test.cc
rename to quiche/common/quiche_ip_address_test.cc
index cc06917..609b6b2 100644
--- a/quiche/quic/platform/api/quic_ip_address_test.cc
+++ b/quiche/common/quiche_ip_address_test.cc
@@ -2,19 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "quiche/quic/platform/api/quic_ip_address.h"
+#include "quiche/common/quiche_ip_address.h"
 
 #include <cstdint>
 
-#include "quiche/quic/platform/api/quic_ip_address_family.h"
-#include "quiche/quic/platform/api/quic_test.h"
+#include "quiche/common/platform/api/quiche_test.h"
+#include "quiche/common/quiche_ip_address_family.h"
 
-namespace quic {
+namespace quiche {
 namespace test {
 namespace {
 
-TEST(QuicIpAddressTest, IPv4) {
-  QuicIpAddress ip_address;
+TEST(QuicheIpAddressTest, IPv4) {
+  QuicheIpAddress ip_address;
   EXPECT_FALSE(ip_address.IsInitialized());
 
   EXPECT_TRUE(ip_address.FromString("127.0.52.223"));
@@ -34,8 +34,8 @@
   EXPECT_EQ(223u, *(v4_address_ptr + 3));
 }
 
-TEST(QuicIpAddressTest, IPv6) {
-  QuicIpAddress ip_address;
+TEST(QuicheIpAddressTest, IPv6) {
+  QuicheIpAddress ip_address;
   EXPECT_FALSE(ip_address.IsInitialized());
 
   EXPECT_TRUE(ip_address.FromString("fe80::1ff:fe23:4567"));
@@ -62,19 +62,19 @@
   EXPECT_EQ(ip_address, ip_address.DualStacked());
 }
 
-TEST(QuicIpAddressTest, FromPackedString) {
-  QuicIpAddress loopback4, loopback6;
+TEST(QuicheIpAddressTest, FromPackedString) {
+  QuicheIpAddress loopback4, loopback6;
   const char loopback4_packed[] = "\x7f\0\0\x01";
   const char loopback6_packed[] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01";
   EXPECT_TRUE(loopback4.FromPackedString(loopback4_packed, 4));
   EXPECT_TRUE(loopback6.FromPackedString(loopback6_packed, 16));
-  EXPECT_EQ(loopback4, QuicIpAddress::Loopback4());
-  EXPECT_EQ(loopback6, QuicIpAddress::Loopback6());
+  EXPECT_EQ(loopback4, QuicheIpAddress::Loopback4());
+  EXPECT_EQ(loopback6, QuicheIpAddress::Loopback6());
 }
 
-TEST(QuicIpAddressTest, MappedAddress) {
-  QuicIpAddress ipv4_address;
-  QuicIpAddress mapped_address;
+TEST(QuicheIpAddressTest, MappedAddress) {
+  QuicheIpAddress ipv4_address;
+  QuicheIpAddress mapped_address;
 
   EXPECT_TRUE(ipv4_address.FromString("127.0.0.1"));
   EXPECT_TRUE(mapped_address.FromString("::ffff:7f00:1"));
@@ -83,7 +83,7 @@
   EXPECT_EQ(ipv4_address, mapped_address.Normalized());
 }
 
-TEST(QuicIpAddressTest, Subnets) {
+TEST(QuicheIpAddressTest, Subnets) {
   struct {
     const char* address1;
     const char* address2;
@@ -118,7 +118,7 @@
   };
 
   for (const auto& test_case : test_cases) {
-    QuicIpAddress address1, address2;
+    QuicheIpAddress address1, address2;
     ASSERT_TRUE(address1.FromString(test_case.address1));
     ASSERT_TRUE(address2.FromString(test_case.address2));
     EXPECT_EQ(test_case.same_subnet,
@@ -128,15 +128,15 @@
   }
 }
 
-TEST(QuicIpAddress, LoopbackAddresses) {
-  QuicIpAddress loopback4;
-  QuicIpAddress loopback6;
+TEST(QuicheIpAddress, LoopbackAddresses) {
+  QuicheIpAddress loopback4;
+  QuicheIpAddress loopback6;
   ASSERT_TRUE(loopback4.FromString("127.0.0.1"));
   ASSERT_TRUE(loopback6.FromString("::1"));
-  EXPECT_EQ(loopback4, QuicIpAddress::Loopback4());
-  EXPECT_EQ(loopback6, QuicIpAddress::Loopback6());
+  EXPECT_EQ(loopback4, QuicheIpAddress::Loopback4());
+  EXPECT_EQ(loopback6, QuicheIpAddress::Loopback6());
 }
 
 }  // namespace
 }  // namespace test
-}  // namespace quic
+}  // namespace quiche
diff --git a/quiche/quic/core/io/socket_posix.cc b/quiche/quic/core/io/socket_posix.cc
index c8d1555..f72b088 100644
--- a/quiche/quic/core/io/socket_posix.cc
+++ b/quiche/quic/core/io/socket_posix.cc
@@ -128,7 +128,7 @@
 absl::StatusOr<SocketFd> CreateSocketWithFlags(IpAddressFamily address_family,
                                                SocketProtocol protocol,
                                                int flags) {
-  int address_family_int = ToPlatformAddressFamily(address_family);
+  int address_family_int = quiche::ToPlatformAddressFamily(address_family);
 
   int type_int = ToPlatformSocketType(protocol);
   type_int |= flags;
diff --git a/quiche/quic/core/quic_udp_socket_posix.cc b/quiche/quic/core/quic_udp_socket_posix.cc
index 400f45b..248fee3 100644
--- a/quiche/quic/core/quic_udp_socket_posix.cc
+++ b/quiche/quic/core/quic_udp_socket_posix.cc
@@ -205,10 +205,10 @@
   // on ios/osx because CMSG_SPACE isn't a constant expression there.
   QUICHE_DCHECK_GE(kDefaultUdpPacketControlBufferSize, kMinCmsgSpaceForRead);
 
-  absl::StatusOr<SocketFd> socket =
-      socket_api::CreateSocket(FromPlatformAddressFamily(address_family),
-                               socket_api::SocketProtocol::kUdp,
-                               /*blocking=*/false);
+  absl::StatusOr<SocketFd> socket = socket_api::CreateSocket(
+      quiche::FromPlatformAddressFamily(address_family),
+      socket_api::SocketProtocol::kUdp,
+      /*blocking=*/false);
 
   if (!socket.ok()) {
     QUIC_LOG_FIRST_N(ERROR, 100)
diff --git a/quiche/quic/platform/api/quic_ip_address.h b/quiche/quic/platform/api/quic_ip_address.h
index 685cde8..7f2ed20 100644
--- a/quiche/quic/platform/api/quic_ip_address.h
+++ b/quiche/quic/platform/api/quic_ip_address.h
@@ -5,92 +5,11 @@
 #ifndef QUICHE_QUIC_PLATFORM_API_QUIC_IP_ADDRESS_H_
 #define QUICHE_QUIC_PLATFORM_API_QUIC_IP_ADDRESS_H_
 
-#if defined(_WIN32)
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#else
-#include <arpa/inet.h>
-#include <netinet/in.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#endif
-
-#include <ostream>
-#include <string>
-
-#include "quiche/quic/platform/api/quic_export.h"
-#include "quiche/quic/platform/api/quic_ip_address_family.h"
+#include "quiche/common/quiche_ip_address.h"
 
 namespace quic {
 
-// Represents an IP address.
-class QUIC_EXPORT_PRIVATE QuicIpAddress {
- public:
-  // Sizes of IP addresses of different types, in bytes.
-  enum : size_t {
-    kIPv4AddressSize = 32 / 8,
-    kIPv6AddressSize = 128 / 8,
-    kMaxAddressSize = kIPv6AddressSize,
-  };
-
-  // TODO(fayang): Remove Loopback*() and use TestLoopback*() in tests.
-  static QuicIpAddress Loopback4();
-  static QuicIpAddress Loopback6();
-  static QuicIpAddress Any4();
-  static QuicIpAddress Any6();
-
-  QuicIpAddress();
-  QuicIpAddress(const QuicIpAddress& other) = default;
-  explicit QuicIpAddress(const in_addr& ipv4_address);
-  explicit QuicIpAddress(const in6_addr& ipv6_address);
-  QuicIpAddress& operator=(const QuicIpAddress& other) = default;
-  QuicIpAddress& operator=(QuicIpAddress&& other) = default;
-  QUIC_EXPORT_PRIVATE friend bool operator==(QuicIpAddress lhs,
-                                             QuicIpAddress rhs);
-  QUIC_EXPORT_PRIVATE friend bool operator!=(QuicIpAddress lhs,
-                                             QuicIpAddress rhs);
-
-  bool IsInitialized() const;
-  IpAddressFamily address_family() const;
-  int AddressFamilyToInt() const;
-  // Returns the address as a sequence of bytes in network-byte-order. IPv4 will
-  // be 4 bytes. IPv6 will be 16 bytes.
-  std::string ToPackedString() const;
-  // Returns string representation of the address.
-  std::string ToString() const;
-  // Normalizes the address representation with respect to IPv4 addresses, i.e,
-  // mapped IPv4 addresses ("::ffff:X.Y.Z.Q") are converted to pure IPv4
-  // addresses.  All other IPv4, IPv6, and empty values are left unchanged.
-  QuicIpAddress Normalized() const;
-  // Returns an address suitable for use in IPv6-aware contexts.  This is the
-  // opposite of NormalizeIPAddress() above.  IPv4 addresses are converted into
-  // their IPv4-mapped address equivalents (e.g. 192.0.2.1 becomes
-  // ::ffff:192.0.2.1).  IPv6 addresses are a noop (they are returned
-  // unchanged).
-  QuicIpAddress DualStacked() const;
-  bool FromPackedString(const char* data, size_t length);
-  bool FromString(std::string str);
-  bool IsIPv4() const;
-  bool IsIPv6() const;
-  bool InSameSubnet(const QuicIpAddress& other, int subnet_length);
-
-  in_addr GetIPv4() const;
-  in6_addr GetIPv6() const;
-
- private:
-  union {
-    in_addr v4;
-    in6_addr v6;
-    uint8_t bytes[kMaxAddressSize];
-    char chars[kMaxAddressSize];
-  } address_;
-  IpAddressFamily family_;
-};
-
-inline std::ostream& operator<<(std::ostream& os, const QuicIpAddress address) {
-  os << address.ToString();
-  return os;
-}
+using QuicIpAddress = ::quiche::QuicheIpAddress;
 
 }  // namespace quic
 
diff --git a/quiche/quic/platform/api/quic_ip_address_family.h b/quiche/quic/platform/api/quic_ip_address_family.h
index ad3963c..0aeac17 100644
--- a/quiche/quic/platform/api/quic_ip_address_family.h
+++ b/quiche/quic/platform/api/quic_ip_address_family.h
@@ -5,18 +5,11 @@
 #ifndef QUICHE_QUIC_PLATFORM_API_QUIC_IP_ADDRESS_FAMILY_H_
 #define QUICHE_QUIC_PLATFORM_API_QUIC_IP_ADDRESS_FAMILY_H_
 
+#include "quiche/common/quiche_ip_address_family.h"
+
 namespace quic {
 
-// IP address family type used in QUIC. This hides platform dependant IP address
-// family types.
-enum class IpAddressFamily {
-  IP_V4,
-  IP_V6,
-  IP_UNSPEC,
-};
-
-int ToPlatformAddressFamily(IpAddressFamily family);
-IpAddressFamily FromPlatformAddressFamily(int family);
+using IpAddressFamily = ::quiche::IpAddressFamily;
 
 }  // namespace quic