OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_time_wait_list_manager.h" | 5 #include "net/quic/quic_time_wait_list_manager.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 | 8 |
9 #include "base/containers/hash_tables.h" | 9 #include "base/containers/hash_tables.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 it != connection_id_map_.end(); | 105 it != connection_id_map_.end(); |
106 ++it) { | 106 ++it) { |
107 delete it->second.close_packet; | 107 delete it->second.close_packet; |
108 } | 108 } |
109 } | 109 } |
110 | 110 |
111 void QuicTimeWaitListManager::AddConnectionIdToTimeWait( | 111 void QuicTimeWaitListManager::AddConnectionIdToTimeWait( |
112 QuicConnectionId connection_id, | 112 QuicConnectionId connection_id, |
113 QuicVersion version, | 113 QuicVersion version, |
114 QuicEncryptedPacket* close_packet) { | 114 QuicEncryptedPacket* close_packet) { |
115 DVLOG(1) << "Adding " << connection_id << " to the time wait list."; | |
116 int num_packets = 0; | 115 int num_packets = 0; |
117 ConnectionIdMap::iterator it = connection_id_map_.find(connection_id); | 116 ConnectionIdMap::iterator it = connection_id_map_.find(connection_id); |
118 if (it != connection_id_map_.end()) { // Replace record if it is reinserted. | 117 const bool new_connection_id = it == connection_id_map_.end(); |
| 118 if (!new_connection_id) { // Replace record if it is reinserted. |
119 num_packets = it->second.num_packets; | 119 num_packets = it->second.num_packets; |
120 delete it->second.close_packet; | 120 delete it->second.close_packet; |
121 connection_id_map_.erase(it); | 121 connection_id_map_.erase(it); |
122 } | 122 } |
123 ConnectionIdData data(num_packets, | 123 ConnectionIdData data(num_packets, |
124 version, | 124 version, |
125 helper_->GetClock()->ApproximateNow(), | 125 helper_->GetClock()->ApproximateNow(), |
126 close_packet); | 126 close_packet); |
127 connection_id_map_.insert(make_pair(connection_id, data)); | 127 connection_id_map_.insert(make_pair(connection_id, data)); |
| 128 if (new_connection_id) { |
| 129 visitor_->OnConnectionAddedToTimeWaitList(connection_id); |
| 130 } |
128 } | 131 } |
129 | 132 |
130 bool QuicTimeWaitListManager::IsConnectionIdInTimeWait( | 133 bool QuicTimeWaitListManager::IsConnectionIdInTimeWait( |
131 QuicConnectionId connection_id) const { | 134 QuicConnectionId connection_id) const { |
132 return ContainsKey(connection_id_map_, connection_id); | 135 return ContainsKey(connection_id_map_, connection_id); |
133 } | 136 } |
134 | 137 |
135 QuicVersion QuicTimeWaitListManager::GetQuicVersionFromConnectionId( | 138 QuicVersion QuicTimeWaitListManager::GetQuicVersionFromConnectionId( |
136 QuicConnectionId connection_id) { | 139 QuicConnectionId connection_id) { |
137 ConnectionIdMap::iterator it = connection_id_map_.find(connection_id); | 140 ConnectionIdMap::iterator it = connection_id_map_.find(connection_id); |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 } | 273 } |
271 | 274 |
272 void QuicTimeWaitListManager::CleanUpOldConnectionIds() { | 275 void QuicTimeWaitListManager::CleanUpOldConnectionIds() { |
273 QuicTime now = helper_->GetClock()->ApproximateNow(); | 276 QuicTime now = helper_->GetClock()->ApproximateNow(); |
274 while (!connection_id_map_.empty()) { | 277 while (!connection_id_map_.empty()) { |
275 ConnectionIdMap::iterator it = connection_id_map_.begin(); | 278 ConnectionIdMap::iterator it = connection_id_map_.begin(); |
276 QuicTime oldest_connection_id = it->second.time_added; | 279 QuicTime oldest_connection_id = it->second.time_added; |
277 if (now.Subtract(oldest_connection_id) < kTimeWaitPeriod_) { | 280 if (now.Subtract(oldest_connection_id) < kTimeWaitPeriod_) { |
278 break; | 281 break; |
279 } | 282 } |
| 283 const QuicConnectionId connection_id = it->first; |
280 // This connection_id has lived its age, retire it now. | 284 // This connection_id has lived its age, retire it now. |
281 DVLOG(1) << "Retiring " << it->first << " from the time-wait state."; | |
282 delete it->second.close_packet; | 285 delete it->second.close_packet; |
283 connection_id_map_.erase(it); | 286 connection_id_map_.erase(it); |
| 287 visitor_->OnConnectionRemovedFromTimeWaitList(connection_id); |
284 } | 288 } |
285 SetConnectionIdCleanUpAlarm(); | 289 SetConnectionIdCleanUpAlarm(); |
286 } | 290 } |
287 | 291 |
288 } // namespace net | 292 } // namespace net |
OLD | NEW |