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_dispatcher.h" | 5 #include "net/tools/quic/quic_dispatcher.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 } | 143 } |
144 | 144 |
145 void QuicDispatcher::Initialize(int fd) { | 145 void QuicDispatcher::Initialize(int fd) { |
146 DCHECK(writer_ == NULL); | 146 DCHECK(writer_ == NULL); |
147 writer_.reset(CreateWriterWrapper(CreateWriter(fd))); | 147 writer_.reset(CreateWriterWrapper(CreateWriter(fd))); |
148 time_wait_list_manager_.reset( | 148 time_wait_list_manager_.reset( |
149 new QuicTimeWaitListManager(writer_.get(), this, | 149 new QuicTimeWaitListManager(writer_.get(), this, |
150 epoll_server(), supported_versions())); | 150 epoll_server(), supported_versions())); |
151 } | 151 } |
152 | 152 |
153 // TODO(fnk): remove the Writer interface implementation in favor of | |
154 // direct requests for blocked list placement from Connection/Session. | |
155 WriteResult QuicDispatcher::WritePacket(const char* buffer, size_t buf_len, | |
156 const IPAddressNumber& self_address, | |
157 const IPEndPoint& peer_address, | |
158 QuicBlockedWriterInterface* writer) { | |
159 if (IsWriteBlocked()) { | |
160 write_blocked_list_.insert(make_pair(writer, true)); | |
161 return WriteResult(WRITE_STATUS_BLOCKED, EAGAIN); | |
162 } | |
163 | |
164 WriteResult result = | |
165 writer_->WritePacket(buffer, buf_len, self_address, peer_address, writer); | |
166 if (result.status == WRITE_STATUS_BLOCKED) { | |
167 DCHECK(IsWriteBlocked()); | |
168 write_blocked_list_.insert(make_pair(writer, true)); | |
169 } | |
170 return result; | |
171 } | |
172 | |
173 bool QuicDispatcher::IsWriteBlockedDataBuffered() const { | |
174 return writer_->IsWriteBlockedDataBuffered(); | |
175 } | |
176 | |
177 bool QuicDispatcher::IsWriteBlocked() const { | |
178 return writer_->IsWriteBlocked(); | |
179 } | |
180 | |
181 void QuicDispatcher::SetWritable() { | |
182 writer_->SetWritable(); | |
183 } | |
184 | |
185 void QuicDispatcher::ProcessPacket(const IPEndPoint& server_address, | 153 void QuicDispatcher::ProcessPacket(const IPEndPoint& server_address, |
186 const IPEndPoint& client_address, | 154 const IPEndPoint& client_address, |
187 const QuicEncryptedPacket& packet) { | 155 const QuicEncryptedPacket& packet) { |
188 current_server_address_ = server_address; | 156 current_server_address_ = server_address; |
189 current_client_address_ = client_address; | 157 current_client_address_ = client_address; |
190 current_packet_ = &packet; | 158 current_packet_ = &packet; |
191 // ProcessPacket will cause the packet to be dispatched in | 159 // ProcessPacket will cause the packet to be dispatched in |
192 // OnUnauthenticatedPublicHeader, or sent to the time wait list manager | 160 // OnUnauthenticatedPublicHeader, or sent to the time wait list manager |
193 // in OnAuthenticatedHeader. | 161 // in OnAuthenticatedHeader. |
194 framer_.ProcessPacket(packet); | 162 framer_.ProcessPacket(packet); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 connection_close_packet); | 234 connection_close_packet); |
267 session_map_.erase(it); | 235 session_map_.erase(it); |
268 } | 236 } |
269 | 237 |
270 void QuicDispatcher::DeleteSessions() { | 238 void QuicDispatcher::DeleteSessions() { |
271 STLDeleteElements(&closed_session_list_); | 239 STLDeleteElements(&closed_session_list_); |
272 } | 240 } |
273 | 241 |
274 bool QuicDispatcher::OnCanWrite() { | 242 bool QuicDispatcher::OnCanWrite() { |
275 // We got an EPOLLOUT: the socket should not be blocked. | 243 // We got an EPOLLOUT: the socket should not be blocked. |
276 SetWritable(); | 244 writer_->SetWritable(); |
277 | 245 |
278 // Give each writer one attempt to write. | 246 // Give each writer one attempt to write. |
279 int num_writers = write_blocked_list_.size(); | 247 int num_writers = write_blocked_list_.size(); |
280 for (int i = 0; i < num_writers; ++i) { | 248 for (int i = 0; i < num_writers; ++i) { |
281 if (write_blocked_list_.empty()) { | 249 if (write_blocked_list_.empty()) { |
282 break; | 250 break; |
283 } | 251 } |
284 QuicBlockedWriterInterface* writer = write_blocked_list_.begin()->first; | 252 QuicBlockedWriterInterface* writer = write_blocked_list_.begin()->first; |
285 write_blocked_list_.erase(write_blocked_list_.begin()); | 253 write_blocked_list_.erase(write_blocked_list_.begin()); |
286 bool can_write_more = writer->OnCanWrite(); | 254 bool can_write_more = writer->OnCanWrite(); |
287 if (IsWriteBlocked()) { | 255 if (writer_->IsWriteBlocked()) { |
288 // We were unable to write. Wait for the next EPOLLOUT. | 256 // We were unable to write. Wait for the next EPOLLOUT. |
289 // In this case, the session would have been added to the blocked list | 257 // In this case, the session would have been added to the blocked list |
290 // up in WritePacket. | 258 // up in WritePacket. |
291 return false; | 259 return false; |
292 } | 260 } |
293 // The socket is not blocked but the writer has ceded work. Add it to the | 261 // The socket is not blocked but the writer has ceded work. Add it to the |
294 // end of the list. | 262 // end of the list. |
295 if (can_write_more) { | 263 if (can_write_more) { |
296 write_blocked_list_.insert(make_pair(writer, true)); | 264 write_blocked_list_.insert(make_pair(writer, true)); |
297 } | 265 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 } | 297 } |
330 closed_session_list_.push_back(it->second); | 298 closed_session_list_.push_back(it->second); |
331 CleanUpSession(it); | 299 CleanUpSession(it); |
332 } | 300 } |
333 | 301 |
334 void QuicDispatcher::OnWriteBlocked(QuicBlockedWriterInterface* writer) { | 302 void QuicDispatcher::OnWriteBlocked(QuicBlockedWriterInterface* writer) { |
335 DCHECK(writer_->IsWriteBlocked()); | 303 DCHECK(writer_->IsWriteBlocked()); |
336 write_blocked_list_.insert(make_pair(writer, true)); | 304 write_blocked_list_.insert(make_pair(writer, true)); |
337 } | 305 } |
338 | 306 |
339 QuicSession* QuicDispatcher::CreateQuicSession( | |
340 QuicGuid guid, | |
341 const IPEndPoint& server_address, | |
342 const IPEndPoint& client_address) { | |
343 QuicServerSession* session = new QuicServerSession( | |
344 config_, new QuicConnection(guid, client_address, helper_.get(), this, | |
345 true, supported_versions_), this); | |
346 session->InitializeSession(crypto_config_); | |
347 return session; | |
348 } | |
349 | |
350 QuicPacketWriter* QuicDispatcher::CreateWriter(int fd) { | 307 QuicPacketWriter* QuicDispatcher::CreateWriter(int fd) { |
351 return new QuicDefaultPacketWriter(fd); | 308 return new QuicDefaultPacketWriter(fd); |
352 } | 309 } |
353 | 310 |
354 QuicPacketWriterWrapper* QuicDispatcher::CreateWriterWrapper( | 311 QuicPacketWriterWrapper* QuicDispatcher::CreateWriterWrapper( |
355 QuicPacketWriter* writer) { | 312 QuicPacketWriter* writer) { |
356 return new QuicPacketWriterWrapper(writer); | 313 return new QuicPacketWriterWrapper(writer); |
357 } | 314 } |
358 | 315 |
| 316 QuicSession* QuicDispatcher::CreateQuicSession( |
| 317 QuicGuid guid, |
| 318 const IPEndPoint& server_address, |
| 319 const IPEndPoint& client_address) { |
| 320 QuicServerSession* session = new QuicServerSession( |
| 321 config_, |
| 322 CreateQuicConnection(guid, server_address, client_address), |
| 323 this); |
| 324 session->InitializeSession(crypto_config_); |
| 325 return session; |
| 326 } |
| 327 |
| 328 QuicConnection* QuicDispatcher::CreateQuicConnection( |
| 329 QuicGuid guid, |
| 330 const IPEndPoint& server_address, |
| 331 const IPEndPoint& client_address) { |
| 332 return new QuicConnection(guid, client_address, helper_.get(), writer_.get(), |
| 333 true, supported_versions_); |
| 334 } |
| 335 |
359 void QuicDispatcher::set_writer(QuicPacketWriter* writer) { | 336 void QuicDispatcher::set_writer(QuicPacketWriter* writer) { |
360 writer_->set_writer(writer); | 337 writer_->set_writer(writer); |
361 } | 338 } |
362 | 339 |
363 bool QuicDispatcher::HandlePacketForTimeWait( | 340 bool QuicDispatcher::HandlePacketForTimeWait( |
364 const QuicPacketPublicHeader& header) { | 341 const QuicPacketPublicHeader& header) { |
365 if (header.reset_flag) { | 342 if (header.reset_flag) { |
366 // Public reset packets do not have sequence numbers, so ignore the packet. | 343 // Public reset packets do not have sequence numbers, so ignore the packet. |
367 return false; | 344 return false; |
368 } | 345 } |
369 | 346 |
370 // Switch the framer to the correct version, so that the sequence number can | 347 // Switch the framer to the correct version, so that the sequence number can |
371 // be parsed correctly. | 348 // be parsed correctly. |
372 framer_.set_version(time_wait_list_manager_->GetQuicVersionFromGuid( | 349 framer_.set_version(time_wait_list_manager_->GetQuicVersionFromGuid( |
373 header.guid)); | 350 header.guid)); |
374 | 351 |
375 // Continue parsing the packet to extract the sequence number. Then | 352 // Continue parsing the packet to extract the sequence number. Then |
376 // send it to the time wait manager in OnUnathenticatedHeader. | 353 // send it to the time wait manager in OnUnathenticatedHeader. |
377 return true; | 354 return true; |
378 } | 355 } |
379 | 356 |
380 } // namespace tools | 357 } // namespace tools |
381 } // namespace net | 358 } // namespace net |
OLD | NEW |