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