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 #ifndef NET_NQE_NETWORK_QUALITY_ESTIMATOR_H_ | 5 #ifndef NET_NQE_NETWORK_QUALITY_ESTIMATOR_H_ |
6 #define NET_NQE_NETWORK_QUALITY_ESTIMATOR_H_ | 6 #define NET_NQE_NETWORK_QUALITY_ESTIMATOR_H_ |
7 | 7 |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <map> | 10 #include <map> |
11 #include <memory> | 11 #include <memory> |
12 #include <string> | 12 #include <string> |
13 | 13 |
14 #include "base/compiler_specific.h" | 14 #include "base/compiler_specific.h" |
15 #include "base/gtest_prod_util.h" | 15 #include "base/gtest_prod_util.h" |
16 #include "base/macros.h" | 16 #include "base/macros.h" |
17 #include "base/memory/ref_counted.h" | 17 #include "base/memory/ref_counted.h" |
18 #include "base/memory/weak_ptr.h" | 18 #include "base/memory/weak_ptr.h" |
19 #include "base/observer_list.h" | 19 #include "base/observer_list.h" |
20 #include "base/threading/thread_checker.h" | 20 #include "base/threading/thread_checker.h" |
21 #include "base/time/time.h" | 21 #include "base/time/time.h" |
22 #include "net/base/net_export.h" | 22 #include "net/base/net_export.h" |
23 #include "net/base/network_change_notifier.h" | 23 #include "net/base/network_change_notifier.h" |
24 #include "net/nqe/cached_network_quality.h" | 24 #include "net/nqe/cached_network_quality.h" |
| 25 #include "net/nqe/effective_connection_type.h" |
25 #include "net/nqe/external_estimate_provider.h" | 26 #include "net/nqe/external_estimate_provider.h" |
26 #include "net/nqe/network_id.h" | 27 #include "net/nqe/network_id.h" |
27 #include "net/nqe/network_quality.h" | 28 #include "net/nqe/network_quality.h" |
28 #include "net/nqe/network_quality_observation.h" | 29 #include "net/nqe/network_quality_observation.h" |
29 #include "net/nqe/network_quality_observation_source.h" | 30 #include "net/nqe/network_quality_observation_source.h" |
30 #include "net/nqe/network_quality_store.h" | 31 #include "net/nqe/network_quality_store.h" |
31 #include "net/nqe/observation_buffer.h" | 32 #include "net/nqe/observation_buffer.h" |
32 #include "net/socket/socket_performance_watcher_factory.h" | 33 #include "net/socket/socket_performance_watcher_factory.h" |
33 | 34 |
34 namespace base { | 35 namespace base { |
(...skipping 15 matching lines...) Expand all Loading... |
50 // The estimates are based on the observed organic traffic. | 51 // The estimates are based on the observed organic traffic. |
51 // A NetworkQualityEstimator instance is attached to URLRequestContexts and | 52 // A NetworkQualityEstimator instance is attached to URLRequestContexts and |
52 // observes the traffic of URLRequests spawned from the URLRequestContexts. | 53 // observes the traffic of URLRequests spawned from the URLRequestContexts. |
53 // A single instance of NQE can be attached to multiple URLRequestContexts, | 54 // A single instance of NQE can be attached to multiple URLRequestContexts, |
54 // thereby increasing the single NQE instance's accuracy by providing more | 55 // thereby increasing the single NQE instance's accuracy by providing more |
55 // observed traffic characteristics. | 56 // observed traffic characteristics. |
56 class NET_EXPORT NetworkQualityEstimator | 57 class NET_EXPORT NetworkQualityEstimator |
57 : public NetworkChangeNotifier::ConnectionTypeObserver, | 58 : public NetworkChangeNotifier::ConnectionTypeObserver, |
58 public ExternalEstimateProvider::UpdatedEstimateDelegate { | 59 public ExternalEstimateProvider::UpdatedEstimateDelegate { |
59 public: | 60 public: |
60 // EffectiveConnectionType is the connection type whose typical performance is | |
61 // most similar to the measured performance of the network in use. In many | |
62 // cases, the "effective" connection type and the actual type of connection in | |
63 // use are the same, but often a network connection performs significantly | |
64 // different, usually worse, from its expected capabilities. | |
65 // EffectiveConnectionType of a network is independent of if the current | |
66 // connection is metered or not. For example, an unmetered slow connection may | |
67 // have EFFECTIVE_CONNECTION_TYPE_SLOW_2G as its effective connection type. | |
68 enum EffectiveConnectionType { | |
69 // The connection types should be in increasing order of quality. | |
70 EFFECTIVE_CONNECTION_TYPE_UNKNOWN = 0, | |
71 EFFECTIVE_CONNECTION_TYPE_OFFLINE, | |
72 EFFECTIVE_CONNECTION_TYPE_SLOW_2G, | |
73 EFFECTIVE_CONNECTION_TYPE_2G, | |
74 EFFECTIVE_CONNECTION_TYPE_3G, | |
75 EFFECTIVE_CONNECTION_TYPE_4G, | |
76 EFFECTIVE_CONNECTION_TYPE_BROADBAND, | |
77 EFFECTIVE_CONNECTION_TYPE_LAST, | |
78 }; | |
79 | |
80 // Observes changes in effective connection type. | 61 // Observes changes in effective connection type. |
81 class NET_EXPORT EffectiveConnectionTypeObserver { | 62 class NET_EXPORT EffectiveConnectionTypeObserver { |
82 public: | 63 public: |
83 // Notifies the observer of a change in the effective connection type. | 64 // Notifies the observer of a change in the effective connection type. |
84 // NetworkQualityEstimator computes the effective connection type once in | 65 // NetworkQualityEstimator computes the effective connection type once in |
85 // every interval of duration | 66 // every interval of duration |
86 // |effective_connection_type_recomputation_interval_|. Additionally, when | 67 // |effective_connection_type_recomputation_interval_|. Additionally, when |
87 // there is a change in the connection type of the device, then the | 68 // there is a change in the connection type of the device, then the |
88 // effective connection type is immediately recomputed. The observer must | 69 // effective connection type is immediately recomputed. The observer must |
89 // register and unregister itself on the IO thread. All the observers would | 70 // register and unregister itself on the IO thread. All the observers would |
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
562 // Default network quality observations obtained from the network quality | 543 // Default network quality observations obtained from the network quality |
563 // estimator field trial parameters. The observations are indexed by | 544 // estimator field trial parameters. The observations are indexed by |
564 // ConnectionType. | 545 // ConnectionType. |
565 nqe::internal::NetworkQuality | 546 nqe::internal::NetworkQuality |
566 default_observations_[NetworkChangeNotifier::CONNECTION_LAST + 1]; | 547 default_observations_[NetworkChangeNotifier::CONNECTION_LAST + 1]; |
567 | 548 |
568 // Default thresholds for different effective connection types. The default | 549 // Default thresholds for different effective connection types. The default |
569 // values are used if the thresholds are unavailable from the variation | 550 // values are used if the thresholds are unavailable from the variation |
570 // params. | 551 // params. |
571 nqe::internal::NetworkQuality default_effective_connection_type_thresholds_ | 552 nqe::internal::NetworkQuality default_effective_connection_type_thresholds_ |
572 [EFFECTIVE_CONNECTION_TYPE_LAST]; | 553 [EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_LAST]; |
573 | 554 |
574 // Thresholds for different effective connection types obtained from field | 555 // Thresholds for different effective connection types obtained from field |
575 // trial variation params. These thresholds encode how different connection | 556 // trial variation params. These thresholds encode how different connection |
576 // types behave in general. In future, complex encodings (e.g., curve | 557 // types behave in general. In future, complex encodings (e.g., curve |
577 // fitting) may be used. | 558 // fitting) may be used. |
578 nqe::internal::NetworkQuality | 559 nqe::internal::NetworkQuality connection_thresholds_ |
579 connection_thresholds_[EFFECTIVE_CONNECTION_TYPE_LAST]; | 560 [EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_LAST]; |
580 | 561 |
581 // Latest time when the headers for a main frame request were received. | 562 // Latest time when the headers for a main frame request were received. |
582 base::TimeTicks last_main_frame_request_; | 563 base::TimeTicks last_main_frame_request_; |
583 | 564 |
584 // Estimated network quality when the response headers for the last mainframe | 565 // Estimated network quality when the response headers for the last mainframe |
585 // request were received. | 566 // request were received. |
586 nqe::internal::NetworkQuality estimated_quality_at_last_main_frame_; | 567 nqe::internal::NetworkQuality estimated_quality_at_last_main_frame_; |
587 EffectiveConnectionType effective_connection_type_at_last_main_frame_; | 568 EffectiveConnectionType effective_connection_type_at_last_main_frame_; |
588 | 569 |
589 // Estimated network quality obtained from external estimate provider when the | 570 // Estimated network quality obtained from external estimate provider when the |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 base::ThreadChecker thread_checker_; | 615 base::ThreadChecker thread_checker_; |
635 | 616 |
636 base::WeakPtrFactory<NetworkQualityEstimator> weak_ptr_factory_; | 617 base::WeakPtrFactory<NetworkQualityEstimator> weak_ptr_factory_; |
637 | 618 |
638 DISALLOW_COPY_AND_ASSIGN(NetworkQualityEstimator); | 619 DISALLOW_COPY_AND_ASSIGN(NetworkQualityEstimator); |
639 }; | 620 }; |
640 | 621 |
641 } // namespace net | 622 } // namespace net |
642 | 623 |
643 #endif // NET_NQE_NETWORK_QUALITY_ESTIMATOR_H_ | 624 #endif // NET_NQE_NETWORK_QUALITY_ESTIMATOR_H_ |
OLD | NEW |