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/core/quic_session.h" | 5 #include "net/quic/core/quic_session.h" |
6 | 6 |
7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
10 #include "net/quic/core/crypto/proof_verifier.h" | 10 #include "net/quic/core/crypto/proof_verifier.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 | 50 |
51 void QuicSession::Initialize() { | 51 void QuicSession::Initialize() { |
52 connection_->set_visitor(this); | 52 connection_->set_visitor(this); |
53 connection_->SetFromConfig(config_); | 53 connection_->SetFromConfig(config_); |
54 | 54 |
55 DCHECK_EQ(kCryptoStreamId, GetCryptoStream()->id()); | 55 DCHECK_EQ(kCryptoStreamId, GetCryptoStream()->id()); |
56 static_stream_map_[kCryptoStreamId] = GetCryptoStream(); | 56 static_stream_map_[kCryptoStreamId] = GetCryptoStream(); |
57 } | 57 } |
58 | 58 |
59 QuicSession::~QuicSession() { | 59 QuicSession::~QuicSession() { |
60 STLDeleteElements(&closed_streams_); | 60 base::STLDeleteElements(&closed_streams_); |
61 STLDeleteValues(&dynamic_stream_map_); | 61 base::STLDeleteValues(&dynamic_stream_map_); |
62 | 62 |
63 DLOG_IF(WARNING, num_locally_closed_incoming_streams_highest_offset() > | 63 DLOG_IF(WARNING, num_locally_closed_incoming_streams_highest_offset() > |
64 max_open_incoming_streams_) | 64 max_open_incoming_streams_) |
65 << "Surprisingly high number of locally closed peer initiated streams" | 65 << "Surprisingly high number of locally closed peer initiated streams" |
66 "still waiting for final byte offset: " | 66 "still waiting for final byte offset: " |
67 << num_locally_closed_incoming_streams_highest_offset(); | 67 << num_locally_closed_incoming_streams_highest_offset(); |
68 DLOG_IF(WARNING, GetNumLocallyClosedOutgoingStreamsHighestOffset() > | 68 DLOG_IF(WARNING, GetNumLocallyClosedOutgoingStreamsHighestOffset() > |
69 max_open_outgoing_streams_) | 69 max_open_outgoing_streams_) |
70 << "Surprisingly high number of locally closed self initiated streams" | 70 << "Surprisingly high number of locally closed self initiated streams" |
71 "still waiting for final byte offset: " | 71 "still waiting for final byte offset: " |
(...skipping 11 matching lines...) Expand all Loading... |
83 if (frame.fin) { | 83 if (frame.fin) { |
84 QuicStreamOffset final_byte_offset = frame.offset + frame.data_length; | 84 QuicStreamOffset final_byte_offset = frame.offset + frame.data_length; |
85 UpdateFlowControlOnFinalReceivedByteOffset(stream_id, final_byte_offset); | 85 UpdateFlowControlOnFinalReceivedByteOffset(stream_id, final_byte_offset); |
86 } | 86 } |
87 return; | 87 return; |
88 } | 88 } |
89 stream->OnStreamFrame(frame); | 89 stream->OnStreamFrame(frame); |
90 } | 90 } |
91 | 91 |
92 void QuicSession::OnRstStream(const QuicRstStreamFrame& frame) { | 92 void QuicSession::OnRstStream(const QuicRstStreamFrame& frame) { |
93 if (ContainsKey(static_stream_map_, frame.stream_id)) { | 93 if (base::ContainsKey(static_stream_map_, frame.stream_id)) { |
94 connection()->CloseConnection( | 94 connection()->CloseConnection( |
95 QUIC_INVALID_STREAM_ID, "Attempt to reset a static stream", | 95 QUIC_INVALID_STREAM_ID, "Attempt to reset a static stream", |
96 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); | 96 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); |
97 return; | 97 return; |
98 } | 98 } |
99 | 99 |
100 ReliableQuicStream* stream = GetOrCreateDynamicStream(frame.stream_id); | 100 ReliableQuicStream* stream = GetOrCreateDynamicStream(frame.stream_id); |
101 if (!stream) { | 101 if (!stream) { |
102 HandleRstOnValidNonexistentStream(frame); | 102 HandleRstOnValidNonexistentStream(frame); |
103 return; // Errors are handled by GetOrCreateStream. | 103 return; // Errors are handled by GetOrCreateStream. |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 } | 263 } |
264 QuicConsumedData data = | 264 QuicConsumedData data = |
265 connection_->SendStreamData(id, iov, offset, fin, ack_notifier_delegate); | 265 connection_->SendStreamData(id, iov, offset, fin, ack_notifier_delegate); |
266 write_blocked_streams_.UpdateBytesForStream(id, data.bytes_consumed); | 266 write_blocked_streams_.UpdateBytesForStream(id, data.bytes_consumed); |
267 return data; | 267 return data; |
268 } | 268 } |
269 | 269 |
270 void QuicSession::SendRstStream(QuicStreamId id, | 270 void QuicSession::SendRstStream(QuicStreamId id, |
271 QuicRstStreamErrorCode error, | 271 QuicRstStreamErrorCode error, |
272 QuicStreamOffset bytes_written) { | 272 QuicStreamOffset bytes_written) { |
273 if (ContainsKey(static_stream_map_, id)) { | 273 if (base::ContainsKey(static_stream_map_, id)) { |
274 QUIC_BUG << "Cannot send RST for a static stream with ID " << id; | 274 QUIC_BUG << "Cannot send RST for a static stream with ID " << id; |
275 return; | 275 return; |
276 } | 276 } |
277 | 277 |
278 if (connection()->connected()) { | 278 if (connection()->connected()) { |
279 // Only send a RST_STREAM frame if still connected. | 279 // Only send a RST_STREAM frame if still connected. |
280 connection_->SendRstStream(id, error, bytes_written); | 280 connection_->SendRstStream(id, error, bytes_written); |
281 } | 281 } |
282 CloseStreamInner(id, true); | 282 CloseStreamInner(id, true); |
283 } | 283 } |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 void QuicSession::OnCryptoHandshakeMessageReceived( | 528 void QuicSession::OnCryptoHandshakeMessageReceived( |
529 const CryptoHandshakeMessage& /*message*/) {} | 529 const CryptoHandshakeMessage& /*message*/) {} |
530 | 530 |
531 QuicConfig* QuicSession::config() { | 531 QuicConfig* QuicSession::config() { |
532 return &config_; | 532 return &config_; |
533 } | 533 } |
534 | 534 |
535 void QuicSession::ActivateStream(ReliableQuicStream* stream) { | 535 void QuicSession::ActivateStream(ReliableQuicStream* stream) { |
536 DVLOG(1) << ENDPOINT << "num_streams: " << dynamic_stream_map_.size() | 536 DVLOG(1) << ENDPOINT << "num_streams: " << dynamic_stream_map_.size() |
537 << ". activating " << stream->id(); | 537 << ". activating " << stream->id(); |
538 DCHECK(!ContainsKey(dynamic_stream_map_, stream->id())); | 538 DCHECK(!base::ContainsKey(dynamic_stream_map_, stream->id())); |
539 DCHECK(!ContainsKey(static_stream_map_, stream->id())); | 539 DCHECK(!base::ContainsKey(static_stream_map_, stream->id())); |
540 dynamic_stream_map_[stream->id()] = stream; | 540 dynamic_stream_map_[stream->id()] = stream; |
541 if (IsIncomingStream(stream->id())) { | 541 if (IsIncomingStream(stream->id())) { |
542 ++num_dynamic_incoming_streams_; | 542 ++num_dynamic_incoming_streams_; |
543 } | 543 } |
544 // Increase the number of streams being emulated when a new one is opened. | 544 // Increase the number of streams being emulated when a new one is opened. |
545 connection_->SetNumOpenStreams(dynamic_stream_map_.size()); | 545 connection_->SetNumOpenStreams(dynamic_stream_map_.size()); |
546 } | 546 } |
547 | 547 |
548 QuicStreamId QuicSession::GetNextOutgoingStreamId() { | 548 QuicStreamId QuicSession::GetNextOutgoingStreamId() { |
549 QuicStreamId id = next_outgoing_stream_id_; | 549 QuicStreamId id = next_outgoing_stream_id_; |
550 next_outgoing_stream_id_ += 2; | 550 next_outgoing_stream_id_ += 2; |
551 return id; | 551 return id; |
552 } | 552 } |
553 | 553 |
554 ReliableQuicStream* QuicSession::GetOrCreateStream( | 554 ReliableQuicStream* QuicSession::GetOrCreateStream( |
555 const QuicStreamId stream_id) { | 555 const QuicStreamId stream_id) { |
556 StaticStreamMap::iterator it = static_stream_map_.find(stream_id); | 556 StaticStreamMap::iterator it = static_stream_map_.find(stream_id); |
557 if (it != static_stream_map_.end()) { | 557 if (it != static_stream_map_.end()) { |
558 return it->second; | 558 return it->second; |
559 } | 559 } |
560 return GetOrCreateDynamicStream(stream_id); | 560 return GetOrCreateDynamicStream(stream_id); |
561 } | 561 } |
562 | 562 |
563 void QuicSession::StreamDraining(QuicStreamId stream_id) { | 563 void QuicSession::StreamDraining(QuicStreamId stream_id) { |
564 DCHECK(ContainsKey(dynamic_stream_map_, stream_id)); | 564 DCHECK(base::ContainsKey(dynamic_stream_map_, stream_id)); |
565 if (!ContainsKey(draining_streams_, stream_id)) { | 565 if (!base::ContainsKey(draining_streams_, stream_id)) { |
566 draining_streams_.insert(stream_id); | 566 draining_streams_.insert(stream_id); |
567 if (IsIncomingStream(stream_id)) { | 567 if (IsIncomingStream(stream_id)) { |
568 ++num_draining_incoming_streams_; | 568 ++num_draining_incoming_streams_; |
569 } | 569 } |
570 } | 570 } |
571 } | 571 } |
572 | 572 |
573 bool QuicSession::MaybeIncreaseLargestPeerStreamId( | 573 bool QuicSession::MaybeIncreaseLargestPeerStreamId( |
574 const QuicStreamId stream_id) { | 574 const QuicStreamId stream_id) { |
575 if (stream_id <= largest_peer_created_stream_id_) { | 575 if (stream_id <= largest_peer_created_stream_id_) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 | 607 |
608 bool QuicSession::ShouldYield(QuicStreamId stream_id) { | 608 bool QuicSession::ShouldYield(QuicStreamId stream_id) { |
609 if (stream_id == currently_writing_stream_id_) { | 609 if (stream_id == currently_writing_stream_id_) { |
610 return false; | 610 return false; |
611 } | 611 } |
612 return write_blocked_streams()->ShouldYield(stream_id); | 612 return write_blocked_streams()->ShouldYield(stream_id); |
613 } | 613 } |
614 | 614 |
615 ReliableQuicStream* QuicSession::GetOrCreateDynamicStream( | 615 ReliableQuicStream* QuicSession::GetOrCreateDynamicStream( |
616 const QuicStreamId stream_id) { | 616 const QuicStreamId stream_id) { |
617 DCHECK(!ContainsKey(static_stream_map_, stream_id)) | 617 DCHECK(!base::ContainsKey(static_stream_map_, stream_id)) |
618 << "Attempt to call GetOrCreateDynamicStream for a static stream"; | 618 << "Attempt to call GetOrCreateDynamicStream for a static stream"; |
619 | 619 |
620 DynamicStreamMap::iterator it = dynamic_stream_map_.find(stream_id); | 620 DynamicStreamMap::iterator it = dynamic_stream_map_.find(stream_id); |
621 if (it != dynamic_stream_map_.end()) { | 621 if (it != dynamic_stream_map_.end()) { |
622 return it->second; | 622 return it->second; |
623 } | 623 } |
624 | 624 |
625 if (IsClosedStream(stream_id)) { | 625 if (IsClosedStream(stream_id)) { |
626 return nullptr; | 626 return nullptr; |
627 } | 627 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
676 // Stream is active | 676 // Stream is active |
677 return false; | 677 return false; |
678 } | 678 } |
679 if (!IsIncomingStream(id)) { | 679 if (!IsIncomingStream(id)) { |
680 // Locally created streams are strictly in-order. If the id is in the | 680 // Locally created streams are strictly in-order. If the id is in the |
681 // range of created streams and it's not active, it must have been closed. | 681 // range of created streams and it's not active, it must have been closed. |
682 return id < next_outgoing_stream_id_; | 682 return id < next_outgoing_stream_id_; |
683 } | 683 } |
684 // For peer created streams, we also need to consider available streams. | 684 // For peer created streams, we also need to consider available streams. |
685 return id <= largest_peer_created_stream_id_ && | 685 return id <= largest_peer_created_stream_id_ && |
686 !ContainsKey(available_streams_, id); | 686 !base::ContainsKey(available_streams_, id); |
687 } | 687 } |
688 | 688 |
689 bool QuicSession::IsOpenStream(QuicStreamId id) { | 689 bool QuicSession::IsOpenStream(QuicStreamId id) { |
690 DCHECK_NE(0u, id); | 690 DCHECK_NE(0u, id); |
691 if (ContainsKey(static_stream_map_, id) || | 691 if (base::ContainsKey(static_stream_map_, id) || |
692 ContainsKey(dynamic_stream_map_, id)) { | 692 base::ContainsKey(dynamic_stream_map_, id)) { |
693 // Stream is active | 693 // Stream is active |
694 return true; | 694 return true; |
695 } | 695 } |
696 return false; | 696 return false; |
697 } | 697 } |
698 | 698 |
699 size_t QuicSession::GetNumOpenIncomingStreams() const { | 699 size_t QuicSession::GetNumOpenIncomingStreams() const { |
700 return num_dynamic_incoming_streams_ - num_draining_incoming_streams_ + | 700 return num_dynamic_incoming_streams_ - num_draining_incoming_streams_ + |
701 num_locally_closed_incoming_streams_highest_offset_; | 701 num_locally_closed_incoming_streams_highest_offset_; |
702 } | 702 } |
(...skipping 18 matching lines...) Expand all Loading... |
721 write_blocked_streams_.AddStream(id); | 721 write_blocked_streams_.AddStream(id); |
722 } | 722 } |
723 | 723 |
724 bool QuicSession::HasDataToWrite() const { | 724 bool QuicSession::HasDataToWrite() const { |
725 return write_blocked_streams_.HasWriteBlockedCryptoOrHeadersStream() || | 725 return write_blocked_streams_.HasWriteBlockedCryptoOrHeadersStream() || |
726 write_blocked_streams_.HasWriteBlockedDataStreams() || | 726 write_blocked_streams_.HasWriteBlockedDataStreams() || |
727 connection_->HasQueuedData(); | 727 connection_->HasQueuedData(); |
728 } | 728 } |
729 | 729 |
730 void QuicSession::PostProcessAfterData() { | 730 void QuicSession::PostProcessAfterData() { |
731 STLDeleteElements(&closed_streams_); | 731 base::STLDeleteElements(&closed_streams_); |
732 closed_streams_.clear(); | 732 closed_streams_.clear(); |
733 } | 733 } |
734 | 734 |
735 size_t QuicSession::GetNumDynamicOutgoingStreams() const { | 735 size_t QuicSession::GetNumDynamicOutgoingStreams() const { |
736 return dynamic_stream_map_.size() - num_dynamic_incoming_streams_; | 736 return dynamic_stream_map_.size() - num_dynamic_incoming_streams_; |
737 } | 737 } |
738 | 738 |
739 size_t QuicSession::GetNumDrainingOutgoingStreams() const { | 739 size_t QuicSession::GetNumDrainingOutgoingStreams() const { |
740 return draining_streams_.size() - num_draining_incoming_streams_; | 740 return draining_streams_.size() - num_draining_incoming_streams_; |
741 } | 741 } |
(...skipping 23 matching lines...) Expand all Loading... |
765 | 765 |
766 size_t QuicSession::MaxAvailableStreams() const { | 766 size_t QuicSession::MaxAvailableStreams() const { |
767 return max_open_incoming_streams_ * kMaxAvailableStreamsMultiplier; | 767 return max_open_incoming_streams_ * kMaxAvailableStreamsMultiplier; |
768 } | 768 } |
769 | 769 |
770 bool QuicSession::IsIncomingStream(QuicStreamId id) const { | 770 bool QuicSession::IsIncomingStream(QuicStreamId id) const { |
771 return id % 2 != next_outgoing_stream_id_ % 2; | 771 return id % 2 != next_outgoing_stream_id_ % 2; |
772 } | 772 } |
773 | 773 |
774 } // namespace net | 774 } // namespace net |
OLD | NEW |