Index: webrtc/p2p/base/port.cc |
diff --git a/webrtc/p2p/base/port.cc b/webrtc/p2p/base/port.cc |
index 0add358ec91392917091e957dfc39d28224be5af..c0e8d9770d8b11fb5e63b3c0221247d6eb2e7e82 100644 |
--- a/webrtc/p2p/base/port.cc |
+++ b/webrtc/p2p/base/port.cc |
@@ -1188,7 +1188,7 @@ void Connection::ReceivedPing() { |
last_ping_received_ = rtc::TimeMillis(); |
} |
-void Connection::ReceivedPingResponse() { |
+void Connection::ReceivedPingResponse(int rtt) { |
// We've already validated that this is a STUN binding response with |
// the correct local and remote username for this connection. |
// So if we're not already, become writable. We may be bringing a pruned |
@@ -1199,6 +1199,8 @@ void Connection::ReceivedPingResponse() { |
set_state(STATE_SUCCEEDED); |
pings_since_last_response_.clear(); |
last_ping_response_received_ = rtc::TimeMillis(); |
+ rtt_samples_++; |
+ rtt_ = (RTT_RATIO * rtt_ + rtt) / (RTT_RATIO + 1); |
} |
bool Connection::dead(int64_t now) const { |
@@ -1226,6 +1228,14 @@ bool Connection::dead(int64_t now) const { |
return now > (time_created_ms_ + MIN_CONNECTION_LIFETIME); |
} |
+bool Connection::stable(int64_t now) { |
+ // A connection is stable if it's RTT has converged and it isn't missing any |
+ // responses. We should send pings at a higher rate until the RTT converges |
+ // and whenever a ping response is missing (so that we can detect |
+ // unwritability faster) |
+ return rtt_converged() && !missing_responses(now); |
+} |
+ |
std::string Connection::ToDebugId() const { |
std::stringstream ss; |
ss << std::hex << this; |
@@ -1296,7 +1306,7 @@ void Connection::OnConnectionRequestResponse(ConnectionRequest* request, |
int rtt = request->Elapsed(); |
- ReceivedPingResponse(); |
+ ReceivedPingResponse(rtt); |
if (LOG_CHECK_LEVEL_V(sev)) { |
bool use_candidate = ( |
@@ -1311,7 +1321,6 @@ void Connection::OnConnectionRequestResponse(ConnectionRequest* request, |
<< ", pings_since_last_response=" << pings; |
} |
- rtt_ = (RTT_RATIO * rtt_ + rtt) / (RTT_RATIO + 1); |
stats_.recv_ping_responses++; |
MaybeAddPrflxCandidate(request, response); |
@@ -1490,6 +1499,19 @@ void Connection::MaybeAddPrflxCandidate(ConnectionRequest* request, |
SignalStateChange(this); |
} |
+bool Connection::rtt_converged() { |
+ return rtt_samples_ > (RTT_RATIO + 1); |
+} |
+ |
+bool Connection::missing_responses(int64_t now) { |
+ if (pings_since_last_response_.empty()) { |
+ return false; |
+ } |
+ |
+ int64_t waiting = now - pings_since_last_response_[0].sent_time; |
+ return waiting > 2 * rtt(); |
+} |
+ |
ProxyConnection::ProxyConnection(Port* port, |
size_t index, |
const Candidate& remote_candidate) |