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/tools/quic/quic_time_wait_list_manager.h" | 5 #include "net/tools/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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 it != connection_id_map_.end(); | 107 it != connection_id_map_.end(); |
108 ++it) { | 108 ++it) { |
109 delete it->second.close_packet; | 109 delete it->second.close_packet; |
110 } | 110 } |
111 } | 111 } |
112 | 112 |
113 void QuicTimeWaitListManager::AddConnectionIdToTimeWait( | 113 void QuicTimeWaitListManager::AddConnectionIdToTimeWait( |
114 QuicConnectionId connection_id, | 114 QuicConnectionId connection_id, |
115 QuicVersion version, | 115 QuicVersion version, |
116 QuicEncryptedPacket* close_packet) { | 116 QuicEncryptedPacket* close_packet) { |
117 DVLOG(1) << "Adding " << connection_id << " to the time wait list."; | |
118 int num_packets = 0; | 117 int num_packets = 0; |
119 ConnectionIdMap::iterator it = connection_id_map_.find(connection_id); | 118 ConnectionIdMap::iterator it = connection_id_map_.find(connection_id); |
120 if (it != connection_id_map_.end()) { // Replace record if it is reinserted. | 119 const bool new_connection_id = it == connection_id_map_.end(); |
| 120 if (!new_connection_id) { // Replace record if it is reinserted. |
121 num_packets = it->second.num_packets; | 121 num_packets = it->second.num_packets; |
122 delete it->second.close_packet; | 122 delete it->second.close_packet; |
123 connection_id_map_.erase(it); | 123 connection_id_map_.erase(it); |
124 } | 124 } |
125 ConnectionIdData data(num_packets, | 125 ConnectionIdData data(num_packets, |
126 version, | 126 version, |
127 clock_.ApproximateNow(), | 127 clock_.ApproximateNow(), |
128 close_packet); | 128 close_packet); |
129 connection_id_map_.insert(make_pair(connection_id, data)); | 129 connection_id_map_.insert(make_pair(connection_id, data)); |
| 130 if (new_connection_id) { |
| 131 visitor_->OnConnectionAddedToTimeWaitList(connection_id); |
| 132 } |
130 } | 133 } |
131 | 134 |
132 bool QuicTimeWaitListManager::IsConnectionIdInTimeWait( | 135 bool QuicTimeWaitListManager::IsConnectionIdInTimeWait( |
133 QuicConnectionId connection_id) const { | 136 QuicConnectionId connection_id) const { |
134 return ContainsKey(connection_id_map_, connection_id); | 137 return ContainsKey(connection_id_map_, connection_id); |
135 } | 138 } |
136 | 139 |
137 QuicVersion QuicTimeWaitListManager::GetQuicVersionFromConnectionId( | 140 QuicVersion QuicTimeWaitListManager::GetQuicVersionFromConnectionId( |
138 QuicConnectionId connection_id) { | 141 QuicConnectionId connection_id) { |
139 ConnectionIdMap::iterator it = connection_id_map_.find(connection_id); | 142 ConnectionIdMap::iterator it = connection_id_map_.find(connection_id); |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 } | 279 } |
277 | 280 |
278 void QuicTimeWaitListManager::CleanUpOldConnectionIds() { | 281 void QuicTimeWaitListManager::CleanUpOldConnectionIds() { |
279 QuicTime now = clock_.ApproximateNow(); | 282 QuicTime now = clock_.ApproximateNow(); |
280 while (!connection_id_map_.empty()) { | 283 while (!connection_id_map_.empty()) { |
281 ConnectionIdMap::iterator it = connection_id_map_.begin(); | 284 ConnectionIdMap::iterator it = connection_id_map_.begin(); |
282 QuicTime oldest_connection_id = it->second.time_added; | 285 QuicTime oldest_connection_id = it->second.time_added; |
283 if (now.Subtract(oldest_connection_id) < kTimeWaitPeriod_) { | 286 if (now.Subtract(oldest_connection_id) < kTimeWaitPeriod_) { |
284 break; | 287 break; |
285 } | 288 } |
| 289 const QuicConnectionId connection_id = it->first; |
286 // This connection_id has lived its age, retire it now. | 290 // This connection_id has lived its age, retire it now. |
287 DVLOG(1) << "Retiring " << it->first << " from the time-wait state."; | |
288 delete it->second.close_packet; | 291 delete it->second.close_packet; |
289 connection_id_map_.erase(it); | 292 connection_id_map_.erase(it); |
| 293 visitor_->OnConnectionRemovedFromTimeWaitList(connection_id); |
290 } | 294 } |
291 SetConnectionIdCleanUpAlarm(); | 295 SetConnectionIdCleanUpAlarm(); |
292 } | 296 } |
293 | 297 |
294 } // namespace tools | 298 } // namespace tools |
295 } // namespace net | 299 } // namespace net |
OLD | NEW |