Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(230)

Unified Diff: webrtc/p2p/base/stunport.cc

Issue 1737493004: Keep on sending stun binding requests on zero-cost networks. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Added tests, chaneged to 64bit lifetime. Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/p2p/base/stunport.cc
diff --git a/webrtc/p2p/base/stunport.cc b/webrtc/p2p/base/stunport.cc
index 8f37dd5218bb745b5e06ab6d8b2574faefc9aa44..723bb345c5ac95efc5b1ee746239d1ea2f808ead 100644
--- a/webrtc/p2p/base/stunport.cc
+++ b/webrtc/p2p/base/stunport.cc
@@ -23,22 +23,24 @@
namespace cricket {
// TODO: Move these to a common place (used in relayport too)
-const int KEEPALIVE_DELAY = 10 * 1000; // 10 seconds - sort timeouts
-const int RETRY_TIMEOUT = 50 * 1000; // ICE says 50 secs
-// Stop sending STUN binding requests after this amount of time
-// (in milliseconds) because the connection binding requests should keep
-// the NAT binding alive.
-const int KEEP_ALIVE_TIMEOUT = 2 * 60 * 1000; // 2 minutes
+const int KEEPALIVE_DELAY_MS = 10 * 1000; // 10 seconds - sort timeouts
+const int RETRY_TIMEOUT_US = 50 * 1000000; // 50 seconds
+// Lifetime chosen for STUN ports on low-cost networks.
+const int INFINITE_LIFETIME = -1;
+// Lifetime for STUN ports on high-cost networks: 2 minutes
+const int32_t HIGH_COST_PORT_KEEPALIVE_LIFETIME_MS = 2 * 60 * 1000;
// Handles a binding request sent to the STUN server.
class StunBindingRequest : public StunRequest {
public:
StunBindingRequest(UDPPort* port,
const rtc::SocketAddress& addr,
- uint32_t deadline)
- : port_(port), server_addr_(addr), deadline_(deadline) {
- start_time_ = rtc::Time();
- }
+ uint64_t start_time_us,
+ int64_t lifetime_us)
+ : port_(port),
+ server_addr_(addr),
+ start_time_us_(start_time_us),
+ lifetime_us_(lifetime_us) {}
virtual ~StunBindingRequest() {
}
@@ -62,11 +64,11 @@ class StunBindingRequest : public StunRequest {
port_->OnStunBindingRequestSucceeded(server_addr_, addr);
}
- // We will do a keep-alive regardless of whether this request succeeds.
- // It will be stopped after |deadline_| mostly to conserve the battery life.
- if (rtc::Time() <= deadline_) {
+ // The keep-alive requests will be stopped after its lifetime has passed.
+ if (WithinLifetime(rtc::TimeMicros())) {
port_->requests_.SendDelayed(
- new StunBindingRequest(port_, server_addr_, deadline_),
+ new StunBindingRequest(port_, server_addr_, start_time_us_,
+ lifetime_us_),
port_->stun_keepalive_delay());
}
}
@@ -77,34 +79,40 @@ class StunBindingRequest : public StunRequest {
LOG(LS_ERROR) << "Bad allocate response error code";
} else {
LOG(LS_ERROR) << "Binding error response:"
- << " class=" << attr->eclass()
- << " number=" << attr->number()
- << " reason='" << attr->reason() << "'";
+ << " class=" << attr->eclass()
+ << " number=" << attr->number() << " reason='"
+ << attr->reason() << "'";
}
port_->OnStunBindingOrResolveRequestFailed(server_addr_);
- uint32_t now = rtc::Time();
- if (now <= deadline_ && rtc::TimeDiff(now, start_time_) <= RETRY_TIMEOUT) {
+ uint64_t now = rtc::TimeMicros();
+ if (WithinLifetime(now) && now - start_time_us_ <= RETRY_TIMEOUT_US) {
port_->requests_.SendDelayed(
- new StunBindingRequest(port_, server_addr_, deadline_),
+ new StunBindingRequest(port_, server_addr_, start_time_us_,
+ lifetime_us_),
port_->stun_keepalive_delay());
}
}
-
virtual void OnTimeout() override {
LOG(LS_ERROR) << "Binding request timed out from "
- << port_->GetLocalAddress().ToSensitiveString()
- << " (" << port_->Network()->name() << ")";
+ << port_->GetLocalAddress().ToSensitiveString() << " ("
+ << port_->Network()->name() << ")";
port_->OnStunBindingOrResolveRequestFailed(server_addr_);
}
private:
+ // Returns true if |now| is within the lifetime of the request (a negative
+ // lifetime means infinite).
+ bool WithinLifetime(uint64_t now) const {
+ return lifetime_us_ < 0 || now <= start_time_us_ + lifetime_us_;
honghaiz3 2016/03/02 20:20:41 Used the negative check instead of exactly -1 so t
+ }
UDPPort* port_;
const rtc::SocketAddress server_addr_;
- uint32_t start_time_;
- uint32_t deadline_;
+ uint64_t start_time_us_;
+ // The time duration for which this request will be rescheduled.
+ int64_t lifetime_us_;
};
UDPPort::AddressResolver::AddressResolver(
@@ -178,7 +186,7 @@ UDPPort::UDPPort(rtc::Thread* thread,
socket_(socket),
error_(0),
ready_(false),
- stun_keepalive_delay_(KEEPALIVE_DELAY),
+ stun_keepalive_delay_(KEEPALIVE_DELAY_MS),
emit_local_for_anyaddress_(emit_local_for_anyaddress) {
requests_.set_origin(origin);
}
@@ -206,12 +214,18 @@ UDPPort::UDPPort(rtc::Thread* thread,
socket_(NULL),
error_(0),
ready_(false),
- stun_keepalive_delay_(KEEPALIVE_DELAY),
+ stun_keepalive_delay_(KEEPALIVE_DELAY_MS),
emit_local_for_anyaddress_(emit_local_for_anyaddress) {
requests_.set_origin(origin);
}
bool UDPPort::Init() {
+ // If this is a zero-cost network, it will keep on sending STUN binding
+ // requests indefinitely to keep the NAT binding alive. Otherwise, stop
+ // sending STUN binding requests after HIGH_COST_PORT_KEEPALIVE_LIFETIME_MS.
+ stun_keepalive_lifetime_ = (network_cost() == 0)
+ ? INFINITE_LIFETIME
+ : HIGH_COST_PORT_KEEPALIVE_LIFETIME_MS;
if (!SharedSocket()) {
ASSERT(socket_ == NULL);
socket_ = socket_factory()->CreateUdpSocket(
@@ -397,8 +411,10 @@ void UDPPort::SendStunBindingRequest(const rtc::SocketAddress& stun_addr) {
} else if (socket_->GetState() == rtc::AsyncPacketSocket::STATE_BOUND) {
// Check if |server_addr_| is compatible with the port's ip.
if (IsCompatibleAddress(stun_addr)) {
- requests_.Send(new StunBindingRequest(this, stun_addr,
- rtc::Time() + KEEP_ALIVE_TIMEOUT));
+ // The |stun_keepalive_lifetime_| is in milliseconds while the lifetime
+ // in the StunBindingRequest is in microseconds.
pthatcher1 2016/03/02 20:25:59 Can we just make everything in this file milliseco
honghaiz3 2016/03/02 23:22:51 It is hard to all use milliseconds or microseconds
+ requests_.Send(new StunBindingRequest(this, stun_addr, rtc::TimeMicros(),
+ stun_keepalive_lifetime_ * 1000));
} else {
// Since we can't send stun messages to the server, we should mark this
// port ready.

Powered by Google App Engine
This is Rietveld 408576698