| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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 #include "chrome/browser/net/network_stats.h" | 5 #include "chrome/browser/net/network_stats.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 10 #include "base/metrics/field_trial.h" | 10 #include "base/metrics/field_trial.h" |
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 } | 313 } |
| 314 | 314 |
| 315 int NetworkStats::ReadData() { | 315 int NetworkStats::ReadData() { |
| 316 if (!socket_.get()) | 316 if (!socket_.get()) |
| 317 return 0; | 317 return 0; |
| 318 | 318 |
| 319 if (read_state_ == READ_STATE_READ_PENDING) | 319 if (read_state_ == READ_STATE_READ_PENDING) |
| 320 return net::ERR_IO_PENDING; | 320 return net::ERR_IO_PENDING; |
| 321 | 321 |
| 322 int rv = 0; | 322 int rv = 0; |
| 323 do { | 323 while (true) { |
| 324 DCHECK(!read_buffer_.get()); | 324 DCHECK(!read_buffer_.get()); |
| 325 read_buffer_ = new net::IOBuffer(kMaxMessageSize); | 325 read_buffer_ = new net::IOBuffer(kMaxMessageSize); |
| 326 | 326 |
| 327 rv = socket_->Read( | 327 rv = socket_->Read( |
| 328 read_buffer_.get(), | 328 read_buffer_.get(), |
| 329 kMaxMessageSize, | 329 kMaxMessageSize, |
| 330 base::Bind(&NetworkStats::OnReadComplete, weak_factory_.GetWeakPtr())); | 330 base::Bind(&NetworkStats::OnReadComplete, weak_factory_.GetWeakPtr())); |
| 331 } while (rv > 0 && !ReadComplete(rv)); | 331 if (rv <= 0) |
| 332 break; |
| 333 if (ReadComplete(rv)) |
| 334 return rv; |
| 335 }; |
| 332 if (rv == net::ERR_IO_PENDING) | 336 if (rv == net::ERR_IO_PENDING) |
| 333 read_state_ = READ_STATE_READ_PENDING; | 337 read_state_ = READ_STATE_READ_PENDING; |
| 334 return rv; | 338 return rv; |
| 335 } | 339 } |
| 336 | 340 |
| 337 void NetworkStats::OnReadComplete(int result) { | 341 void NetworkStats::OnReadComplete(int result) { |
| 338 DCHECK_NE(net::ERR_IO_PENDING, result); | 342 DCHECK_NE(net::ERR_IO_PENDING, result); |
| 339 DCHECK_EQ(READ_STATE_READ_PENDING, read_state_); | 343 DCHECK_EQ(READ_STATE_READ_PENDING, read_state_); |
| 340 | 344 |
| 341 read_state_ = READ_STATE_IDLE; | 345 read_state_ = READ_STATE_IDLE; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 default: | 391 default: |
| 388 DVLOG(1) << "Received unexpected packet type: " | 392 DVLOG(1) << "Received unexpected packet type: " |
| 389 << probe_packet.header().type(); | 393 << probe_packet.header().type(); |
| 390 } | 394 } |
| 391 | 395 |
| 392 if (!current_test_complete) { | 396 if (!current_test_complete) { |
| 393 // All packets have not been received for the current test. | 397 // All packets have not been received for the current test. |
| 394 return false; | 398 return false; |
| 395 } | 399 } |
| 396 // All packets are received for the current test. | 400 // All packets are received for the current test. |
| 397 // Read completes if all tests are done. | 401 // Read completes if all tests are done (if TestPhaseComplete didn't start |
| 398 bool all_tests_done = current_test_index_ >= maximum_tests_ || | 402 // another test). |
| 399 current_test_index_ + 1 >= test_sequence_.size(); | 403 return TestPhaseComplete(SUCCESS, net::OK); |
| 400 TestPhaseComplete(SUCCESS, net::OK); | |
| 401 return all_tests_done; | |
| 402 } | 404 } |
| 403 | 405 |
| 404 bool NetworkStats::UpdateReception(const ProbePacket& probe_packet) { | 406 bool NetworkStats::UpdateReception(const ProbePacket& probe_packet) { |
| 405 uint32 packet_index = probe_packet.packet_index(); | 407 uint32 packet_index = probe_packet.packet_index(); |
| 406 if (packet_index >= packet_rtt_.size()) | 408 if (packet_index >= packet_rtt_.size()) |
| 407 return false; | 409 return false; |
| 408 packets_received_mask_.set(packet_index); | 410 packets_received_mask_.set(packet_index); |
| 409 TestType test_type = test_sequence_[current_test_index_]; | 411 TestType test_type = test_sequence_[current_test_index_]; |
| 410 uint32 received_packets = packets_received_mask_.count(); | 412 uint32 received_packets = packets_received_mask_.count(); |
| 411 | 413 |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 } | 525 } |
| 524 if (received_packets >= kMinimumReceivedPacketsForNATTest) { | 526 if (received_packets >= kMinimumReceivedPacketsForNATTest) { |
| 525 test_sequence_.push_back(TOKEN_REQUEST); | 527 test_sequence_.push_back(TOKEN_REQUEST); |
| 526 test_sequence_.push_back(NAT_BIND_TEST); | 528 test_sequence_.push_back(NAT_BIND_TEST); |
| 527 test_sequence_.push_back(TOKEN_REQUEST); | 529 test_sequence_.push_back(TOKEN_REQUEST); |
| 528 } | 530 } |
| 529 } | 531 } |
| 530 TestPhaseComplete(READ_TIMED_OUT, net::ERR_FAILED); | 532 TestPhaseComplete(READ_TIMED_OUT, net::ERR_FAILED); |
| 531 } | 533 } |
| 532 | 534 |
| 533 void NetworkStats::TestPhaseComplete(Status status, int result) { | 535 bool NetworkStats::TestPhaseComplete(Status status, int result) { |
| 534 // If there is no valid token, do nothing and delete self. | 536 // If there is no valid token, do nothing and delete self. |
| 535 // This includes all connection error, name resolve error, etc. | 537 // This includes all connection error, name resolve error, etc. |
| 536 if (write_state_ == WRITE_STATE_WRITE_PENDING) { | 538 if (write_state_ == WRITE_STATE_WRITE_PENDING) { |
| 537 UMA_HISTOGRAM_BOOLEAN("NetConnectivity5.TestFailed.WritePending", true); | 539 UMA_HISTOGRAM_BOOLEAN("NetConnectivity5.TestFailed.WritePending", true); |
| 538 } else if (token_.timestamp_micros() != 0 && | 540 } else if (status == SUCCESS || status == READ_TIMED_OUT) { |
| 539 (status == SUCCESS || status == READ_TIMED_OUT)) { | |
| 540 TestType current_test = test_sequence_[current_test_index_]; | 541 TestType current_test = test_sequence_[current_test_index_]; |
| 541 DCHECK_LT(current_test, TEST_TYPE_MAX); | 542 DCHECK_LT(current_test, TEST_TYPE_MAX); |
| 542 if (current_test != TOKEN_REQUEST) { | 543 if (current_test != TOKEN_REQUEST) { |
| 543 RecordHistograms(current_test); | 544 RecordHistograms(current_test); |
| 544 } else if (current_test_index_ > 0) { | 545 } else if (current_test_index_ > 0) { |
| 545 if (test_sequence_[current_test_index_ - 1] == NAT_BIND_TEST) { | 546 if (test_sequence_[current_test_index_ - 1] == NAT_BIND_TEST) { |
| 546 // We record the NATTestReceivedHistograms after the succeeding | 547 // We record the NATTestReceivedHistograms after the succeeding |
| 547 // TokenRequest. | 548 // TokenRequest. |
| 548 RecordNATTestReceivedHistograms(status); | 549 RecordNATTestReceivedHistograms(status); |
| 549 } else if (test_sequence_[current_test_index_ - 1] == PACKET_SIZE_TEST) { | 550 } else if (test_sequence_[current_test_index_ - 1] == PACKET_SIZE_TEST) { |
| 550 // We record the PacketSizeTestReceivedHistograms after the succeeding | 551 // We record the PacketSizeTestReceivedHistograms after the succeeding |
| 551 // TokenRequest. | 552 // TokenRequest. |
| 552 RecordPacketSizeTestReceivedHistograms(status); | 553 RecordPacketSizeTestReceivedHistograms(status); |
| 553 } | 554 } |
| 554 } | 555 } |
| 555 | 556 |
| 556 // Move to the next test. | 557 // Move to the next test. |
| 557 current_test = GetNextTest(); | 558 current_test = GetNextTest(); |
| 558 if (current_test_index_ <= maximum_tests_ && current_test < TEST_TYPE_MAX) { | 559 if (current_test_index_ <= maximum_tests_ && current_test < TEST_TYPE_MAX) { |
| 559 DVLOG(1) << "NetworkStat: Start Probe test: " << current_test; | 560 DVLOG(1) << "NetworkStat: Start Probe test: " << current_test; |
| 560 base::MessageLoop::current()->PostTask( | 561 base::MessageLoop::current()->PostTask( |
| 561 FROM_HERE, | 562 FROM_HERE, |
| 562 base::Bind(&NetworkStats::StartOneTest, weak_factory_.GetWeakPtr())); | 563 base::Bind(&NetworkStats::StartOneTest, weak_factory_.GetWeakPtr())); |
| 563 return; | 564 return false; |
| 564 } | 565 } |
| 565 } | 566 } |
| 566 | 567 |
| 567 // All tests are done. | 568 // All tests are done. |
| 568 DoFinishCallback(result); | 569 DoFinishCallback(result); |
| 569 | 570 |
| 570 // Close the socket so that there are no more IO operations. | 571 // Close the socket so that there are no more IO operations. |
| 571 if (socket_.get()) | 572 if (socket_.get()) |
| 572 socket_->Close(); | 573 socket_->Close(); |
| 573 | 574 |
| 574 DVLOG(1) << "NetworkStat: schedule delete self at test index " | 575 DVLOG(1) << "NetworkStat: schedule delete self at test index " |
| 575 << current_test_index_; | 576 << current_test_index_; |
| 576 delete this; | 577 delete this; |
| 578 return true; |
| 577 } | 579 } |
| 578 | 580 |
| 579 NetworkStats::TestType NetworkStats::GetNextTest() { | 581 NetworkStats::TestType NetworkStats::GetNextTest() { |
| 580 ++current_test_index_; | 582 ++current_test_index_; |
| 581 if (current_test_index_ >= test_sequence_.size()) | 583 if (current_test_index_ >= test_sequence_.size()) |
| 582 return TEST_TYPE_MAX; | 584 return TEST_TYPE_MAX; |
| 583 return test_sequence_[current_test_index_]; | 585 return test_sequence_[current_test_index_]; |
| 584 } | 586 } |
| 585 | 587 |
| 586 void NetworkStats::DoFinishCallback(int result) { | 588 void NetworkStats::DoFinishCallback(int result) { |
| (...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 945 udp_stats_client->Start(host_resolver, | 947 udp_stats_client->Start(host_resolver, |
| 946 server_address, | 948 server_address, |
| 947 histogram_port, | 949 histogram_port, |
| 948 has_proxy_server, | 950 has_proxy_server, |
| 949 kProbePacketBytes[probe_choice], | 951 kProbePacketBytes[probe_choice], |
| 950 bytes_for_packet_size_test, | 952 bytes_for_packet_size_test, |
| 951 net::CompletionCallback()); | 953 net::CompletionCallback()); |
| 952 } | 954 } |
| 953 | 955 |
| 954 } // namespace chrome_browser_net | 956 } // namespace chrome_browser_net |
| OLD | NEW |