Index: chromeos/network/portal_detector/network_portal_detector_strategy.cc |
diff --git a/chromeos/network/portal_detector/network_portal_detector_strategy.cc b/chromeos/network/portal_detector/network_portal_detector_strategy.cc |
index 6a860c958bf6689cac82f7e9932bf792f234f020..0bcf070bab10e77bad8b1697eb50cd1d8af9c4d1 100644 |
--- a/chromeos/network/portal_detector/network_portal_detector_strategy.cc |
+++ b/chromeos/network/portal_detector/network_portal_detector_strategy.cc |
@@ -21,9 +21,8 @@ const NetworkState* DefaultNetwork() { |
class LoginScreenStrategy : public PortalDetectorStrategy { |
public: |
- static const int kMaxAttempts = 3; |
- static const int kDelayBetweenAttemptsSec = 3; |
static const int kBaseAttemptTimeoutSec = 5; |
+ static const int kMaxAttemptTimeoutSec = 30; |
LoginScreenStrategy() {} |
virtual ~LoginScreenStrategy() {} |
@@ -31,17 +30,17 @@ class LoginScreenStrategy : public PortalDetectorStrategy { |
protected: |
// PortalDetectorStrategy overrides: |
virtual StrategyId Id() const OVERRIDE { return STRATEGY_ID_LOGIN_SCREEN; } |
- virtual bool CanPerformAttemptImpl() OVERRIDE { |
- return delegate_->AttemptCount() < kMaxAttempts; |
- } |
- virtual base::TimeDelta GetDelayTillNextAttemptImpl() OVERRIDE { |
- return AdjustDelay(base::TimeDelta::FromSeconds(kDelayBetweenAttemptsSec)); |
- } |
virtual base::TimeDelta GetNextAttemptTimeoutImpl() OVERRIDE { |
- int timeout = DefaultNetwork() |
- ? (delegate_->AttemptCount() + 1) * kBaseAttemptTimeoutSec |
- : kBaseAttemptTimeoutSec; |
- return base::TimeDelta::FromSeconds(timeout); |
+ if (DefaultNetwork() && delegate_->NoResponseResultCount() != 0) { |
+ int timeout = kMaxAttemptTimeoutSec; |
+ if (kMaxAttemptTimeoutSec / (delegate_->NoResponseResultCount() + 1) > |
+ kBaseAttemptTimeoutSec) { |
+ timeout = |
+ kBaseAttemptTimeoutSec * (delegate_->NoResponseResultCount() + 1); |
+ } |
+ return base::TimeDelta::FromSeconds(timeout); |
+ } |
+ return base::TimeDelta::FromSeconds(kBaseAttemptTimeoutSec); |
} |
private: |
@@ -50,7 +49,6 @@ class LoginScreenStrategy : public PortalDetectorStrategy { |
class ErrorScreenStrategy : public PortalDetectorStrategy { |
public: |
- static const int kDelayBetweenAttemptsSec = 3; |
static const int kAttemptTimeoutSec = 15; |
ErrorScreenStrategy() {} |
@@ -59,11 +57,6 @@ class ErrorScreenStrategy : public PortalDetectorStrategy { |
protected: |
// PortalDetectorStrategy overrides: |
virtual StrategyId Id() const OVERRIDE { return STRATEGY_ID_ERROR_SCREEN; } |
- virtual bool CanPerformAttemptImpl() OVERRIDE { return true; } |
- virtual bool CanPerformAttemptAfterDetectionImpl() OVERRIDE { return true; } |
- virtual base::TimeDelta GetDelayTillNextAttemptImpl() OVERRIDE { |
- return AdjustDelay(base::TimeDelta::FromSeconds(kDelayBetweenAttemptsSec)); |
- } |
virtual base::TimeDelta GetNextAttemptTimeoutImpl() OVERRIDE { |
return base::TimeDelta::FromSeconds(kAttemptTimeoutSec); |
} |
@@ -74,15 +67,8 @@ class ErrorScreenStrategy : public PortalDetectorStrategy { |
class SessionStrategy : public PortalDetectorStrategy { |
public: |
- static const int kFastDelayBetweenAttemptsSec = 1; |
- static const int kFastAttemptTimeoutSec = 3; |
static const int kMaxFastAttempts = 3; |
- |
- static const int kNormalDelayBetweenAttemptsSec = 10; |
- static const int kNormalAttemptTimeoutSec = 5; |
- static const int kMaxNormalAttempts = 3; |
- |
- static const int kSlowDelayBetweenAttemptsSec = 2 * 60; |
+ static const int kFastAttemptTimeoutSec = 3; |
static const int kSlowAttemptTimeoutSec = 5; |
SessionStrategy() {} |
@@ -90,38 +76,16 @@ class SessionStrategy : public PortalDetectorStrategy { |
protected: |
virtual StrategyId Id() const OVERRIDE { return STRATEGY_ID_SESSION; } |
- virtual bool CanPerformAttemptImpl() OVERRIDE { return true; } |
- virtual bool CanPerformAttemptAfterDetectionImpl() OVERRIDE { return true; } |
- virtual base::TimeDelta GetDelayTillNextAttemptImpl() OVERRIDE { |
- int delay; |
- if (IsFastAttempt()) |
- delay = kFastDelayBetweenAttemptsSec; |
- else if (IsNormalAttempt()) |
- delay = kNormalDelayBetweenAttemptsSec; |
- else |
- delay = kSlowDelayBetweenAttemptsSec; |
- return AdjustDelay(base::TimeDelta::FromSeconds(delay)); |
- } |
virtual base::TimeDelta GetNextAttemptTimeoutImpl() OVERRIDE { |
int timeout; |
- if (IsFastAttempt()) |
+ if (delegate_->NoResponseResultCount() < kMaxFastAttempts) |
timeout = kFastAttemptTimeoutSec; |
- else if (IsNormalAttempt()) |
- timeout = kNormalAttemptTimeoutSec; |
else |
timeout = kSlowAttemptTimeoutSec; |
return base::TimeDelta::FromSeconds(timeout); |
} |
private: |
- bool IsFastAttempt() { |
- return delegate_->AttemptCount() < kMaxFastAttempts; |
- } |
- |
- bool IsNormalAttempt() { |
- return delegate_->AttemptCount() < kMaxFastAttempts + kMaxNormalAttempts; |
- } |
- |
DISALLOW_COPY_AND_ASSIGN(SessionStrategy); |
}; |
@@ -143,9 +107,23 @@ base::TimeDelta PortalDetectorStrategy::next_attempt_timeout_for_testing_; |
bool PortalDetectorStrategy::next_attempt_timeout_for_testing_initialized_ = |
false; |
-PortalDetectorStrategy::PortalDetectorStrategy() : delegate_(NULL) {} |
+PortalDetectorStrategy::PortalDetectorStrategy() |
+ : net::BackoffEntry(&policy_), delegate_(NULL) { |
+ // First three attempts with the same result are performed with |
+ // 600ms delay between them. Delay before every consecutive attempt |
+ // is multplied by 2.0. Also, 30% fuzz factor is used for each |
+ // delay. |
+ policy_.num_errors_to_ignore = 3; |
+ policy_.initial_delay_ms = 600; |
+ policy_.multiply_factor = 2.0; |
+ policy_.jitter_factor = 0.3; |
+ policy_.maximum_backoff_ms = 2 * 60 * 1000; |
+ policy_.entry_lifetime_ms = -1; |
+ policy_.always_use_initial_delay = true; |
+} |
-PortalDetectorStrategy::~PortalDetectorStrategy() {} |
+PortalDetectorStrategy::~PortalDetectorStrategy() { |
+} |
// statc |
scoped_ptr<PortalDetectorStrategy> PortalDetectorStrategy::CreateById( |
@@ -164,18 +142,10 @@ scoped_ptr<PortalDetectorStrategy> PortalDetectorStrategy::CreateById( |
} |
} |
-bool PortalDetectorStrategy::CanPerformAttempt() { |
- return CanPerformAttemptImpl(); |
-} |
- |
-bool PortalDetectorStrategy::CanPerformAttemptAfterDetection() { |
- return CanPerformAttemptAfterDetectionImpl(); |
-} |
- |
base::TimeDelta PortalDetectorStrategy::GetDelayTillNextAttempt() { |
if (delay_till_next_attempt_for_testing_initialized_) |
return delay_till_next_attempt_for_testing_; |
- return GetDelayTillNextAttemptImpl(); |
+ return net::BackoffEntry::GetTimeUntilRelease(); |
} |
base::TimeDelta PortalDetectorStrategy::GetNextAttemptTimeout() { |
@@ -184,31 +154,19 @@ base::TimeDelta PortalDetectorStrategy::GetNextAttemptTimeout() { |
return GetNextAttemptTimeoutImpl(); |
} |
-bool PortalDetectorStrategy::CanPerformAttemptImpl() { return false; } |
- |
-bool PortalDetectorStrategy::CanPerformAttemptAfterDetectionImpl() { |
- return false; |
+void PortalDetectorStrategy::Reset() { |
+ net::BackoffEntry::Reset(); |
} |
-base::TimeDelta PortalDetectorStrategy::GetDelayTillNextAttemptImpl() { |
- return base::TimeDelta(); |
+void PortalDetectorStrategy::OnDetectionCompleted() { |
+ net::BackoffEntry::InformOfRequest(false); |
} |
-base::TimeDelta PortalDetectorStrategy::GetNextAttemptTimeoutImpl() { |
- return base::TimeDelta(); |
+base::TimeTicks PortalDetectorStrategy::ImplGetTimeNow() const { |
+ return delegate_->GetCurrentTimeTicks(); |
} |
-base::TimeDelta PortalDetectorStrategy::AdjustDelay( |
- const base::TimeDelta& delay) { |
- if (!delegate_->AttemptCount()) |
- return base::TimeDelta(); |
- |
- base::TimeTicks now = delegate_->GetCurrentTimeTicks(); |
- base::TimeDelta elapsed; |
- if (now > delegate_->AttemptStartTime()) |
- elapsed = now - delegate_->AttemptStartTime(); |
- if (delay > elapsed) |
- return delay - elapsed; |
+base::TimeDelta PortalDetectorStrategy::GetNextAttemptTimeoutImpl() { |
return base::TimeDelta(); |
} |