Chromium Code Reviews| 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 #ifndef CHROME_BROWSER_NET_NETWORK_STATS_H_ | 5 #ifndef CHROME_BROWSER_NET_NETWORK_STATS_H_ |
| 6 #define CHROME_BROWSER_NET_NETWORK_STATS_H_ | 6 #define CHROME_BROWSER_NET_NETWORK_STATS_H_ |
| 7 #pragma once | 7 #pragma once |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| 11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
| 12 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
| 13 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
| 14 #include "base/string_util.h" | 14 #include "base/string_util.h" |
| 15 #include "base/time.h" | 15 #include "base/time.h" |
| 16 #include "chrome/browser/io_thread.h" | 16 #include "chrome/browser/io_thread.h" |
| 17 #include "net/base/address_list.h" | 17 #include "net/base/address_list.h" |
| 18 #include "net/base/completion_callback.h" | 18 #include "net/base/completion_callback.h" |
| 19 #include "net/base/host_port_pair.h" | 19 #include "net/base/host_port_pair.h" |
| 20 #include "net/base/host_resolver.h" | 20 #include "net/base/host_resolver.h" |
| 21 #include "net/base/io_buffer.h" | 21 #include "net/base/io_buffer.h" |
| 22 #include "net/base/ip_endpoint.h" | 22 #include "net/base/ip_endpoint.h" |
| 23 #include "net/base/test_data_stream.h" | 23 #include "net/base/test_data_stream.h" |
| 24 #include "net/proxy/proxy_info.h" | |
| 24 #include "net/socket/socket.h" | 25 #include "net/socket/socket.h" |
| 25 namespace chrome_browser_net { | 26 namespace chrome_browser_net { |
| 26 | 27 |
| 27 // This class is used for live experiment of network connectivity (either TCP or | 28 // This class is used for live experiment of network connectivity (either TCP or |
| 28 // UDP) metrics. A small percentage of users participate in this experiment. All | 29 // UDP) metrics. A small percentage of users participate in this experiment. All |
| 29 // users (who are in the experiment) must have enabled "UMA upload". | 30 // users (who are in the experiment) must have enabled "UMA upload". |
| 30 // | 31 // |
| 31 // This class collects the following stats from users who have opted in. | 32 // This class collects the following stats from users who have opted in. |
| 32 // a) What percentage of users can get a message end-to-end to a UDP server? | 33 // a) What percentage of users can get a message end-to-end to a UDP server? |
| 33 // b) What percentage of users can get a message end-to-end to a TCP server? | 34 // b) What percentage of users can get a message end-to-end to a TCP server? |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 94 // Starts the client, connecting to |server|. | 95 // Starts the client, connecting to |server|. |
| 95 // Client will send |bytes_to_send| bytes to |server|. | 96 // Client will send |bytes_to_send| bytes to |server|. |
| 96 // When client has received all echoed bytes from the server, or | 97 // When client has received all echoed bytes from the server, or |
| 97 // when an error occurs causing the client to stop, |Finish| will be | 98 // when an error occurs causing the client to stop, |Finish| will be |
| 98 // called with a net status code. | 99 // called with a net status code. |
| 99 // |Finish| will collect histogram stats. | 100 // |Finish| will collect histogram stats. |
| 100 // Returns true if successful in starting the client. | 101 // Returns true if successful in starting the client. |
| 101 bool Start(net::HostResolver* host_resolver, | 102 bool Start(net::HostResolver* host_resolver, |
| 102 const net::HostPortPair& server, | 103 const net::HostPortPair& server, |
| 103 HistogramPortSelector histogram_port, | 104 HistogramPortSelector histogram_port, |
| 105 bool has_proxy_server, | |
| 104 uint32 bytes_to_send, | 106 uint32 bytes_to_send, |
| 105 uint32 packets_to_send, | 107 uint32 packets_to_send, |
| 106 const net::CompletionCallback& callback); | 108 const net::CompletionCallback& callback); |
| 107 | 109 |
| 108 protected: | 110 protected: |
| 109 // Constructs an NetworkStats object that collects metrics for network | 111 // Constructs an NetworkStats object that collects metrics for network |
| 110 // connectivity (either TCP or UDP). | 112 // connectivity (either TCP or UDP). |
| 111 NetworkStats(); | 113 NetworkStats(); |
| 114 // NetworkStats is deleted when Finish() is called. | |
| 112 virtual ~NetworkStats(); | 115 virtual ~NetworkStats(); |
| 113 | 116 |
| 114 // Initializes |finished_callback_| and the number of bytes to send to the | 117 // Initializes |finished_callback_| and the number of bytes to send to the |
| 115 // server. |finished_callback| is called when we are done with the test. | 118 // server. |finished_callback| is called when we are done with the test. |
| 116 // |finished_callback| is mainly useful for unittests. | 119 // |finished_callback| is mainly useful for unittests. |
| 117 void Initialize(uint32 bytes_to_send, | 120 void Initialize(uint32 bytes_to_send, |
| 118 HistogramPortSelector histogram_port, | 121 HistogramPortSelector histogram_port, |
| 122 bool has_proxy_server, | |
| 119 uint32 packets_to_send, | 123 uint32 packets_to_send, |
| 120 const net::CompletionCallback& finished_callback); | 124 const net::CompletionCallback& finished_callback); |
| 121 | 125 |
| 122 // Called after host is resolved. UDPStatsClient and TCPStatsClient implement | 126 // Called after host is resolved. UDPStatsClient and TCPStatsClient implement |
| 123 // this method. They create the socket and connect to the server. | 127 // this method. They create the socket and connect to the server. |
| 124 virtual bool DoConnect(int result) = 0; | 128 virtual bool DoConnect(int result) = 0; |
| 125 | 129 |
| 126 // This method is called after socket connection is completed. It will start | 130 // This method is called after socket connection is completed. It will start |
| 127 // the process of sending packets to |server| by calling SendPacket(). Returns | 131 // the process of sending packets to |server| by calling SendPacket(). Returns |
| 128 // false if connection is not established (result is less than 0). | 132 // false if connection is not established (result is less than 0). |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 219 | 223 |
| 220 // This method parses the "echo response" message in the |response| to verify | 224 // This method parses the "echo response" message in the |response| to verify |
| 221 // that the <payload> is same as what we had sent in "echo request" message. | 225 // that the <payload> is same as what we had sent in "echo request" message. |
| 222 // As it verifies the response in each packet, it also extracts the packet | 226 // As it verifies the response in each packet, it also extracts the packet |
| 223 // number, and records that said packet number responded. It returns SUCCESS, | 227 // number, and records that said packet number responded. It returns SUCCESS, |
| 224 // if all the bytes are verified. | 228 // if all the bytes are verified. |
| 225 NetworkStats::Status VerifyBytes(const std::string& response); | 229 NetworkStats::Status VerifyBytes(const std::string& response); |
| 226 | 230 |
| 227 // Returns the histogram names for collecting network connectivity stats. | 231 // Returns the histogram names for collecting network connectivity stats. |
| 228 // This is called by RecordHistograms. It sets the histogram names in | 232 // This is called by RecordHistograms. It sets the histogram names in |
| 229 // |rtt_histogram_name| and |status_histogram_name|. | 233 // |rtt_histogram_name|, |status_histogram_name| and |
| 230 // If |result| equals to net::OK, it returns | 234 // |packet_loss_histogram_name| and the corresponding no_proxy versions if |
| 235 // there is no proxy server. It returns | |
| 236 // "NetConnectivity.<protocol>.Status.<port>.<load_size>" as histogram name | |
| 237 // for status histogram in |status_histogram_name| and | |
| 238 // "NetConnectivity.<protocol>.PacketLoss.<port>.<load_size>" as histogram | |
| 239 // name for packet loss histogram. If |result| equals to net::OK, it returns | |
| 231 // "NetConnectivity.<protocol>.Success.<port>.<load_size>.RTT" as histogram | 240 // "NetConnectivity.<protocol>.Success.<port>.<load_size>.RTT" as histogram |
| 232 // name for RTT histogram, | 241 // name in |rtt_histogram_name|. If |has_proxy_server| is false, it returns |
| 233 // "NetConnectivity.<protocol>.Status.<port>.<load_size>" as histogram name | 242 // "NetConnectivity.<protocol>.NoProxy.Success.<port>.<load_size>.RTT" as |
| 234 // for status histogram and | 243 // no proxy RTT histogram, |
| 235 // "NetConnectivity.<protocol>.PacketLoss.<port>.<load_size>" as histogram | 244 // "NetConnectivity.<protocol>.NoProxy.Status.<port>.<load_size>" as no proxy |
|
jar (doing other things)
2012/05/03 16:41:34
I expect that you'll be most interesting in compar
ramant (doing other things)
2012/05/04 03:53:11
Done.
| |
| 236 // name for packet loss histogram. | 245 // status histogram and |
| 246 // "NetConnectivity.<protocol>.NoProxy.PacketLoss.<port>.<load_size>" as no | |
| 247 // proxy packet loss histogram. | |
| 237 // |protocol| argument sets <protocol> in the histogram name. It would be | 248 // |protocol| argument sets <protocol> in the histogram name. It would be |
| 238 // either TCP or UDP. <port> is the string representation of |histogram_port|. | 249 // either TCP or UDP. <port> is the string representation of |histogram_port|. |
| 239 // |load_size| argument determines <load_size> in the histogram name. It would | 250 // |load_size| argument determines <load_size> in the histogram name. It would |
| 240 // be either 100B or 1K. | 251 // be either 100B or 1K. |
| 241 static void GetHistogramNames(const ProtocolValue& protocol, | 252 static void GetHistogramNames( |
| 242 HistogramPortSelector histogram_port, | 253 const ProtocolValue& protocol, |
| 243 uint32 load_size, | 254 HistogramPortSelector histogram_port, |
| 244 int result, | 255 bool has_proxy_server, |
| 245 std::string* rtt_histogram_name, | 256 uint32 load_size, |
| 246 std::string* status_histogram_name, | 257 int result, |
| 247 std::string* packet_loss_histogram_name); | 258 std::string* rtt_histogram_name, |
| 259 std::string* rtt_no_proxy_histogram_name, | |
| 260 std::string* status_histogram_name, | |
| 261 std::string* status_no_proxy_histogram_name, | |
| 262 std::string* packet_loss_histogram_name, | |
| 263 std::string* packet_loss_no_proxy_histogram_name); | |
| 248 | 264 |
| 249 // The socket handle for this session. | 265 // The socket handle for this session. |
| 250 scoped_ptr<net::Socket> socket_; | 266 scoped_ptr<net::Socket> socket_; |
| 251 | 267 |
| 252 // The read buffer used to read data from the socket. | 268 // The read buffer used to read data from the socket. |
| 253 scoped_refptr<net::IOBuffer> read_buffer_; | 269 scoped_refptr<net::IOBuffer> read_buffer_; |
| 254 | 270 |
| 255 // The write buffer used to write data to the socket. | 271 // The write buffer used to write data to the socket. |
| 256 scoped_refptr<net::DrainableIOBuffer> write_buffer_; | 272 scoped_refptr<net::DrainableIOBuffer> write_buffer_; |
| 257 | 273 |
| 258 // Some counters for the session. | 274 // Some counters for the session. |
| 259 uint32 load_size_; | 275 uint32 load_size_; |
| 260 uint32 bytes_to_read_; | 276 uint32 bytes_to_read_; |
| 261 uint32 bytes_to_send_; | 277 uint32 bytes_to_send_; |
| 262 | 278 |
| 263 // The encoded message read from the server. | 279 // The encoded message read from the server. |
| 264 std::string encoded_message_; | 280 std::string encoded_message_; |
| 265 | 281 |
| 266 // |stream_| is used to generate data to be sent to the server and it is also | 282 // |stream_| is used to generate data to be sent to the server and it is also |
| 267 // used to verify the data received from the server. | 283 // used to verify the data received from the server. |
| 268 net::TestDataStream stream_; | 284 net::TestDataStream stream_; |
| 269 | 285 |
| 270 // |histogram_port_| specifies the port for which we are testing the network | 286 // |histogram_port_| specifies the port for which we are testing the network |
| 271 // connectivity. | 287 // connectivity. |
| 272 HistogramPortSelector histogram_port_; | 288 HistogramPortSelector histogram_port_; |
| 273 | 289 |
| 290 // |has_proxy_server_| specifies if there is a proxy server or not. | |
| 291 bool has_proxy_server_; | |
| 292 | |
| 274 // HostResolver fills out the |addresses_| after host resolution is completed. | 293 // HostResolver fills out the |addresses_| after host resolution is completed. |
| 275 net::AddressList addresses_; | 294 net::AddressList addresses_; |
| 276 | 295 |
| 277 // Callback to call when echo protocol is successefully finished or whenever | 296 // Callback to call when echo protocol is successefully finished or whenever |
| 278 // there is an error (this allows unittests to wait until echo protocol's | 297 // there is an error (this allows unittests to wait until echo protocol's |
| 279 // round trip is finished). | 298 // round trip is finished). |
| 280 net::CompletionCallback finished_callback_; | 299 net::CompletionCallback finished_callback_; |
| 281 | 300 |
| 282 // The time when the session was started. | 301 // The time when the session was started. |
| 283 base::TimeTicks start_time_; | 302 base::TimeTicks start_time_; |
| 284 | 303 |
| 285 // Data to track number of packets to send to the server and the packets we | 304 // Data to track number of packets to send to the server and the packets we |
| 286 // have received from the server. | 305 // have received from the server. |
| 287 uint32 packets_to_send_; | 306 uint32 packets_to_send_; |
| 288 uint32 packets_sent_; | 307 uint32 packets_sent_; |
| 289 uint32 base_packet_number_; | 308 uint32 base_packet_number_; |
| 290 uint32 packets_received_mask_; | 309 uint32 packets_received_mask_; |
| 291 | 310 |
| 292 // We use this factory to create timeout tasks for socket's ReadData. | 311 // We use this factory to create timeout tasks for socket's ReadData. |
| 293 base::WeakPtrFactory<NetworkStats> weak_factory_; | 312 base::WeakPtrFactory<NetworkStats> weak_factory_; |
| 294 }; | 313 }; |
| 295 | 314 |
| 296 class UDPStatsClient : public NetworkStats { | 315 class UDPStatsClient : public NetworkStats { |
| 297 public: | 316 public: |
| 298 // Constructs an UDPStatsClient object that collects metrics for UDP | 317 // Constructs an UDPStatsClient object that collects metrics for UDP |
| 299 // connectivity. | 318 // connectivity. |
| 300 UDPStatsClient(); | 319 UDPStatsClient(); |
| 320 // UDPStatsClient is deleted when Finish() is called. | |
| 301 virtual ~UDPStatsClient(); | 321 virtual ~UDPStatsClient(); |
| 302 | 322 |
| 303 protected: | 323 protected: |
| 304 // Allow tests to access our innards for testing purposes. | 324 // Allow tests to access our innards for testing purposes. |
| 305 friend class NetworkStatsTestUDP; | 325 friend class NetworkStatsTestUDP; |
| 306 | 326 |
| 307 // Called after host is resolved. Creates UDClientSocket and connects to the | 327 // Called after host is resolved. Creates UDClientSocket and connects to the |
| 308 // server. If successfully connected, then calls ConnectComplete() to start | 328 // server. If successfully connected, then calls ConnectComplete() to start |
| 309 // the echo protocol. Returns |false| if there is any error. | 329 // the echo protocol. Returns |false| if there is any error. |
| 310 virtual bool DoConnect(int result) OVERRIDE; | 330 virtual bool DoConnect(int result) OVERRIDE; |
| 311 | 331 |
| 312 // This method calls NetworkStats::ReadComplete() to verify the data and calls | 332 // This method calls NetworkStats::ReadComplete() to verify the data and calls |
| 313 // Finish() if there is an error or if read callback didn't return any data | 333 // Finish() if there is an error or if read callback didn't return any data |
| 314 // (|result| is less than or equal to 0). | 334 // (|result| is less than or equal to 0). |
| 315 virtual bool ReadComplete(int result) OVERRIDE; | 335 virtual bool ReadComplete(int result) OVERRIDE; |
| 316 | 336 |
| 317 // Collects stats for UDP connectivity. This is called when all the data from | 337 // Collects stats for UDP connectivity. This is called when all the data from |
| 318 // server is read or when there is a failure during connect/read/write. | 338 // server is read or when there is a failure during connect/read/write. This |
| 339 // object is deleted at the end of this method. | |
| 319 virtual void Finish(Status status, int result) OVERRIDE; | 340 virtual void Finish(Status status, int result) OVERRIDE; |
| 320 }; | 341 }; |
| 321 | 342 |
| 322 class TCPStatsClient : public NetworkStats { | 343 class TCPStatsClient : public NetworkStats { |
| 323 public: | 344 public: |
| 324 // Constructs a TCPStatsClient object that collects metrics for TCP | 345 // Constructs a TCPStatsClient object that collects metrics for TCP |
| 325 // connectivity. | 346 // connectivity. |
| 326 TCPStatsClient(); | 347 TCPStatsClient(); |
| 348 // TCPStatsClient is deleted when Finish() is called. | |
| 327 virtual ~TCPStatsClient(); | 349 virtual ~TCPStatsClient(); |
| 328 | 350 |
| 329 protected: | 351 protected: |
| 330 // Allow tests to access our innards for testing purposes. | 352 // Allow tests to access our innards for testing purposes. |
| 331 friend class NetworkStatsTestTCP; | 353 friend class NetworkStatsTestTCP; |
| 332 | 354 |
| 333 // Called after host is resolved. Creates TCPClientSocket and connects to the | 355 // Called after host is resolved. Creates TCPClientSocket and connects to the |
| 334 // server. | 356 // server. |
| 335 virtual bool DoConnect(int result) OVERRIDE; | 357 virtual bool DoConnect(int result) OVERRIDE; |
| 336 | 358 |
| 337 // This method calls NetworkStats::ReadComplete() to verify the data and calls | 359 // This method calls NetworkStats::ReadComplete() to verify the data and calls |
| 338 // Finish() if there is an error (|result| is less than 0). | 360 // Finish() if there is an error (|result| is less than 0). |
| 339 virtual bool ReadComplete(int result) OVERRIDE; | 361 virtual bool ReadComplete(int result) OVERRIDE; |
| 340 | 362 |
| 341 // Collects stats for TCP connectivity. This is called when all the data from | 363 // Collects stats for TCP connectivity. This is called when all the data from |
| 342 // server is read or when there is a failure during connect/read/write. | 364 // server is read or when there is a failure during connect/read/write. This |
| 365 // object is deleted at the end of this method. | |
| 343 virtual void Finish(Status status, int result) OVERRIDE; | 366 virtual void Finish(Status status, int result) OVERRIDE; |
| 344 | 367 |
| 345 private: | 368 private: |
| 346 // Callback that is called when connect is completed and calls | 369 // Callback that is called when connect is completed and calls |
| 347 // ConnectComplete() to start the echo protocol. | 370 // ConnectComplete() to start the echo protocol. |
| 348 void OnConnectComplete(int result); | 371 void OnConnectComplete(int result); |
| 349 }; | 372 }; |
| 350 | 373 |
| 374 class ProxyClient { | |
|
jar (doing other things)
2012/05/03 16:41:34
I'm surprised to see this much work. Is the inten
ramant (doing other things)
2012/05/04 03:53:11
No. This code to detect the proxy runs before we r
| |
| 375 public: | |
| 376 // Constructs a ProxyClient object that resolves if access to | |
| 377 // network_stats_server goes through a proxy server or not. | |
| 378 ProxyClient(const std::string& network_stats_server, | |
| 379 NetworkStats::HistogramPortSelector histogram_port, | |
| 380 IOThread* io_thread); | |
| 381 virtual ~ProxyClient(); | |
| 382 | |
| 383 // This method uses system ProxyService to resolve the proxy for the given | |
| 384 // |network_stats_server| and |histogram_port|. | |
| 385 void ResolveProxy(); | |
| 386 | |
| 387 // Collects the network connectivity stats for UDP and TCP protocols. | |
| 388 void OnResolveProxyComplete(int result); | |
| 389 | |
| 390 private: | |
| 391 // |network_stats_server_| specifies the TCP/UDP echo server name. | |
| 392 std::string network_stats_server_; | |
| 393 | |
| 394 // |histogram_port_| specifies the port for which we are testing the network | |
| 395 // connectivity. | |
| 396 NetworkStats::HistogramPortSelector histogram_port_; | |
| 397 | |
| 398 // |proxy_info_| holds proxy information returned by ResolveProxy. | |
| 399 net::ProxyInfo proxy_info_; | |
| 400 | |
| 401 // The IOThread for accessing global HostResolver to resolve | |
| 402 // network_stats_server_ host and for accessing global system ProxyService. | |
| 403 // |io_thread_| is accessed on IO thread and it is safe to access it on IO | |
| 404 // thread. | |
| 405 IOThread* io_thread_; | |
| 406 }; | |
| 407 | |
| 351 // This collects the network connectivity stats for UDP and TCP for small | 408 // This collects the network connectivity stats for UDP and TCP for small |
| 352 // percentage of users who are participating in the experiment. All users must | 409 // percentage of users who are participating in the experiment. All users must |
| 353 // have enabled "UMA upload". This method gets called only if UMA upload to the | 410 // have enabled "UMA upload". This method gets called only if UMA upload to the |
| 354 // server has succeeded. | 411 // server has succeeded. |
| 355 void CollectNetworkStats(const std::string& network_stats_server_url, | 412 void CollectNetworkStats(const std::string& network_stats_server_url, |
| 356 IOThread* io_thread); | 413 IOThread* io_thread); |
| 357 | 414 |
| 358 } // namespace chrome_browser_net | 415 } // namespace chrome_browser_net |
| 359 | 416 |
| 360 #endif // CHROME_BROWSER_NET_NETWORK_STATS_H_ | 417 #endif // CHROME_BROWSER_NET_NETWORK_STATS_H_ |
| OLD | NEW |