| 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 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 return PP_NETADDRESSFAMILY_IPV6; | 65 return PP_NETADDRESSFAMILY_IPV6; |
| 66 default: | 66 default: |
| 67 return PP_NETADDRESSFAMILY_UNSPECIFIED; | 67 return PP_NETADDRESSFAMILY_UNSPECIFIED; |
| 68 } | 68 } |
| 69 } | 69 } |
| 70 | 70 |
| 71 uint16_t GetPort(const PP_NetAddress_Private* addr) { | 71 uint16_t GetPort(const PP_NetAddress_Private* addr) { |
| 72 switch (GetFamilyInternal(addr)) { | 72 switch (GetFamilyInternal(addr)) { |
| 73 case AF_INET: { | 73 case AF_INET: { |
| 74 const sockaddr_in* a = reinterpret_cast<const sockaddr_in*>(addr->data); | 74 const sockaddr_in* a = reinterpret_cast<const sockaddr_in*>(addr->data); |
| 75 return ntohs(a->sin_port); | 75 return base::NetToHost16(a->sin_port); |
| 76 } | 76 } |
| 77 case AF_INET6: { | 77 case AF_INET6: { |
| 78 const sockaddr_in6* a = reinterpret_cast<const sockaddr_in6*>(addr->data); | 78 const sockaddr_in6* a = reinterpret_cast<const sockaddr_in6*>(addr->data); |
| 79 return ntohs(a->sin6_port); | 79 return base::NetToHost16(a->sin6_port); |
| 80 } | 80 } |
| 81 default: | 81 default: |
| 82 return 0; | 82 return 0; |
| 83 } | 83 } |
| 84 } | 84 } |
| 85 | 85 |
| 86 PP_Bool GetAddress(const PP_NetAddress_Private* addr, | 86 PP_Bool GetAddress(const PP_NetAddress_Private* addr, |
| 87 void* address, | 87 void* address, |
| 88 uint16_t address_size) { | 88 uint16_t address_size) { |
| 89 switch (GetFamilyInternal(addr)) { | 89 switch (GetFamilyInternal(addr)) { |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 return PP_FromBool(a1->sin6_port == a2->sin6_port); | 174 return PP_FromBool(a1->sin6_port == a2->sin6_port); |
| 175 } | 175 } |
| 176 default: | 176 default: |
| 177 return PP_FALSE; | 177 return PP_FALSE; |
| 178 } | 178 } |
| 179 } | 179 } |
| 180 | 180 |
| 181 #if defined(OS_WIN) || defined(OS_MACOSX) | 181 #if defined(OS_WIN) || defined(OS_MACOSX) |
| 182 std::string ConvertIPv4AddressToString(const sockaddr_in* a, | 182 std::string ConvertIPv4AddressToString(const sockaddr_in* a, |
| 183 bool include_port) { | 183 bool include_port) { |
| 184 unsigned ip = ntohl(a->sin_addr.s_addr); | 184 unsigned ip = base::NetToHost32(a->sin_addr.s_addr); |
| 185 unsigned port = ntohs(a->sin_port); | 185 unsigned port = base::NetToHost16(a->sin_port); |
| 186 std::string description = base::StringPrintf( | 186 std::string description = base::StringPrintf( |
| 187 "%u.%u.%u.%u", | 187 "%u.%u.%u.%u", |
| 188 (ip >> 24) & 0xff, (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff); | 188 (ip >> 24) & 0xff, (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff); |
| 189 if (include_port) | 189 if (include_port) |
| 190 base::StringAppendF(&description, ":%u", port); | 190 base::StringAppendF(&description, ":%u", port); |
| 191 return description; | 191 return description; |
| 192 } | 192 } |
| 193 | 193 |
| 194 // Format an IPv6 address for human consumption, basically according to RFC | 194 // Format an IPv6 address for human consumption, basically according to RFC |
| 195 // 5952. | 195 // 5952. |
| 196 // - If the scope is nonzero, it is appended to the address as "%<scope>" (this | 196 // - If the scope is nonzero, it is appended to the address as "%<scope>" (this |
| 197 // is not in RFC 5952, but consistent with |getnameinfo()| on Linux and | 197 // is not in RFC 5952, but consistent with |getnameinfo()| on Linux and |
| 198 // Windows). | 198 // Windows). |
| 199 // - If |include_port| is true, the address (possibly including the scope) is | 199 // - If |include_port| is true, the address (possibly including the scope) is |
| 200 // enclosed in square brackets and ":<port>" is appended, i.e., the overall | 200 // enclosed in square brackets and ":<port>" is appended, i.e., the overall |
| 201 // format is "[<address>]:<port>". | 201 // format is "[<address>]:<port>". |
| 202 // - If the address is an IPv4 address embedded IPv6 (per RFC 4291), then the | 202 // - If the address is an IPv4 address embedded IPv6 (per RFC 4291), then the |
| 203 // mixed format is used, e.g., "::ffff:192.168.1.2". This is optional per RFC | 203 // mixed format is used, e.g., "::ffff:192.168.1.2". This is optional per RFC |
| 204 // 5952, but consistent with |getnameinfo()|. | 204 // 5952, but consistent with |getnameinfo()|. |
| 205 std::string ConvertIPv6AddressToString(const sockaddr_in6* a, | 205 std::string ConvertIPv6AddressToString(const sockaddr_in6* a, |
| 206 bool include_port) { | 206 bool include_port) { |
| 207 unsigned port = ntohs(a->sin6_port); | 207 unsigned port = base::NetToHost16(a->sin6_port); |
| 208 unsigned scope = a->sin6_scope_id; | 208 unsigned scope = a->sin6_scope_id; |
| 209 std::string description(include_port ? "[" : ""); | 209 std::string description(include_port ? "[" : ""); |
| 210 | 210 |
| 211 // IPv4 address embedded in IPv6. | 211 // IPv4 address embedded in IPv6. |
| 212 if (a->sin6_addr.s6_addr16[0] == 0 && a->sin6_addr.s6_addr16[1] == 0 && | 212 if (a->sin6_addr.s6_addr16[0] == 0 && a->sin6_addr.s6_addr16[1] == 0 && |
| 213 a->sin6_addr.s6_addr16[2] == 0 && a->sin6_addr.s6_addr16[3] == 0 && | 213 a->sin6_addr.s6_addr16[2] == 0 && a->sin6_addr.s6_addr16[3] == 0 && |
| 214 a->sin6_addr.s6_addr16[4] == 0 && | 214 a->sin6_addr.s6_addr16[4] == 0 && |
| 215 (a->sin6_addr.s6_addr16[5] == 0 || a->sin6_addr.s6_addr16[5] == 0xffff)) { | 215 (a->sin6_addr.s6_addr16[5] == 0 || a->sin6_addr.s6_addr16[5] == 0xffff)) { |
| 216 base::StringAppendF( | 216 base::StringAppendF( |
| 217 &description, | 217 &description, |
| 218 a->sin6_addr.s6_addr16[5] == 0 ? "::%u.%u.%u.%u" : "::ffff:%u.%u.%u.%u", | 218 a->sin6_addr.s6_addr16[5] == 0 ? "::%u.%u.%u.%u" : "::ffff:%u.%u.%u.%u", |
| 219 static_cast<unsigned>(a->sin6_addr.s6_addr[12]), | 219 static_cast<unsigned>(a->sin6_addr.s6_addr[12]), |
| 220 static_cast<unsigned>(a->sin6_addr.s6_addr[13]), | 220 static_cast<unsigned>(a->sin6_addr.s6_addr[13]), |
| 221 static_cast<unsigned>(a->sin6_addr.s6_addr[14]), | 221 static_cast<unsigned>(a->sin6_addr.s6_addr[14]), |
| 222 static_cast<unsigned>(a->sin6_addr.s6_addr[15])); | 222 static_cast<unsigned>(a->sin6_addr.s6_addr[15])); |
| 223 | 223 |
| 224 // "Real" IPv6 addresses. | 224 // "Real" IPv6 addresses. |
| 225 } else { | 225 } else { |
| 226 // Find the first longest run of 0s (of length > 1), to collapse to "::". | 226 // Find the first longest run of 0s (of length > 1), to collapse to "::". |
| 227 int longest_start = 0; | 227 int longest_start = 0; |
| 228 int longest_length = 0; | 228 int longest_length = 0; |
| 229 int curr_start = 0; | 229 int curr_start = 0; |
| 230 int curr_length = 0; | 230 int curr_length = 0; |
| 231 for (int i = 0; i < 8; i++) { | 231 for (int i = 0; i < 8; i++) { |
| 232 if (ntohs(a->sin6_addr.s6_addr16[i]) != 0) { | 232 if (base::NetToHost16(a->sin6_addr.s6_addr16[i]) != 0) { |
| 233 curr_length = 0; | 233 curr_length = 0; |
| 234 } else { | 234 } else { |
| 235 if (!curr_length) | 235 if (!curr_length) |
| 236 curr_start = i; | 236 curr_start = i; |
| 237 curr_length++; | 237 curr_length++; |
| 238 if (curr_length > longest_length) { | 238 if (curr_length > longest_length) { |
| 239 longest_start = curr_start; | 239 longest_start = curr_start; |
| 240 longest_length = curr_length; | 240 longest_length = curr_length; |
| 241 } | 241 } |
| 242 } | 242 } |
| 243 } | 243 } |
| 244 | 244 |
| 245 bool need_sep = false; // Whether the next item needs a ':' to separate. | 245 bool need_sep = false; // Whether the next item needs a ':' to separate. |
| 246 for (int i = 0; i < 8;) { | 246 for (int i = 0; i < 8;) { |
| 247 if (longest_length > 1 && i == longest_start) { | 247 if (longest_length > 1 && i == longest_start) { |
| 248 description.append("::"); | 248 description.append("::"); |
| 249 need_sep = false; | 249 need_sep = false; |
| 250 i += longest_length; | 250 i += longest_length; |
| 251 } else { | 251 } else { |
| 252 unsigned v = ntohs(a->sin6_addr.s6_addr16[i]); | 252 unsigned v = base::NetToHost16(a->sin6_addr.s6_addr16[i]); |
| 253 base::StringAppendF(&description, need_sep ? ":%x" : "%x", v); | 253 base::StringAppendF(&description, need_sep ? ":%x" : "%x", v); |
| 254 need_sep = true; | 254 need_sep = true; |
| 255 i++; | 255 i++; |
| 256 } | 256 } |
| 257 } | 257 } |
| 258 } | 258 } |
| 259 | 259 |
| 260 // Nonzero scopes, e.g., 123, are indicated by appending, e.g., "%123". | 260 // Nonzero scopes, e.g., 123, are indicated by appending, e.g., "%123". |
| 261 if (scope != 0) | 261 if (scope != 0) |
| 262 base::StringAppendF(&description, "%%%u", scope); | 262 base::StringAppendF(&description, "%%%u", scope); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 | 308 |
| 309 PP_Bool ReplacePort(const struct PP_NetAddress_Private* src_addr, | 309 PP_Bool ReplacePort(const struct PP_NetAddress_Private* src_addr, |
| 310 uint16_t port, | 310 uint16_t port, |
| 311 struct PP_NetAddress_Private* dest_addr) { | 311 struct PP_NetAddress_Private* dest_addr) { |
| 312 if (!NetAddressPrivateImpl::ValidateNetAddress(*src_addr)) | 312 if (!NetAddressPrivateImpl::ValidateNetAddress(*src_addr)) |
| 313 return PP_FALSE; | 313 return PP_FALSE; |
| 314 | 314 |
| 315 switch (GetFamilyInternal(src_addr)) { | 315 switch (GetFamilyInternal(src_addr)) { |
| 316 case AF_INET: { | 316 case AF_INET: { |
| 317 memmove(dest_addr, src_addr, sizeof(*src_addr)); | 317 memmove(dest_addr, src_addr, sizeof(*src_addr)); |
| 318 reinterpret_cast<sockaddr_in*>(dest_addr->data)->sin_port = htons(port); | 318 reinterpret_cast<sockaddr_in*>(dest_addr->data)->sin_port = |
| 319 base::HostToNet16(port); |
| 319 return PP_TRUE; | 320 return PP_TRUE; |
| 320 } | 321 } |
| 321 case AF_INET6: { | 322 case AF_INET6: { |
| 322 memmove(dest_addr, src_addr, sizeof(*src_addr)); | 323 memmove(dest_addr, src_addr, sizeof(*src_addr)); |
| 323 reinterpret_cast<sockaddr_in6*>(dest_addr->data)->sin6_port = htons(port); | 324 reinterpret_cast<sockaddr_in6*>(dest_addr->data)->sin6_port = |
| 325 base::HostToNet16(port); |
| 324 return PP_TRUE; | 326 return PP_TRUE; |
| 325 } | 327 } |
| 326 default: | 328 default: |
| 327 return PP_FALSE; | 329 return PP_FALSE; |
| 328 } | 330 } |
| 329 } | 331 } |
| 330 | 332 |
| 331 void GetAnyAddress(PP_Bool is_ipv6, PP_NetAddress_Private* addr) { | 333 void GetAnyAddress(PP_Bool is_ipv6, PP_NetAddress_Private* addr) { |
| 332 memset(addr->data, 0, arraysize(addr->data) * sizeof(addr->data[0])); | 334 memset(addr->data, 0, arraysize(addr->data) * sizeof(addr->data[0])); |
| 333 if (is_ipv6) { | 335 if (is_ipv6) { |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 net::IPEndPoint ip_end_point; | 513 net::IPEndPoint ip_end_point; |
| 512 if (!NetAddressToIPEndPoint(net_addr, &ip_end_point)) | 514 if (!NetAddressToIPEndPoint(net_addr, &ip_end_point)) |
| 513 return false; | 515 return false; |
| 514 | 516 |
| 515 *address_list = net::AddressList::CreateFromIPAddress(ip_end_point.address(), | 517 *address_list = net::AddressList::CreateFromIPAddress(ip_end_point.address(), |
| 516 ip_end_point.port()); | 518 ip_end_point.port()); |
| 517 return true; | 519 return true; |
| 518 } | 520 } |
| 519 | 521 |
| 520 } // namespace ppapi | 522 } // namespace ppapi |
| OLD | NEW |