Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(315)

Unified Diff: net/base/ip_address.h

Issue 1408803010: Add IPAddress class as a replacement for the IPAddressNumber typedef. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | net/base/ip_address.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/ip_address.h
diff --git a/net/base/ip_address.h b/net/base/ip_address.h
new file mode 100644
index 0000000000000000000000000000000000000000..e79ab936e4733535ba17ef0f9a3eb0a5edd24746
--- /dev/null
+++ b/net/base/ip_address.h
@@ -0,0 +1,155 @@
+// Copyright (c) 2015 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 NET_BASE_IP_ADDRESS_NET_H_
+#define NET_BASE_IP_ADDRESS_NET_H_
+
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+#include "base/gtest_prod_util.h"
eroman 2015/11/24 00:21:49 Why is this included? (I see only "friend" in the
martijnc 2015/11/26 22:10:31 Removed. (Was leftover from some earlier testing)
+#include "base/strings/string_piece.h"
+#include "net/base/address_family.h"
+#include "net/base/ip_address_number.h"
+#include "net/base/net_export.h"
+#include "net/base/sys_addrinfo.h"
+
+namespace net {
+
+class NET_EXPORT IPAddress {
+ public:
+ IPAddress();
eroman 2015/11/24 00:21:49 Please document what default construction does (wi
martijnc 2015/11/26 22:10:31 Done.
+ ~IPAddress();
+
+ static const size_t kIPv4AddressSize = 4;
eroman 2015/11/24 00:21:49 I believe the conclusion in https://groups.google.
martijnc 2015/11/26 22:10:31 Done.
+ static const size_t kIPv6AddressSize = 16;
+
+ // Returns true if an IP address hostname is in a range reserved by the IANA.
+ // Works with both IPv4 and IPv6 addresses, and only compares against a given
+ // protocols's reserved ranges.
+ bool IsIPAddressReserved() const;
+
+ // Returns true if the IP has |kIPv4AddressSize| elements.
+ bool IsIPv4() const { return ip_address_.size() == kIPv4AddressSize; }
+
+ // Returns true if the IP has |kIPv6AddressSize| elements.
+ bool IsIPv6() const { return ip_address_.size() == kIPv6AddressSize; }
+
+ // The size in bytes of |ip_address_|.
+ size_t size() const { return ip_address_.size(); }
+
+ // Returns the string representation of an IP address.
eroman 2015/11/24 00:21:49 nit: Instead of "the string representation" can y
martijnc 2015/11/26 22:10:31 Done.
+ // For example: "192.168.0.1" or "::1".
+ std::string ToString() const;
+
+ // Returns the string representation of an IP address along with its port.
+ // For example: "192.168.0.1:99" or "[::1]:80".
+ std::string ToStringWithPort(uint16_t port) const;
eroman 2015/11/24 00:21:49 I don't think this function belongs here, as this
martijnc 2015/11/26 22:10:31 Removed.
+
+ // Returns the address as a sequence of bytes in network-byte-order.
+ std::string ToPackedString() const;
eroman 2015/11/24 00:21:49 Rather than copy into a string, why not something
martijnc 2015/11/26 22:10:31 Done (removed).
+
+ // Returns number of matching initial bits between the addresses |other|.
+ unsigned CommonPrefixLength(const IPAddress& other) const;
+
+ // Computes the number of leading 1-bits in the address.
+ unsigned MaskPrefixLength() const;
+
+ // Returns true if |ip_address_| is an IPv4-mapped IPv6 address.
+ bool IsIPv4Mapped() const;
+
+ // Returns AddressFamily of the address.
+ AddressFamily GetAddressFamily() const;
+
+ // Compares an IP address to see if it falls within the specified IP block.
+ // Returns true if it does, false otherwise.
+ //
+ // The IP block is given by (|ip_prefix|, |prefix_length_in_bits|) -- any
+ // IP address whose |prefix_length_in_bits| most significant bits match
+ // |ip_prefix| will be matched.
+ //
+ // In cases when an IPv4 address is being compared to an IPv6 address prefix
+ // and vice versa, the IPv4 addresses will be converted to IPv4-mapped
+ // (IPv6) addresses.
+ bool MatchesPrefix(const IPAddress& ip_prefix,
+ size_t prefix_length_in_bits) WARN_UNUSED_RESULT;
+
+ // Convert to a provided sockaddr struct.
+ // |address| is the sockaddr to copy into. Should be at least
+ // sizeof(struct sockaddr_storage) bytes. |address_length| is an
+ // input/output parameter. On input, it is the size of data in |address|
+ // available. On output, it is the size of the address that was copied into
+ // |address|. Returns true on success, false on failure.
+ bool ToSockAddrWithPort(struct sockaddr* address,
+ socklen_t* address_length,
+ int port) const;
+
+ // Parses a URL-safe IP literal (see RFC 3986, Sec 3.2.2) to its numeric
+ // value.
+ // Returns true on success, and fills |ip_address| with the numeric value
+ static bool FromURLHostname(const std::string& hostname,
+ IPAddress* ip_address) WARN_UNUSED_RESULT;
+
+ // Parses an IP address literal (either IPv4 or IPv6) to its numeric value.
+ // Returns true on success and fills |ip_address| with the numeric value.
+ static bool FromIPLiteral(const base::StringPiece& ip_literal,
+ IPAddress* ip_adress) WARN_UNUSED_RESULT;
+
+ // Parses an IP block specifier from CIDR notation to an
+ // (IP address, prefix length) pair. Returns true on success and fills
+ // |*ip_address| with the numeric value of the IP address and sets
+ // |*prefix_length_in_bits| with the length of the prefix.
+ //
+ // CIDR notation literals can use either IPv4 or IPv6 literals. Some examples:
+ //
+ // 10.10.3.1/20
+ // a:b:c::/46
+ // ::1/128
+ static bool FromCIDRBlock(const std::string& cidr_literal,
+ IPAddress* ip_address,
+ size_t* prefix_length_in_bits);
+
+ // Creates an IPAddress from a legacy IPAddressNumber.
+ // TODO(Martijnc): Remove when migration is complete. https://crbug.com/496258
+ static IPAddress FromLegacy(const IPAddressNumber& ip_address);
+
+ // Converts an IPv4 address to an IPv4-mapped IPv6 address.
+ // For example 192.168.0.1 would be converted to ::ffff:192.168.0.1.
+ static IPAddress ConvertIPv4ToIPv6(const IPAddress& ipv4_address);
+
+ // Converts an IPv4-mapped IPv6 address to IPv4 address. Should only be called
+ // on IPv4-mapped IPv6 addresses.
+ static IPAddress ConvertIPv4MappedToIPv4(const IPAddress& address);
+
+ bool operator==(const IPAddress& that) const;
+ bool operator!=(const IPAddress& that) const;
+ bool operator<(const IPAddress& that) const;
+ bool operator>(const IPAddress& that) const;
eroman 2015/11/24 00:21:49 Why provide != and > ?
martijnc 2015/11/26 22:10:31 Removed. (added them initially for completeness)
+
+ private:
+ friend class IPAddressTest;
+
+ // TODO(Martijnc): Remove this when all IPEndPoint consumers are moved to the
+ // new IPAddress class. https://crbug.com/496258
+ friend class IPEndPoint;
+
+ IPAddress(std::vector<unsigned char>& ip_address);
+
+ bool IPAddressPrefixCheck(const IPAddress* ip_prefix,
+ size_t prefix_length_in_bits) const;
+
+ bool IPAddressPrefixCheck(const unsigned char* ip_prefix,
+ size_t prefix_length_in_bits) const;
+
+ // IPv4 addresses will have length kIPv4AddressSize, whereas IPv6 address
+ // will have length kIPv6AddressSize.
+ std::vector<unsigned char> ip_address_;
eroman 2015/11/24 00:21:49 uint8_t
martijnc 2015/11/26 22:10:31 Done.
+
+ static const unsigned char kIPv4MappedPrefix[];
eroman 2015/11/24 00:21:49 This can go into the .cc file as either a static v
martijnc 2015/11/26 22:10:31 Done.
+};
+
+} // namespace net
+
+#endif // NET_BASE_IP_ADDRESS_NET_H_
« no previous file with comments | « no previous file | net/base/ip_address.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698