| 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 |