OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/base/ip_endpoint.h" | 5 #include "net/base/ip_endpoint.h" |
6 | 6 |
7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
8 | 8 |
9 #if defined(OS_WIN) | 9 #if defined(OS_WIN) |
10 #include <winsock2.h> | 10 #include <winsock2.h> |
(...skipping 26 matching lines...) Expand all Loading... |
37 socklen_t sock_addr_len, | 37 socklen_t sock_addr_len, |
38 const uint8_t** address, | 38 const uint8_t** address, |
39 size_t* address_len, | 39 size_t* address_len, |
40 uint16_t* port) { | 40 uint16_t* port) { |
41 if (sock_addr->sa_family == AF_INET) { | 41 if (sock_addr->sa_family == AF_INET) { |
42 if (sock_addr_len < static_cast<socklen_t>(sizeof(struct sockaddr_in))) | 42 if (sock_addr_len < static_cast<socklen_t>(sizeof(struct sockaddr_in))) |
43 return false; | 43 return false; |
44 const struct sockaddr_in* addr = | 44 const struct sockaddr_in* addr = |
45 reinterpret_cast<const struct sockaddr_in*>(sock_addr); | 45 reinterpret_cast<const struct sockaddr_in*>(sock_addr); |
46 *address = reinterpret_cast<const uint8_t*>(&addr->sin_addr); | 46 *address = reinterpret_cast<const uint8_t*>(&addr->sin_addr); |
47 *address_len = kIPv4AddressSize; | 47 *address_len = IPAddress::kIPv4AddressSize; |
48 if (port) | 48 if (port) |
49 *port = base::NetToHost16(addr->sin_port); | 49 *port = base::NetToHost16(addr->sin_port); |
50 return true; | 50 return true; |
51 } | 51 } |
52 | 52 |
53 if (sock_addr->sa_family == AF_INET6) { | 53 if (sock_addr->sa_family == AF_INET6) { |
54 if (sock_addr_len < static_cast<socklen_t>(sizeof(struct sockaddr_in6))) | 54 if (sock_addr_len < static_cast<socklen_t>(sizeof(struct sockaddr_in6))) |
55 return false; | 55 return false; |
56 const struct sockaddr_in6* addr = | 56 const struct sockaddr_in6* addr = |
57 reinterpret_cast<const struct sockaddr_in6*>(sock_addr); | 57 reinterpret_cast<const struct sockaddr_in6*>(sock_addr); |
58 *address = reinterpret_cast<const uint8_t*>(&addr->sin6_addr); | 58 *address = reinterpret_cast<const uint8_t*>(&addr->sin6_addr); |
59 *address_len = kIPv6AddressSize; | 59 *address_len = IPAddress::kIPv6AddressSize; |
60 if (port) | 60 if (port) |
61 *port = base::NetToHost16(addr->sin6_port); | 61 *port = base::NetToHost16(addr->sin6_port); |
62 return true; | 62 return true; |
63 } | 63 } |
64 | 64 |
65 #if defined(OS_WIN) | 65 #if defined(OS_WIN) |
66 if (sock_addr->sa_family == AF_BTH) { | 66 if (sock_addr->sa_family == AF_BTH) { |
67 if (sock_addr_len < static_cast<socklen_t>(sizeof(SOCKADDR_BTH))) | 67 if (sock_addr_len < static_cast<socklen_t>(sizeof(SOCKADDR_BTH))) |
68 return false; | 68 return false; |
69 const SOCKADDR_BTH* addr = reinterpret_cast<const SOCKADDR_BTH*>(sock_addr); | 69 const SOCKADDR_BTH* addr = reinterpret_cast<const SOCKADDR_BTH*>(sock_addr); |
70 *address = reinterpret_cast<const uint8_t*>(&addr->btAddr); | 70 *address = reinterpret_cast<const uint8_t*>(&addr->btAddr); |
71 *address_len = kBluetoothAddressSize; | 71 *address_len = kBluetoothAddressSize; |
72 if (port) | 72 if (port) |
73 *port = static_cast<uint16_t>(addr->port); | 73 *port = static_cast<uint16_t>(addr->port); |
74 return true; | 74 return true; |
75 } | 75 } |
76 #endif | 76 #endif |
77 | 77 |
78 return false; // Unrecognized |sa_family|. | 78 return false; // Unrecognized |sa_family|. |
79 } | 79 } |
80 | 80 |
81 } // namespace | 81 } // namespace |
82 | 82 |
83 IPEndPoint::IPEndPoint() : port_(0) {} | 83 IPEndPoint::IPEndPoint() : port_(0) {} |
84 | 84 |
85 IPEndPoint::~IPEndPoint() {} | 85 IPEndPoint::~IPEndPoint() {} |
86 | 86 |
87 IPEndPoint::IPEndPoint(const IPAddressNumber& address, uint16_t port) | |
88 : address_(address), port_(port) { | |
89 } | |
90 | |
91 IPEndPoint::IPEndPoint(const IPAddress& address, uint16_t port) | 87 IPEndPoint::IPEndPoint(const IPAddress& address, uint16_t port) |
92 : address_(address), port_(port) {} | 88 : address_(address), port_(port) {} |
93 | 89 |
94 IPEndPoint::IPEndPoint(const IPEndPoint& endpoint) { | 90 IPEndPoint::IPEndPoint(const IPEndPoint& endpoint) { |
95 address_ = endpoint.address_; | 91 address_ = endpoint.address_; |
96 port_ = endpoint.port_; | 92 port_ = endpoint.port_; |
97 } | 93 } |
98 | 94 |
99 AddressFamily IPEndPoint::GetFamily() const { | 95 AddressFamily IPEndPoint::GetFamily() const { |
100 return GetAddressFamily(address_); | 96 return GetAddressFamily(address_); |
101 } | 97 } |
102 | 98 |
103 int IPEndPoint::GetSockAddrFamily() const { | 99 int IPEndPoint::GetSockAddrFamily() const { |
104 switch (address_.size()) { | 100 switch (address_.size()) { |
105 case kIPv4AddressSize: | 101 case IPAddress::kIPv4AddressSize: |
106 return AF_INET; | 102 return AF_INET; |
107 case kIPv6AddressSize: | 103 case IPAddress::kIPv6AddressSize: |
108 return AF_INET6; | 104 return AF_INET6; |
109 default: | 105 default: |
110 NOTREACHED() << "Bad IP address"; | 106 NOTREACHED() << "Bad IP address"; |
111 return AF_UNSPEC; | 107 return AF_UNSPEC; |
112 } | 108 } |
113 } | 109 } |
114 | 110 |
115 bool IPEndPoint::ToSockAddr(struct sockaddr* address, | 111 bool IPEndPoint::ToSockAddr(struct sockaddr* address, |
116 socklen_t* address_length) const { | 112 socklen_t* address_length) const { |
117 DCHECK(address); | 113 DCHECK(address); |
118 DCHECK(address_length); | 114 DCHECK(address_length); |
119 switch (address_.size()) { | 115 switch (address_.size()) { |
120 case kIPv4AddressSize: { | 116 case IPAddress::kIPv4AddressSize: { |
121 if (*address_length < kSockaddrInSize) | 117 if (*address_length < kSockaddrInSize) |
122 return false; | 118 return false; |
123 *address_length = kSockaddrInSize; | 119 *address_length = kSockaddrInSize; |
124 struct sockaddr_in* addr = reinterpret_cast<struct sockaddr_in*>(address); | 120 struct sockaddr_in* addr = reinterpret_cast<struct sockaddr_in*>(address); |
125 memset(addr, 0, sizeof(struct sockaddr_in)); | 121 memset(addr, 0, sizeof(struct sockaddr_in)); |
126 addr->sin_family = AF_INET; | 122 addr->sin_family = AF_INET; |
127 addr->sin_port = base::HostToNet16(port_); | 123 addr->sin_port = base::HostToNet16(port_); |
128 memcpy(&addr->sin_addr, &address_.bytes()[0], kIPv4AddressSize); | 124 memcpy(&addr->sin_addr, address_.bytes().data(), |
| 125 IPAddress::kIPv4AddressSize); |
129 break; | 126 break; |
130 } | 127 } |
131 case kIPv6AddressSize: { | 128 case IPAddress::kIPv6AddressSize: { |
132 if (*address_length < kSockaddrIn6Size) | 129 if (*address_length < kSockaddrIn6Size) |
133 return false; | 130 return false; |
134 *address_length = kSockaddrIn6Size; | 131 *address_length = kSockaddrIn6Size; |
135 struct sockaddr_in6* addr6 = | 132 struct sockaddr_in6* addr6 = |
136 reinterpret_cast<struct sockaddr_in6*>(address); | 133 reinterpret_cast<struct sockaddr_in6*>(address); |
137 memset(addr6, 0, sizeof(struct sockaddr_in6)); | 134 memset(addr6, 0, sizeof(struct sockaddr_in6)); |
138 addr6->sin6_family = AF_INET6; | 135 addr6->sin6_family = AF_INET6; |
139 addr6->sin6_port = base::HostToNet16(port_); | 136 addr6->sin6_port = base::HostToNet16(port_); |
140 memcpy(&addr6->sin6_addr, &address_.bytes()[0], kIPv6AddressSize); | 137 memcpy(&addr6->sin6_addr, address_.bytes().data(), |
| 138 IPAddress::kIPv6AddressSize); |
141 break; | 139 break; |
142 } | 140 } |
143 default: | 141 default: |
144 return false; | 142 return false; |
145 } | 143 } |
146 return true; | 144 return true; |
147 } | 145 } |
148 | 146 |
149 bool IPEndPoint::FromSockAddr(const struct sockaddr* sock_addr, | 147 bool IPEndPoint::FromSockAddr(const struct sockaddr* sock_addr, |
150 socklen_t sock_addr_len) { | 148 socklen_t sock_addr_len) { |
(...skipping 26 matching lines...) Expand all Loading... |
177 return address_.size() < other.address_.size(); | 175 return address_.size() < other.address_.size(); |
178 } | 176 } |
179 return std::tie(address_, port_) < std::tie(other.address_, other.port_); | 177 return std::tie(address_, port_) < std::tie(other.address_, other.port_); |
180 } | 178 } |
181 | 179 |
182 bool IPEndPoint::operator==(const IPEndPoint& other) const { | 180 bool IPEndPoint::operator==(const IPEndPoint& other) const { |
183 return address_ == other.address_ && port_ == other.port_; | 181 return address_ == other.address_ && port_ == other.port_; |
184 } | 182 } |
185 | 183 |
186 } // namespace net | 184 } // namespace net |
OLD | NEW |