// 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_