| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/quic_connection.h" | 5 #include "net/quic/quic_connection.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 #include <sys/types.h> | 8 #include <sys/types.h> |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <iterator> | 10 #include <iterator> |
| (...skipping 1884 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1895 | 1895 |
| 1896 void QuicConnection::SetOverallConnectionTimeout(QuicTime::Delta timeout) { | 1896 void QuicConnection::SetOverallConnectionTimeout(QuicTime::Delta timeout) { |
| 1897 if (timeout < overall_connection_timeout_) { | 1897 if (timeout < overall_connection_timeout_) { |
| 1898 overall_connection_timeout_ = timeout; | 1898 overall_connection_timeout_ = timeout; |
| 1899 CheckForTimeout(); | 1899 CheckForTimeout(); |
| 1900 } else { | 1900 } else { |
| 1901 overall_connection_timeout_ = timeout; | 1901 overall_connection_timeout_ = timeout; |
| 1902 } | 1902 } |
| 1903 } | 1903 } |
| 1904 | 1904 |
| 1905 bool QuicConnection::CheckForTimeout() { | 1905 void QuicConnection::CheckForTimeout() { |
| 1906 QuicTime now = clock_->ApproximateNow(); | 1906 QuicTime now = clock_->ApproximateNow(); |
| 1907 QuicTime time_of_last_packet = max(time_of_last_received_packet_, | 1907 QuicTime time_of_last_packet = max(time_of_last_received_packet_, |
| 1908 time_of_last_sent_new_packet_); | 1908 time_of_last_sent_new_packet_); |
| 1909 | 1909 |
| 1910 // If no packets have been sent or received, then don't timeout. | 1910 // If no packets have been sent or received, then don't timeout. |
| 1911 if (FLAGS_quic_timeouts_require_activity && | 1911 if (FLAGS_quic_timeouts_require_activity && |
| 1912 !time_of_last_packet.IsInitialized()) { | 1912 !time_of_last_packet.IsInitialized()) { |
| 1913 timeout_alarm_->Cancel(); | 1913 timeout_alarm_->Cancel(); |
| 1914 timeout_alarm_->Set(now.Add(idle_network_timeout_)); | 1914 timeout_alarm_->Set(now.Add(idle_network_timeout_)); |
| 1915 return false; | 1915 return; |
| 1916 } | 1916 } |
| 1917 | 1917 |
| 1918 // |delta| can be < 0 as |now| is approximate time but |time_of_last_packet| | 1918 // |delta| can be < 0 as |now| is approximate time but |time_of_last_packet| |
| 1919 // is accurate time. However, this should not change the behavior of | 1919 // is accurate time. However, this should not change the behavior of |
| 1920 // timeout handling. | 1920 // timeout handling. |
| 1921 QuicTime::Delta delta = now.Subtract(time_of_last_packet); | 1921 QuicTime::Delta delta = now.Subtract(time_of_last_packet); |
| 1922 DVLOG(1) << ENDPOINT << "last packet " | 1922 DVLOG(1) << ENDPOINT << "last packet " |
| 1923 << time_of_last_packet.ToDebuggingValue() | 1923 << time_of_last_packet.ToDebuggingValue() |
| 1924 << " now:" << now.ToDebuggingValue() | 1924 << " now:" << now.ToDebuggingValue() |
| 1925 << " delta:" << delta.ToMicroseconds() | 1925 << " delta:" << delta.ToMicroseconds() |
| 1926 << " network_timeout: " << idle_network_timeout_.ToMicroseconds(); | 1926 << " network_timeout: " << idle_network_timeout_.ToMicroseconds(); |
| 1927 if (delta >= idle_network_timeout_) { | 1927 if (delta >= idle_network_timeout_) { |
| 1928 DVLOG(1) << ENDPOINT << "Connection timedout due to no network activity."; | 1928 DVLOG(1) << ENDPOINT << "Connection timedout due to no network activity."; |
| 1929 SendConnectionClose(QUIC_CONNECTION_TIMED_OUT); | 1929 SendConnectionClose(QUIC_CONNECTION_TIMED_OUT); |
| 1930 return true; | 1930 return; |
| 1931 } | 1931 } |
| 1932 | 1932 |
| 1933 // Next timeout delta. | 1933 // Next timeout delta. |
| 1934 QuicTime::Delta timeout = idle_network_timeout_.Subtract(delta); | 1934 QuicTime::Delta timeout = idle_network_timeout_.Subtract(delta); |
| 1935 | 1935 |
| 1936 if (!overall_connection_timeout_.IsInfinite()) { | 1936 if (!overall_connection_timeout_.IsInfinite()) { |
| 1937 QuicTime::Delta connected_time = | 1937 QuicTime::Delta connected_time = |
| 1938 now.Subtract(stats_.connection_creation_time); | 1938 now.Subtract(stats_.connection_creation_time); |
| 1939 DVLOG(1) << ENDPOINT << "connection time: " | 1939 DVLOG(1) << ENDPOINT << "connection time: " |
| 1940 << connected_time.ToMilliseconds() << " overall timeout: " | 1940 << connected_time.ToMilliseconds() << " overall timeout: " |
| 1941 << overall_connection_timeout_.ToMilliseconds(); | 1941 << overall_connection_timeout_.ToMilliseconds(); |
| 1942 if (connected_time >= overall_connection_timeout_) { | 1942 if (connected_time >= overall_connection_timeout_) { |
| 1943 DVLOG(1) << ENDPOINT << | 1943 DVLOG(1) << ENDPOINT << |
| 1944 "Connection timedout due to overall connection timeout."; | 1944 "Connection timedout due to overall connection timeout."; |
| 1945 SendConnectionClose(QUIC_CONNECTION_OVERALL_TIMED_OUT); | 1945 SendConnectionClose(QUIC_CONNECTION_OVERALL_TIMED_OUT); |
| 1946 return true; | 1946 return; |
| 1947 } | 1947 } |
| 1948 | 1948 |
| 1949 // Take the min timeout. | 1949 // Take the min timeout. |
| 1950 QuicTime::Delta connection_timeout = | 1950 QuicTime::Delta connection_timeout = |
| 1951 overall_connection_timeout_.Subtract(connected_time); | 1951 overall_connection_timeout_.Subtract(connected_time); |
| 1952 if (connection_timeout < timeout) { | 1952 if (connection_timeout < timeout) { |
| 1953 timeout = connection_timeout; | 1953 timeout = connection_timeout; |
| 1954 } | 1954 } |
| 1955 } | 1955 } |
| 1956 | 1956 |
| 1957 timeout_alarm_->Cancel(); | 1957 timeout_alarm_->Cancel(); |
| 1958 timeout_alarm_->Set(now.Add(timeout)); | 1958 timeout_alarm_->Set(now.Add(timeout)); |
| 1959 return false; | |
| 1960 } | 1959 } |
| 1961 | 1960 |
| 1962 void QuicConnection::SetPingAlarm() { | 1961 void QuicConnection::SetPingAlarm() { |
| 1963 if (is_server_) { | 1962 if (is_server_) { |
| 1964 // Only clients send pings. | 1963 // Only clients send pings. |
| 1965 return; | 1964 return; |
| 1966 } | 1965 } |
| 1967 if (!visitor_->HasOpenDataStreams()) { | 1966 if (!visitor_->HasOpenDataStreams()) { |
| 1968 ping_alarm_->Cancel(); | 1967 ping_alarm_->Cancel(); |
| 1969 // Don't send a ping unless there are open streams. | 1968 // Don't send a ping unless there are open streams. |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2033 } | 2032 } |
| 2034 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) { | 2033 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) { |
| 2035 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) { | 2034 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) { |
| 2036 return true; | 2035 return true; |
| 2037 } | 2036 } |
| 2038 } | 2037 } |
| 2039 return false; | 2038 return false; |
| 2040 } | 2039 } |
| 2041 | 2040 |
| 2042 } // namespace net | 2041 } // namespace net |
| OLD | NEW |