| OLD | NEW | 
|    1 /* |    1 /* | 
|    2  *  Copyright 2011 The WebRTC Project Authors. All rights reserved. |    2  *  Copyright 2011 The WebRTC Project Authors. All rights reserved. | 
|    3  * |    3  * | 
|    4  *  Use of this source code is governed by a BSD-style license |    4  *  Use of this source code is governed by a BSD-style license | 
|    5  *  that can be found in the LICENSE file in the root of the source |    5  *  that can be found in the LICENSE file in the root of the source | 
|    6  *  tree. An additional intellectual property rights grant can be found |    6  *  tree. An additional intellectual property rights grant can be found | 
|    7  *  in the file PATENTS.  All contributing project authors may |    7  *  in the file PATENTS.  All contributing project authors may | 
|    8  *  be found in the AUTHORS file in the root of the source tree. |    8  *  be found in the AUTHORS file in the root of the source tree. | 
|    9  */ |    9  */ | 
|   10  |   10  | 
|   11 #ifndef WEBRTC_BASE_IPADDRESS_H_ |   11 #ifndef WEBRTC_BASE_IPADDRESS_H_ | 
|   12 #define WEBRTC_BASE_IPADDRESS_H_ |   12 #define WEBRTC_BASE_IPADDRESS_H_ | 
|   13  |   13  | 
|   14 #if defined(WEBRTC_POSIX) |  | 
|   15 #include <netinet/in.h> |  | 
|   16 #include <sys/socket.h> |  | 
|   17 #include <arpa/inet.h> |  | 
|   18 #include <netdb.h> |  | 
|   19 #endif |  | 
|   20 #if defined(WEBRTC_WIN) |  | 
|   21 #include <winsock2.h> |  | 
|   22 #include <ws2tcpip.h> |  | 
|   23 #endif |  | 
|   24 #include <string.h> |  | 
|   25 #include <string> |  | 
|   26 #include <vector> |  | 
|   27  |   14  | 
|   28 #include "webrtc/base/basictypes.h" |   15 // This header is deprecated and is just left here temporarily during | 
|   29 #include "webrtc/base/byteorder.h" |   16 // refactoring. See https://bugs.webrtc.org/7634 for more details. | 
|   30 #if defined(WEBRTC_WIN) |   17 #include "webrtc/rtc_base/ipaddress.h" | 
|   31 #include "webrtc/base/win32.h" |  | 
|   32 #endif |  | 
|   33  |  | 
|   34 namespace rtc { |  | 
|   35  |  | 
|   36 enum IPv6AddressFlag { |  | 
|   37   IPV6_ADDRESS_FLAG_NONE =           0x00, |  | 
|   38  |  | 
|   39   // Temporary address is dynamic by nature and will not carry MAC |  | 
|   40   // address. |  | 
|   41   IPV6_ADDRESS_FLAG_TEMPORARY =      1 << 0, |  | 
|   42  |  | 
|   43   // Temporary address could become deprecated once the preferred |  | 
|   44   // lifetime is reached. It is still valid but just shouldn't be used |  | 
|   45   // to create new connection. |  | 
|   46   IPV6_ADDRESS_FLAG_DEPRECATED =     1 << 1, |  | 
|   47 }; |  | 
|   48  |  | 
|   49 // Version-agnostic IP address class, wraps a union of in_addr and in6_addr. |  | 
|   50 class IPAddress { |  | 
|   51  public: |  | 
|   52   IPAddress() : family_(AF_UNSPEC) { |  | 
|   53     ::memset(&u_, 0, sizeof(u_)); |  | 
|   54   } |  | 
|   55  |  | 
|   56   explicit IPAddress(const in_addr& ip4) : family_(AF_INET) { |  | 
|   57     memset(&u_, 0, sizeof(u_)); |  | 
|   58     u_.ip4 = ip4; |  | 
|   59   } |  | 
|   60  |  | 
|   61   explicit IPAddress(const in6_addr& ip6) : family_(AF_INET6) { |  | 
|   62     u_.ip6 = ip6; |  | 
|   63   } |  | 
|   64  |  | 
|   65   explicit IPAddress(uint32_t ip_in_host_byte_order) : family_(AF_INET) { |  | 
|   66     memset(&u_, 0, sizeof(u_)); |  | 
|   67     u_.ip4.s_addr = HostToNetwork32(ip_in_host_byte_order); |  | 
|   68   } |  | 
|   69  |  | 
|   70   IPAddress(const IPAddress& other) : family_(other.family_) { |  | 
|   71     ::memcpy(&u_, &other.u_, sizeof(u_)); |  | 
|   72   } |  | 
|   73  |  | 
|   74   virtual ~IPAddress() {} |  | 
|   75  |  | 
|   76   const IPAddress & operator=(const IPAddress& other) { |  | 
|   77     family_ = other.family_; |  | 
|   78     ::memcpy(&u_, &other.u_, sizeof(u_)); |  | 
|   79     return *this; |  | 
|   80   } |  | 
|   81  |  | 
|   82   bool operator==(const IPAddress& other) const; |  | 
|   83   bool operator!=(const IPAddress& other) const; |  | 
|   84   bool operator <(const IPAddress& other) const; |  | 
|   85   bool operator >(const IPAddress& other) const; |  | 
|   86   friend std::ostream& operator<<(std::ostream& os, const IPAddress& addr); |  | 
|   87  |  | 
|   88   int family() const { return family_; } |  | 
|   89   in_addr ipv4_address() const; |  | 
|   90   in6_addr ipv6_address() const; |  | 
|   91  |  | 
|   92   // Returns the number of bytes needed to store the raw address. |  | 
|   93   size_t Size() const; |  | 
|   94  |  | 
|   95   // Wraps inet_ntop. |  | 
|   96   std::string ToString() const; |  | 
|   97  |  | 
|   98   // Same as ToString but anonymizes it by hiding the last part. |  | 
|   99   std::string ToSensitiveString() const; |  | 
|  100  |  | 
|  101   // Returns an unmapped address from a possibly-mapped address. |  | 
|  102   // Returns the same address if this isn't a mapped address. |  | 
|  103   IPAddress Normalized() const; |  | 
|  104  |  | 
|  105   // Returns this address as an IPv6 address. |  | 
|  106   // Maps v4 addresses (as ::ffff:a.b.c.d), returns v6 addresses unchanged. |  | 
|  107   IPAddress AsIPv6Address() const; |  | 
|  108  |  | 
|  109   // For socketaddress' benefit. Returns the IP in host byte order. |  | 
|  110   uint32_t v4AddressAsHostOrderInteger() const; |  | 
|  111  |  | 
|  112   // Whether this is an unspecified IP address. |  | 
|  113   bool IsNil() const; |  | 
|  114  |  | 
|  115  private: |  | 
|  116   int family_; |  | 
|  117   union { |  | 
|  118     in_addr ip4; |  | 
|  119     in6_addr ip6; |  | 
|  120   } u_; |  | 
|  121 }; |  | 
|  122  |  | 
|  123 // IP class which could represent IPv6 address flags which is only |  | 
|  124 // meaningful in IPv6 case. |  | 
|  125 class InterfaceAddress : public IPAddress { |  | 
|  126  public: |  | 
|  127   InterfaceAddress() : ipv6_flags_(IPV6_ADDRESS_FLAG_NONE) {} |  | 
|  128  |  | 
|  129   InterfaceAddress(IPAddress ip) |  | 
|  130     : IPAddress(ip), ipv6_flags_(IPV6_ADDRESS_FLAG_NONE) {} |  | 
|  131  |  | 
|  132   InterfaceAddress(IPAddress addr, int ipv6_flags) |  | 
|  133     : IPAddress(addr), ipv6_flags_(ipv6_flags) {} |  | 
|  134  |  | 
|  135   InterfaceAddress(const in6_addr& ip6, int ipv6_flags) |  | 
|  136     : IPAddress(ip6), ipv6_flags_(ipv6_flags) {} |  | 
|  137  |  | 
|  138   const InterfaceAddress & operator=(const InterfaceAddress& other); |  | 
|  139  |  | 
|  140   bool operator==(const InterfaceAddress& other) const; |  | 
|  141   bool operator!=(const InterfaceAddress& other) const; |  | 
|  142  |  | 
|  143   int ipv6_flags() const { return ipv6_flags_; } |  | 
|  144   friend std::ostream& operator<<(std::ostream& os, |  | 
|  145                                   const InterfaceAddress& addr); |  | 
|  146  |  | 
|  147  private: |  | 
|  148   int ipv6_flags_; |  | 
|  149 }; |  | 
|  150  |  | 
|  151 bool IPFromAddrInfo(struct addrinfo* info, IPAddress* out); |  | 
|  152 bool IPFromString(const std::string& str, IPAddress* out); |  | 
|  153 bool IPFromString(const std::string& str, int flags, |  | 
|  154                   InterfaceAddress* out); |  | 
|  155 bool IPIsAny(const IPAddress& ip); |  | 
|  156 bool IPIsLoopback(const IPAddress& ip); |  | 
|  157 bool IPIsPrivate(const IPAddress& ip); |  | 
|  158 bool IPIsUnspec(const IPAddress& ip); |  | 
|  159 size_t HashIP(const IPAddress& ip); |  | 
|  160  |  | 
|  161 // These are only really applicable for IPv6 addresses. |  | 
|  162 bool IPIs6Bone(const IPAddress& ip); |  | 
|  163 bool IPIs6To4(const IPAddress& ip); |  | 
|  164 bool IPIsLinkLocal(const IPAddress& ip); |  | 
|  165 bool IPIsMacBased(const IPAddress& ip); |  | 
|  166 bool IPIsSiteLocal(const IPAddress& ip); |  | 
|  167 bool IPIsTeredo(const IPAddress& ip); |  | 
|  168 bool IPIsULA(const IPAddress& ip); |  | 
|  169 bool IPIsV4Compatibility(const IPAddress& ip); |  | 
|  170 bool IPIsV4Mapped(const IPAddress& ip); |  | 
|  171  |  | 
|  172 // Returns the precedence value for this IP as given in RFC3484. |  | 
|  173 int IPAddressPrecedence(const IPAddress& ip); |  | 
|  174  |  | 
|  175 // Returns 'ip' truncated to be 'length' bits long. |  | 
|  176 IPAddress TruncateIP(const IPAddress& ip, int length); |  | 
|  177  |  | 
|  178 IPAddress GetLoopbackIP(int family); |  | 
|  179 IPAddress GetAnyIP(int family); |  | 
|  180  |  | 
|  181 // Returns the number of contiguously set bits, counting from the MSB in network |  | 
|  182 // byte order, in this IPAddress. Bits after the first 0 encountered are not |  | 
|  183 // counted. |  | 
|  184 int CountIPMaskBits(IPAddress mask); |  | 
|  185  |  | 
|  186 }  // namespace rtc |  | 
|  187  |   18  | 
|  188 #endif  // WEBRTC_BASE_IPADDRESS_H_ |   19 #endif  // WEBRTC_BASE_IPADDRESS_H_ | 
| OLD | NEW |