1*6777b538SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #ifndef NET_BASE_IP_ADDRESS_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_BASE_IP_ADDRESS_H_
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
9*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker #include <algorithm>
12*6777b538SAndroid Build Coastguard Worker #include <array>
13*6777b538SAndroid Build Coastguard Worker #include <optional>
14*6777b538SAndroid Build Coastguard Worker #include <string>
15*6777b538SAndroid Build Coastguard Worker #include <string_view>
16*6777b538SAndroid Build Coastguard Worker #include <vector>
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/values.h"
21*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
22*6777b538SAndroid Build Coastguard Worker
23*6777b538SAndroid Build Coastguard Worker namespace net {
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard Worker // Helper class to represent the sequence of bytes in an IP address.
26*6777b538SAndroid Build Coastguard Worker // A vector<uint8_t> would be simpler but incurs heap allocation, so
27*6777b538SAndroid Build Coastguard Worker // IPAddressBytes uses a fixed size array.
28*6777b538SAndroid Build Coastguard Worker class NET_EXPORT IPAddressBytes {
29*6777b538SAndroid Build Coastguard Worker public:
30*6777b538SAndroid Build Coastguard Worker IPAddressBytes();
31*6777b538SAndroid Build Coastguard Worker explicit IPAddressBytes(base::span<const uint8_t> data);
32*6777b538SAndroid Build Coastguard Worker IPAddressBytes(const IPAddressBytes& other);
33*6777b538SAndroid Build Coastguard Worker ~IPAddressBytes();
34*6777b538SAndroid Build Coastguard Worker
35*6777b538SAndroid Build Coastguard Worker // Copies elements from |data| into this object.
36*6777b538SAndroid Build Coastguard Worker void Assign(base::span<const uint8_t> data);
37*6777b538SAndroid Build Coastguard Worker
38*6777b538SAndroid Build Coastguard Worker // Returns the number of elements in the underlying array.
size()39*6777b538SAndroid Build Coastguard Worker size_t size() const { return size_; }
40*6777b538SAndroid Build Coastguard Worker
41*6777b538SAndroid Build Coastguard Worker // Sets the size to be |size|. Does not actually change the size
42*6777b538SAndroid Build Coastguard Worker // of the underlying array or zero-initialize the bytes.
Resize(size_t size)43*6777b538SAndroid Build Coastguard Worker void Resize(size_t size) {
44*6777b538SAndroid Build Coastguard Worker DCHECK_LE(size, 16u);
45*6777b538SAndroid Build Coastguard Worker size_ = static_cast<uint8_t>(size);
46*6777b538SAndroid Build Coastguard Worker }
47*6777b538SAndroid Build Coastguard Worker
48*6777b538SAndroid Build Coastguard Worker // Returns true if the underlying array is empty.
empty()49*6777b538SAndroid Build Coastguard Worker bool empty() const { return size_ == 0; }
50*6777b538SAndroid Build Coastguard Worker
51*6777b538SAndroid Build Coastguard Worker // Returns a pointer to the underlying array of bytes.
data()52*6777b538SAndroid Build Coastguard Worker const uint8_t* data() const { return bytes_.data(); }
data()53*6777b538SAndroid Build Coastguard Worker uint8_t* data() { return bytes_.data(); }
54*6777b538SAndroid Build Coastguard Worker
55*6777b538SAndroid Build Coastguard Worker // Returns a pointer to the first element.
begin()56*6777b538SAndroid Build Coastguard Worker const uint8_t* begin() const { return data(); }
begin()57*6777b538SAndroid Build Coastguard Worker uint8_t* begin() { return data(); }
58*6777b538SAndroid Build Coastguard Worker
59*6777b538SAndroid Build Coastguard Worker // Returns a pointer past the last element.
end()60*6777b538SAndroid Build Coastguard Worker const uint8_t* end() const { return data() + size_; }
end()61*6777b538SAndroid Build Coastguard Worker uint8_t* end() { return data() + size_; }
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker // Returns a reference to the last element.
back()64*6777b538SAndroid Build Coastguard Worker uint8_t& back() {
65*6777b538SAndroid Build Coastguard Worker DCHECK(!empty());
66*6777b538SAndroid Build Coastguard Worker return bytes_[size_ - 1];
67*6777b538SAndroid Build Coastguard Worker }
back()68*6777b538SAndroid Build Coastguard Worker const uint8_t& back() const {
69*6777b538SAndroid Build Coastguard Worker DCHECK(!empty());
70*6777b538SAndroid Build Coastguard Worker return bytes_[size_ - 1];
71*6777b538SAndroid Build Coastguard Worker }
72*6777b538SAndroid Build Coastguard Worker
73*6777b538SAndroid Build Coastguard Worker // Appends |val| to the end and increments the size.
push_back(uint8_t val)74*6777b538SAndroid Build Coastguard Worker void push_back(uint8_t val) {
75*6777b538SAndroid Build Coastguard Worker DCHECK_GT(16, size_);
76*6777b538SAndroid Build Coastguard Worker bytes_[size_++] = val;
77*6777b538SAndroid Build Coastguard Worker }
78*6777b538SAndroid Build Coastguard Worker
79*6777b538SAndroid Build Coastguard Worker // Appends `data` to the end and increments the size.
80*6777b538SAndroid Build Coastguard Worker void Append(base::span<const uint8_t> data);
81*6777b538SAndroid Build Coastguard Worker
82*6777b538SAndroid Build Coastguard Worker // Returns a reference to the byte at index |pos|.
83*6777b538SAndroid Build Coastguard Worker uint8_t& operator[](size_t pos) {
84*6777b538SAndroid Build Coastguard Worker DCHECK_LT(pos, size_);
85*6777b538SAndroid Build Coastguard Worker return bytes_[pos];
86*6777b538SAndroid Build Coastguard Worker }
87*6777b538SAndroid Build Coastguard Worker const uint8_t& operator[](size_t pos) const {
88*6777b538SAndroid Build Coastguard Worker DCHECK_LT(pos, size_);
89*6777b538SAndroid Build Coastguard Worker return bytes_[pos];
90*6777b538SAndroid Build Coastguard Worker }
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard Worker bool operator<(const IPAddressBytes& other) const;
93*6777b538SAndroid Build Coastguard Worker bool operator!=(const IPAddressBytes& other) const;
94*6777b538SAndroid Build Coastguard Worker bool operator==(const IPAddressBytes& other) const;
95*6777b538SAndroid Build Coastguard Worker
96*6777b538SAndroid Build Coastguard Worker size_t EstimateMemoryUsage() const;
97*6777b538SAndroid Build Coastguard Worker
98*6777b538SAndroid Build Coastguard Worker private:
99*6777b538SAndroid Build Coastguard Worker // Underlying sequence of bytes
100*6777b538SAndroid Build Coastguard Worker std::array<uint8_t, 16> bytes_;
101*6777b538SAndroid Build Coastguard Worker
102*6777b538SAndroid Build Coastguard Worker // Number of elements in |bytes_|. Should be either kIPv4AddressSize
103*6777b538SAndroid Build Coastguard Worker // or kIPv6AddressSize or 0.
104*6777b538SAndroid Build Coastguard Worker uint8_t size_;
105*6777b538SAndroid Build Coastguard Worker };
106*6777b538SAndroid Build Coastguard Worker
107*6777b538SAndroid Build Coastguard Worker class NET_EXPORT IPAddress {
108*6777b538SAndroid Build Coastguard Worker public:
109*6777b538SAndroid Build Coastguard Worker enum : size_t { kIPv4AddressSize = 4, kIPv6AddressSize = 16 };
110*6777b538SAndroid Build Coastguard Worker
111*6777b538SAndroid Build Coastguard Worker // Nullopt if `value` is malformed to be deserialized to IPAddress.
112*6777b538SAndroid Build Coastguard Worker static std::optional<IPAddress> FromValue(const base::Value& value);
113*6777b538SAndroid Build Coastguard Worker
114*6777b538SAndroid Build Coastguard Worker // Parses an IP address literal (either IPv4 or IPv6). Returns the resulting
115*6777b538SAndroid Build Coastguard Worker // IPAddress on success, or nullopt on error.
116*6777b538SAndroid Build Coastguard Worker static std::optional<IPAddress> FromIPLiteral(std::string_view ip_literal);
117*6777b538SAndroid Build Coastguard Worker
118*6777b538SAndroid Build Coastguard Worker // Creates a zero-sized, invalid address.
119*6777b538SAndroid Build Coastguard Worker IPAddress();
120*6777b538SAndroid Build Coastguard Worker
121*6777b538SAndroid Build Coastguard Worker IPAddress(const IPAddress& other);
122*6777b538SAndroid Build Coastguard Worker
123*6777b538SAndroid Build Coastguard Worker // Copies the input address to |ip_address_|.
124*6777b538SAndroid Build Coastguard Worker explicit IPAddress(const IPAddressBytes& address);
125*6777b538SAndroid Build Coastguard Worker
126*6777b538SAndroid Build Coastguard Worker // Copies the input address to |ip_address_|. The input is expected to be in
127*6777b538SAndroid Build Coastguard Worker // network byte order.
128*6777b538SAndroid Build Coastguard Worker explicit IPAddress(base::span<const uint8_t> address);
129*6777b538SAndroid Build Coastguard Worker
130*6777b538SAndroid Build Coastguard Worker // Initializes |ip_address_| from the 4 bX bytes to form an IPv4 address.
131*6777b538SAndroid Build Coastguard Worker // The bytes are expected to be in network byte order.
132*6777b538SAndroid Build Coastguard Worker IPAddress(uint8_t b0, uint8_t b1, uint8_t b2, uint8_t b3);
133*6777b538SAndroid Build Coastguard Worker
134*6777b538SAndroid Build Coastguard Worker // Initializes |ip_address_| from the 16 bX bytes to form an IPv6 address.
135*6777b538SAndroid Build Coastguard Worker // The bytes are expected to be in network byte order.
136*6777b538SAndroid Build Coastguard Worker IPAddress(uint8_t b0,
137*6777b538SAndroid Build Coastguard Worker uint8_t b1,
138*6777b538SAndroid Build Coastguard Worker uint8_t b2,
139*6777b538SAndroid Build Coastguard Worker uint8_t b3,
140*6777b538SAndroid Build Coastguard Worker uint8_t b4,
141*6777b538SAndroid Build Coastguard Worker uint8_t b5,
142*6777b538SAndroid Build Coastguard Worker uint8_t b6,
143*6777b538SAndroid Build Coastguard Worker uint8_t b7,
144*6777b538SAndroid Build Coastguard Worker uint8_t b8,
145*6777b538SAndroid Build Coastguard Worker uint8_t b9,
146*6777b538SAndroid Build Coastguard Worker uint8_t b10,
147*6777b538SAndroid Build Coastguard Worker uint8_t b11,
148*6777b538SAndroid Build Coastguard Worker uint8_t b12,
149*6777b538SAndroid Build Coastguard Worker uint8_t b13,
150*6777b538SAndroid Build Coastguard Worker uint8_t b14,
151*6777b538SAndroid Build Coastguard Worker uint8_t b15);
152*6777b538SAndroid Build Coastguard Worker
153*6777b538SAndroid Build Coastguard Worker ~IPAddress();
154*6777b538SAndroid Build Coastguard Worker
155*6777b538SAndroid Build Coastguard Worker // Returns true if the IP has |kIPv4AddressSize| elements.
156*6777b538SAndroid Build Coastguard Worker bool IsIPv4() const;
157*6777b538SAndroid Build Coastguard Worker
158*6777b538SAndroid Build Coastguard Worker // Returns true if the IP has |kIPv6AddressSize| elements.
159*6777b538SAndroid Build Coastguard Worker bool IsIPv6() const;
160*6777b538SAndroid Build Coastguard Worker
161*6777b538SAndroid Build Coastguard Worker // Returns true if the IP is either an IPv4 or IPv6 address. This function
162*6777b538SAndroid Build Coastguard Worker // only checks the address length.
163*6777b538SAndroid Build Coastguard Worker bool IsValid() const;
164*6777b538SAndroid Build Coastguard Worker
165*6777b538SAndroid Build Coastguard Worker // Returns true if the IP is not in a range reserved by the IANA for
166*6777b538SAndroid Build Coastguard Worker // local networks. Works with both IPv4 and IPv6 addresses.
167*6777b538SAndroid Build Coastguard Worker // IPv4-mapped-to-IPv6 addresses are considered publicly routable.
168*6777b538SAndroid Build Coastguard Worker bool IsPubliclyRoutable() const;
169*6777b538SAndroid Build Coastguard Worker
170*6777b538SAndroid Build Coastguard Worker // Returns true if the IP is "zero" (e.g. the 0.0.0.0 IPv4 address).
171*6777b538SAndroid Build Coastguard Worker bool IsZero() const;
172*6777b538SAndroid Build Coastguard Worker
173*6777b538SAndroid Build Coastguard Worker // Returns true if |ip_address_| is an IPv4-mapped IPv6 address.
174*6777b538SAndroid Build Coastguard Worker bool IsIPv4MappedIPv6() const;
175*6777b538SAndroid Build Coastguard Worker
176*6777b538SAndroid Build Coastguard Worker // Returns true if |ip_address_| is 127.0.0.1/8 or ::1/128
177*6777b538SAndroid Build Coastguard Worker bool IsLoopback() const;
178*6777b538SAndroid Build Coastguard Worker
179*6777b538SAndroid Build Coastguard Worker // Returns true if |ip_address_| is 169.254.0.0/16 or fe80::/10, or
180*6777b538SAndroid Build Coastguard Worker // ::ffff:169.254.0.0/112 (IPv4 mapped IPv6 link-local).
181*6777b538SAndroid Build Coastguard Worker bool IsLinkLocal() const;
182*6777b538SAndroid Build Coastguard Worker
183*6777b538SAndroid Build Coastguard Worker // Returns true if `ip_address_` is a unique local IPv6 address (fc00::/7).
184*6777b538SAndroid Build Coastguard Worker bool IsUniqueLocalIPv6() const;
185*6777b538SAndroid Build Coastguard Worker
186*6777b538SAndroid Build Coastguard Worker // The size in bytes of |ip_address_|.
size()187*6777b538SAndroid Build Coastguard Worker size_t size() const { return ip_address_.size(); }
188*6777b538SAndroid Build Coastguard Worker
189*6777b538SAndroid Build Coastguard Worker // Returns true if the IP is an empty, zero-sized (invalid) address.
empty()190*6777b538SAndroid Build Coastguard Worker bool empty() const { return ip_address_.empty(); }
191*6777b538SAndroid Build Coastguard Worker
192*6777b538SAndroid Build Coastguard Worker // Returns the canonical string representation of an IP address.
193*6777b538SAndroid Build Coastguard Worker // For example: "192.168.0.1" or "::1". Returns the empty string when
194*6777b538SAndroid Build Coastguard Worker // |ip_address_| is invalid.
195*6777b538SAndroid Build Coastguard Worker std::string ToString() const;
196*6777b538SAndroid Build Coastguard Worker
197*6777b538SAndroid Build Coastguard Worker // Parses an IP address literal (either IPv4 or IPv6) to its numeric value.
198*6777b538SAndroid Build Coastguard Worker // Returns true on success and fills |ip_address_| with the numeric value.
199*6777b538SAndroid Build Coastguard Worker //
200*6777b538SAndroid Build Coastguard Worker // When parsing fails, the original value of |this| will be overwritten such
201*6777b538SAndroid Build Coastguard Worker // that |this->empty()| and |!this->IsValid()|.
202*6777b538SAndroid Build Coastguard Worker [[nodiscard]] bool AssignFromIPLiteral(std::string_view ip_literal);
203*6777b538SAndroid Build Coastguard Worker
204*6777b538SAndroid Build Coastguard Worker // Returns the underlying bytes.
bytes()205*6777b538SAndroid Build Coastguard Worker const IPAddressBytes& bytes() const { return ip_address_; }
206*6777b538SAndroid Build Coastguard Worker
207*6777b538SAndroid Build Coastguard Worker // Copies the bytes to a new vector. Generally callers should be using
208*6777b538SAndroid Build Coastguard Worker // |bytes()| and the IPAddressBytes abstraction. This method is provided as a
209*6777b538SAndroid Build Coastguard Worker // convenience for call sites that existed prior to the introduction of
210*6777b538SAndroid Build Coastguard Worker // IPAddressBytes.
211*6777b538SAndroid Build Coastguard Worker std::vector<uint8_t> CopyBytesToVector() const;
212*6777b538SAndroid Build Coastguard Worker
213*6777b538SAndroid Build Coastguard Worker // Returns an IPAddress instance representing the 127.0.0.1 address.
214*6777b538SAndroid Build Coastguard Worker static IPAddress IPv4Localhost();
215*6777b538SAndroid Build Coastguard Worker
216*6777b538SAndroid Build Coastguard Worker // Returns an IPAddress instance representing the ::1 address.
217*6777b538SAndroid Build Coastguard Worker static IPAddress IPv6Localhost();
218*6777b538SAndroid Build Coastguard Worker
219*6777b538SAndroid Build Coastguard Worker // Returns an IPAddress made up of |num_zero_bytes| zeros.
220*6777b538SAndroid Build Coastguard Worker static IPAddress AllZeros(size_t num_zero_bytes);
221*6777b538SAndroid Build Coastguard Worker
222*6777b538SAndroid Build Coastguard Worker // Returns an IPAddress instance representing the 0.0.0.0 address.
223*6777b538SAndroid Build Coastguard Worker static IPAddress IPv4AllZeros();
224*6777b538SAndroid Build Coastguard Worker
225*6777b538SAndroid Build Coastguard Worker // Returns an IPAddress instance representing the :: address.
226*6777b538SAndroid Build Coastguard Worker static IPAddress IPv6AllZeros();
227*6777b538SAndroid Build Coastguard Worker
228*6777b538SAndroid Build Coastguard Worker // Create an IPv4 mask with prefix |mask_prefix_length|
229*6777b538SAndroid Build Coastguard Worker // Returns false if |max_prefix_length| is greater than the maximum length of
230*6777b538SAndroid Build Coastguard Worker // an IPv4 address.
231*6777b538SAndroid Build Coastguard Worker static bool CreateIPv4Mask(IPAddress* ip_address, size_t mask_prefix_length);
232*6777b538SAndroid Build Coastguard Worker
233*6777b538SAndroid Build Coastguard Worker // Create an IPv6 mask with prefix |mask_prefix_length|
234*6777b538SAndroid Build Coastguard Worker // Returns false if |max_prefix_length| is greater than the maximum length of
235*6777b538SAndroid Build Coastguard Worker // an IPv6 address.
236*6777b538SAndroid Build Coastguard Worker static bool CreateIPv6Mask(IPAddress* ip_address, size_t mask_prefix_length);
237*6777b538SAndroid Build Coastguard Worker
238*6777b538SAndroid Build Coastguard Worker bool operator==(const IPAddress& that) const;
239*6777b538SAndroid Build Coastguard Worker bool operator!=(const IPAddress& that) const;
240*6777b538SAndroid Build Coastguard Worker bool operator<(const IPAddress& that) const;
241*6777b538SAndroid Build Coastguard Worker
242*6777b538SAndroid Build Coastguard Worker // Must be a valid address (per IsValid()).
243*6777b538SAndroid Build Coastguard Worker base::Value ToValue() const;
244*6777b538SAndroid Build Coastguard Worker
245*6777b538SAndroid Build Coastguard Worker size_t EstimateMemoryUsage() const;
246*6777b538SAndroid Build Coastguard Worker
247*6777b538SAndroid Build Coastguard Worker private:
248*6777b538SAndroid Build Coastguard Worker IPAddressBytes ip_address_;
249*6777b538SAndroid Build Coastguard Worker
250*6777b538SAndroid Build Coastguard Worker // This class is copyable and assignable.
251*6777b538SAndroid Build Coastguard Worker };
252*6777b538SAndroid Build Coastguard Worker
253*6777b538SAndroid Build Coastguard Worker using IPAddressList = std::vector<IPAddress>;
254*6777b538SAndroid Build Coastguard Worker
255*6777b538SAndroid Build Coastguard Worker // Returns the canonical string representation of an IP address along with its
256*6777b538SAndroid Build Coastguard Worker // port. For example: "192.168.0.1:99" or "[::1]:80".
257*6777b538SAndroid Build Coastguard Worker NET_EXPORT std::string IPAddressToStringWithPort(const IPAddress& address,
258*6777b538SAndroid Build Coastguard Worker uint16_t port);
259*6777b538SAndroid Build Coastguard Worker
260*6777b538SAndroid Build Coastguard Worker // Returns the address as a sequence of bytes in network-byte-order.
261*6777b538SAndroid Build Coastguard Worker NET_EXPORT std::string IPAddressToPackedString(const IPAddress& address);
262*6777b538SAndroid Build Coastguard Worker
263*6777b538SAndroid Build Coastguard Worker // Converts an IPv4 address to an IPv4-mapped IPv6 address.
264*6777b538SAndroid Build Coastguard Worker // For example 192.168.0.1 would be converted to ::ffff:192.168.0.1.
265*6777b538SAndroid Build Coastguard Worker NET_EXPORT IPAddress ConvertIPv4ToIPv4MappedIPv6(const IPAddress& address);
266*6777b538SAndroid Build Coastguard Worker
267*6777b538SAndroid Build Coastguard Worker // Converts an IPv4-mapped IPv6 address to IPv4 address. Should only be called
268*6777b538SAndroid Build Coastguard Worker // on IPv4-mapped IPv6 addresses.
269*6777b538SAndroid Build Coastguard Worker NET_EXPORT IPAddress ConvertIPv4MappedIPv6ToIPv4(const IPAddress& address);
270*6777b538SAndroid Build Coastguard Worker
271*6777b538SAndroid Build Coastguard Worker // Compares an IP address to see if it falls within the specified IP block.
272*6777b538SAndroid Build Coastguard Worker // Returns true if it does, false otherwise.
273*6777b538SAndroid Build Coastguard Worker //
274*6777b538SAndroid Build Coastguard Worker // The IP block is given by (|ip_prefix|, |prefix_length_in_bits|) -- any
275*6777b538SAndroid Build Coastguard Worker // IP address whose |prefix_length_in_bits| most significant bits match
276*6777b538SAndroid Build Coastguard Worker // |ip_prefix| will be matched.
277*6777b538SAndroid Build Coastguard Worker //
278*6777b538SAndroid Build Coastguard Worker // In cases when an IPv4 address is being compared to an IPv6 address prefix
279*6777b538SAndroid Build Coastguard Worker // and vice versa, the IPv4 addresses will be converted to IPv4-mapped
280*6777b538SAndroid Build Coastguard Worker // (IPv6) addresses.
281*6777b538SAndroid Build Coastguard Worker NET_EXPORT bool IPAddressMatchesPrefix(const IPAddress& ip_address,
282*6777b538SAndroid Build Coastguard Worker const IPAddress& ip_prefix,
283*6777b538SAndroid Build Coastguard Worker size_t prefix_length_in_bits);
284*6777b538SAndroid Build Coastguard Worker
285*6777b538SAndroid Build Coastguard Worker // Parses an IP block specifier from CIDR notation to an
286*6777b538SAndroid Build Coastguard Worker // (IP address, prefix length) pair. Returns true on success and fills
287*6777b538SAndroid Build Coastguard Worker // |*ip_address| with the numeric value of the IP address and sets
288*6777b538SAndroid Build Coastguard Worker // |*prefix_length_in_bits| with the length of the prefix. On failure,
289*6777b538SAndroid Build Coastguard Worker // |ip_address| will be cleared to an empty value.
290*6777b538SAndroid Build Coastguard Worker //
291*6777b538SAndroid Build Coastguard Worker // CIDR notation literals can use either IPv4 or IPv6 literals. Some examples:
292*6777b538SAndroid Build Coastguard Worker //
293*6777b538SAndroid Build Coastguard Worker // 10.10.3.1/20
294*6777b538SAndroid Build Coastguard Worker // a:b:c::/46
295*6777b538SAndroid Build Coastguard Worker // ::1/128
296*6777b538SAndroid Build Coastguard Worker NET_EXPORT bool ParseCIDRBlock(std::string_view cidr_literal,
297*6777b538SAndroid Build Coastguard Worker IPAddress* ip_address,
298*6777b538SAndroid Build Coastguard Worker size_t* prefix_length_in_bits);
299*6777b538SAndroid Build Coastguard Worker
300*6777b538SAndroid Build Coastguard Worker // Parses a URL-safe IP literal (see RFC 3986, Sec 3.2.2) to its numeric value.
301*6777b538SAndroid Build Coastguard Worker // Returns true on success, and fills |ip_address| with the numeric value.
302*6777b538SAndroid Build Coastguard Worker // In other words, |hostname| must be an IPv4 literal, or an IPv6 literal
303*6777b538SAndroid Build Coastguard Worker // surrounded by brackets as in [::1]. On failure |ip_address| may have been
304*6777b538SAndroid Build Coastguard Worker // overwritten and could contain an invalid IPAddress.
305*6777b538SAndroid Build Coastguard Worker [[nodiscard]] NET_EXPORT bool ParseURLHostnameToAddress(
306*6777b538SAndroid Build Coastguard Worker std::string_view hostname,
307*6777b538SAndroid Build Coastguard Worker IPAddress* ip_address);
308*6777b538SAndroid Build Coastguard Worker
309*6777b538SAndroid Build Coastguard Worker // Returns number of matching initial bits between the addresses |a1| and |a2|.
310*6777b538SAndroid Build Coastguard Worker NET_EXPORT size_t CommonPrefixLength(const IPAddress& a1, const IPAddress& a2);
311*6777b538SAndroid Build Coastguard Worker
312*6777b538SAndroid Build Coastguard Worker // Computes the number of leading 1-bits in |mask|.
313*6777b538SAndroid Build Coastguard Worker NET_EXPORT size_t MaskPrefixLength(const IPAddress& mask);
314*6777b538SAndroid Build Coastguard Worker
315*6777b538SAndroid Build Coastguard Worker // Checks whether |address| starts with |prefix|. This provides similar
316*6777b538SAndroid Build Coastguard Worker // functionality as IPAddressMatchesPrefix() but doesn't perform automatic IPv4
317*6777b538SAndroid Build Coastguard Worker // to IPv4MappedIPv6 conversions and only checks against full bytes.
318*6777b538SAndroid Build Coastguard Worker template <size_t N>
IPAddressStartsWith(const IPAddress & address,const uint8_t (& prefix)[N])319*6777b538SAndroid Build Coastguard Worker bool IPAddressStartsWith(const IPAddress& address, const uint8_t (&prefix)[N]) {
320*6777b538SAndroid Build Coastguard Worker if (address.size() < N)
321*6777b538SAndroid Build Coastguard Worker return false;
322*6777b538SAndroid Build Coastguard Worker return std::equal(prefix, prefix + N, address.bytes().begin());
323*6777b538SAndroid Build Coastguard Worker }
324*6777b538SAndroid Build Coastguard Worker
325*6777b538SAndroid Build Coastguard Worker // According to RFC6052 Section 2.2 IPv4-Embedded IPv6 Address Format.
326*6777b538SAndroid Build Coastguard Worker // https://www.rfc-editor.org/rfc/rfc6052#section-2.2
327*6777b538SAndroid Build Coastguard Worker // +--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
328*6777b538SAndroid Build Coastguard Worker // |PL| 0-------------32--40--48--56--64--72--80--88--96--104---------|
329*6777b538SAndroid Build Coastguard Worker // +--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
330*6777b538SAndroid Build Coastguard Worker // |32| prefix |v4(32) | u | suffix |
331*6777b538SAndroid Build Coastguard Worker // +--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
332*6777b538SAndroid Build Coastguard Worker // |40| prefix |v4(24) | u |(8)| suffix |
333*6777b538SAndroid Build Coastguard Worker // +--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
334*6777b538SAndroid Build Coastguard Worker // |48| prefix |v4(16) | u | (16) | suffix |
335*6777b538SAndroid Build Coastguard Worker // +--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
336*6777b538SAndroid Build Coastguard Worker // |56| prefix |(8)| u | v4(24) | suffix |
337*6777b538SAndroid Build Coastguard Worker // +--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
338*6777b538SAndroid Build Coastguard Worker // |64| prefix | u | v4(32) | suffix |
339*6777b538SAndroid Build Coastguard Worker // +--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
340*6777b538SAndroid Build Coastguard Worker // |96| prefix | v4(32) |
341*6777b538SAndroid Build Coastguard Worker // +--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
342*6777b538SAndroid Build Coastguard Worker //
343*6777b538SAndroid Build Coastguard Worker // The NAT64/DNS64 translation prefixes has one of the following lengths.
344*6777b538SAndroid Build Coastguard Worker enum class Dns64PrefixLength {
345*6777b538SAndroid Build Coastguard Worker k32bit,
346*6777b538SAndroid Build Coastguard Worker k40bit,
347*6777b538SAndroid Build Coastguard Worker k48bit,
348*6777b538SAndroid Build Coastguard Worker k56bit,
349*6777b538SAndroid Build Coastguard Worker k64bit,
350*6777b538SAndroid Build Coastguard Worker k96bit,
351*6777b538SAndroid Build Coastguard Worker kInvalid
352*6777b538SAndroid Build Coastguard Worker };
353*6777b538SAndroid Build Coastguard Worker
354*6777b538SAndroid Build Coastguard Worker // Extracts the NAT64 translation prefix from the IPv6 address using the well
355*6777b538SAndroid Build Coastguard Worker // known address ipv4only.arpa 192.0.0.170 and 192.0.0.171.
356*6777b538SAndroid Build Coastguard Worker // Returns prefix length on success, or Dns64PrefixLength::kInvalid on failure
357*6777b538SAndroid Build Coastguard Worker // (when the ipv4only.arpa IPv4 address is not found)
358*6777b538SAndroid Build Coastguard Worker NET_EXPORT Dns64PrefixLength
359*6777b538SAndroid Build Coastguard Worker ExtractPref64FromIpv4onlyArpaAAAA(const IPAddress& address);
360*6777b538SAndroid Build Coastguard Worker
361*6777b538SAndroid Build Coastguard Worker // Converts an IPv4 address to an IPv4-embedded IPv6 address using the given
362*6777b538SAndroid Build Coastguard Worker // prefix. For example 192.168.0.1 and 64:ff9b::/96 would be converted to
363*6777b538SAndroid Build Coastguard Worker // 64:ff9b::192.168.0.1
364*6777b538SAndroid Build Coastguard Worker // Returns converted IPv6 address when prefix_length is not
365*6777b538SAndroid Build Coastguard Worker // Dns64PrefixLength::kInvalid, and returns the original IPv4 address when
366*6777b538SAndroid Build Coastguard Worker // prefix_length is Dns64PrefixLength::kInvalid.
367*6777b538SAndroid Build Coastguard Worker NET_EXPORT IPAddress
368*6777b538SAndroid Build Coastguard Worker ConvertIPv4ToIPv4EmbeddedIPv6(const IPAddress& ipv4_address,
369*6777b538SAndroid Build Coastguard Worker const IPAddress& ipv6_address,
370*6777b538SAndroid Build Coastguard Worker Dns64PrefixLength prefix_length);
371*6777b538SAndroid Build Coastguard Worker
372*6777b538SAndroid Build Coastguard Worker } // namespace net
373*6777b538SAndroid Build Coastguard Worker
374*6777b538SAndroid Build Coastguard Worker #endif // NET_BASE_IP_ADDRESS_H_
375