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

Side by Side Diff: webrtc/p2p/base/port.cc

Issue 1944003002: Increase the stun ping interval. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fix naming issue in unit test before committing. Created 4 years, 6 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 unified diff | Download patch
« no previous file with comments | « webrtc/p2p/base/port.h ('k') | webrtc/p2p/base/transport.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 1170 matching lines...) Expand 10 before | Expand all | Expand 10 after
1181 requests_.Send(req); 1181 requests_.Send(req);
1182 state_ = STATE_INPROGRESS; 1182 state_ = STATE_INPROGRESS;
1183 num_pings_sent_++; 1183 num_pings_sent_++;
1184 } 1184 }
1185 1185
1186 void Connection::ReceivedPing() { 1186 void Connection::ReceivedPing() {
1187 set_receiving(true); 1187 set_receiving(true);
1188 last_ping_received_ = rtc::TimeMillis(); 1188 last_ping_received_ = rtc::TimeMillis();
1189 } 1189 }
1190 1190
1191 void Connection::ReceivedPingResponse() { 1191 void Connection::ReceivedPingResponse(int rtt) {
1192 // We've already validated that this is a STUN binding response with 1192 // We've already validated that this is a STUN binding response with
1193 // the correct local and remote username for this connection. 1193 // the correct local and remote username for this connection.
1194 // So if we're not already, become writable. We may be bringing a pruned 1194 // So if we're not already, become writable. We may be bringing a pruned
1195 // connection back to life, but if we don't really want it, we can always 1195 // connection back to life, but if we don't really want it, we can always
1196 // prune it again. 1196 // prune it again.
1197 set_receiving(true); 1197 set_receiving(true);
1198 set_write_state(STATE_WRITABLE); 1198 set_write_state(STATE_WRITABLE);
1199 set_state(STATE_SUCCEEDED); 1199 set_state(STATE_SUCCEEDED);
1200 pings_since_last_response_.clear(); 1200 pings_since_last_response_.clear();
1201 last_ping_response_received_ = rtc::TimeMillis(); 1201 last_ping_response_received_ = rtc::TimeMillis();
1202 rtt_samples_++;
1203 rtt_ = (RTT_RATIO * rtt_ + rtt) / (RTT_RATIO + 1);
1202 } 1204 }
1203 1205
1204 bool Connection::dead(int64_t now) const { 1206 bool Connection::dead(int64_t now) const {
1205 if (last_received() > 0) { 1207 if (last_received() > 0) {
1206 // If it has ever received anything, we keep it alive until it hasn't 1208 // If it has ever received anything, we keep it alive until it hasn't
1207 // received anything for DEAD_CONNECTION_RECEIVE_TIMEOUT. This covers the 1209 // received anything for DEAD_CONNECTION_RECEIVE_TIMEOUT. This covers the
1208 // normal case of a successfully used connection that stops working. This 1210 // normal case of a successfully used connection that stops working. This
1209 // also allows a remote peer to continue pinging over a locally inactive 1211 // also allows a remote peer to continue pinging over a locally inactive
1210 // (pruned) connection. 1212 // (pruned) connection.
1211 return (now > (last_received() + DEAD_CONNECTION_RECEIVE_TIMEOUT)); 1213 return (now > (last_received() + DEAD_CONNECTION_RECEIVE_TIMEOUT));
1212 } 1214 }
1213 1215
1214 if (active()) { 1216 if (active()) {
1215 // If it has never received anything, keep it alive as long as it is 1217 // If it has never received anything, keep it alive as long as it is
1216 // actively pinging and not pruned. Otherwise, the connection might be 1218 // actively pinging and not pruned. Otherwise, the connection might be
1217 // deleted before it has a chance to ping. This is the normal case for a 1219 // deleted before it has a chance to ping. This is the normal case for a
1218 // new connection that is pinging but hasn't received anything yet. 1220 // new connection that is pinging but hasn't received anything yet.
1219 return false; 1221 return false;
1220 } 1222 }
1221 1223
1222 // If it has never received anything and is not actively pinging (pruned), we 1224 // If it has never received anything and is not actively pinging (pruned), we
1223 // keep it around for at least MIN_CONNECTION_LIFETIME to prevent connections 1225 // keep it around for at least MIN_CONNECTION_LIFETIME to prevent connections
1224 // from being pruned too quickly during a network change event when two 1226 // from being pruned too quickly during a network change event when two
1225 // networks would be up simultaneously but only for a brief period. 1227 // networks would be up simultaneously but only for a brief period.
1226 return now > (time_created_ms_ + MIN_CONNECTION_LIFETIME); 1228 return now > (time_created_ms_ + MIN_CONNECTION_LIFETIME);
1227 } 1229 }
1228 1230
1231 bool Connection::stable(int64_t now) {
1232 // A connection is stable if it's RTT has converged and it isn't missing any
1233 // responses. We should send pings at a higher rate until the RTT converges
1234 // and whenever a ping response is missing (so that we can detect
1235 // unwritability faster)
1236 return rtt_converged() && !missing_responses(now);
1237 }
1238
1229 std::string Connection::ToDebugId() const { 1239 std::string Connection::ToDebugId() const {
1230 std::stringstream ss; 1240 std::stringstream ss;
1231 ss << std::hex << this; 1241 ss << std::hex << this;
1232 return ss.str(); 1242 return ss.str();
1233 } 1243 }
1234 1244
1235 uint32_t Connection::ComputeNetworkCost() const { 1245 uint32_t Connection::ComputeNetworkCost() const {
1236 // TODO(honghaiz): Will add rtt as part of the network cost. 1246 // TODO(honghaiz): Will add rtt as part of the network cost.
1237 return port()->network_cost() + remote_candidate_.network_cost(); 1247 return port()->network_cost() + remote_candidate_.network_cost();
1238 } 1248 }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1289 } 1299 }
1290 1300
1291 void Connection::OnConnectionRequestResponse(ConnectionRequest* request, 1301 void Connection::OnConnectionRequestResponse(ConnectionRequest* request,
1292 StunMessage* response) { 1302 StunMessage* response) {
1293 // Log at LS_INFO if we receive a ping response on an unwritable 1303 // Log at LS_INFO if we receive a ping response on an unwritable
1294 // connection. 1304 // connection.
1295 rtc::LoggingSeverity sev = !writable() ? rtc::LS_INFO : rtc::LS_VERBOSE; 1305 rtc::LoggingSeverity sev = !writable() ? rtc::LS_INFO : rtc::LS_VERBOSE;
1296 1306
1297 int rtt = request->Elapsed(); 1307 int rtt = request->Elapsed();
1298 1308
1299 ReceivedPingResponse(); 1309 ReceivedPingResponse(rtt);
1300 1310
1301 if (LOG_CHECK_LEVEL_V(sev)) { 1311 if (LOG_CHECK_LEVEL_V(sev)) {
1302 bool use_candidate = ( 1312 bool use_candidate = (
1303 response->GetByteString(STUN_ATTR_USE_CANDIDATE) != nullptr); 1313 response->GetByteString(STUN_ATTR_USE_CANDIDATE) != nullptr);
1304 std::string pings; 1314 std::string pings;
1305 PrintPingsSinceLastResponse(&pings, 5); 1315 PrintPingsSinceLastResponse(&pings, 5);
1306 LOG_JV(sev, this) << "Received STUN ping response" 1316 LOG_JV(sev, this) << "Received STUN ping response"
1307 << ", id=" << rtc::hex_encode(request->id()) 1317 << ", id=" << rtc::hex_encode(request->id())
1308 << ", code=0" // Makes logging easier to parse. 1318 << ", code=0" // Makes logging easier to parse.
1309 << ", rtt=" << rtt 1319 << ", rtt=" << rtt
1310 << ", use_candidate=" << use_candidate 1320 << ", use_candidate=" << use_candidate
1311 << ", pings_since_last_response=" << pings; 1321 << ", pings_since_last_response=" << pings;
1312 } 1322 }
1313 1323
1314 rtt_ = (RTT_RATIO * rtt_ + rtt) / (RTT_RATIO + 1);
1315 stats_.recv_ping_responses++; 1324 stats_.recv_ping_responses++;
1316 1325
1317 MaybeAddPrflxCandidate(request, response); 1326 MaybeAddPrflxCandidate(request, response);
1318 } 1327 }
1319 1328
1320 void Connection::OnConnectionRequestErrorResponse(ConnectionRequest* request, 1329 void Connection::OnConnectionRequestErrorResponse(ConnectionRequest* request,
1321 StunMessage* response) { 1330 StunMessage* response) {
1322 const StunErrorCodeAttribute* error_attr = response->GetErrorCode(); 1331 const StunErrorCodeAttribute* error_attr = response->GetErrorCode();
1323 int error_code = STUN_ERROR_GLOBAL_FAILURE; 1332 int error_code = STUN_ERROR_GLOBAL_FAILURE;
1324 if (error_attr) { 1333 if (error_attr) {
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1483 new_local_candidate.set_network_cost(local_candidate().network_cost()); 1492 new_local_candidate.set_network_cost(local_candidate().network_cost());
1484 1493
1485 // Change the local candidate of this Connection to the new prflx candidate. 1494 // Change the local candidate of this Connection to the new prflx candidate.
1486 local_candidate_index_ = port_->AddPrflxCandidate(new_local_candidate); 1495 local_candidate_index_ = port_->AddPrflxCandidate(new_local_candidate);
1487 1496
1488 // SignalStateChange to force a re-sort in P2PTransportChannel as this 1497 // SignalStateChange to force a re-sort in P2PTransportChannel as this
1489 // Connection's local candidate has changed. 1498 // Connection's local candidate has changed.
1490 SignalStateChange(this); 1499 SignalStateChange(this);
1491 } 1500 }
1492 1501
1502 bool Connection::rtt_converged() {
1503 return rtt_samples_ > (RTT_RATIO + 1);
1504 }
1505
1506 bool Connection::missing_responses(int64_t now) {
1507 if (pings_since_last_response_.empty()) {
1508 return false;
1509 }
1510
1511 int64_t waiting = now - pings_since_last_response_[0].sent_time;
1512 return waiting > 2 * rtt();
1513 }
1514
1493 ProxyConnection::ProxyConnection(Port* port, 1515 ProxyConnection::ProxyConnection(Port* port,
1494 size_t index, 1516 size_t index,
1495 const Candidate& remote_candidate) 1517 const Candidate& remote_candidate)
1496 : Connection(port, index, remote_candidate) {} 1518 : Connection(port, index, remote_candidate) {}
1497 1519
1498 int ProxyConnection::Send(const void* data, size_t size, 1520 int ProxyConnection::Send(const void* data, size_t size,
1499 const rtc::PacketOptions& options) { 1521 const rtc::PacketOptions& options) {
1500 if (write_state_ == STATE_WRITE_INIT || write_state_ == STATE_WRITE_TIMEOUT) { 1522 if (write_state_ == STATE_WRITE_INIT || write_state_ == STATE_WRITE_TIMEOUT) {
1501 error_ = EWOULDBLOCK; 1523 error_ = EWOULDBLOCK;
1502 return SOCKET_ERROR; 1524 return SOCKET_ERROR;
1503 } 1525 }
1504 stats_.sent_total_packets++; 1526 stats_.sent_total_packets++;
1505 int sent = port_->SendTo(data, size, remote_candidate_.address(), 1527 int sent = port_->SendTo(data, size, remote_candidate_.address(),
1506 options, true); 1528 options, true);
1507 if (sent <= 0) { 1529 if (sent <= 0) {
1508 ASSERT(sent < 0); 1530 ASSERT(sent < 0);
1509 error_ = port_->GetError(); 1531 error_ = port_->GetError();
1510 stats_.sent_discarded_packets++; 1532 stats_.sent_discarded_packets++;
1511 } else { 1533 } else {
1512 send_rate_tracker_.AddSamples(sent); 1534 send_rate_tracker_.AddSamples(sent);
1513 } 1535 }
1514 return sent; 1536 return sent;
1515 } 1537 }
1516 1538
1517 } // namespace cricket 1539 } // namespace cricket
OLDNEW
« no previous file with comments | « webrtc/p2p/base/port.h ('k') | webrtc/p2p/base/transport.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698