| // Copyright (c) 2011 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_NET_UTIL_H_ |
| #define NET_BASE_NET_UTIL_H_ |
| #pragma once |
| |
| #if defined(OS_WIN) |
| #include <windows.h> |
| #include <ws2tcpip.h> |
| #elif defined(OS_POSIX) |
| #include <sys/socket.h> |
| #endif |
| |
| #include <list> |
| #include <string> |
| #include <set> |
| #include <vector> |
| |
| #include <cstdint> |
| |
| namespace net { |
| |
| // IPAddressNumber is used to represent an IP address's numeric value as an |
| // array of bytes, from most significant to least significant. This is the |
| // network byte ordering. |
| // |
| // IPv4 addresses will have length 4, whereas IPv6 address will have length 16. |
| typedef std::vector<unsigned char> IPAddressNumber; |
| typedef std::vector<IPAddressNumber> IPAddressList; |
| |
| // Parses an IP address literal (either IPv4 or IPv6) to its numeric value. |
| // Returns true on success and fills |ip_number| with the numeric value. |
| bool ParseIPLiteralToNumber(const std::string& ip_literal, |
| IPAddressNumber* ip_number); |
| |
| // Parses an IP block specifier from CIDR notation to an |
| // (IP address, prefix length) pair. Returns true on success and fills |
| // |*ip_number| 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 |
| bool ParseCIDRBlock(const std::string& cidr_literal, |
| IPAddressNumber* ip_number, |
| size_t* prefix_length_in_bits); |
| |
| // 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 IPNumberMatchesPrefix(const IPAddressNumber& ip_number, |
| const IPAddressNumber& ip_prefix, |
| size_t prefix_length_in_bits); |
| |
| } // namespace net |
| |
| #endif // NET_BASE_NET_UTIL_H_ |