Index: webrtc/p2p/base/stunport.cc |
diff --git a/webrtc/p2p/base/stunport.cc b/webrtc/p2p/base/stunport.cc |
index 13ecca4a3a1cb90b2640e45ebee708d47cc2bf37..93d95efce5659d6bfc8598d6617cba7a891f00a0 100644 |
--- a/webrtc/p2p/base/stunport.cc |
+++ b/webrtc/p2p/base/stunport.cc |
@@ -24,15 +24,19 @@ 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_DELAY = 50; // 50ms, from ICE spec |
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 |
// Handles a binding request sent to the STUN server. |
class StunBindingRequest : public StunRequest { |
public: |
- StunBindingRequest(UDPPort* port, bool keep_alive, |
- const rtc::SocketAddress& addr) |
- : port_(port), keep_alive_(keep_alive), server_addr_(addr) { |
+ StunBindingRequest(UDPPort* port, |
+ const rtc::SocketAddress& addr, |
+ uint32_t deadline) |
+ : port_(port), server_addr_(addr), deadline_(deadline) { |
start_time_ = rtc::Time(); |
} |
@@ -59,10 +63,10 @@ class StunBindingRequest : public StunRequest { |
} |
// We will do a keep-alive regardless of whether this request succeeds. |
- // This should have almost no impact on network usage. |
- if (keep_alive_) { |
+ // It will be stopped after |deadline_| mostly to conserve the battery life. |
+ if (rtc::Time() <= deadline_) { |
port_->requests_.SendDelayed( |
- new StunBindingRequest(port_, true, server_addr_), |
+ new StunBindingRequest(port_, server_addr_, deadline_), |
port_->stun_keepalive_delay()); |
} |
} |
@@ -80,10 +84,10 @@ class StunBindingRequest : public StunRequest { |
port_->OnStunBindingOrResolveRequestFailed(server_addr_); |
- if (keep_alive_ |
- && (rtc::TimeSince(start_time_) <= RETRY_TIMEOUT)) { |
+ uint32_t now = rtc::Time(); |
+ if (now <= deadline_ && rtc::TimeDiff(now, start_time_) <= RETRY_TIMEOUT) { |
port_->requests_.SendDelayed( |
- new StunBindingRequest(port_, true, server_addr_), |
+ new StunBindingRequest(port_, server_addr_, deadline_), |
port_->stun_keepalive_delay()); |
} |
} |
@@ -94,20 +98,13 @@ class StunBindingRequest : public StunRequest { |
<< " (" << port_->Network()->name() << ")"; |
port_->OnStunBindingOrResolveRequestFailed(server_addr_); |
- |
- if (keep_alive_ |
- && (rtc::TimeSince(start_time_) <= RETRY_TIMEOUT)) { |
- port_->requests_.SendDelayed( |
- new StunBindingRequest(port_, true, server_addr_), |
- RETRY_DELAY); |
- } |
} |
private: |
UDPPort* port_; |
- bool keep_alive_; |
const rtc::SocketAddress server_addr_; |
uint32_t start_time_; |
+ uint32_t deadline_; |
}; |
UDPPort::AddressResolver::AddressResolver( |
@@ -351,7 +348,7 @@ void UDPPort::OnReadyToSend(rtc::AsyncPacketSocket* socket) { |
void UDPPort::SendStunBindingRequests() { |
// We will keep pinging the stun server to make sure our NAT pin-hole stays |
- // open during the call. |
+ // open until the deadline (specified in SendStunBindingRequest). |
ASSERT(requests_.empty()); |
for (ServerAddresses::const_iterator it = server_addresses_.begin(); |
@@ -397,7 +394,8 @@ 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, true, stun_addr)); |
+ requests_.Send(new StunBindingRequest(this, stun_addr, |
+ rtc::Time() + KEEP_ALIVE_TIMEOUT)); |
} else { |
// Since we can't send stun messages to the server, we should mark this |
// port ready. |