| Index: chrome/browser/net/network_stats.h
|
| diff --git a/chrome/browser/net/network_stats.h b/chrome/browser/net/network_stats.h
|
| deleted file mode 100644
|
| index 4ce6c4ebd3e0b94e967606f0400367f7f836065a..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/net/network_stats.h
|
| +++ /dev/null
|
| @@ -1,390 +0,0 @@
|
| -// Copyright 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#ifndef CHROME_BROWSER_NET_NETWORK_STATS_H_
|
| -#define CHROME_BROWSER_NET_NETWORK_STATS_H_
|
| -
|
| -#include <bitset>
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/metrics/histogram.h"
|
| -#include "base/time/time.h"
|
| -#include "chrome/browser/io_thread.h"
|
| -#include "chrome/browser/net/probe_message.h"
|
| -#include "net/base/address_list.h"
|
| -#include "net/base/completion_callback.h"
|
| -#include "net/base/host_port_pair.h"
|
| -#include "net/base/io_buffer.h"
|
| -#include "net/proxy/proxy_info.h"
|
| -
|
| -namespace net {
|
| -class ClientSocketFactory;
|
| -class DatagramClientSocket;
|
| -class HostResolver;
|
| -class SingleRequestHostResolver;
|
| -}
|
| -
|
| -namespace chrome_browser_net {
|
| -
|
| -// This class is used for live experiment of network connectivity (for UDP)
|
| -// metrics. A small percentage of users participate in this experiment. All
|
| -// users (who are in the experiment) must have enabled "UMA upload".
|
| -// In the experiments, clients request the server to send some probing packets,
|
| -// collect some stats, and send back the results via UMA reports.
|
| -//
|
| -// This class collects the following stats from users who have opted in.
|
| -// a) RTT.
|
| -// b) packet inter-arrival time.
|
| -// c) packet losses for correlation and FEC experiments.
|
| -// d) packet losses for NAT binding test after idling for a certain period.
|
| -//
|
| -// There are three tests in one experiment. Right before each test, a
|
| -// HelloRequest is sent to get an updated token.
|
| -// 1. |START_PACKET_TEST|: 21 packets are sent from the server to the client
|
| -// without pacing.
|
| -// 2. |PACED_PACKET_TEST| or |NON_PACED_PACKET_TEST|: After the first test,
|
| -// 21 packets are sent from the server to the client with or without pacing.
|
| -// If pacing, the pacing rate is computed from the first test.
|
| -// 3. |NAT_BIND_TEST|: 2 packets are sent from the server to the client with
|
| -// a randomly generated delay of 1~300 seconds.
|
| -// At the end of these tests, we send another HelloRequest to test whether
|
| -// the network is still connected and has not changed (e.g. from Wifi to 3g).
|
| -
|
| -class NetworkStats {
|
| - public:
|
| - enum Status { // Used in UMA_HISTOGRAM_ENUMERATION.
|
| - SUCCESS, // Successfully received bytes from the server.
|
| - SOCKET_CREATE_FAILED, // Socket creation failed.
|
| - RESOLVE_FAILED, // Host resolution failed.
|
| - CONNECT_FAILED, // Connection to the server failed.
|
| - WRITE_FAILED, // Sending a message to the server failed.
|
| - READ_TIMED_OUT, // Reading the reply from the server timed out.
|
| - READ_FAILED, // Reading the reply from the server failed.
|
| - STATUS_MAX, // Bounding value.
|
| - };
|
| -
|
| - enum ReadState { // Used to track if |socket_| has a pending read.
|
| - READ_STATE_IDLE,
|
| - READ_STATE_READ_PENDING,
|
| - };
|
| -
|
| - enum WriteState { // Used to track if |socket_| has a pending write.
|
| - WRITE_STATE_IDLE,
|
| - WRITE_STATE_WRITE_PENDING,
|
| - };
|
| -
|
| - // |TestType| specifies the possible tests we may run
|
| - // (except for the first and the last serving as boundaries).
|
| - enum TestType {
|
| - // The first one is for requesting token, not a probe test. Put it here
|
| - // because we use it as a symbol for sending the HelloRequest packet to
|
| - // acquire the token.
|
| - TOKEN_REQUEST,
|
| - START_PACKET_TEST, // First packet loss test (no pacing).
|
| - NON_PACED_PACKET_TEST, // Packet loss test with no pacing.
|
| - PACED_PACKET_TEST, // Packet loss test with pacing.
|
| - // Test whether NAT binding expires after some idle period.
|
| - NAT_BIND_TEST,
|
| - PACKET_SIZE_TEST,
|
| - TEST_TYPE_MAX,
|
| - };
|
| -
|
| - // Pointer |socket_factory| is NOT deleted by this class.
|
| - explicit NetworkStats(net::ClientSocketFactory* socket_factory);
|
| - // NetworkStats is deleted in TestPhaseComplete() when all tests are done.
|
| - ~NetworkStats();
|
| -
|
| - // Start the client and connect to |server|.
|
| - // A client will request a token and then perform several tests.
|
| - // When the client finishes all tests, or when an error occurs causing the
|
| - // client to stop, |TestPhaseComplete| will be called with a net status code.
|
| - // |TestPhaseComplete| will collect histogram stats.
|
| - // Return true if successful in starting the client.
|
| - bool Start(net::HostResolver* host_resolver,
|
| - const net::HostPortPair& server,
|
| - uint16 histogram_port,
|
| - bool has_proxy_server,
|
| - uint32 probe_bytes,
|
| - uint32 bytes_for_packet_size_test,
|
| - const net::CompletionCallback& callback);
|
| -
|
| - private:
|
| - friend class NetworkStatsTest;
|
| -
|
| - // Start the test specified by the current_test_index_. It also resets all
|
| - // the book keeping data, before starting the new test.
|
| - void StartOneTest();
|
| -
|
| - // Reset all the counters and the collected stats.
|
| - void ResetData();
|
| -
|
| - // Callback that is called when host resolution is completed.
|
| - void OnResolveComplete(int result);
|
| -
|
| - // Called after host is resolved. Creates UDPClientSocket and connects to the
|
| - // server. If successfully connected, then calls ConnectComplete() to start
|
| - // the network connectivity tests. Returns |false| if there is any error.
|
| - bool DoConnect(int result);
|
| -
|
| - // This method is called after socket connection is completed. It will start
|
| - // the process of sending packets to |server| by calling SendHelloPacket().
|
| - // Return false if connection is not established (result is less than 0).
|
| - bool ConnectComplete(int result);
|
| -
|
| - // Send a HelloRequest packet which asks for a token from the server. If
|
| - // a token is received, it will will add |START_PACKET_TEST| to the test
|
| - // queue.
|
| - void SendHelloRequest();
|
| -
|
| - // Send a ProbeRequest packet which requests the server to send a set
|
| - // of Probing packets.
|
| - void SendProbeRequest();
|
| -
|
| - // Read and process the data. Called from OnReadComplete() or ReadData().
|
| - // This function calls TestPhaseComplete() if there is a significant network
|
| - // error or if all packets in the current test are received.
|
| - // Return true if TestPhaseComplete() is called otherwise return false.
|
| - bool ReadComplete(int result);
|
| -
|
| - // Callbacks when an internal IO (Read or Write) is completed.
|
| - void OnReadComplete(int result);
|
| - void OnWriteComplete(int result);
|
| -
|
| - // Read data from server until an error or IO blocking occurs or reading is
|
| - // complete. Return the result value from socket reading and 0 if |socket_|
|
| - // is Null.
|
| - int ReadData();
|
| -
|
| - // Send data contained in |str| to server.
|
| - // Return a negative value if IO blocking occurs or there is an error.
|
| - // Otherwise return net::OK.
|
| - int SendData(const std::string& str);
|
| -
|
| - // Update the send buffer (telling it that |bytes_sent| has been sent).
|
| - // And reset |write_buffer_|.
|
| - void UpdateSendBuffer(int bytes_sent);
|
| -
|
| - // Start a timer (with value |milliseconds|) for responses from the probe
|
| - // servers. |test_index| is the index of the test at vector |test_sequence_|
|
| - // and it is used as a parameter of the timer callback.
|
| - void StartReadDataTimer(uint32 milliseconds, uint32 test_index);
|
| -
|
| - // Called when the StartReadDataTimer fires. |test_index| specifies
|
| - // the index of the test. If |current_test_index_| has changed to a
|
| - // different value, it indicates |test_index| has completed, then
|
| - // this method is a no-op.
|
| - void OnReadDataTimeout(uint32 test_index);
|
| -
|
| - // Collect network connectivity stats. This is called when all the data from
|
| - // server is read or when there is a failure during connect/read/write. It
|
| - // will either start the next phase of the test, or it will self destruct
|
| - // at the end of this method. Returns true if a new test wasn't started and it
|
| - // was self destructed.
|
| - bool TestPhaseComplete(Status status, int result);
|
| -
|
| - // This method is called from TestPhaseComplete() and calls
|
| - // |finished_callback_| callback to indicate that the test has finished.
|
| - void DoFinishCallback(int result);
|
| -
|
| - // Update counters/metrics for the given |probe_packet|.
|
| - // Return true if all packets for the current test are received and
|
| - // false otherwise.
|
| - bool UpdateReception(const ProbePacket& probe_packet);
|
| -
|
| - // Record all histograms for current test phase, which is assumed to be
|
| - // complete (i.e., we are no longer waiting for packets in this phase).
|
| - // |test_type| is the current test_type to be recorded. |status| is the
|
| - // status of the current test.
|
| - void RecordHistograms(TestType test_type);
|
| -
|
| - // Collect the following network connectivity stats when
|
| - // kMaximumSequentialPackets (21) packets are sent from the server.
|
| - // a) Client received at least one packet.
|
| - // b) Client received the nth packet.
|
| - // c) The number of packets received for each subsequence of packets 1...n.
|
| - void RecordPacketsReceivedHistograms(TestType test_type);
|
| -
|
| - // Collect the following network connectivity stats for the first
|
| - // kMaximumCorrelationPackets (6) packets in a test.
|
| - // Success/failure of each packet, to estimate reachability for users,
|
| - // and to estimate if there is a probabalistic dependency in packet loss when
|
| - // kMaximumCorrelationPackets packets are sent consecutively.
|
| - void RecordPacketLossSeriesHistograms(TestType test_type);
|
| -
|
| - // Collect the average inter-arrival time (scaled up by 20 times because the
|
| - // minimum time value in a histogram is 1ms) of a sequence of probing packets.
|
| - void RecordInterArrivalHistograms(TestType test_type);
|
| -
|
| - // Collect the RTT for the packet specified by the |index| in the current
|
| - // test.
|
| - void RecordRTTHistograms(TestType test_type, uint32 index);
|
| -
|
| - // Collect whether the second packet in the NAT test is received for the
|
| - // given idle time.
|
| - void RecordNATTestReceivedHistograms(Status status);
|
| -
|
| - // Collect whether we have the requested packet size was received or not in
|
| - // the PACKET_SIZE_TEST test.
|
| - void RecordPacketSizeTestReceivedHistograms(Status status);
|
| -
|
| - // Record the time duration between sending the probe request and receiving
|
| - // the last probe packet excluding the pacing time requested by the client.
|
| - // This applies to both NAT bind test and paced/non-paced packet test.
|
| - void RecordSendToLastRecvDelayHistograms(TestType test_type);
|
| -
|
| - // Return the next test type (internally increment |current_test_index_|)
|
| - // in |test_sequence_|;
|
| - TestType GetNextTest();
|
| -
|
| - // These static variables are defined so that they can be changed in testing.
|
| - // Maximum number of tests in one activation of the experiment.
|
| - static uint32 maximum_tests_;
|
| - // Maximum number of packets for START/PACED/NON_PACED tests.
|
| - static uint32 maximum_sequential_packets_;
|
| - // Maximum number of packets for NAT binding test.
|
| - static uint32 maximum_NAT_packets_;
|
| - // Maximum time duration between the two packets for NAT Bind testing.
|
| - static uint32 maximum_NAT_idle_seconds_;
|
| - // Whether to start the probe test immediately after connect success.
|
| - // Used for unittest.
|
| - static bool start_test_after_connect_;
|
| -
|
| - // The socket handler for this session.
|
| - scoped_ptr<net::DatagramClientSocket> socket_;
|
| -
|
| - net::ClientSocketFactory* socket_factory_;
|
| -
|
| - // The read buffer used to read data from the socket.
|
| - scoped_refptr<net::IOBuffer> read_buffer_;
|
| -
|
| - // The write buffer used to write data to the socket.
|
| - scoped_refptr<net::DrainableIOBuffer> write_buffer_;
|
| -
|
| - // Specify the port for which we are testing the network connectivity.
|
| - uint16 histogram_port_;
|
| -
|
| - // Specify if there is a proxy server or not.
|
| - bool has_proxy_server_;
|
| -
|
| - // HostResolver used to find the IP addresses.
|
| - scoped_ptr<net::SingleRequestHostResolver> resolver_;
|
| -
|
| - // Addresses filled out by HostResolver after host resolution is completed.
|
| - net::AddressList addresses_;
|
| -
|
| - // Callback to call when test is successefully finished or whenever
|
| - // there is an error (this will be used by unittests to check the result).
|
| - net::CompletionCallback finished_callback_;
|
| -
|
| - // RTTs for each packet.
|
| - std::vector<base::TimeDelta> packet_rtt_;
|
| -
|
| - // Time when sending probe_request, used for computing RTT.
|
| - base::TimeTicks probe_request_time_;
|
| -
|
| - // Size of the probe packets requested to be sent from servers. We don't use
|
| - // |probe_packet_bytes_| during PACKET_SIZE_TEST.
|
| - uint32 probe_packet_bytes_;
|
| -
|
| - // Size of the packet requested to be sent from servers for PACKET_SIZE_TEST.
|
| - uint32 bytes_for_packet_size_test_;
|
| -
|
| - // bitmask indicating which packets are received.
|
| - std::bitset<21> packets_received_mask_;
|
| -
|
| - // Arrival time of the first packet in the current test.
|
| - base::TimeTicks first_arrival_time_;
|
| - // Arrival time of the most recently received packet in the current test.
|
| - base::TimeTicks last_arrival_time_;
|
| - // Average time between two consecutive packets. It is updated when either all
|
| - // packets are received or timeout happens in the current test.
|
| - base::TimeDelta inter_arrival_time_;
|
| - // Target time duration for sending two consecutive packets at the server.
|
| - // It should be 0 for StartPacket test or NonPacedPacket test. For
|
| - // PacedPacket test, it is derived from the inter_arrival_time_ in the
|
| - // previous (StartPacket) test. For NATBind test, it is randomly generated
|
| - // between 1 second and |maximum_NAT_idle_seconds_| seconds.
|
| - base::TimeDelta pacing_interval_;
|
| - // A list of tests that will be performed in sequence.
|
| - std::vector<TestType> test_sequence_;
|
| - uint32 current_test_index_; // Index of the current test.
|
| -
|
| - ProbeMessage probe_message_;
|
| -
|
| - // Token received from server for authentication.
|
| - ProbePacket_Token token_;
|
| -
|
| - // The state variables to track pending reads/writes.
|
| - ReadState read_state_;
|
| - WriteState write_state_;
|
| -
|
| - // We use this factory to create timeout tasks for socket's ReadData.
|
| - base::WeakPtrFactory<NetworkStats> weak_factory_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(NetworkStats);
|
| -};
|
| -
|
| -class ProxyDetector {
|
| - public:
|
| - // Used for the callback that is called from |OnResolveProxyComplete|.
|
| - typedef base::Callback<void(bool)> OnResolvedCallback;
|
| -
|
| - // Construct a ProxyDetector object that finds out if access to
|
| - // |server_address| goes through a proxy server or not. Calls the |callback|
|
| - // after proxy resolution is completed by currying the proxy resolution
|
| - // status.
|
| - ProxyDetector(net::ProxyService* proxy_service,
|
| - const net::HostPortPair& server_address,
|
| - OnResolvedCallback callback);
|
| -
|
| - // This method uses |proxy_service_| to resolve the proxy for
|
| - // |server_address_|.
|
| - void StartResolveProxy();
|
| -
|
| - private:
|
| - // This object is deleted from |OnResolveProxyComplete|.
|
| - ~ProxyDetector();
|
| -
|
| - // Call the |callback_| by currying the proxy resolution status.
|
| - void OnResolveProxyComplete(int result);
|
| -
|
| - // |proxy_service_| specifies the proxy service that is to be used to find
|
| - // if access to |server_address_| goes through proxy server or not.
|
| - net::ProxyService* proxy_service_;
|
| -
|
| - // |server_address_| specifies the server host and port pair for which we are
|
| - // trying to see if access to it, goes through proxy or not.
|
| - net::HostPortPair server_address_;
|
| -
|
| - // |callback_| will be called after proxy resolution is completed.
|
| - OnResolvedCallback callback_;
|
| -
|
| - // |proxy_info_| holds proxy information returned by ResolveProxy.
|
| - net::ProxyInfo proxy_info_;
|
| -
|
| - // Indicate if there is a pending a proxy resolution. We use this to assert
|
| - // that there is no in-progress proxy resolution request.
|
| - bool has_pending_proxy_resolution_;
|
| - DISALLOW_COPY_AND_ASSIGN(ProxyDetector);
|
| -};
|
| -
|
| -// This collects the network connectivity stats for UDP protocol for small
|
| -// percentage of users who are participating in the experiment (by enabling
|
| -// "UMA upload"). This method gets called only if UMA upload to the
|
| -// server has succeeded.
|
| -void CollectNetworkStats(const std::string& network_stats_server_url,
|
| - IOThread* io_thread);
|
| -
|
| -// This starts a series of tests randomly selected among one of the three
|
| -// choices of probe packet sizes: 100 Bytes, 500 Bytes, 1200 Bytes.
|
| -void StartNetworkStatsTest(net::HostResolver* host_resolver,
|
| - const net::HostPortPair& server_address,
|
| - uint16 histogram_port,
|
| - bool has_proxy_server);
|
| -
|
| -} // namespace chrome_browser_net
|
| -
|
| -#endif // CHROME_BROWSER_NET_NETWORK_STATS_H_
|
|
|