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