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

Side by Side 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 unified diff | Download patch
« no previous file with comments | « no previous file | net/base/ip_address.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef NET_BASE_IP_ADDRESS_NET_H_
6 #define NET_BASE_IP_ADDRESS_NET_H_
7
8 #include <vector>
9
10 #include "base/basictypes.h"
11 #include "base/compiler_specific.h"
12 #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)
13 #include "base/strings/string_piece.h"
14 #include "net/base/address_family.h"
15 #include "net/base/ip_address_number.h"
16 #include "net/base/net_export.h"
17 #include "net/base/sys_addrinfo.h"
18
19 namespace net {
20
21 class NET_EXPORT IPAddress {
22 public:
23 IPAddress();
eroman 2015/11/24 00:21:49 Please document what default construction does (wi
martijnc 2015/11/26 22:10:31 Done.
24 ~IPAddress();
25
26 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.
27 static const size_t kIPv6AddressSize = 16;
28
29 // Returns true if an IP address hostname is in a range reserved by the IANA.
30 // Works with both IPv4 and IPv6 addresses, and only compares against a given
31 // protocols's reserved ranges.
32 bool IsIPAddressReserved() const;
33
34 // Returns true if the IP has |kIPv4AddressSize| elements.
35 bool IsIPv4() const { return ip_address_.size() == kIPv4AddressSize; }
36
37 // Returns true if the IP has |kIPv6AddressSize| elements.
38 bool IsIPv6() const { return ip_address_.size() == kIPv6AddressSize; }
39
40 // The size in bytes of |ip_address_|.
41 size_t size() const { return ip_address_.size(); }
42
43 // 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.
44 // For example: "192.168.0.1" or "::1".
45 std::string ToString() const;
46
47 // Returns the string representation of an IP address along with its port.
48 // For example: "192.168.0.1:99" or "[::1]:80".
49 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.
50
51 // Returns the address as a sequence of bytes in network-byte-order.
52 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).
53
54 // Returns number of matching initial bits between the addresses |other|.
55 unsigned CommonPrefixLength(const IPAddress& other) const;
56
57 // Computes the number of leading 1-bits in the address.
58 unsigned MaskPrefixLength() const;
59
60 // Returns true if |ip_address_| is an IPv4-mapped IPv6 address.
61 bool IsIPv4Mapped() const;
62
63 // Returns AddressFamily of the address.
64 AddressFamily GetAddressFamily() const;
65
66 // Compares an IP address to see if it falls within the specified IP block.
67 // Returns true if it does, false otherwise.
68 //
69 // The IP block is given by (|ip_prefix|, |prefix_length_in_bits|) -- any
70 // IP address whose |prefix_length_in_bits| most significant bits match
71 // |ip_prefix| will be matched.
72 //
73 // In cases when an IPv4 address is being compared to an IPv6 address prefix
74 // and vice versa, the IPv4 addresses will be converted to IPv4-mapped
75 // (IPv6) addresses.
76 bool MatchesPrefix(const IPAddress& ip_prefix,
77 size_t prefix_length_in_bits) WARN_UNUSED_RESULT;
78
79 // Convert to a provided sockaddr struct.
80 // |address| is the sockaddr to copy into. Should be at least
81 // sizeof(struct sockaddr_storage) bytes. |address_length| is an
82 // input/output parameter. On input, it is the size of data in |address|
83 // available. On output, it is the size of the address that was copied into
84 // |address|. Returns true on success, false on failure.
85 bool ToSockAddrWithPort(struct sockaddr* address,
86 socklen_t* address_length,
87 int port) const;
88
89 // Parses a URL-safe IP literal (see RFC 3986, Sec 3.2.2) to its numeric
90 // value.
91 // Returns true on success, and fills |ip_address| with the numeric value
92 static bool FromURLHostname(const std::string& hostname,
93 IPAddress* ip_address) WARN_UNUSED_RESULT;
94
95 // Parses an IP address literal (either IPv4 or IPv6) to its numeric value.
96 // Returns true on success and fills |ip_address| with the numeric value.
97 static bool FromIPLiteral(const base::StringPiece& ip_literal,
98 IPAddress* ip_adress) WARN_UNUSED_RESULT;
99
100 // Parses an IP block specifier from CIDR notation to an
101 // (IP address, prefix length) pair. Returns true on success and fills
102 // |*ip_address| with the numeric value of the IP address and sets
103 // |*prefix_length_in_bits| with the length of the prefix.
104 //
105 // CIDR notation literals can use either IPv4 or IPv6 literals. Some examples:
106 //
107 // 10.10.3.1/20
108 // a:b:c::/46
109 // ::1/128
110 static bool FromCIDRBlock(const std::string& cidr_literal,
111 IPAddress* ip_address,
112 size_t* prefix_length_in_bits);
113
114 // Creates an IPAddress from a legacy IPAddressNumber.
115 // TODO(Martijnc): Remove when migration is complete. https://crbug.com/496258
116 static IPAddress FromLegacy(const IPAddressNumber& ip_address);
117
118 // Converts an IPv4 address to an IPv4-mapped IPv6 address.
119 // For example 192.168.0.1 would be converted to ::ffff:192.168.0.1.
120 static IPAddress ConvertIPv4ToIPv6(const IPAddress& ipv4_address);
121
122 // Converts an IPv4-mapped IPv6 address to IPv4 address. Should only be called
123 // on IPv4-mapped IPv6 addresses.
124 static IPAddress ConvertIPv4MappedToIPv4(const IPAddress& address);
125
126 bool operator==(const IPAddress& that) const;
127 bool operator!=(const IPAddress& that) const;
128 bool operator<(const IPAddress& that) const;
129 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)
130
131 private:
132 friend class IPAddressTest;
133
134 // TODO(Martijnc): Remove this when all IPEndPoint consumers are moved to the
135 // new IPAddress class. https://crbug.com/496258
136 friend class IPEndPoint;
137
138 IPAddress(std::vector<unsigned char>& ip_address);
139
140 bool IPAddressPrefixCheck(const IPAddress* ip_prefix,
141 size_t prefix_length_in_bits) const;
142
143 bool IPAddressPrefixCheck(const unsigned char* ip_prefix,
144 size_t prefix_length_in_bits) const;
145
146 // IPv4 addresses will have length kIPv4AddressSize, whereas IPv6 address
147 // will have length kIPv6AddressSize.
148 std::vector<unsigned char> ip_address_;
eroman 2015/11/24 00:21:49 uint8_t
martijnc 2015/11/26 22:10:31 Done.
149
150 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.
151 };
152
153 } // namespace net
154
155 #endif // NET_BASE_IP_ADDRESS_NET_H_
OLDNEW
« 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