Home | History | Annotate | Download | only in src
      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