Migrate net/udp/* to net::IPAddress.

BUG=496258

Review URL: https://codereview.chromium.org/1778793003

Cr-Commit-Position: refs/heads/master@{#381019}
diff --git a/chrome/browser/printing/cloud_print/privet_traffic_detector.cc b/chrome/browser/printing/cloud_print/privet_traffic_detector.cc
index c088722..26debe0 100644
--- a/chrome/browser/printing/cloud_print/privet_traffic_detector.cc
+++ b/chrome/browser/printing/cloud_print/privet_traffic_detector.cc
@@ -133,14 +133,15 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
   socket_.reset(new net::UDPServerSocket(NULL, net::NetLog::Source()));
   net::IPEndPoint multicast_addr = net::GetMDnsIPEndPoint(address_family_);
-  net::IPAddressNumber address_any(multicast_addr.address().size());
-  net::IPEndPoint bind_endpoint(address_any, multicast_addr.port());
+  net::IPEndPoint bind_endpoint(
+      net::IPAddress::AllZeros(multicast_addr.address().size()),
+      multicast_addr.port());
   socket_->AllowAddressReuse();
   int rv = socket_->Listen(bind_endpoint);
   if (rv < net::OK)
     return rv;
   socket_->SetMulticastLoopbackMode(false);
-  return socket_->JoinGroup(multicast_addr.address().bytes());
+  return socket_->JoinGroup(multicast_addr.address());
 }
 
 bool PrivetTrafficDetector::IsSourceAcceptable() const {
diff --git a/content/browser/renderer_host/p2p/socket_host_udp_unittest.cc b/content/browser/renderer_host/p2p/socket_host_udp_unittest.cc
index 7bf09445..aecd85a7 100644
--- a/content/browser/renderer_host/p2p/socket_host_udp_unittest.cc
+++ b/content/browser/renderer_host/p2p/socket_host_udp_unittest.cc
@@ -121,12 +121,12 @@
 
   void AllowBroadcast() override { NOTIMPLEMENTED(); }
 
-  int JoinGroup(const net::IPAddressNumber& group_address) const override {
+  int JoinGroup(const net::IPAddress& group_address) const override {
     NOTIMPLEMENTED();
     return net::ERR_NOT_IMPLEMENTED;
   }
 
-  int LeaveGroup(const net::IPAddressNumber& group_address) const override {
+  int LeaveGroup(const net::IPAddress& group_address) const override {
     NOTIMPLEMENTED();
     return net::ERR_NOT_IMPLEMENTED;
   }
diff --git a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
index b73029e6..b5f6e14c 100644
--- a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
+++ b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
@@ -53,12 +53,11 @@
 namespace content {
 
 PepperUDPSocketMessageFilter::PendingSend::PendingSend(
-    const net::IPAddressNumber& address,
+    const net::IPAddress& address,
     int port,
     const scoped_refptr<net::IOBufferWithSize>& buffer,
     const ppapi::host::ReplyMessageContext& context)
-    : address(address), port(port), buffer(buffer), context(context) {
-}
+    : address(address), port(port), buffer(buffer), context(context) {}
 
 PepperUDPSocketMessageFilter::PendingSend::PendingSend(
     const PendingSend& other) = default;
@@ -364,13 +363,13 @@
   if (!socket_)
     return PP_ERROR_FAILED;
 
-  net::IPAddressNumber group;
+  std::vector<uint8_t> group;
   uint16_t port;
 
   if (!NetAddressPrivateImpl::NetAddressToIPEndPoint(addr, &group, &port))
     return PP_ERROR_ADDRESS_INVALID;
 
-  return NetErrorToPepperError(socket_->JoinGroup(group));
+  return NetErrorToPepperError(socket_->JoinGroup(net::IPAddress(group)));
 }
 
 int32_t PepperUDPSocketMessageFilter::OnMsgLeaveGroup(
@@ -385,13 +384,13 @@
   if (!socket_)
     return PP_ERROR_FAILED;
 
-  net::IPAddressNumber group;
+  std::vector<uint8_t> group;
   uint16_t port;
 
   if (!NetAddressPrivateImpl::NetAddressToIPEndPoint(addr, &group, &port))
     return PP_ERROR_ADDRESS_INVALID;
 
-  return NetErrorToPepperError(socket_->LeaveGroup(group));
+  return NetErrorToPepperError(socket_->LeaveGroup(net::IPAddress(group)));
 }
 
 void PepperUDPSocketMessageFilter::DoBind(
@@ -408,13 +407,13 @@
       net::DatagramSocket::DEFAULT_BIND, net::RandIntCallback(),
       NULL, net::NetLog::Source()));
 
-  net::IPAddressNumber address;
+  std::vector<uint8_t> address;
   uint16_t port;
   if (!NetAddressPrivateImpl::NetAddressToIPEndPoint(addr, &address, &port)) {
     SendBindError(context, PP_ERROR_ADDRESS_INVALID);
     return;
   }
-  net::IPEndPoint end_point(address, port);
+  net::IPEndPoint end_point(net::IPAddress(address), port);
   {
     int net_result = socket->Open(end_point.GetFamily());
     if (net_result != net::OK) {
@@ -589,7 +588,7 @@
     return;
   }
 
-  net::IPAddressNumber address;
+  std::vector<uint8_t> address;
   uint16_t port;
   if (!NetAddressPrivateImpl::NetAddressToIPEndPoint(addr, &address, &port)) {
     SendSendToError(context, PP_ERROR_ADDRESS_INVALID);
@@ -607,7 +606,8 @@
     return;
   }
 
-  pending_sends_.push(PendingSend(address, port, buffer, context));
+  pending_sends_.push(
+      PendingSend(net::IPAddress(address), port, buffer, context));
   // If there are other sends pending, we can't start yet.
   if (num_pending_sends)
     return;
diff --git a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.h b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.h
index 7f9612ca9..6420581 100644
--- a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.h
+++ b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.h
@@ -19,6 +19,7 @@
 #include "content/common/content_export.h"
 #include "content/public/common/process_type.h"
 #include "net/base/completion_callback.h"
+#include "net/base/ip_address.h"
 #include "net/base/ip_endpoint.h"
 #include "net/udp/udp_socket.h"
 #include "ppapi/c/pp_instance.h"
@@ -75,14 +76,14 @@
   };
 
   struct PendingSend {
-    PendingSend(const net::IPAddressNumber& address,
+    PendingSend(const net::IPAddress& address,
                 int port,
                 const scoped_refptr<net::IOBufferWithSize>& buffer,
                 const ppapi::host::ReplyMessageContext& context);
     PendingSend(const PendingSend& other);
     ~PendingSend();
 
-    net::IPAddressNumber address;
+    net::IPAddress address;
     int port;
     scoped_refptr<net::IOBufferWithSize> buffer;
     ppapi::host::ReplyMessageContext context;
diff --git a/extensions/browser/api/socket/udp_socket.cc b/extensions/browser/api/socket/udp_socket.cc
index 3aa5729..6e58ac3a 100644
--- a/extensions/browser/api/socket/udp_socket.cc
+++ b/extensions/browser/api/socket/udp_socket.cc
@@ -8,6 +8,7 @@
 
 #include "base/lazy_instance.h"
 #include "extensions/browser/api/api_resource.h"
+#include "net/base/ip_address.h"
 #include "net/base/ip_endpoint.h"
 #include "net/base/net_errors.h"
 #include "net/udp/datagram_socket.h"
@@ -243,11 +244,11 @@
 bool UDPSocket::IsBound() { return socket_.is_connected(); }
 
 int UDPSocket::JoinGroup(const std::string& address) {
-  net::IPAddressNumber ip;
-  if (!net::ParseIPLiteralToNumber(address, &ip))
+  net::IPAddress ip;
+  if (!ip.AssignFromIPLiteral(address))
     return net::ERR_ADDRESS_INVALID;
 
-  std::string normalized_address = net::IPAddressToString(ip);
+  std::string normalized_address = ip.ToString();
   std::vector<std::string>::iterator find_result = std::find(
       multicast_groups_.begin(), multicast_groups_.end(), normalized_address);
   if (find_result != multicast_groups_.end())
@@ -260,11 +261,11 @@
 }
 
 int UDPSocket::LeaveGroup(const std::string& address) {
-  net::IPAddressNumber ip;
-  if (!net::ParseIPLiteralToNumber(address, &ip))
+  net::IPAddress ip;
+  if (!ip.AssignFromIPLiteral(address))
     return net::ERR_ADDRESS_INVALID;
 
-  std::string normalized_address = net::IPAddressToString(ip);
+  std::string normalized_address = ip.ToString();
   std::vector<std::string>::iterator find_result = std::find(
       multicast_groups_.begin(), multicast_groups_.end(), normalized_address);
   if (find_result == multicast_groups_.end())
diff --git a/net/base/ip_address.cc b/net/base/ip_address.cc
index 945e2877..075d4d00 100644
--- a/net/base/ip_address.cc
+++ b/net/base/ip_address.cc
@@ -10,9 +10,6 @@
 
 namespace net {
 
-const size_t IPAddress::kIPv4AddressSize = 4;
-const size_t IPAddress::kIPv6AddressSize = 16;
-
 IPAddress::IPAddress() {}
 
 IPAddress::IPAddress(const IPAddressNumber& address) : ip_address_(address) {}
@@ -87,6 +84,11 @@
   return IPAddress(kLocalhostIPv6);
 }
 
+// static
+IPAddress IPAddress::AllZeros(size_t num_zero_bytes) {
+  return IPAddress(std::vector<uint8_t>(num_zero_bytes));
+}
+
 bool IPAddress::operator==(const IPAddress& that) const {
   return ip_address_ == that.ip_address_;
 }
diff --git a/net/base/ip_address.h b/net/base/ip_address.h
index 93f594d..ed76a76 100644
--- a/net/base/ip_address.h
+++ b/net/base/ip_address.h
@@ -20,8 +20,7 @@
 
 class NET_EXPORT IPAddress {
  public:
-  static const size_t kIPv4AddressSize;
-  static const size_t kIPv6AddressSize;
+  enum : size_t { kIPv4AddressSize = 4, kIPv6AddressSize = 16 };
 
   // Creates a zero-sized, invalid address.
   IPAddress();
@@ -93,6 +92,9 @@
   // Returns an IPAddress instance representing the ::1 address.
   static IPAddress IPv6Localhost();
 
+  // Returns an IPAddress made up of |num_zero_bytes| zeros.
+  static IPAddress AllZeros(size_t num_zero_bytes);
+
   bool operator==(const IPAddress& that) const;
   bool operator!=(const IPAddress& that) const;
   bool operator<(const IPAddress& that) const;
diff --git a/net/dns/mdns_client.cc b/net/dns/mdns_client.cc
index 64e0d75..f72d9c2 100644
--- a/net/dns/mdns_client.cc
+++ b/net/dns/mdns_client.cc
@@ -38,7 +38,7 @@
   if (rv < OK)
     return rv;
 
-  return socket->JoinGroup(multicast_addr.address().bytes());
+  return socket->JoinGroup(multicast_addr.address());
 }
 
 }  // namespace
diff --git a/net/dns/mock_mdns_socket_factory.h b/net/dns/mock_mdns_socket_factory.h
index a5b1422..179fb39 100644
--- a/net/dns/mock_mdns_socket_factory.h
+++ b/net/dns/mock_mdns_socket_factory.h
@@ -16,6 +16,8 @@
 
 namespace net {
 
+class IPAddress;
+
 class MockMDnsDatagramServerSocket : public DatagramServerSocket {
  public:
   explicit MockMDnsDatagramServerSocket(AddressFamily address_family);
@@ -51,8 +53,8 @@
   MOCK_METHOD0(AllowAddressReuse, void());
   MOCK_METHOD0(AllowBroadcast, void());
 
-  MOCK_CONST_METHOD1(JoinGroup, int(const IPAddressNumber& group_address));
-  MOCK_CONST_METHOD1(LeaveGroup, int(const IPAddressNumber& address));
+  MOCK_CONST_METHOD1(JoinGroup, int(const IPAddress& group_address));
+  MOCK_CONST_METHOD1(LeaveGroup, int(const IPAddress& address));
 
   MOCK_METHOD1(SetMulticastInterface, int(uint32_t interface_index));
   MOCK_METHOD1(SetMulticastTimeToLive, int(int ttl));
diff --git a/net/udp/datagram_server_socket.h b/net/udp/datagram_server_socket.h
index bad1fee..7e5adee1 100644
--- a/net/udp/datagram_server_socket.h
+++ b/net/udp/datagram_server_socket.h
@@ -13,6 +13,7 @@
 
 namespace net {
 
+class IPAddress;
 class IPEndPoint;
 class IOBuffer;
 
@@ -71,14 +72,14 @@
 
   // Join the multicast group with address |group_address|.
   // Returns a network error code.
-  virtual int JoinGroup(const IPAddressNumber& group_address) const = 0;
+  virtual int JoinGroup(const IPAddress& group_address) const = 0;
 
   // Leave the multicast group with address |group_address|.
   // If the socket hasn't joined the group, it will be ignored.
   // It's optional to leave the multicast group before destroying
   // the socket. It will be done by the OS.
   // Returns a network error code.
-  virtual int LeaveGroup(const IPAddressNumber& group_address) const = 0;
+  virtual int LeaveGroup(const IPAddress& group_address) const = 0;
 
   // Set interface to use for multicast. If |interface_index| set to 0, default
   // interface is used.
diff --git a/net/udp/udp_server_socket.cc b/net/udp/udp_server_socket.cc
index 8cda8d4..4cba115 100644
--- a/net/udp/udp_server_socket.cc
+++ b/net/udp/udp_server_socket.cc
@@ -92,11 +92,11 @@
   allow_broadcast_ = true;
 }
 
-int UDPServerSocket::JoinGroup(const IPAddressNumber& group_address) const {
+int UDPServerSocket::JoinGroup(const IPAddress& group_address) const {
   return socket_.JoinGroup(group_address);
 }
 
-int UDPServerSocket::LeaveGroup(const IPAddressNumber& group_address) const {
+int UDPServerSocket::LeaveGroup(const IPAddress& group_address) const {
   return socket_.LeaveGroup(group_address);
 }
 
diff --git a/net/udp/udp_server_socket.h b/net/udp/udp_server_socket.h
index 668ebcc4..a0b4852b 100644
--- a/net/udp/udp_server_socket.h
+++ b/net/udp/udp_server_socket.h
@@ -9,12 +9,12 @@
 
 #include "base/macros.h"
 #include "net/base/completion_callback.h"
-#include "net/base/ip_address_number.h"
 #include "net/udp/datagram_server_socket.h"
 #include "net/udp/udp_socket.h"
 
 namespace net {
 
+class IPAddress;
 class IPEndPoint;
 class BoundNetLog;
 
@@ -42,8 +42,8 @@
   const BoundNetLog& NetLog() const override;
   void AllowAddressReuse() override;
   void AllowBroadcast() override;
-  int JoinGroup(const IPAddressNumber& group_address) const override;
-  int LeaveGroup(const IPAddressNumber& group_address) const override;
+  int JoinGroup(const IPAddress& group_address) const override;
+  int LeaveGroup(const IPAddress& group_address) const override;
   int SetMulticastInterface(uint32_t interface_index) override;
   int SetMulticastTimeToLive(int time_to_live) override;
   int SetMulticastLoopbackMode(bool loopback) override;
diff --git a/net/udp/udp_socket_perftest.cc b/net/udp/udp_socket_perftest.cc
index 26c14cf..67804a7 100644
--- a/net/udp/udp_socket_perftest.cc
+++ b/net/udp/udp_socket_perftest.cc
@@ -53,11 +53,10 @@
 void CreateUDPAddress(const std::string& ip_str,
                       uint16_t port,
                       IPEndPoint* address) {
-  IPAddressNumber ip_number;
-  bool rv = ParseIPLiteralToNumber(ip_str, &ip_number);
-  if (!rv)
+  IPAddress ip_address;
+  if (!ip_address.AssignFromIPLiteral(ip_str))
     return;
-  *address = IPEndPoint(ip_number, port);
+  *address = IPEndPoint(ip_address, port);
 }
 
 void UDPSocketPerfTest::WritePacketsToSocket(UDPClientSocket* socket,
diff --git a/net/udp/udp_socket_posix.cc b/net/udp/udp_socket_posix.cc
index ea1a560..331bb77 100644
--- a/net/udp/udp_socket_posix.cc
+++ b/net/udp/udp_socket_posix.cc
@@ -21,6 +21,7 @@
 #include "base/posix/eintr_wrapper.h"
 #include "base/rand_util.h"
 #include "net/base/io_buffer.h"
+#include "net/base/ip_address.h"
 #include "net/base/ip_endpoint.h"
 #include "net/base/net_errors.h"
 #include "net/base/network_activity_monitor.h"
@@ -281,12 +282,12 @@
 
   int rv = 0;
   if (bind_type_ == DatagramSocket::RANDOM_BIND) {
-    // Construct IPAddressNumber of appropriate size (IPv4 or IPv6) of 0s,
+    // Construct IPAddress of appropriate size (IPv4 or IPv6) of 0s,
     // representing INADDR_ANY or in6addr_any.
-    size_t addr_size = address.GetSockAddrFamily() == AF_INET ?
-        kIPv4AddressSize : kIPv6AddressSize;
-    IPAddressNumber addr_any(addr_size);
-    rv = RandomBind(addr_any);
+    size_t addr_size = address.GetSockAddrFamily() == AF_INET
+                           ? IPAddress::kIPv4AddressSize
+                           : IPAddress::kIPv6AddressSize;
+    rv = RandomBind(IPAddress::AllZeros(addr_size));
   }
   // else connect() does the DatagramSocket::DEFAULT_BIND
 
@@ -652,7 +653,7 @@
   return MapSystemError(last_error);
 }
 
-int UDPSocketPosix::RandomBind(const IPAddressNumber& address) {
+int UDPSocketPosix::RandomBind(const IPAddress& address) {
   DCHECK(bind_type_ == DatagramSocket::RANDOM_BIND && !rand_int_cb_.is_null());
 
   for (int i = 0; i < kBindRetries; ++i) {
@@ -664,13 +665,13 @@
   return DoBind(IPEndPoint(address, 0));
 }
 
-int UDPSocketPosix::JoinGroup(const IPAddressNumber& group_address) const {
+int UDPSocketPosix::JoinGroup(const IPAddress& group_address) const {
   DCHECK(CalledOnValidThread());
   if (!is_connected())
     return ERR_SOCKET_NOT_CONNECTED;
 
   switch (group_address.size()) {
-    case kIPv4AddressSize: {
+    case IPAddress::kIPv4AddressSize: {
       if (addr_family_ != AF_INET)
         return ERR_ADDRESS_INVALID;
 
@@ -681,23 +682,25 @@
 #else
       ip_mreq mreq;
       int error = GetIPv4AddressFromIndex(socket_, multicast_interface_,
-                                            &mreq.imr_interface.s_addr);
+                                          &mreq.imr_interface.s_addr);
       if (error != OK)
         return error;
 #endif
-      memcpy(&mreq.imr_multiaddr, &group_address[0], kIPv4AddressSize);
+      memcpy(&mreq.imr_multiaddr, group_address.bytes().data(),
+             IPAddress::kIPv4AddressSize);
       int rv = setsockopt(socket_, IPPROTO_IP, IP_ADD_MEMBERSHIP,
                           &mreq, sizeof(mreq));
       if (rv < 0)
         return MapSystemError(errno);
       return OK;
     }
-    case kIPv6AddressSize: {
+    case IPAddress::kIPv6AddressSize: {
       if (addr_family_ != AF_INET6)
         return ERR_ADDRESS_INVALID;
       ipv6_mreq mreq;
       mreq.ipv6mr_interface = multicast_interface_;
-      memcpy(&mreq.ipv6mr_multiaddr, &group_address[0], kIPv6AddressSize);
+      memcpy(&mreq.ipv6mr_multiaddr, group_address.bytes().data(),
+             IPAddress::kIPv6AddressSize);
       int rv = setsockopt(socket_, IPPROTO_IPV6, IPV6_JOIN_GROUP,
                           &mreq, sizeof(mreq));
       if (rv < 0)
@@ -710,31 +713,33 @@
   }
 }
 
-int UDPSocketPosix::LeaveGroup(const IPAddressNumber& group_address) const {
+int UDPSocketPosix::LeaveGroup(const IPAddress& group_address) const {
   DCHECK(CalledOnValidThread());
 
   if (!is_connected())
     return ERR_SOCKET_NOT_CONNECTED;
 
   switch (group_address.size()) {
-    case kIPv4AddressSize: {
+    case IPAddress::kIPv4AddressSize: {
       if (addr_family_ != AF_INET)
         return ERR_ADDRESS_INVALID;
       ip_mreq mreq;
       mreq.imr_interface.s_addr = INADDR_ANY;
-      memcpy(&mreq.imr_multiaddr, &group_address[0], kIPv4AddressSize);
+      memcpy(&mreq.imr_multiaddr, group_address.bytes().data(),
+             IPAddress::kIPv4AddressSize);
       int rv = setsockopt(socket_, IPPROTO_IP, IP_DROP_MEMBERSHIP,
                           &mreq, sizeof(mreq));
       if (rv < 0)
         return MapSystemError(errno);
       return OK;
     }
-    case kIPv6AddressSize: {
+    case IPAddress::kIPv6AddressSize: {
       if (addr_family_ != AF_INET6)
         return ERR_ADDRESS_INVALID;
       ipv6_mreq mreq;
       mreq.ipv6mr_interface = 0;  // 0 indicates default multicast interface.
-      memcpy(&mreq.ipv6mr_multiaddr, &group_address[0], kIPv6AddressSize);
+      memcpy(&mreq.ipv6mr_multiaddr, group_address.bytes().data(),
+             IPAddress::kIPv6AddressSize);
       int rv = setsockopt(socket_, IPPROTO_IPV6, IPV6_LEAVE_GROUP,
                           &mreq, sizeof(mreq));
       if (rv < 0)
diff --git a/net/udp/udp_socket_posix.h b/net/udp/udp_socket_posix.h
index 969f98d..60b095c 100644
--- a/net/udp/udp_socket_posix.h
+++ b/net/udp/udp_socket_posix.h
@@ -26,6 +26,8 @@
 
 namespace net {
 
+class IPAddress;
+
 class NET_EXPORT UDPSocketPosix : public base::NonThreadSafe {
  public:
   UDPSocketPosix(DatagramSocket::BindType bind_type,
@@ -136,7 +138,7 @@
   // |group_address| is the group address to join, could be either
   // an IPv4 or IPv6 address.
   // Returns a net error code.
-  int JoinGroup(const IPAddressNumber& group_address) const;
+  int JoinGroup(const IPAddress& group_address) const;
 
   // Leaves the multicast group.
   // |group_address| is the group address to leave, could be either
@@ -145,7 +147,7 @@
   // It's optional to leave the multicast group before destroying
   // the socket. It will be done by the OS.
   // Returns a net error code.
-  int LeaveGroup(const IPAddressNumber& group_address) const;
+  int LeaveGroup(const IPAddress& group_address) const;
 
   // Sets interface to use for multicast. If |interface_index| set to 0,
   // default interface is used.
@@ -251,7 +253,7 @@
   int SetMulticastOptions();
   int DoBind(const IPEndPoint& address);
   // Binds to a random port on |address|.
-  int RandomBind(const IPAddressNumber& address);
+  int RandomBind(const IPAddress& address);
 
   int socket_;
 
diff --git a/net/udp/udp_socket_unittest.cc b/net/udp/udp_socket_unittest.cc
index 2782ba9..28f29cc 100644
--- a/net/udp/udp_socket_unittest.cc
+++ b/net/udp/udp_socket_unittest.cc
@@ -16,6 +16,7 @@
 #include "base/stl_util.h"
 #include "base/thread_task_runner_handle.h"
 #include "net/base/io_buffer.h"
+#include "net/base/ip_address.h"
 #include "net/base/ip_endpoint.h"
 #include "net/base/net_errors.h"
 #include "net/base/test_completion_callback.h"
@@ -128,11 +129,10 @@
   void CreateUDPAddress(const std::string& ip_str,
                         uint16_t port,
                         IPEndPoint* address) {
-    IPAddressNumber ip_number;
-    bool rv = ParseIPLiteralToNumber(ip_str, &ip_number);
-    if (!rv)
+    IPAddress ip_address;
+    if (!ip_address.AssignFromIPLiteral(ip_str))
       return;
-    *address = IPEndPoint(ip_number, port);
+    *address = IPEndPoint(ip_address, port);
   }
 
   // Run unit test for a connection test.
@@ -512,11 +512,11 @@
     SCOPED_TRACE(std::string("Connecting from ") +  tests[i].local_address +
                  std::string(" to ") + tests[i].remote_address);
 
-    IPAddressNumber ip_number;
-    ParseIPLiteralToNumber(tests[i].remote_address, &ip_number);
-    IPEndPoint remote_address(ip_number, 80);
-    ParseIPLiteralToNumber(tests[i].local_address, &ip_number);
-    IPEndPoint local_address(ip_number, 80);
+    IPAddress ip_address;
+    EXPECT_TRUE(ip_address.AssignFromIPLiteral(tests[i].remote_address));
+    IPEndPoint remote_address(ip_address, 80);
+    EXPECT_TRUE(ip_address.AssignFromIPLiteral(tests[i].local_address));
+    IPEndPoint local_address(ip_address, 80);
 
     UDPClientSocket client(DatagramSocket::DEFAULT_BIND,
                            RandIntCallback(),
@@ -610,8 +610,8 @@
 
   IPEndPoint bind_address;
   CreateUDPAddress("0.0.0.0", kPort, &bind_address);
-  IPAddressNumber group_ip;
-  EXPECT_TRUE(ParseIPLiteralToNumber(kGroup, &group_ip));
+  IPAddress group_ip;
+  EXPECT_TRUE(group_ip.AssignFromIPLiteral(kGroup));
 
   UDPSocket socket(DatagramSocket::DEFAULT_BIND,
                    RandIntCallback(),
diff --git a/net/udp/udp_socket_win.cc b/net/udp/udp_socket_win.cc
index 27e2750..c1628229 100644
--- a/net/udp/udp_socket_win.cc
+++ b/net/udp/udp_socket_win.cc
@@ -15,6 +15,7 @@
 #include "base/metrics/sparse_histogram.h"
 #include "base/rand_util.h"
 #include "net/base/io_buffer.h"
+#include "net/base/ip_address.h"
 #include "net/base/ip_endpoint.h"
 #include "net/base/net_errors.h"
 #include "net/base/network_activity_monitor.h"
@@ -439,12 +440,12 @@
 
   int rv = 0;
   if (bind_type_ == DatagramSocket::RANDOM_BIND) {
-    // Construct IPAddressNumber of appropriate size (IPv4 or IPv6) of 0s,
+    // Construct IPAddress of appropriate size (IPv4 or IPv6) of 0s,
     // representing INADDR_ANY or in6addr_any.
-    size_t addr_size = (address.GetSockAddrFamily() == AF_INET) ?
-        kIPv4AddressSize : kIPv6AddressSize;
-    IPAddressNumber addr_any(addr_size);
-    rv = RandomBind(addr_any);
+    size_t addr_size = (address.GetSockAddrFamily() == AF_INET)
+                           ? IPAddress::kIPv4AddressSize
+                           : IPAddress::kIPv6AddressSize;
+    rv = RandomBind(IPAddress::AllZeros(addr_size));
   }
   // else connect() does the DatagramSocket::DEFAULT_BIND
 
@@ -952,7 +953,7 @@
   return MapSystemError(last_error);
 }
 
-int UDPSocketWin::RandomBind(const IPAddressNumber& address) {
+int UDPSocketWin::RandomBind(const IPAddress& address) {
   DCHECK(bind_type_ == DatagramSocket::RANDOM_BIND && !rand_int_cb_.is_null());
 
   for (int i = 0; i < kBindRetries; ++i) {
@@ -964,19 +965,19 @@
   return DoBind(IPEndPoint(address, 0));
 }
 
-int UDPSocketWin::JoinGroup(
-    const IPAddressNumber& group_address) const {
+int UDPSocketWin::JoinGroup(const IPAddress& group_address) const {
   DCHECK(CalledOnValidThread());
   if (!is_connected())
     return ERR_SOCKET_NOT_CONNECTED;
 
   switch (group_address.size()) {
-    case kIPv4AddressSize: {
+    case IPAddress::kIPv4AddressSize: {
       if (addr_family_ != AF_INET)
         return ERR_ADDRESS_INVALID;
       ip_mreq mreq;
       mreq.imr_interface.s_addr = htonl(multicast_interface_);
-      memcpy(&mreq.imr_multiaddr, &group_address[0], kIPv4AddressSize);
+      memcpy(&mreq.imr_multiaddr, group_address.bytes().data(),
+             IPAddress::kIPv4AddressSize);
       int rv = setsockopt(socket_, IPPROTO_IP, IP_ADD_MEMBERSHIP,
                           reinterpret_cast<const char*>(&mreq),
                           sizeof(mreq));
@@ -984,12 +985,13 @@
         return MapSystemError(WSAGetLastError());
       return OK;
     }
-    case kIPv6AddressSize: {
+    case IPAddress::kIPv6AddressSize: {
       if (addr_family_ != AF_INET6)
         return ERR_ADDRESS_INVALID;
       ipv6_mreq mreq;
       mreq.ipv6mr_interface = multicast_interface_;
-      memcpy(&mreq.ipv6mr_multiaddr, &group_address[0], kIPv6AddressSize);
+      memcpy(&mreq.ipv6mr_multiaddr, group_address.bytes().data(),
+             IPAddress::kIPv6AddressSize);
       int rv = setsockopt(socket_, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP,
                           reinterpret_cast<const char*>(&mreq),
                           sizeof(mreq));
@@ -1003,31 +1005,32 @@
   }
 }
 
-int UDPSocketWin::LeaveGroup(
-    const IPAddressNumber& group_address) const {
+int UDPSocketWin::LeaveGroup(const IPAddress& group_address) const {
   DCHECK(CalledOnValidThread());
   if (!is_connected())
     return ERR_SOCKET_NOT_CONNECTED;
 
   switch (group_address.size()) {
-    case kIPv4AddressSize: {
+    case IPAddress::kIPv4AddressSize: {
       if (addr_family_ != AF_INET)
         return ERR_ADDRESS_INVALID;
       ip_mreq mreq;
       mreq.imr_interface.s_addr = htonl(multicast_interface_);
-      memcpy(&mreq.imr_multiaddr, &group_address[0], kIPv4AddressSize);
+      memcpy(&mreq.imr_multiaddr, group_address.bytes().data(),
+             IPAddress::kIPv4AddressSize);
       int rv = setsockopt(socket_, IPPROTO_IP, IP_DROP_MEMBERSHIP,
                           reinterpret_cast<const char*>(&mreq), sizeof(mreq));
       if (rv)
         return MapSystemError(WSAGetLastError());
       return OK;
     }
-    case kIPv6AddressSize: {
+    case IPAddress::kIPv6AddressSize: {
       if (addr_family_ != AF_INET6)
         return ERR_ADDRESS_INVALID;
       ipv6_mreq mreq;
       mreq.ipv6mr_interface = multicast_interface_;
-      memcpy(&mreq.ipv6mr_multiaddr, &group_address[0], kIPv6AddressSize);
+      memcpy(&mreq.ipv6mr_multiaddr, group_address.bytes().data(),
+             IPAddress::kIPv6AddressSize);
       int rv = setsockopt(socket_, IPPROTO_IPV6, IP_DROP_MEMBERSHIP,
                           reinterpret_cast<const char*>(&mreq), sizeof(mreq));
       if (rv)
diff --git a/net/udp/udp_socket_win.h b/net/udp/udp_socket_win.h
index f36c19b..62c3e11 100644
--- a/net/udp/udp_socket_win.h
+++ b/net/udp/udp_socket_win.h
@@ -29,6 +29,8 @@
 
 namespace net {
 
+class IPAddress;
+
 class NET_EXPORT UDPSocketWin
     : NON_EXPORTED_BASE(public base::NonThreadSafe),
       NON_EXPORTED_BASE(public base::win::ObjectWatcher::Delegate) {
@@ -140,7 +142,7 @@
   // |group_address| is the group address to join, could be either
   // an IPv4 or IPv6 address.
   // Returns a net error code.
-  int JoinGroup(const IPAddressNumber& group_address) const;
+  int JoinGroup(const IPAddress& group_address) const;
 
   // Leaves the multicast group.
   // |group_address| is the group address to leave, could be either
@@ -149,7 +151,7 @@
   // It's optional to leave the multicast group before destroying
   // the socket. It will be done by the OS.
   // Return a net error code.
-  int LeaveGroup(const IPAddressNumber& group_address) const;
+  int LeaveGroup(const IPAddress& group_address) const;
 
   // Sets interface to use for multicast. If |interface_index| set to 0,
   // default interface is used.
@@ -245,7 +247,7 @@
   int SetMulticastOptions();
   int DoBind(const IPEndPoint& address);
   // Binds to a random port on |address|.
-  int RandomBind(const IPAddressNumber& address);
+  int RandomBind(const IPAddress& address);
 
   SOCKET socket_;
   int addr_family_;
diff --git a/ppapi/shared_impl/private/net_address_private_impl.cc b/ppapi/shared_impl/private/net_address_private_impl.cc
index 07d61d7..c9458082 100644
--- a/ppapi/shared_impl/private/net_address_private_impl.cc
+++ b/ppapi/shared_impl/private/net_address_private_impl.cc
@@ -450,7 +450,7 @@
 
 // static
 bool NetAddressPrivateImpl::IPEndPointToNetAddress(
-    const std::vector<unsigned char>& address,
+    const std::vector<uint8_t>& address,
     uint16_t port,
     PP_NetAddress_Private* addr) {
   if (!addr)
@@ -483,7 +483,7 @@
 // static
 bool NetAddressPrivateImpl::NetAddressToIPEndPoint(
     const PP_NetAddress_Private& addr,
-    std::vector<unsigned char>* address,
+    std::vector<uint8_t>* address,
     uint16_t* port) {
   if (!address || !port)
     return false;
diff --git a/ppapi/shared_impl/private/net_address_private_impl.h b/ppapi/shared_impl/private/net_address_private_impl.h
index a7867dd..dd4b56a 100644
--- a/ppapi/shared_impl/private/net_address_private_impl.h
+++ b/ppapi/shared_impl/private/net_address_private_impl.h
@@ -5,6 +5,7 @@
 #ifndef PPAPI_SHARED_IMPL_PRIVATE_NET_ADDRESS_PRIVATE_IMPL_H_
 #define PPAPI_SHARED_IMPL_PRIVATE_NET_ADDRESS_PRIVATE_IMPL_H_
 
+#include <stdint.h>
 #include <string>
 #include <vector>
 
@@ -26,12 +27,12 @@
                                    uint32_t sa_length,
                                    PP_NetAddress_Private* net_addr);
 
-  static bool IPEndPointToNetAddress(const std::vector<unsigned char>& address,
+  static bool IPEndPointToNetAddress(const std::vector<uint8_t>& address,
                                      uint16_t port,
                                      PP_NetAddress_Private* net_addr);
 
   static bool NetAddressToIPEndPoint(const PP_NetAddress_Private& net_addr,
-                                     std::vector<unsigned char>* address,
+                                     std::vector<uint8_t>* address,
                                      uint16_t* port);
 
   static std::string DescribeNetAddress(const PP_NetAddress_Private& addr,