Index: webrtc/p2p/base/port.cc |
diff --git a/webrtc/p2p/base/port.cc b/webrtc/p2p/base/port.cc |
index d6bc27ba023bdf156dd8dd0aeca87f07a355a880..e03c0e60b5b3654b468e8d30b1f9531f8cc95175 100644 |
--- a/webrtc/p2p/base/port.cc |
+++ b/webrtc/p2p/base/port.cc |
@@ -791,6 +791,7 @@ Connection::Connection(Port* port, |
remote_ice_mode_(ICEMODE_FULL), |
requests_(port->thread()), |
rtt_(DEFAULT_RTT), |
+ time_created_(rtc::Time()), |
last_ping_sent_(0), |
last_ping_received_(0), |
last_data_received_(0), |
@@ -849,7 +850,6 @@ void Connection::set_write_state(WriteState value) { |
LOG_J(LS_VERBOSE, this) << "set_write_state from: " << old_value << " to " |
<< value; |
SignalStateChange(this); |
- CheckTimeout(); |
} |
} |
@@ -858,7 +858,6 @@ void Connection::set_receiving(bool value) { |
LOG_J(LS_VERBOSE, this) << "set_receiving to " << value; |
receiving_ = value; |
SignalStateChange(this); |
- CheckTimeout(); |
} |
} |
@@ -913,6 +912,7 @@ void Connection::OnReadPacket( |
LOG(LS_WARNING) << "Received a data packet on a timed-out Connection. " |
<< "Resetting state to STATE_WRITE_INIT."; |
set_write_state(STATE_WRITE_INIT); |
+ Unprune(); |
pthatcher1
2015/09/21 23:49:18
if (!pruned_) Unprune()?
Why would we unprune if
honghaiz3
2015/09/22 19:35:08
If it is not pruned, then you don't need to unprun
|
} |
} else if (!msg) { |
// The packet was STUN, but failed a check and was handled internally. |
@@ -1003,7 +1003,13 @@ void Connection::Prune() { |
LOG_J(LS_VERBOSE, this) << "Connection pruned"; |
pruned_ = true; |
requests_.Clear(); |
- set_write_state(STATE_WRITE_TIMEOUT); |
+ } |
+} |
+ |
+void Connection::Unprune() { |
+ if (pruned_) { |
+ LOG_J(LS_VERBOSE, this) << "Connection un-pruned"; |
+ pruned_ = false; |
} |
} |
@@ -1045,6 +1051,8 @@ void Connection::UpdateState(uint32 now) { |
} |
// Check the writable state. (The order of these checks is important.) |
+ // If the connection has not sent stun ping for a while (mostly because |
pthatcher1
2015/09/21 23:49:18
sent stun ping => sent a stun ping
honghaiz3
2015/09/22 19:35:08
Done.
|
+ // it is pruned), it is considered stale. |
// |
// Before becoming unwritable, we allow for a fixed number of pings to fail |
// (i.e., receive no response). We also have to give the response time to |
@@ -1053,7 +1061,12 @@ void Connection::UpdateState(uint32 now) { |
// Before timing out writability, we give a fixed amount of time. This is to |
// allow for changes in network conditions. |
- if ((write_state_ == STATE_WRITABLE) && |
+ if (write_state_ == STATE_WRITABLE && |
+ last_ping_sent_ + CONNECTION_WRITE_STALE_TIMEOUT < now) { |
+ LOG_J(LS_INFO, this) << "WriteState becomes stale"; |
+ set_write_state(STATE_WRITE_STALE); |
+ } |
+ if ((write_state_ == STATE_WRITABLE || write_state_ == STATE_WRITE_STALE) && |
TooManyFailures(pings_since_last_response_, |
CONNECTION_WRITE_CONNECT_FAILURES, |
rtt, |
@@ -1089,6 +1102,16 @@ void Connection::UpdateState(uint32 now) { |
uint32 last_recv_time = last_received(); |
bool receiving = now <= last_recv_time + receiving_timeout_; |
set_receiving(receiving); |
+ if (!receiving) { |
+ // If this connection has not received anything for a long time, |
+ // destroy the connection. If the connection has never received anything, |
+ // use the connection creating time as the starting time for calculating |
+ // the receiving timeout. |
+ if (now > std::max(last_recv_time, time_created_) + |
+ DEAD_CONNECTION_RECEIVE_TIMEOUT) { |
+ Destroy(); |
+ } |
+ } |
} |
void Connection::Ping(uint32 now) { |
@@ -1134,8 +1157,9 @@ std::string Connection::ToString() const { |
'-', // not receiving (false) |
'R', // receiving (true) |
}; |
- const char WRITE_STATE_ABBREV[4] = { |
+ const char WRITE_STATE_ABBREV[5] = { |
'W', // STATE_WRITABLE |
+ 's', // STATE_WRITE_STALE |
pthatcher1
2015/09/21 23:49:18
Maybe a '?' would be good, since it means we don't
honghaiz3
2015/09/22 19:35:08
Dropped this (saved for a separate CL).
|
'w', // STATE_WRITE_UNRELIABLE |
'-', // STATE_WRITE_INIT |
'x', // STATE_WRITE_TIMEOUT |
@@ -1251,13 +1275,6 @@ void Connection::OnConnectionRequestSent(ConnectionRequest* request) { |
<< ", use_candidate=" << use_candidate; |
} |
-void Connection::CheckTimeout() { |
- // If write has timed out and it is not receiving, remove the connection. |
- if (!receiving_ && write_state_ == STATE_WRITE_TIMEOUT) { |
- port_->thread()->Post(this, MSG_DELETE); |
- } |
-} |
- |
void Connection::HandleRoleConflictFromPeer() { |
port_->SignalRoleConflict(port_); |
} |