1 // Copyright (c) 2011 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_NET_UTIL_H_
6 #define NET_BASE_NET_UTIL_H_
7 #pragma once
8 
9 #if defined(OS_WIN)
10 #include <windows.h>
11 #include <ws2tcpip.h>
12 #elif defined(OS_POSIX)
13 #include <sys/socket.h>
14 #endif
15 
16 #include <list>
17 #include <string>
18 #include <set>
19 #include <vector>
20 
21 #include <cstdint>
22 
23 namespace net {
24 
25 // IPAddressNumber is used to represent an IP address's numeric value as an
26 // array of bytes, from most significant to least significant. This is the
27 // network byte ordering.
28 //
29 // IPv4 addresses will have length 4, whereas IPv6 address will have length 16.
30 typedef std::vector<unsigned char> IPAddressNumber;
31 typedef std::vector<IPAddressNumber> IPAddressList;
32 
33 // Parses an IP address literal (either IPv4 or IPv6) to its numeric value.
34 // Returns true on success and fills |ip_number| with the numeric value.
35 bool ParseIPLiteralToNumber(const std::string& ip_literal,
36                             IPAddressNumber* ip_number);
37 
38 // Parses an IP block specifier from CIDR notation to an
39 // (IP address, prefix length) pair. Returns true on success and fills
40 // |*ip_number| with the numeric value of the IP address and sets
41 // |*prefix_length_in_bits| with the length of the prefix.
42 //
43 // CIDR notation literals can use either IPv4 or IPv6 literals. Some examples:
44 //
45 //    10.10.3.1/20
46 //    a:b:c::/46
47 //    ::1/128
48 bool ParseCIDRBlock(const std::string& cidr_literal,
49                     IPAddressNumber* ip_number,
50                     size_t* prefix_length_in_bits);
51 
52 // Compares an IP address to see if it falls within the specified IP block.
53 // Returns true if it does, false otherwise.
54 //
55 // The IP block is given by (|ip_prefix|, |prefix_length_in_bits|) -- any
56 // IP address whose |prefix_length_in_bits| most significant bits match
57 // |ip_prefix| will be matched.
58 //
59 // In cases when an IPv4 address is being compared to an IPv6 address prefix
60 // and vice versa, the IPv4 addresses will be converted to IPv4-mapped
61 // (IPv6) addresses.
62 bool IPNumberMatchesPrefix(const IPAddressNumber& ip_number,
63                            const IPAddressNumber& ip_prefix,
64                            size_t prefix_length_in_bits);
65 
66 }  // namespace net
67 
68 #endif  // NET_BASE_NET_UTIL_H_
69