OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "net/nqe/network_quality_estimator.h" | 5 #include "net/nqe/network_quality_estimator.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 #include <limits> | 9 #include <limits> |
10 #include <utility> | 10 #include <utility> |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 use_small_responses_(use_smaller_responses_for_tests), | 238 use_small_responses_(use_smaller_responses_for_tests), |
239 disable_offline_check_(false), | 239 disable_offline_check_(false), |
240 add_default_platform_observations_(add_default_platform_observations), | 240 add_default_platform_observations_(add_default_platform_observations), |
241 tick_clock_(new base::DefaultTickClock()), | 241 tick_clock_(new base::DefaultTickClock()), |
242 last_connection_change_(tick_clock_->NowTicks()), | 242 last_connection_change_(tick_clock_->NowTicks()), |
243 current_network_id_(nqe::internal::NetworkID( | 243 current_network_id_(nqe::internal::NetworkID( |
244 NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN, | 244 NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN, |
245 std::string())), | 245 std::string())), |
246 downstream_throughput_kbps_observations_( | 246 downstream_throughput_kbps_observations_( |
247 params_->weight_multiplier_per_second(), | 247 params_->weight_multiplier_per_second(), |
248 params_->weight_multiplier_per_dbm()), | 248 params_->weight_multiplier_per_signal_strength_level()), |
249 rtt_observations_(params_->weight_multiplier_per_second(), | 249 rtt_observations_(params_->weight_multiplier_per_second(), |
250 params_->weight_multiplier_per_dbm()), | 250 params_->weight_multiplier_per_signal_strength_level()), |
251 effective_connection_type_at_last_main_frame_( | 251 effective_connection_type_at_last_main_frame_( |
252 EFFECTIVE_CONNECTION_TYPE_UNKNOWN), | 252 EFFECTIVE_CONNECTION_TYPE_UNKNOWN), |
253 external_estimate_provider_(std::move(external_estimates_provider)), | 253 external_estimate_provider_(std::move(external_estimates_provider)), |
254 effective_connection_type_recomputation_interval_( | 254 effective_connection_type_recomputation_interval_( |
255 base::TimeDelta::FromSeconds(10)), | 255 base::TimeDelta::FromSeconds(10)), |
256 rtt_observations_size_at_last_ect_computation_(0), | 256 rtt_observations_size_at_last_ect_computation_(0), |
257 throughput_observations_size_at_last_ect_computation_(0), | 257 throughput_observations_size_at_last_ect_computation_(0), |
258 effective_connection_type_(EFFECTIVE_CONNECTION_TYPE_UNKNOWN), | 258 effective_connection_type_(EFFECTIVE_CONNECTION_TYPE_UNKNOWN), |
259 signal_strength_dbm_(INT32_MIN), | |
260 min_signal_strength_since_connection_change_(INT32_MAX), | |
261 max_signal_strength_since_connection_change_(INT32_MIN), | |
262 event_creator_(net_log), | 259 event_creator_(net_log), |
263 disallowed_observation_sources_for_http_( | 260 disallowed_observation_sources_for_http_( |
264 {NETWORK_QUALITY_OBSERVATION_SOURCE_TCP, | 261 {NETWORK_QUALITY_OBSERVATION_SOURCE_TCP, |
265 NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC, | 262 NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC, |
266 NETWORK_QUALITY_OBSERVATION_SOURCE_TRANSPORT_CACHED_ESTIMATE, | 263 NETWORK_QUALITY_OBSERVATION_SOURCE_TRANSPORT_CACHED_ESTIMATE, |
267 NETWORK_QUALITY_OBSERVATION_SOURCE_DEFAULT_TRANSPORT_FROM_PLATFORM}), | 264 NETWORK_QUALITY_OBSERVATION_SOURCE_DEFAULT_TRANSPORT_FROM_PLATFORM}), |
268 disallowed_observation_sources_for_transport_( | 265 disallowed_observation_sources_for_transport_( |
269 {NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP, | 266 {NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP, |
270 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_EXTERNAL_ESTIMATE, | 267 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_EXTERNAL_ESTIMATE, |
271 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_CACHED_ESTIMATE, | 268 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_CACHED_ESTIMATE, |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
431 base::TimeDelta observed_http_rtt = | 428 base::TimeDelta observed_http_rtt = |
432 load_timing_info.receive_headers_end - load_timing_info.send_start; | 429 load_timing_info.receive_headers_end - load_timing_info.send_start; |
433 DCHECK_GE(observed_http_rtt, base::TimeDelta()); | 430 DCHECK_GE(observed_http_rtt, base::TimeDelta()); |
434 if (observed_http_rtt < peak_network_quality_.http_rtt() || | 431 if (observed_http_rtt < peak_network_quality_.http_rtt() || |
435 peak_network_quality_.http_rtt() == nqe::internal::InvalidRTT()) { | 432 peak_network_quality_.http_rtt() == nqe::internal::InvalidRTT()) { |
436 peak_network_quality_ = nqe::internal::NetworkQuality( | 433 peak_network_quality_ = nqe::internal::NetworkQuality( |
437 observed_http_rtt, peak_network_quality_.transport_rtt(), | 434 observed_http_rtt, peak_network_quality_.transport_rtt(), |
438 peak_network_quality_.downstream_throughput_kbps()); | 435 peak_network_quality_.downstream_throughput_kbps()); |
439 } | 436 } |
440 | 437 |
441 RttObservation http_rtt_observation( | 438 RttObservation http_rtt_observation(observed_http_rtt, |
442 observed_http_rtt, tick_clock_->NowTicks(), signal_strength_dbm_, | 439 tick_clock_->NowTicks(), signal_strength_, |
443 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP); | 440 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP); |
444 rtt_observations_.AddObservation(http_rtt_observation); | 441 rtt_observations_.AddObservation(http_rtt_observation); |
445 NotifyObserversOfRTT(http_rtt_observation); | 442 NotifyObserversOfRTT(http_rtt_observation); |
446 } | 443 } |
447 | 444 |
448 void NetworkQualityEstimator::RecordAccuracyAfterMainFrame( | 445 void NetworkQualityEstimator::RecordAccuracyAfterMainFrame( |
449 base::TimeDelta measuring_duration) const { | 446 base::TimeDelta measuring_duration) const { |
450 DCHECK(thread_checker_.CalledOnValidThread()); | 447 DCHECK(thread_checker_.CalledOnValidThread()); |
451 DCHECK_EQ(0, measuring_duration.InMilliseconds() % 1000); | 448 DCHECK_EQ(0, measuring_duration.InMilliseconds() % 1000); |
452 DCHECK(ContainsValue(GetAccuracyRecordingIntervals(), measuring_duration)); | 449 DCHECK(ContainsValue(GetAccuracyRecordingIntervals(), measuring_duration)); |
453 | 450 |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
798 last_effective_connection_type_computation_, | 795 last_effective_connection_type_computation_, |
799 network_quality_, effective_connection_type_)); | 796 network_quality_, effective_connection_type_)); |
800 | 797 |
801 // Clear the local state. | 798 // Clear the local state. |
802 last_connection_change_ = tick_clock_->NowTicks(); | 799 last_connection_change_ = tick_clock_->NowTicks(); |
803 peak_network_quality_ = nqe::internal::NetworkQuality(); | 800 peak_network_quality_ = nqe::internal::NetworkQuality(); |
804 downstream_throughput_kbps_observations_.Clear(); | 801 downstream_throughput_kbps_observations_.Clear(); |
805 rtt_observations_.Clear(); | 802 rtt_observations_.Clear(); |
806 | 803 |
807 #if defined(OS_ANDROID) | 804 #if defined(OS_ANDROID) |
808 if (params_->weight_multiplier_per_dbm() < 1.0 && | 805 if (params_->weight_multiplier_per_signal_strength_level() < 1.0 && |
809 NetworkChangeNotifier::IsConnectionCellular(current_network_id_.type)) { | 806 NetworkChangeNotifier::IsConnectionCellular(current_network_id_.type)) { |
810 UMA_HISTOGRAM_BOOLEAN( | 807 bool signal_strength_available = |
811 "NQE.CellularSignalStrengthAvailable", | 808 min_signal_strength_since_connection_change_ && |
812 min_signal_strength_since_connection_change_ != INT32_MAX && | 809 max_signal_strength_since_connection_change_; |
813 max_signal_strength_since_connection_change_ != INT32_MIN); | 810 UMA_HISTOGRAM_BOOLEAN("NQE.CellularSignalStrength.LevelAvailable", |
| 811 signal_strength_available); |
814 | 812 |
815 if (min_signal_strength_since_connection_change_ != INT32_MAX && | 813 if (signal_strength_available) { |
816 max_signal_strength_since_connection_change_ != INT32_MIN) { | |
817 UMA_HISTOGRAM_COUNTS_100( | 814 UMA_HISTOGRAM_COUNTS_100( |
818 "NQE.CellularSignalStrengthDifference", | 815 "NQE.CellularSignalStrength.LevelDifference", |
819 max_signal_strength_since_connection_change_ - | 816 max_signal_strength_since_connection_change_.value() - |
820 min_signal_strength_since_connection_change_); | 817 min_signal_strength_since_connection_change_.value()); |
821 } | 818 } |
822 } | 819 } |
823 #endif // OS_ANDROID | 820 #endif // OS_ANDROID |
824 signal_strength_dbm_ = INT32_MIN; | 821 signal_strength_.reset(); |
825 min_signal_strength_since_connection_change_ = INT32_MAX; | 822 min_signal_strength_since_connection_change_.reset(); |
826 max_signal_strength_since_connection_change_ = INT32_MIN; | 823 max_signal_strength_since_connection_change_.reset(); |
827 network_quality_ = nqe::internal::NetworkQuality(); | 824 network_quality_ = nqe::internal::NetworkQuality(); |
828 effective_connection_type_ = EFFECTIVE_CONNECTION_TYPE_UNKNOWN; | 825 effective_connection_type_ = EFFECTIVE_CONNECTION_TYPE_UNKNOWN; |
829 effective_connection_type_at_last_main_frame_ = | 826 effective_connection_type_at_last_main_frame_ = |
830 EFFECTIVE_CONNECTION_TYPE_UNKNOWN; | 827 EFFECTIVE_CONNECTION_TYPE_UNKNOWN; |
831 rtt_observations_size_at_last_ect_computation_ = 0; | 828 rtt_observations_size_at_last_ect_computation_ = 0; |
832 throughput_observations_size_at_last_ect_computation_ = 0; | 829 throughput_observations_size_at_last_ect_computation_ = 0; |
833 | 830 |
834 // Update the local state as part of preparation for the new connection. | 831 // Update the local state as part of preparation for the new connection. |
835 current_network_id_ = GetCurrentNetworkID(); | 832 current_network_id_ = GetCurrentNetworkID(); |
836 RecordNetworkIDAvailability(); | 833 RecordNetworkIDAvailability(); |
(...skipping 22 matching lines...) Expand all Loading... |
859 current_network_id_.type != NetworkChangeNotifier::CONNECTION_UNKNOWN && | 856 current_network_id_.type != NetworkChangeNotifier::CONNECTION_UNKNOWN && |
860 current_network_id_.type != NetworkChangeNotifier::CONNECTION_ETHERNET && | 857 current_network_id_.type != NetworkChangeNotifier::CONNECTION_ETHERNET && |
861 current_network_id_.type != NetworkChangeNotifier::CONNECTION_BLUETOOTH) { | 858 current_network_id_.type != NetworkChangeNotifier::CONNECTION_BLUETOOTH) { |
862 RecordExternalEstimateProviderMetrics( | 859 RecordExternalEstimateProviderMetrics( |
863 EXTERNAL_ESTIMATE_PROVIDER_STATUS_QUERIED); | 860 EXTERNAL_ESTIMATE_PROVIDER_STATUS_QUERIED); |
864 external_estimate_provider_->Update(); | 861 external_estimate_provider_->Update(); |
865 } | 862 } |
866 } | 863 } |
867 | 864 |
868 void NetworkQualityEstimator::UpdateSignalStrength() { | 865 void NetworkQualityEstimator::UpdateSignalStrength() { |
| 866 DCHECK(thread_checker_.CalledOnValidThread()); |
| 867 |
| 868 signal_strength_.reset(); |
869 #if defined(OS_ANDROID) | 869 #if defined(OS_ANDROID) |
870 if (params_->weight_multiplier_per_dbm() >= 1.0 || | 870 if (params_->weight_multiplier_per_signal_strength_level() >= 1.0) |
871 !NetworkChangeNotifier::IsConnectionCellular(current_network_id_.type) || | 871 return; |
872 !android::cellular_signal_strength::GetSignalStrengthDbm( | 872 if (!NetworkChangeNotifier::IsConnectionCellular(current_network_id_.type)) |
873 &signal_strength_dbm_)) { | 873 return; |
874 signal_strength_dbm_ = INT32_MIN; | 874 |
875 } | 875 signal_strength_ = |
876 min_signal_strength_since_connection_change_ = std::min( | 876 android::cellular_signal_strength::GetSignalStrengthLevel(); |
877 min_signal_strength_since_connection_change_, signal_strength_dbm_); | 877 |
878 max_signal_strength_since_connection_change_ = std::max( | 878 if (!signal_strength_) |
879 max_signal_strength_since_connection_change_, signal_strength_dbm_); | 879 return; |
| 880 |
| 881 min_signal_strength_since_connection_change_ = |
| 882 std::min(min_signal_strength_since_connection_change_.value_or(INT32_MAX), |
| 883 signal_strength_.value()); |
| 884 max_signal_strength_since_connection_change_ = |
| 885 std::max(max_signal_strength_since_connection_change_.value_or(INT32_MIN), |
| 886 signal_strength_.value()); |
880 #endif // OS_ANDROID | 887 #endif // OS_ANDROID |
881 } | 888 } |
882 | 889 |
883 void NetworkQualityEstimator::RecordMetricsOnConnectionTypeChanged() const { | 890 void NetworkQualityEstimator::RecordMetricsOnConnectionTypeChanged() const { |
884 DCHECK(thread_checker_.CalledOnValidThread()); | 891 DCHECK(thread_checker_.CalledOnValidThread()); |
885 if (peak_network_quality_.http_rtt() != nqe::internal::InvalidRTT()) { | 892 if (peak_network_quality_.http_rtt() != nqe::internal::InvalidRTT()) { |
886 base::HistogramBase* rtt_histogram = | 893 base::HistogramBase* rtt_histogram = |
887 GetHistogram("FastestRTT.", current_network_id_.type, 10 * 1000); | 894 GetHistogram("FastestRTT.", current_network_id_.type, 10 * 1000); |
888 rtt_histogram->Add(peak_network_quality_.http_rtt().InMilliseconds()); | 895 rtt_histogram->Add(peak_network_quality_.http_rtt().InMilliseconds()); |
889 } | 896 } |
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1341 const base::Optional<Statistic>& statistic, | 1348 const base::Optional<Statistic>& statistic, |
1342 int percentile) const { | 1349 int percentile) const { |
1343 DCHECK(thread_checker_.CalledOnValidThread()); | 1350 DCHECK(thread_checker_.CalledOnValidThread()); |
1344 | 1351 |
1345 // RTT observations are sorted by duration from shortest to longest, thus | 1352 // RTT observations are sorted by duration from shortest to longest, thus |
1346 // a higher percentile RTT will have a longer RTT than a lower percentile. | 1353 // a higher percentile RTT will have a longer RTT than a lower percentile. |
1347 base::TimeDelta rtt = nqe::internal::InvalidRTT(); | 1354 base::TimeDelta rtt = nqe::internal::InvalidRTT(); |
1348 | 1355 |
1349 if (!statistic) { | 1356 if (!statistic) { |
1350 // Use default statistic algorithm. | 1357 // Use default statistic algorithm. |
1351 if (!rtt_observations_.GetPercentile(start_time, signal_strength_dbm_, &rtt, | 1358 if (!rtt_observations_.GetPercentile(start_time, signal_strength_, &rtt, |
1352 percentile, | 1359 percentile, |
1353 disallowed_observation_sources)) { | 1360 disallowed_observation_sources)) { |
1354 return nqe::internal::InvalidRTT(); | 1361 return nqe::internal::InvalidRTT(); |
1355 } | 1362 } |
1356 return rtt; | 1363 return rtt; |
1357 } | 1364 } |
1358 | 1365 |
1359 switch (statistic.value()) { | 1366 switch (statistic.value()) { |
1360 case STATISTIC_LAST: | 1367 case STATISTIC_LAST: |
1361 NOTREACHED(); | 1368 NOTREACHED(); |
1362 return nqe::internal::InvalidRTT(); | 1369 return nqe::internal::InvalidRTT(); |
1363 case STATISTIC_WEIGHTED_AVERAGE: | 1370 case STATISTIC_WEIGHTED_AVERAGE: |
1364 if (!rtt_observations_.GetWeightedAverage( | 1371 if (!rtt_observations_.GetWeightedAverage(start_time, signal_strength_, |
1365 start_time, signal_strength_dbm_, disallowed_observation_sources, | 1372 disallowed_observation_sources, |
1366 &rtt)) { | 1373 &rtt)) { |
1367 return nqe::internal::InvalidRTT(); | 1374 return nqe::internal::InvalidRTT(); |
1368 } | 1375 } |
1369 return rtt; | 1376 return rtt; |
1370 case STATISTIC_UNWEIGHTED_AVERAGE: | 1377 case STATISTIC_UNWEIGHTED_AVERAGE: |
1371 if (!rtt_observations_.GetUnweightedAverage( | 1378 if (!rtt_observations_.GetUnweightedAverage( |
1372 start_time, signal_strength_dbm_, disallowed_observation_sources, | 1379 start_time, signal_strength_, disallowed_observation_sources, |
1373 &rtt)) { | 1380 &rtt)) { |
1374 return nqe::internal::InvalidRTT(); | 1381 return nqe::internal::InvalidRTT(); |
1375 } | 1382 } |
1376 return rtt; | 1383 return rtt; |
1377 } | 1384 } |
1378 NOTREACHED(); | 1385 NOTREACHED(); |
1379 return nqe::internal::InvalidRTT(); | 1386 return nqe::internal::InvalidRTT(); |
1380 } | 1387 } |
1381 | 1388 |
1382 int32_t NetworkQualityEstimator::GetDownlinkThroughputKbpsEstimateInternal( | 1389 int32_t NetworkQualityEstimator::GetDownlinkThroughputKbpsEstimateInternal( |
1383 const base::TimeTicks& start_time, | 1390 const base::TimeTicks& start_time, |
1384 int percentile) const { | 1391 int percentile) const { |
1385 DCHECK(thread_checker_.CalledOnValidThread()); | 1392 DCHECK(thread_checker_.CalledOnValidThread()); |
1386 | 1393 |
1387 // Throughput observations are sorted by kbps from slowest to fastest, | 1394 // Throughput observations are sorted by kbps from slowest to fastest, |
1388 // thus a higher percentile throughput will be faster than a lower one. | 1395 // thus a higher percentile throughput will be faster than a lower one. |
1389 int32_t kbps = nqe::internal::kInvalidThroughput; | 1396 int32_t kbps = nqe::internal::kInvalidThroughput; |
1390 if (!downstream_throughput_kbps_observations_.GetPercentile( | 1397 if (!downstream_throughput_kbps_observations_.GetPercentile( |
1391 start_time, signal_strength_dbm_, &kbps, 100 - percentile, | 1398 start_time, signal_strength_, &kbps, 100 - percentile, |
1392 std::vector<NetworkQualityObservationSource>())) { | 1399 std::vector<NetworkQualityObservationSource>())) { |
1393 return nqe::internal::kInvalidThroughput; | 1400 return nqe::internal::kInvalidThroughput; |
1394 } | 1401 } |
1395 return kbps; | 1402 return kbps; |
1396 } | 1403 } |
1397 | 1404 |
1398 nqe::internal::NetworkID NetworkQualityEstimator::GetCurrentNetworkID() const { | 1405 nqe::internal::NetworkID NetworkQualityEstimator::GetCurrentNetworkID() const { |
1399 DCHECK(thread_checker_.CalledOnValidThread()); | 1406 DCHECK(thread_checker_.CalledOnValidThread()); |
1400 | 1407 |
1401 // TODO(tbansal): crbug.com/498068 Add NetworkQualityEstimatorAndroid class | 1408 // TODO(tbansal): crbug.com/498068 Add NetworkQualityEstimatorAndroid class |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1504 RecordExternalEstimateProviderMetrics( | 1511 RecordExternalEstimateProviderMetrics( |
1505 EXTERNAL_ESTIMATE_PROVIDER_STATUS_CALLBACK); | 1512 EXTERNAL_ESTIMATE_PROVIDER_STATUS_CALLBACK); |
1506 | 1513 |
1507 external_estimate_provider_quality_ = nqe::internal::NetworkQuality(); | 1514 external_estimate_provider_quality_ = nqe::internal::NetworkQuality(); |
1508 | 1515 |
1509 if (rtt > base::TimeDelta()) { | 1516 if (rtt > base::TimeDelta()) { |
1510 RecordExternalEstimateProviderMetrics( | 1517 RecordExternalEstimateProviderMetrics( |
1511 EXTERNAL_ESTIMATE_PROVIDER_STATUS_RTT_AVAILABLE); | 1518 EXTERNAL_ESTIMATE_PROVIDER_STATUS_RTT_AVAILABLE); |
1512 UMA_HISTOGRAM_TIMES("NQE.ExternalEstimateProvider.RTT", rtt); | 1519 UMA_HISTOGRAM_TIMES("NQE.ExternalEstimateProvider.RTT", rtt); |
1513 RttObservation rtt_observation( | 1520 RttObservation rtt_observation( |
1514 rtt, tick_clock_->NowTicks(), signal_strength_dbm_, | 1521 rtt, tick_clock_->NowTicks(), signal_strength_, |
1515 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_EXTERNAL_ESTIMATE); | 1522 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_EXTERNAL_ESTIMATE); |
1516 rtt_observations_.AddObservation(rtt_observation); | 1523 rtt_observations_.AddObservation(rtt_observation); |
1517 external_estimate_provider_quality_.set_http_rtt(rtt); | 1524 external_estimate_provider_quality_.set_http_rtt(rtt); |
1518 NotifyObserversOfRTT(rtt_observation); | 1525 NotifyObserversOfRTT(rtt_observation); |
1519 } | 1526 } |
1520 | 1527 |
1521 if (downstream_throughput_kbps > 0) { | 1528 if (downstream_throughput_kbps > 0) { |
1522 RecordExternalEstimateProviderMetrics( | 1529 RecordExternalEstimateProviderMetrics( |
1523 EXTERNAL_ESTIMATE_PROVIDER_STATUS_DOWNLINK_BANDWIDTH_AVAILABLE); | 1530 EXTERNAL_ESTIMATE_PROVIDER_STATUS_DOWNLINK_BANDWIDTH_AVAILABLE); |
1524 UMA_HISTOGRAM_COUNTS("NQE.ExternalEstimateProvider.DownlinkBandwidth", | 1531 UMA_HISTOGRAM_COUNTS("NQE.ExternalEstimateProvider.DownlinkBandwidth", |
1525 downstream_throughput_kbps); | 1532 downstream_throughput_kbps); |
1526 ThroughputObservation throughput_observation( | 1533 ThroughputObservation throughput_observation( |
1527 downstream_throughput_kbps, tick_clock_->NowTicks(), | 1534 downstream_throughput_kbps, tick_clock_->NowTicks(), signal_strength_, |
1528 signal_strength_dbm_, | |
1529 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_EXTERNAL_ESTIMATE); | 1535 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_EXTERNAL_ESTIMATE); |
1530 downstream_throughput_kbps_observations_.AddObservation( | 1536 downstream_throughput_kbps_observations_.AddObservation( |
1531 throughput_observation); | 1537 throughput_observation); |
1532 external_estimate_provider_quality_.set_downstream_throughput_kbps( | 1538 external_estimate_provider_quality_.set_downstream_throughput_kbps( |
1533 downstream_throughput_kbps); | 1539 downstream_throughput_kbps); |
1534 NotifyObserversOfThroughput(throughput_observation); | 1540 NotifyObserversOfThroughput(throughput_observation); |
1535 } | 1541 } |
1536 } | 1542 } |
1537 | 1543 |
1538 void NetworkQualityEstimator::SetTickClockForTesting( | 1544 void NetworkQualityEstimator::SetTickClockForTesting( |
1539 std::unique_ptr<base::TickClock> tick_clock) { | 1545 std::unique_ptr<base::TickClock> tick_clock) { |
1540 DCHECK(thread_checker_.CalledOnValidThread()); | 1546 DCHECK(thread_checker_.CalledOnValidThread()); |
1541 tick_clock_ = std::move(tick_clock); | 1547 tick_clock_ = std::move(tick_clock); |
1542 } | 1548 } |
1543 | 1549 |
1544 double NetworkQualityEstimator::RandDouble() const { | 1550 double NetworkQualityEstimator::RandDouble() const { |
1545 return base::RandDouble(); | 1551 return base::RandDouble(); |
1546 } | 1552 } |
1547 | 1553 |
1548 void NetworkQualityEstimator::OnUpdatedRTTAvailable( | 1554 void NetworkQualityEstimator::OnUpdatedRTTAvailable( |
1549 SocketPerformanceWatcherFactory::Protocol protocol, | 1555 SocketPerformanceWatcherFactory::Protocol protocol, |
1550 const base::TimeDelta& rtt) { | 1556 const base::TimeDelta& rtt) { |
1551 DCHECK(thread_checker_.CalledOnValidThread()); | 1557 DCHECK(thread_checker_.CalledOnValidThread()); |
1552 DCHECK_NE(nqe::internal::InvalidRTT(), rtt); | 1558 DCHECK_NE(nqe::internal::InvalidRTT(), rtt); |
1553 | 1559 |
1554 RttObservation observation(rtt, tick_clock_->NowTicks(), signal_strength_dbm_, | 1560 RttObservation observation(rtt, tick_clock_->NowTicks(), signal_strength_, |
1555 ProtocolSourceToObservationSource(protocol)); | 1561 ProtocolSourceToObservationSource(protocol)); |
1556 NotifyObserversOfRTT(observation); | 1562 NotifyObserversOfRTT(observation); |
1557 rtt_observations_.AddObservation(observation); | 1563 rtt_observations_.AddObservation(observation); |
1558 } | 1564 } |
1559 | 1565 |
1560 void NetworkQualityEstimator::NotifyObserversOfRTT( | 1566 void NetworkQualityEstimator::NotifyObserversOfRTT( |
1561 const RttObservation& observation) { | 1567 const RttObservation& observation) { |
1562 DCHECK(thread_checker_.CalledOnValidThread()); | 1568 DCHECK(thread_checker_.CalledOnValidThread()); |
1563 DCHECK_NE(nqe::internal::InvalidRTT(), observation.value); | 1569 DCHECK_NE(nqe::internal::InvalidRTT(), observation.value); |
1564 DCHECK_GT(NETWORK_QUALITY_OBSERVATION_SOURCE_MAX, observation.source); | 1570 DCHECK_GT(NETWORK_QUALITY_OBSERVATION_SOURCE_MAX, observation.source); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1603 DCHECK_NE(nqe::internal::kInvalidThroughput, downstream_kbps); | 1609 DCHECK_NE(nqe::internal::kInvalidThroughput, downstream_kbps); |
1604 | 1610 |
1605 if (downstream_kbps > peak_network_quality_.downstream_throughput_kbps() || | 1611 if (downstream_kbps > peak_network_quality_.downstream_throughput_kbps() || |
1606 peak_network_quality_.downstream_throughput_kbps() == | 1612 peak_network_quality_.downstream_throughput_kbps() == |
1607 nqe::internal::kInvalidThroughput) { | 1613 nqe::internal::kInvalidThroughput) { |
1608 peak_network_quality_ = nqe::internal::NetworkQuality( | 1614 peak_network_quality_ = nqe::internal::NetworkQuality( |
1609 peak_network_quality_.http_rtt(), peak_network_quality_.transport_rtt(), | 1615 peak_network_quality_.http_rtt(), peak_network_quality_.transport_rtt(), |
1610 downstream_kbps); | 1616 downstream_kbps); |
1611 } | 1617 } |
1612 ThroughputObservation throughput_observation( | 1618 ThroughputObservation throughput_observation( |
1613 downstream_kbps, tick_clock_->NowTicks(), signal_strength_dbm_, | 1619 downstream_kbps, tick_clock_->NowTicks(), signal_strength_, |
1614 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP); | 1620 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP); |
1615 downstream_throughput_kbps_observations_.AddObservation( | 1621 downstream_throughput_kbps_observations_.AddObservation( |
1616 throughput_observation); | 1622 throughput_observation); |
1617 NotifyObserversOfThroughput(throughput_observation); | 1623 NotifyObserversOfThroughput(throughput_observation); |
1618 } | 1624 } |
1619 | 1625 |
1620 void NetworkQualityEstimator::MaybeComputeEffectiveConnectionType() { | 1626 void NetworkQualityEstimator::MaybeComputeEffectiveConnectionType() { |
1621 DCHECK(thread_checker_.CalledOnValidThread()); | 1627 DCHECK(thread_checker_.CalledOnValidThread()); |
1622 | 1628 |
1623 const base::TimeTicks now = tick_clock_->NowTicks(); | 1629 const base::TimeTicks now = tick_clock_->NowTicks(); |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1820 return "UnweightedAverage"; | 1826 return "UnweightedAverage"; |
1821 case STATISTIC_LAST: | 1827 case STATISTIC_LAST: |
1822 NOTREACHED(); | 1828 NOTREACHED(); |
1823 return ""; | 1829 return ""; |
1824 } | 1830 } |
1825 NOTREACHED(); | 1831 NOTREACHED(); |
1826 return ""; | 1832 return ""; |
1827 } | 1833 } |
1828 | 1834 |
1829 } // namespace net | 1835 } // namespace net |
OLD | NEW |