| 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 26 matching lines...) Expand all Loading... |
| 37 | 37 |
| 38 } // namespace | 38 } // namespace |
| 39 | 39 |
| 40 // A requester tracks the requests and responses from a single socket to many | 40 // A requester tracks the requests and responses from a single socket to many |
| 41 // STUN servers | 41 // STUN servers |
| 42 class StunProber::Requester : public sigslot::has_slots<> { | 42 class StunProber::Requester : public sigslot::has_slots<> { |
| 43 public: | 43 public: |
| 44 // Each Request maps to a request and response. | 44 // Each Request maps to a request and response. |
| 45 struct Request { | 45 struct Request { |
| 46 // Actual time the STUN bind request was sent. | 46 // Actual time the STUN bind request was sent. |
| 47 int64 sent_time_ms = 0; | 47 int64_t sent_time_ms = 0; |
| 48 // Time the response was received. | 48 // Time the response was received. |
| 49 int64 received_time_ms = 0; | 49 int64_t received_time_ms = 0; |
| 50 | 50 |
| 51 // Server reflexive address from STUN response for this given request. | 51 // Server reflexive address from STUN response for this given request. |
| 52 rtc::SocketAddress srflx_addr; | 52 rtc::SocketAddress srflx_addr; |
| 53 | 53 |
| 54 rtc::IPAddress server_addr; | 54 rtc::IPAddress server_addr; |
| 55 | 55 |
| 56 int64 rtt() { return received_time_ms - sent_time_ms; } | 56 int64_t rtt() { return received_time_ms - sent_time_ms; } |
| 57 void ProcessResponse(const char* buf, size_t buf_len); | 57 void ProcessResponse(const char* buf, size_t buf_len); |
| 58 }; | 58 }; |
| 59 | 59 |
| 60 // StunProber provides |server_ips| for Requester to probe. For shared | 60 // StunProber provides |server_ips| for Requester to probe. For shared |
| 61 // socket mode, it'll be all the resolved IP addresses. For non-shared mode, | 61 // socket mode, it'll be all the resolved IP addresses. For non-shared mode, |
| 62 // it'll just be a single address. | 62 // it'll just be a single address. |
| 63 Requester(StunProber* prober, | 63 Requester(StunProber* prober, |
| 64 rtc::AsyncPacketSocket* socket, | 64 rtc::AsyncPacketSocket* socket, |
| 65 const std::vector<rtc::SocketAddress>& server_ips); | 65 const std::vector<rtc::SocketAddress>& server_ips); |
| 66 virtual ~Requester(); | 66 virtual ~Requester(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 90 | 90 |
| 91 // The socket for this session. | 91 // The socket for this session. |
| 92 rtc::scoped_ptr<rtc::AsyncPacketSocket> socket_; | 92 rtc::scoped_ptr<rtc::AsyncPacketSocket> socket_; |
| 93 | 93 |
| 94 // Temporary SocketAddress and buffer for RecvFrom. | 94 // Temporary SocketAddress and buffer for RecvFrom. |
| 95 rtc::SocketAddress addr_; | 95 rtc::SocketAddress addr_; |
| 96 rtc::scoped_ptr<rtc::ByteBuffer> response_packet_; | 96 rtc::scoped_ptr<rtc::ByteBuffer> response_packet_; |
| 97 | 97 |
| 98 std::vector<Request*> requests_; | 98 std::vector<Request*> requests_; |
| 99 std::vector<rtc::SocketAddress> server_ips_; | 99 std::vector<rtc::SocketAddress> server_ips_; |
| 100 int16 num_request_sent_ = 0; | 100 int16_t num_request_sent_ = 0; |
| 101 int16 num_response_received_ = 0; | 101 int16_t num_response_received_ = 0; |
| 102 | 102 |
| 103 rtc::ThreadChecker& thread_checker_; | 103 rtc::ThreadChecker& thread_checker_; |
| 104 | 104 |
| 105 RTC_DISALLOW_COPY_AND_ASSIGN(Requester); | 105 RTC_DISALLOW_COPY_AND_ASSIGN(Requester); |
| 106 }; | 106 }; |
| 107 | 107 |
| 108 StunProber::Requester::Requester( | 108 StunProber::Requester::Requester( |
| 109 StunProber* prober, | 109 StunProber* prober, |
| 110 rtc::AsyncPacketSocket* socket, | 110 rtc::AsyncPacketSocket* socket, |
| 111 const std::vector<rtc::SocketAddress>& server_ips) | 111 const std::vector<rtc::SocketAddress>& server_ips) |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 } | 162 } |
| 163 | 163 |
| 164 request.sent_time_ms = rtc::Time(); | 164 request.sent_time_ms = rtc::Time(); |
| 165 | 165 |
| 166 num_request_sent_++; | 166 num_request_sent_++; |
| 167 RTC_DCHECK(static_cast<size_t>(num_request_sent_) <= server_ips_.size()); | 167 RTC_DCHECK(static_cast<size_t>(num_request_sent_) <= server_ips_.size()); |
| 168 } | 168 } |
| 169 | 169 |
| 170 void StunProber::Requester::Request::ProcessResponse(const char* buf, | 170 void StunProber::Requester::Request::ProcessResponse(const char* buf, |
| 171 size_t buf_len) { | 171 size_t buf_len) { |
| 172 int64 now = rtc::Time(); | 172 int64_t now = rtc::Time(); |
| 173 rtc::ByteBuffer message(buf, buf_len); | 173 rtc::ByteBuffer message(buf, buf_len); |
| 174 cricket::StunMessage stun_response; | 174 cricket::StunMessage stun_response; |
| 175 if (!stun_response.Read(&message)) { | 175 if (!stun_response.Read(&message)) { |
| 176 // Invalid or incomplete STUN packet. | 176 // Invalid or incomplete STUN packet. |
| 177 received_time_ms = 0; | 177 received_time_ms = 0; |
| 178 return; | 178 return; |
| 179 } | 179 } |
| 180 | 180 |
| 181 // Get external address of the socket. | 181 // Get external address of the socket. |
| 182 const cricket::StunAddressAttribute* addr_attr = | 182 const cricket::StunAddressAttribute* addr_attr = |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 if (!current_requester_) { | 369 if (!current_requester_) { |
| 370 return false; | 370 return false; |
| 371 } | 371 } |
| 372 current_requester_->SendStunRequest(); | 372 current_requester_->SendStunRequest(); |
| 373 num_request_sent_++; | 373 num_request_sent_++; |
| 374 return true; | 374 return true; |
| 375 } | 375 } |
| 376 | 376 |
| 377 void StunProber::MaybeScheduleStunRequests() { | 377 void StunProber::MaybeScheduleStunRequests() { |
| 378 RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 378 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
| 379 uint32 now = rtc::Time(); | 379 uint32_t now = rtc::Time(); |
| 380 | 380 |
| 381 if (Done()) { | 381 if (Done()) { |
| 382 invoker_.AsyncInvokeDelayed<void>( | 382 invoker_.AsyncInvokeDelayed<void>( |
| 383 thread_, rtc::Bind(&StunProber::End, this, SUCCESS), timeout_ms_); | 383 thread_, rtc::Bind(&StunProber::End, this, SUCCESS), timeout_ms_); |
| 384 return; | 384 return; |
| 385 } | 385 } |
| 386 if ((now + (thread_wake_up_interval_ms / 2)) >= next_request_time_ms_) { | 386 if ((now + (thread_wake_up_interval_ms / 2)) >= next_request_time_ms_) { |
| 387 if (!SendNextRequest()) { | 387 if (!SendNextRequest()) { |
| 388 End(GENERIC_FAILURE); | 388 End(GENERIC_FAILURE); |
| 389 return; | 389 return; |
| 390 } | 390 } |
| 391 next_request_time_ms_ = now + interval_ms_; | 391 next_request_time_ms_ = now + interval_ms_; |
| 392 } | 392 } |
| 393 invoker_.AsyncInvokeDelayed<void>( | 393 invoker_.AsyncInvokeDelayed<void>( |
| 394 thread_, rtc::Bind(&StunProber::MaybeScheduleStunRequests, this), | 394 thread_, rtc::Bind(&StunProber::MaybeScheduleStunRequests, this), |
| 395 thread_wake_up_interval_ms /* ms */); | 395 thread_wake_up_interval_ms /* ms */); |
| 396 } | 396 } |
| 397 | 397 |
| 398 bool StunProber::GetStats(StunProber::Stats* prob_stats) const { | 398 bool StunProber::GetStats(StunProber::Stats* prob_stats) const { |
| 399 // No need to be on the same thread. | 399 // No need to be on the same thread. |
| 400 if (!prob_stats) { | 400 if (!prob_stats) { |
| 401 return false; | 401 return false; |
| 402 } | 402 } |
| 403 | 403 |
| 404 StunProber::Stats stats; | 404 StunProber::Stats stats; |
| 405 | 405 |
| 406 int rtt_sum = 0; | 406 int rtt_sum = 0; |
| 407 int64 first_sent_time = 0; | 407 int64_t first_sent_time = 0; |
| 408 int64 last_sent_time = 0; | 408 int64_t last_sent_time = 0; |
| 409 NatType nat_type = NATTYPE_INVALID; | 409 NatType nat_type = NATTYPE_INVALID; |
| 410 | 410 |
| 411 // Track of how many srflx IP that we have seen. | 411 // Track of how many srflx IP that we have seen. |
| 412 std::set<rtc::IPAddress> srflx_ips; | 412 std::set<rtc::IPAddress> srflx_ips; |
| 413 | 413 |
| 414 // If we're not receiving any response on a given IP, all requests sent to | 414 // If we're not receiving any response on a given IP, all requests sent to |
| 415 // that IP should be ignored as this could just be an DNS error. | 415 // that IP should be ignored as this could just be an DNS error. |
| 416 std::map<rtc::IPAddress, int> num_response_per_server; | 416 std::map<rtc::IPAddress, int> num_response_per_server; |
| 417 std::map<rtc::IPAddress, int> num_request_per_server; | 417 std::map<rtc::IPAddress, int> num_request_per_server; |
| 418 | 418 |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 525 if (!finished_callback_.empty()) { | 525 if (!finished_callback_.empty()) { |
| 526 AsyncCallback callback = finished_callback_; | 526 AsyncCallback callback = finished_callback_; |
| 527 finished_callback_ = AsyncCallback(); | 527 finished_callback_ = AsyncCallback(); |
| 528 | 528 |
| 529 // Callback at the last since the prober might be deleted in the callback. | 529 // Callback at the last since the prober might be deleted in the callback. |
| 530 callback(this, status); | 530 callback(this, status); |
| 531 } | 531 } |
| 532 } | 532 } |
| 533 | 533 |
| 534 } // namespace stunprober | 534 } // namespace stunprober |
| OLD | NEW |