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/quic/quic_session.h" | 5 #include "net/quic/quic_session.h" |
6 | 6 |
7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
8 #include "net/quic/crypto/proof_verifier.h" | 8 #include "net/quic/crypto/proof_verifier.h" |
9 #include "net/quic/quic_connection.h" | 9 #include "net/quic/quic_connection.h" |
10 #include "net/quic/quic_headers_stream.h" | 10 #include "net/quic/quic_headers_stream.h" |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 | 57 |
58 virtual void OnSuccessfulVersionNegotiation( | 58 virtual void OnSuccessfulVersionNegotiation( |
59 const QuicVersion& version) OVERRIDE { | 59 const QuicVersion& version) OVERRIDE { |
60 session_->OnSuccessfulVersionNegotiation(version); | 60 session_->OnSuccessfulVersionNegotiation(version); |
61 } | 61 } |
62 | 62 |
63 virtual void OnConfigNegotiated() OVERRIDE { | 63 virtual void OnConfigNegotiated() OVERRIDE { |
64 session_->OnConfigNegotiated(); | 64 session_->OnConfigNegotiated(); |
65 } | 65 } |
66 | 66 |
67 virtual void OnConnectionClosed(QuicErrorCode error, | 67 virtual void OnConnectionClosed( |
68 bool from_peer) OVERRIDE { | 68 QuicErrorCode error, bool from_peer) OVERRIDE { |
69 session_->OnConnectionClosed(error, from_peer); | 69 session_->OnConnectionClosed(error, from_peer); |
70 // The session will go away, so don't bother with cleanup. | 70 // The session will go away, so don't bother with cleanup. |
71 } | 71 } |
72 | 72 |
| 73 virtual void OnWriteBlocked() OVERRIDE { |
| 74 session_->OnWriteBlocked(); |
| 75 } |
| 76 |
73 virtual bool HasPendingHandshake() const OVERRIDE { | 77 virtual bool HasPendingHandshake() const OVERRIDE { |
74 return session_->HasPendingHandshake(); | 78 return session_->HasPendingHandshake(); |
75 } | 79 } |
76 | 80 |
77 private: | 81 private: |
78 QuicSession* session_; | 82 QuicSession* session_; |
79 }; | 83 }; |
80 | 84 |
81 QuicSession::QuicSession(QuicConnection* connection, | 85 QuicSession::QuicSession(QuicConnection* connection, |
82 const QuicConfig& config) | 86 const QuicConfig& config) |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 CloseStream(id); | 266 CloseStream(id); |
263 } | 267 } |
264 } | 268 } |
265 } | 269 } |
266 | 270 |
267 bool QuicSession::OnCanWrite() { | 271 bool QuicSession::OnCanWrite() { |
268 // We latch this here rather than doing a traditional loop, because streams | 272 // We latch this here rather than doing a traditional loop, because streams |
269 // may be modifying the list as we loop. | 273 // may be modifying the list as we loop. |
270 int remaining_writes = write_blocked_streams_.NumBlockedStreams(); | 274 int remaining_writes = write_blocked_streams_.NumBlockedStreams(); |
271 | 275 |
272 while (!connection_->HasQueuedData() && | 276 while (remaining_writes > 0 && connection_->CanWriteStreamData()) { |
273 remaining_writes > 0) { | |
274 DCHECK(write_blocked_streams_.HasWriteBlockedStreams()); | 277 DCHECK(write_blocked_streams_.HasWriteBlockedStreams()); |
275 if (!write_blocked_streams_.HasWriteBlockedStreams()) { | 278 if (!write_blocked_streams_.HasWriteBlockedStreams()) { |
276 LOG(DFATAL) << "WriteBlockedStream is missing"; | 279 LOG(DFATAL) << "WriteBlockedStream is missing"; |
277 connection_->CloseConnection(QUIC_INTERNAL_ERROR, false); | 280 connection_->CloseConnection(QUIC_INTERNAL_ERROR, false); |
278 return true; // We have no write blocked streams. | 281 return true; // We have no write blocked streams. |
279 } | 282 } |
280 int index = write_blocked_streams_.GetHighestPriorityWriteBlockedList(); | 283 QuicStreamId stream_id = write_blocked_streams_.PopFront(); |
281 QuicStreamId stream_id = write_blocked_streams_.PopFront(index); | |
282 if (stream_id == kCryptoStreamId) { | 284 if (stream_id == kCryptoStreamId) { |
283 has_pending_handshake_ = false; // We just popped it. | 285 has_pending_handshake_ = false; // We just popped it. |
284 } | 286 } |
285 ReliableQuicStream* stream = GetStream(stream_id); | 287 ReliableQuicStream* stream = GetStream(stream_id); |
286 if (stream != NULL) { | 288 if (stream != NULL) { |
287 // If the stream can't write all bytes, it'll re-add itself to the blocked | 289 // If the stream can't write all bytes, it'll re-add itself to the blocked |
288 // list. | 290 // list. |
289 stream->OnCanWrite(); | 291 stream->OnCanWrite(); |
290 } | 292 } |
291 --remaining_writes; | 293 --remaining_writes; |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 return id <= largest_peer_created_stream_id_ && | 583 return id <= largest_peer_created_stream_id_ && |
582 implicitly_created_streams_.count(id) == 0; | 584 implicitly_created_streams_.count(id) == 0; |
583 } | 585 } |
584 | 586 |
585 size_t QuicSession::GetNumOpenStreams() const { | 587 size_t QuicSession::GetNumOpenStreams() const { |
586 return stream_map_.size() + implicitly_created_streams_.size() - | 588 return stream_map_.size() + implicitly_created_streams_.size() - |
587 zombie_streams_.size(); | 589 zombie_streams_.size(); |
588 } | 590 } |
589 | 591 |
590 void QuicSession::MarkWriteBlocked(QuicStreamId id, QuicPriority priority) { | 592 void QuicSession::MarkWriteBlocked(QuicStreamId id, QuicPriority priority) { |
| 593 #ifndef NDEBUG |
| 594 ReliableQuicStream* stream = GetStream(id); |
| 595 if (stream != NULL) { |
| 596 LOG_IF(DFATAL, priority != stream->EffectivePriority()) |
| 597 << "Priorities do not match. Got: " << priority |
| 598 << " Expected: " << stream->EffectivePriority(); |
| 599 } else { |
| 600 LOG(DFATAL) << "Marking unknown stream " << id << " blocked."; |
| 601 } |
| 602 #endif |
| 603 |
591 if (id == kCryptoStreamId) { | 604 if (id == kCryptoStreamId) { |
592 DCHECK(!has_pending_handshake_); | 605 DCHECK(!has_pending_handshake_); |
593 has_pending_handshake_ = true; | 606 has_pending_handshake_ = true; |
594 // TODO(jar): Be sure to use the highest priority for the crypto stream, | 607 // TODO(jar): Be sure to use the highest priority for the crypto stream, |
595 // perhaps by adding a "special" priority for it that is higher than | 608 // perhaps by adding a "special" priority for it that is higher than |
596 // kHighestPriority. | 609 // kHighestPriority. |
597 priority = kHighestPriority; | 610 priority = kHighestPriority; |
598 } | 611 } |
599 write_blocked_streams_.PushBack(id, priority); | 612 write_blocked_streams_.PushBack(id, priority, connection()->version()); |
600 } | 613 } |
601 | 614 |
602 bool QuicSession::HasQueuedData() const { | 615 bool QuicSession::HasDataToWrite() const { |
603 return write_blocked_streams_.NumBlockedStreams() || | 616 return write_blocked_streams_.HasWriteBlockedStreams() || |
604 connection_->HasQueuedData(); | 617 connection_->HasQueuedData(); |
605 } | 618 } |
606 | 619 |
607 void QuicSession::MarkDecompressionBlocked(QuicHeaderId header_id, | 620 void QuicSession::MarkDecompressionBlocked(QuicHeaderId header_id, |
608 QuicStreamId stream_id) { | 621 QuicStreamId stream_id) { |
609 DCHECK_GE(QUIC_VERSION_12, connection()->version()); | 622 DCHECK_GE(QUIC_VERSION_12, connection()->version()); |
610 decompression_blocked_streams_[header_id] = stream_id; | 623 decompression_blocked_streams_[header_id] = stream_id; |
611 } | 624 } |
612 | 625 |
613 bool QuicSession::GetSSLInfo(SSLInfo* ssl_info) { | 626 bool QuicSession::GetSSLInfo(SSLInfo* ssl_info) { |
614 NOTIMPLEMENTED(); | 627 NOTIMPLEMENTED(); |
615 return false; | 628 return false; |
616 } | 629 } |
617 | 630 |
618 void QuicSession::PostProcessAfterData() { | 631 void QuicSession::PostProcessAfterData() { |
619 STLDeleteElements(&closed_streams_); | 632 STLDeleteElements(&closed_streams_); |
620 closed_streams_.clear(); | 633 closed_streams_.clear(); |
621 } | 634 } |
622 | 635 |
623 } // namespace net | 636 } // namespace net |
OLD | NEW |