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 1893 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1904 if (FLAGS_quic_timeouts_require_activity && | 1904 if (FLAGS_quic_timeouts_require_activity && |
1905 !time_of_last_packet.IsInitialized()) { | 1905 !time_of_last_packet.IsInitialized()) { |
1906 timeout_alarm_->Cancel(); | 1906 timeout_alarm_->Cancel(); |
1907 timeout_alarm_->Set(now.Add(idle_network_timeout_)); | 1907 timeout_alarm_->Set(now.Add(idle_network_timeout_)); |
1908 return; | 1908 return; |
1909 } | 1909 } |
1910 | 1910 |
1911 // |delta| can be < 0 as |now| is approximate time but |time_of_last_packet| | 1911 // |delta| can be < 0 as |now| is approximate time but |time_of_last_packet| |
1912 // is accurate time. However, this should not change the behavior of | 1912 // is accurate time. However, this should not change the behavior of |
1913 // timeout handling. | 1913 // timeout handling. |
1914 QuicTime::Delta delta = now.Subtract(time_of_last_packet); | 1914 QuicTime::Delta idle_duration = now.Subtract(time_of_last_packet); |
1915 DVLOG(1) << ENDPOINT << "last packet " | 1915 DVLOG(1) << ENDPOINT << "last packet " |
1916 << time_of_last_packet.ToDebuggingValue() | 1916 << time_of_last_packet.ToDebuggingValue() |
1917 << " now:" << now.ToDebuggingValue() | 1917 << " now:" << now.ToDebuggingValue() |
1918 << " delta:" << delta.ToMicroseconds() | 1918 << " idle_duration:" << idle_duration.ToMicroseconds() |
1919 << " network_timeout: " << idle_network_timeout_.ToMicroseconds(); | 1919 << " idle_network_timeout: " |
1920 if (delta >= idle_network_timeout_) { | 1920 << idle_network_timeout_.ToMicroseconds(); |
| 1921 if (idle_duration >= idle_network_timeout_) { |
1921 DVLOG(1) << ENDPOINT << "Connection timedout due to no network activity."; | 1922 DVLOG(1) << ENDPOINT << "Connection timedout due to no network activity."; |
1922 SendConnectionClose(QUIC_CONNECTION_TIMED_OUT); | 1923 SendConnectionClose(QUIC_CONNECTION_TIMED_OUT); |
1923 return; | 1924 return; |
1924 } | 1925 } |
1925 | 1926 |
1926 // Next timeout delta. | |
1927 QuicTime::Delta timeout = idle_network_timeout_.Subtract(delta); | |
1928 | |
1929 if (!overall_connection_timeout_.IsInfinite()) { | 1927 if (!overall_connection_timeout_.IsInfinite()) { |
1930 QuicTime::Delta connected_time = | 1928 QuicTime::Delta connected_duration = |
1931 now.Subtract(stats_.connection_creation_time); | 1929 now.Subtract(stats_.connection_creation_time); |
1932 DVLOG(1) << ENDPOINT << "connection time: " | 1930 DVLOG(1) << ENDPOINT << "connection time: " |
1933 << connected_time.ToMilliseconds() << " overall timeout: " | 1931 << connected_duration.ToMicroseconds() << " overall timeout: " |
1934 << overall_connection_timeout_.ToMilliseconds(); | 1932 << overall_connection_timeout_.ToMicroseconds(); |
1935 if (connected_time >= overall_connection_timeout_) { | 1933 if (connected_duration >= overall_connection_timeout_) { |
1936 DVLOG(1) << ENDPOINT << | 1934 DVLOG(1) << ENDPOINT << |
1937 "Connection timedout due to overall connection timeout."; | 1935 "Connection timedout due to overall connection timeout."; |
1938 SendConnectionClose(QUIC_CONNECTION_OVERALL_TIMED_OUT); | 1936 SendConnectionClose(QUIC_CONNECTION_OVERALL_TIMED_OUT); |
1939 return; | 1937 return; |
1940 } | 1938 } |
| 1939 } |
1941 | 1940 |
1942 // Take the min timeout. | 1941 SetTimeoutAlarm(); |
1943 QuicTime::Delta connection_timeout = | 1942 } |
1944 overall_connection_timeout_.Subtract(connected_time); | 1943 |
1945 if (connection_timeout < timeout) { | 1944 void QuicConnection::SetTimeoutAlarm() { |
1946 timeout = connection_timeout; | 1945 QuicTime time_of_last_packet = max(time_of_last_received_packet_, |
1947 } | 1946 time_of_last_sent_new_packet_); |
| 1947 |
| 1948 QuicTime deadline = time_of_last_packet.Add(idle_network_timeout_); |
| 1949 if (!overall_connection_timeout_.IsInfinite()) { |
| 1950 deadline = min(deadline, |
| 1951 stats_.connection_creation_time.Add( |
| 1952 overall_connection_timeout_)); |
1948 } | 1953 } |
1949 | 1954 |
1950 timeout_alarm_->Cancel(); | 1955 timeout_alarm_->Cancel(); |
1951 timeout_alarm_->Set(now.Add(timeout)); | 1956 timeout_alarm_->Set(deadline); |
1952 } | 1957 } |
1953 | 1958 |
1954 void QuicConnection::SetPingAlarm() { | 1959 void QuicConnection::SetPingAlarm() { |
1955 if (is_server_) { | 1960 if (is_server_) { |
1956 // Only clients send pings. | 1961 // Only clients send pings. |
1957 return; | 1962 return; |
1958 } | 1963 } |
1959 if (!visitor_->HasOpenDataStreams()) { | 1964 if (!visitor_->HasOpenDataStreams()) { |
1960 ping_alarm_->Cancel(); | 1965 ping_alarm_->Cancel(); |
1961 // Don't send a ping unless there are open streams. | 1966 // Don't send a ping unless there are open streams. |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2025 } | 2030 } |
2026 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) { | 2031 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) { |
2027 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) { | 2032 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) { |
2028 return true; | 2033 return true; |
2029 } | 2034 } |
2030 } | 2035 } |
2031 return false; | 2036 return false; |
2032 } | 2037 } |
2033 | 2038 |
2034 } // namespace net | 2039 } // namespace net |
OLD | NEW |