Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(189)

Side by Side Diff: net/tools/quic/quic_dispatcher.cc

Issue 149263002: Refactor QuicConnection to use explicit notification for getting onto (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/tools/quic/quic_dispatcher.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « net/tools/quic/quic_dispatcher.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698