| Index: webrtc/p2p/base/stunrequest.cc
|
| diff --git a/webrtc/p2p/base/stunrequest.cc b/webrtc/p2p/base/stunrequest.cc
|
| index 57c3c2e4a5864e74212302ed9e92f4b761d8ef00..ef2bee8aa819c251f7920df001666867912dc9dc 100644
|
| --- a/webrtc/p2p/base/stunrequest.cc
|
| +++ b/webrtc/p2p/base/stunrequest.cc
|
| @@ -22,9 +22,22 @@ namespace cricket {
|
|
|
| const uint32_t MSG_STUN_SEND = 1;
|
|
|
| -const int MAX_SENDS = 9;
|
| -const int DELAY_UNIT = 100; // 100 milliseconds
|
| -const int DELAY_MAX_FACTOR = 16;
|
| +// RFC 5389 says SHOULD be 500ms.
|
| +// For years, this was 100ms, but for networks that
|
| +// experience moments of high RTT (such as 2G networks), this doesn't
|
| +// work well.
|
| +const int STUN_INITIAL_RTO = 250; // milliseconds
|
| +
|
| +// The timeout doubles each retransmission, up to this many times
|
| +// RFC 5389 says SHOULD retransmit 7 times.
|
| +// This has been 8 for years (not sure why).
|
| +const int STUN_MAX_RETRANSMISSIONS = 8; // Total sends: 9
|
| +
|
| +// We also cap the doubling, even though the standard doesn't say to.
|
| +// This has been 1.6 seconds for years, but for networks that
|
| +// experience moments of high RTT (such as 2G networks), this doesn't
|
| +// work well.
|
| +const int STUN_MAX_RTO = 8000; // milliseconds, or 5 doublings
|
|
|
| StunRequestManager::StunRequestManager(rtc::Thread* thread)
|
| : thread_(thread) {
|
| @@ -226,7 +239,8 @@ void StunRequest::OnMessage(rtc::Message* pmsg) {
|
|
|
| void StunRequest::OnSent() {
|
| count_ += 1;
|
| - if (count_ == MAX_SENDS) {
|
| + int retransmissions = (count_ - 1);
|
| + if (retransmissions >= STUN_MAX_RETRANSMISSIONS) {
|
| timeout_ = true;
|
| }
|
| LOG(LS_VERBOSE) << "Sent STUN request " << count_
|
| @@ -237,7 +251,9 @@ int StunRequest::resend_delay() {
|
| if (count_ == 0) {
|
| return 0;
|
| }
|
| - return DELAY_UNIT * std::min(1 << (count_-1), DELAY_MAX_FACTOR);
|
| + int retransmissions = (count_ - 1);
|
| + int rto = STUN_INITIAL_RTO << retransmissions;
|
| + return std::min(rto, STUN_MAX_RTO);
|
| }
|
|
|
| } // namespace cricket
|
|
|