OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 rtc::scoped_ptr<rtc::ByteBuffer> request_packet( | 67 rtc::scoped_ptr<rtc::ByteBuffer> request_packet( |
68 new rtc::ByteBuffer(nullptr, kMaxUdpBufferSize)); | 68 new rtc::ByteBuffer(nullptr, kMaxUdpBufferSize)); |
69 if (!message.Write(request_packet.get())) { | 69 if (!message.Write(request_packet.get())) { |
70 prober_->End(WRITE_FAILED, 0); | 70 prober_->End(WRITE_FAILED, 0); |
71 return; | 71 return; |
72 } | 72 } |
73 | 73 |
74 auto addr = server_ips_[num_request_sent_]; | 74 auto addr = server_ips_[num_request_sent_]; |
75 request.server_addr = addr.ipaddr(); | 75 request.server_addr = addr.ipaddr(); |
76 | 76 |
77 int rv = 0; | |
78 | |
79 // Only bind to the interface at the first request. | |
80 if (num_request_sent_ == 0) { | |
81 rtc::IPAddress local_addr; | |
82 rv = prober_->GetLocalAddress(&local_addr); | |
83 if (rv != 0) { | |
84 prober_->End(GENERIC_FAILURE, rv); | |
85 return; | |
86 } | |
87 rv = socket_->Bind(rtc::SocketAddress(local_addr, 0)); | |
88 if (rv < 0) { | |
89 prober_->End(GENERIC_FAILURE, rv); | |
90 return; | |
91 } | |
92 } | |
93 | |
94 // The write must succeed immediately. Otherwise, the calculating of the STUN | 77 // The write must succeed immediately. Otherwise, the calculating of the STUN |
95 // request timing could become too complicated. Callback is ignored by passing | 78 // request timing could become too complicated. Callback is ignored by passing |
96 // empty AsyncCallback. | 79 // empty AsyncCallback. |
97 rv = socket_->SendTo(addr, const_cast<char*>(request_packet->Data()), | 80 int rv = socket_->SendTo(addr, const_cast<char*>(request_packet->Data()), |
98 request_packet->Length(), AsyncCallback()); | 81 request_packet->Length(), AsyncCallback()); |
99 if (rv < 0) { | 82 if (rv < 0) { |
100 prober_->End(WRITE_FAILED, rv); | 83 prober_->End(WRITE_FAILED, rv); |
101 return; | 84 return; |
102 } | 85 } |
103 | 86 |
104 request.sent_time_ms = rtc::Time(); | 87 request.sent_time_ms = rtc::Time(); |
105 | 88 |
106 // Post a read waiting for response. For share mode, the subsequent read will | 89 // Post a read waiting for response. For share mode, the subsequent read will |
107 // be posted inside OnStunResponseReceived. | 90 // be posted inside OnStunResponseReceived. |
108 if (num_request_sent_ == 0) { | 91 if (num_request_sent_ == 0) { |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 std::set<rtc::SocketAddress> addrs(all_servers_ips_.begin(), | 255 std::set<rtc::SocketAddress> addrs(all_servers_ips_.begin(), |
273 all_servers_ips_.end()); | 256 all_servers_ips_.end()); |
274 all_servers_ips_.assign(addrs.begin(), addrs.end()); | 257 all_servers_ips_.assign(addrs.begin(), addrs.end()); |
275 | 258 |
276 rtc::IPAddress addr; | 259 rtc::IPAddress addr; |
277 if (GetLocalAddress(&addr) != 0) { | 260 if (GetLocalAddress(&addr) != 0) { |
278 End(GENERIC_FAILURE, result); | 261 End(GENERIC_FAILURE, result); |
279 return; | 262 return; |
280 } | 263 } |
281 | 264 |
282 MaybeScheduleStunRequests(); | 265 socket_factory_->Prepare(GetTotalClientSockets(), GetTotalServerSockets(), |
| 266 [this](int result) { |
| 267 if (result == 0) { |
| 268 this->MaybeScheduleStunRequests(); |
| 269 } |
| 270 }); |
283 } | 271 } |
284 | 272 |
285 int StunProber::GetLocalAddress(rtc::IPAddress* addr) { | 273 int StunProber::GetLocalAddress(rtc::IPAddress* addr) { |
286 DCHECK(thread_checker_.CalledOnValidThread()); | 274 DCHECK(thread_checker_.CalledOnValidThread()); |
287 if (local_addr_.family() == AF_UNSPEC) { | 275 if (local_addr_.family() == AF_UNSPEC) { |
288 rtc::SocketAddress sock_addr; | 276 rtc::SocketAddress sock_addr; |
289 rtc::scoped_ptr<ClientSocketInterface> socket( | 277 rtc::scoped_ptr<ClientSocketInterface> socket( |
290 socket_factory_->CreateClientSocket()); | 278 socket_factory_->CreateClientSocket()); |
291 int rv = socket->Connect(all_servers_ips_[0]); | 279 int rv = socket->Connect(all_servers_ips_[0]); |
292 if (rv != SUCCESS) { | 280 if (rv != SUCCESS) { |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
433 | 421 |
434 // Shared mode is only true if we use the shared socket and there are more | 422 // Shared mode is only true if we use the shared socket and there are more |
435 // than 1 responding servers. | 423 // than 1 responding servers. |
436 stats.shared_socket_mode = | 424 stats.shared_socket_mode = |
437 shared_socket_mode_ && (num_server_ip_with_response > 1); | 425 shared_socket_mode_ && (num_server_ip_with_response > 1); |
438 | 426 |
439 stats.host_ip = local_addr_.ToString(); | 427 stats.host_ip = local_addr_.ToString(); |
440 stats.num_request_sent = num_sent; | 428 stats.num_request_sent = num_sent; |
441 stats.num_response_received = num_received; | 429 stats.num_response_received = num_received; |
442 stats.target_request_interval_ns = interval_ms_ * 1000; | 430 stats.target_request_interval_ns = interval_ms_ * 1000; |
| 431 stats.symmetric_nat = |
| 432 stats.srflx_addrs.size() > static_cast<size_t>(GetTotalServerSockets()); |
443 | 433 |
444 if (num_sent) { | 434 if (num_sent) { |
445 stats.success_percent = static_cast<int>(100 * num_received / num_sent); | 435 stats.success_percent = static_cast<int>(100 * num_received / num_sent); |
446 } | 436 } |
447 | 437 |
448 if (num_sent > 1) { | 438 if (num_sent > 1) { |
449 stats.actual_request_interval_ns = | 439 stats.actual_request_interval_ns = |
450 (1000 * (last_sent_time - first_sent_time)) / (num_sent - 1); | 440 (1000 * (last_sent_time - first_sent_time)) / (num_sent - 1); |
451 } | 441 } |
452 | 442 |
(...skipping 10 matching lines...) Expand all Loading... |
463 if (!finished_callback_.empty()) { | 453 if (!finished_callback_.empty()) { |
464 AsyncCallback callback = finished_callback_; | 454 AsyncCallback callback = finished_callback_; |
465 finished_callback_ = AsyncCallback(); | 455 finished_callback_ = AsyncCallback(); |
466 | 456 |
467 // Callback at the last since the prober might be deleted in the callback. | 457 // Callback at the last since the prober might be deleted in the callback. |
468 callback(status); | 458 callback(status); |
469 } | 459 } |
470 } | 460 } |
471 | 461 |
472 } // namespace stunprober | 462 } // namespace stunprober |
OLD | NEW |