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 "ppapi/shared_impl/private/net_address_private_impl.h" | 5 #include "ppapi/shared_impl/private/net_address_private_impl.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 return PP_NETADDRESSFAMILY_IPV6; | 63 return PP_NETADDRESSFAMILY_IPV6; |
64 default: | 64 default: |
65 return PP_NETADDRESSFAMILY_UNSPECIFIED; | 65 return PP_NETADDRESSFAMILY_UNSPECIFIED; |
66 } | 66 } |
67 } | 67 } |
68 | 68 |
69 uint16_t GetPort(const PP_NetAddress_Private* addr) { | 69 uint16_t GetPort(const PP_NetAddress_Private* addr) { |
70 switch (GetFamilyInternal(addr)) { | 70 switch (GetFamilyInternal(addr)) { |
71 case AF_INET: { | 71 case AF_INET: { |
72 const sockaddr_in* a = reinterpret_cast<const sockaddr_in*>(addr->data); | 72 const sockaddr_in* a = reinterpret_cast<const sockaddr_in*>(addr->data); |
73 return ntohs(a->sin_port); | 73 return base::NetToHost16(a->sin_port); |
74 } | 74 } |
75 case AF_INET6: { | 75 case AF_INET6: { |
76 const sockaddr_in6* a = reinterpret_cast<const sockaddr_in6*>(addr->data); | 76 const sockaddr_in6* a = reinterpret_cast<const sockaddr_in6*>(addr->data); |
77 return ntohs(a->sin6_port); | 77 return base::NetToHost16(a->sin6_port); |
78 } | 78 } |
79 default: | 79 default: |
80 return 0; | 80 return 0; |
81 } | 81 } |
82 } | 82 } |
83 | 83 |
84 PP_Bool GetAddress(const PP_NetAddress_Private* addr, | 84 PP_Bool GetAddress(const PP_NetAddress_Private* addr, |
85 void* address, | 85 void* address, |
86 uint16_t address_size) { | 86 uint16_t address_size) { |
87 switch (GetFamilyInternal(addr)) { | 87 switch (GetFamilyInternal(addr)) { |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 return PP_FromBool(a1->sin6_port == a2->sin6_port); | 161 return PP_FromBool(a1->sin6_port == a2->sin6_port); |
162 } | 162 } |
163 default: | 163 default: |
164 return PP_FALSE; | 164 return PP_FALSE; |
165 } | 165 } |
166 } | 166 } |
167 | 167 |
168 #if defined(OS_WIN) || defined(OS_MACOSX) | 168 #if defined(OS_WIN) || defined(OS_MACOSX) |
169 std::string ConvertIPv4AddressToString(const sockaddr_in* a, | 169 std::string ConvertIPv4AddressToString(const sockaddr_in* a, |
170 bool include_port) { | 170 bool include_port) { |
171 unsigned ip = ntohl(a->sin_addr.s_addr); | 171 unsigned ip = base::NetToHost32(a->sin_addr.s_addr); |
172 unsigned port = ntohs(a->sin_port); | 172 unsigned port = base::NetToHost16(a->sin_port); |
173 std::string description = base::StringPrintf( | 173 std::string description = base::StringPrintf( |
174 "%u.%u.%u.%u", | 174 "%u.%u.%u.%u", |
175 (ip >> 24) & 0xff, (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff); | 175 (ip >> 24) & 0xff, (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff); |
176 if (include_port) | 176 if (include_port) |
177 base::StringAppendF(&description, ":%u", port); | 177 base::StringAppendF(&description, ":%u", port); |
178 return description; | 178 return description; |
179 } | 179 } |
180 | 180 |
181 // Format an IPv6 address for human consumption, basically according to RFC | 181 // Format an IPv6 address for human consumption, basically according to RFC |
182 // 5952. | 182 // 5952. |
183 // - If the scope is nonzero, it is appended to the address as "%<scope>" (this | 183 // - If the scope is nonzero, it is appended to the address as "%<scope>" (this |
184 // is not in RFC 5952, but consistent with |getnameinfo()| on Linux and | 184 // is not in RFC 5952, but consistent with |getnameinfo()| on Linux and |
185 // Windows). | 185 // Windows). |
186 // - If |include_port| is true, the address (possibly including the scope) is | 186 // - If |include_port| is true, the address (possibly including the scope) is |
187 // enclosed in square brackets and ":<port>" is appended, i.e., the overall | 187 // enclosed in square brackets and ":<port>" is appended, i.e., the overall |
188 // format is "[<address>]:<port>". | 188 // format is "[<address>]:<port>". |
189 // - If the address is an IPv4 address embedded IPv6 (per RFC 4291), then the | 189 // - If the address is an IPv4 address embedded IPv6 (per RFC 4291), then the |
190 // mixed format is used, e.g., "::ffff:192.168.1.2". This is optional per RFC | 190 // mixed format is used, e.g., "::ffff:192.168.1.2". This is optional per RFC |
191 // 5952, but consistent with |getnameinfo()|. | 191 // 5952, but consistent with |getnameinfo()|. |
192 std::string ConvertIPv6AddressToString(const sockaddr_in6* a, | 192 std::string ConvertIPv6AddressToString(const sockaddr_in6* a, |
193 bool include_port) { | 193 bool include_port) { |
194 unsigned port = ntohs(a->sin6_port); | 194 unsigned port = base::NetToHost16(a->sin6_port); |
195 unsigned scope = a->sin6_scope_id; | 195 unsigned scope = a->sin6_scope_id; |
196 std::string description(include_port ? "[" : ""); | 196 std::string description(include_port ? "[" : ""); |
197 | 197 |
198 // IPv4 address embedded in IPv6. | 198 // IPv4 address embedded in IPv6. |
199 if (a->sin6_addr.s6_addr16[0] == 0 && a->sin6_addr.s6_addr16[1] == 0 && | 199 if (a->sin6_addr.s6_addr16[0] == 0 && a->sin6_addr.s6_addr16[1] == 0 && |
200 a->sin6_addr.s6_addr16[2] == 0 && a->sin6_addr.s6_addr16[3] == 0 && | 200 a->sin6_addr.s6_addr16[2] == 0 && a->sin6_addr.s6_addr16[3] == 0 && |
201 a->sin6_addr.s6_addr16[4] == 0 && | 201 a->sin6_addr.s6_addr16[4] == 0 && |
202 (a->sin6_addr.s6_addr16[5] == 0 || a->sin6_addr.s6_addr16[5] == 0xffff)) { | 202 (a->sin6_addr.s6_addr16[5] == 0 || a->sin6_addr.s6_addr16[5] == 0xffff)) { |
203 base::StringAppendF( | 203 base::StringAppendF( |
204 &description, | 204 &description, |
205 a->sin6_addr.s6_addr16[5] == 0 ? "::%u.%u.%u.%u" : "::ffff:%u.%u.%u.%u", | 205 a->sin6_addr.s6_addr16[5] == 0 ? "::%u.%u.%u.%u" : "::ffff:%u.%u.%u.%u", |
206 static_cast<unsigned>(a->sin6_addr.s6_addr[12]), | 206 static_cast<unsigned>(a->sin6_addr.s6_addr[12]), |
207 static_cast<unsigned>(a->sin6_addr.s6_addr[13]), | 207 static_cast<unsigned>(a->sin6_addr.s6_addr[13]), |
208 static_cast<unsigned>(a->sin6_addr.s6_addr[14]), | 208 static_cast<unsigned>(a->sin6_addr.s6_addr[14]), |
209 static_cast<unsigned>(a->sin6_addr.s6_addr[15])); | 209 static_cast<unsigned>(a->sin6_addr.s6_addr[15])); |
210 | 210 |
211 // "Real" IPv6 addresses. | 211 // "Real" IPv6 addresses. |
212 } else { | 212 } else { |
213 // Find the first longest run of 0s (of length > 1), to collapse to "::". | 213 // Find the first longest run of 0s (of length > 1), to collapse to "::". |
214 int longest_start = 0; | 214 int longest_start = 0; |
215 int longest_length = 0; | 215 int longest_length = 0; |
216 int curr_start = 0; | 216 int curr_start = 0; |
217 int curr_length = 0; | 217 int curr_length = 0; |
218 for (int i = 0; i < 8; i++) { | 218 for (int i = 0; i < 8; i++) { |
219 if (ntohs(a->sin6_addr.s6_addr16[i]) != 0) { | 219 if (base::NetToHost16(a->sin6_addr.s6_addr16[i]) != 0) { |
220 curr_length = 0; | 220 curr_length = 0; |
221 } else { | 221 } else { |
222 if (!curr_length) | 222 if (!curr_length) |
223 curr_start = i; | 223 curr_start = i; |
224 curr_length++; | 224 curr_length++; |
225 if (curr_length > longest_length) { | 225 if (curr_length > longest_length) { |
226 longest_start = curr_start; | 226 longest_start = curr_start; |
227 longest_length = curr_length; | 227 longest_length = curr_length; |
228 } | 228 } |
229 } | 229 } |
230 } | 230 } |
231 | 231 |
232 bool need_sep = false; // Whether the next item needs a ':' to separate. | 232 bool need_sep = false; // Whether the next item needs a ':' to separate. |
233 for (int i = 0; i < 8;) { | 233 for (int i = 0; i < 8;) { |
234 if (longest_length > 1 && i == longest_start) { | 234 if (longest_length > 1 && i == longest_start) { |
235 description.append("::"); | 235 description.append("::"); |
236 need_sep = false; | 236 need_sep = false; |
237 i += longest_length; | 237 i += longest_length; |
238 } else { | 238 } else { |
239 unsigned v = ntohs(a->sin6_addr.s6_addr16[i]); | 239 unsigned v = base::NetToHost16(a->sin6_addr.s6_addr16[i]); |
240 base::StringAppendF(&description, need_sep ? ":%x" : "%x", v); | 240 base::StringAppendF(&description, need_sep ? ":%x" : "%x", v); |
241 need_sep = true; | 241 need_sep = true; |
242 i++; | 242 i++; |
243 } | 243 } |
244 } | 244 } |
245 } | 245 } |
246 | 246 |
247 // Nonzero scopes, e.g., 123, are indicated by appending, e.g., "%123". | 247 // Nonzero scopes, e.g., 123, are indicated by appending, e.g., "%123". |
248 if (scope != 0) | 248 if (scope != 0) |
249 base::StringAppendF(&description, "%%%u", scope); | 249 base::StringAppendF(&description, "%%%u", scope); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
295 | 295 |
296 PP_Bool ReplacePort(const struct PP_NetAddress_Private* src_addr, | 296 PP_Bool ReplacePort(const struct PP_NetAddress_Private* src_addr, |
297 uint16_t port, | 297 uint16_t port, |
298 struct PP_NetAddress_Private* dest_addr) { | 298 struct PP_NetAddress_Private* dest_addr) { |
299 if (!NetAddressPrivateImpl::ValidateNetAddress(*src_addr)) | 299 if (!NetAddressPrivateImpl::ValidateNetAddress(*src_addr)) |
300 return PP_FALSE; | 300 return PP_FALSE; |
301 | 301 |
302 switch (GetFamilyInternal(src_addr)) { | 302 switch (GetFamilyInternal(src_addr)) { |
303 case AF_INET: { | 303 case AF_INET: { |
304 memmove(dest_addr, src_addr, sizeof(*src_addr)); | 304 memmove(dest_addr, src_addr, sizeof(*src_addr)); |
305 reinterpret_cast<sockaddr_in*>(dest_addr->data)->sin_port = htons(port); | 305 reinterpret_cast<sockaddr_in*>(dest_addr->data)->sin_port = |
| 306 base::HostToNet16(port); |
306 return PP_TRUE; | 307 return PP_TRUE; |
307 } | 308 } |
308 case AF_INET6: { | 309 case AF_INET6: { |
309 memmove(dest_addr, src_addr, sizeof(*src_addr)); | 310 memmove(dest_addr, src_addr, sizeof(*src_addr)); |
310 reinterpret_cast<sockaddr_in6*>(dest_addr->data)->sin6_port = htons(port); | 311 reinterpret_cast<sockaddr_in6*>(dest_addr->data)->sin6_port = |
| 312 base::HostToNet16(port); |
311 return PP_TRUE; | 313 return PP_TRUE; |
312 } | 314 } |
313 default: | 315 default: |
314 return PP_FALSE; | 316 return PP_FALSE; |
315 } | 317 } |
316 } | 318 } |
317 | 319 |
318 void GetAnyAddress(PP_Bool is_ipv6, PP_NetAddress_Private* addr) { | 320 void GetAnyAddress(PP_Bool is_ipv6, PP_NetAddress_Private* addr) { |
319 memset(addr->data, 0, arraysize(addr->data) * sizeof(addr->data[0])); | 321 memset(addr->data, 0, arraysize(addr->data) * sizeof(addr->data[0])); |
320 if (is_ipv6) { | 322 if (is_ipv6) { |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 net::IPEndPoint ip_end_point; | 455 net::IPEndPoint ip_end_point; |
454 if (!NetAddressToIPEndPoint(net_addr, &ip_end_point)) | 456 if (!NetAddressToIPEndPoint(net_addr, &ip_end_point)) |
455 return false; | 457 return false; |
456 | 458 |
457 *address_list = net::AddressList::CreateFromIPAddress(ip_end_point.address(), | 459 *address_list = net::AddressList::CreateFromIPAddress(ip_end_point.address(), |
458 ip_end_point.port()); | 460 ip_end_point.port()); |
459 return true; | 461 return true; |
460 } | 462 } |
461 | 463 |
462 } // namespace ppapi | 464 } // namespace ppapi |
OLD | NEW |