| 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 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 int timeout_ms, | 185 int timeout_ms, |
| 186 const AsyncCallback finish_callback); | 186 const AsyncCallback finish_callback); |
| 187 | 187 |
| 188 // Method to retrieve the Stats once |finish_callback| is invoked. Returning | 188 // Method to retrieve the Stats once |finish_callback| is invoked. Returning |
| 189 // false when the result is inconclusive, for example, whether it's behind a | 189 // false when the result is inconclusive, for example, whether it's behind a |
| 190 // NAT or not. | 190 // NAT or not. |
| 191 bool GetStats(Stats* stats); | 191 bool GetStats(Stats* stats); |
| 192 | 192 |
| 193 private: | 193 private: |
| 194 // A requester tracks the requests and responses from a single socket to many | 194 // A requester tracks the requests and responses from a single socket to many |
| 195 // STUN servers | 195 // STUN servers. |
| 196 class Requester { | 196 class Requester; |
| 197 public: | |
| 198 // Each Request maps to a request and response. | |
| 199 struct Request { | |
| 200 // Actual time the STUN bind request was sent. | |
| 201 int64 sent_time_ms = 0; | |
| 202 // Time the response was received. | |
| 203 int64 received_time_ms = 0; | |
| 204 | 197 |
| 205 // See whether the observed address returned matches the | |
| 206 // local address as in StunProber.local_addr_. | |
| 207 bool behind_nat = false; | |
| 208 | |
| 209 // Server reflexive address from STUN response for this given request. | |
| 210 rtc::SocketAddress srflx_addr; | |
| 211 | |
| 212 rtc::IPAddress server_addr; | |
| 213 | |
| 214 int64 rtt() { return received_time_ms - sent_time_ms; } | |
| 215 void ProcessResponse(rtc::ByteBuffer* message, | |
| 216 int buf_len, | |
| 217 const rtc::IPAddress& local_addr); | |
| 218 }; | |
| 219 | |
| 220 // StunProber provides |server_ips| for Requester to probe. For shared | |
| 221 // socket mode, it'll be all the resolved IP addresses. For non-shared mode, | |
| 222 // it'll just be a single address. | |
| 223 Requester(StunProber* prober, | |
| 224 ServerSocketInterface* socket, | |
| 225 const std::vector<rtc::SocketAddress>& server_ips); | |
| 226 virtual ~Requester(); | |
| 227 | |
| 228 // There is no callback for SendStunRequest as the underneath socket send is | |
| 229 // expected to be completed immediately. Otherwise, it'll skip this request | |
| 230 // and move to the next one. | |
| 231 void SendStunRequest(); | |
| 232 | |
| 233 void ReadStunResponse(); | |
| 234 | |
| 235 // |result| is the positive return value from RecvFrom when data is | |
| 236 // available. | |
| 237 void OnStunResponseReceived(int result); | |
| 238 | |
| 239 const std::vector<Request*>& requests() { return requests_; } | |
| 240 | |
| 241 // Whether this Requester has completed all requests. | |
| 242 bool Done() { | |
| 243 return static_cast<size_t>(num_request_sent_) == server_ips_.size(); | |
| 244 } | |
| 245 | |
| 246 private: | |
| 247 Request* GetRequestByAddress(const rtc::IPAddress& ip); | |
| 248 | |
| 249 StunProber* prober_; | |
| 250 | |
| 251 // The socket for this session. | |
| 252 rtc::scoped_ptr<ServerSocketInterface> socket_; | |
| 253 | |
| 254 // Temporary SocketAddress and buffer for RecvFrom. | |
| 255 rtc::SocketAddress addr_; | |
| 256 rtc::scoped_ptr<rtc::ByteBuffer> response_packet_; | |
| 257 | |
| 258 std::vector<Request*> requests_; | |
| 259 std::vector<rtc::SocketAddress> server_ips_; | |
| 260 int16 num_request_sent_ = 0; | |
| 261 int16 num_response_received_ = 0; | |
| 262 | |
| 263 rtc::ThreadChecker& thread_checker_; | |
| 264 | |
| 265 DISALLOW_COPY_AND_ASSIGN(Requester); | |
| 266 }; | |
| 267 | |
| 268 private: | |
| 269 void OnServerResolved(int index, int result); | 198 void OnServerResolved(int index, int result); |
| 270 | 199 |
| 271 bool Done() { | 200 bool Done() { |
| 272 return num_request_sent_ >= requests_per_ip_ * all_servers_ips_.size(); | 201 return num_request_sent_ >= requests_per_ip_ * all_servers_ips_.size(); |
| 273 } | 202 } |
| 274 | 203 |
| 275 int GetTotalClientSockets() { return 1; } | 204 int GetTotalClientSockets() { return 1; } |
| 276 int GetTotalServerSockets() { | 205 int GetTotalServerSockets() { |
| 277 return static_cast<int>( | 206 return static_cast<int>( |
| 278 (shared_socket_mode_ ? 1 : all_servers_ips_.size()) * requests_per_ip_); | 207 (shared_socket_mode_ ? 1 : all_servers_ips_.size()) * requests_per_ip_); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 std::vector<Requester*> requesters_; | 270 std::vector<Requester*> requesters_; |
| 342 | 271 |
| 343 rtc::ThreadChecker thread_checker_; | 272 rtc::ThreadChecker thread_checker_; |
| 344 | 273 |
| 345 DISALLOW_COPY_AND_ASSIGN(StunProber); | 274 DISALLOW_COPY_AND_ASSIGN(StunProber); |
| 346 }; | 275 }; |
| 347 | 276 |
| 348 } // namespace stunprober | 277 } // namespace stunprober |
| 349 | 278 |
| 350 #endif // WEBRTC_P2P_STUNPROBER_STUNPROBER_H_ | 279 #endif // WEBRTC_P2P_STUNPROBER_STUNPROBER_H_ |
| OLD | NEW |