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

Side by Side Diff: net/quic/core/quic_session.cc

Issue 2651673004: Add quic_map_util. (Closed)
Patch Set: Created 3 years, 11 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
« no previous file with comments | « net/quic/core/quic_sent_packet_manager.cc ('k') | net/quic/core/quic_session_test.cc » ('j') | 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/quic/core/quic_session.h" 5 #include "net/quic/core/quic_session.h"
6 6
7 #include "base/stl_util.h"
8 #include "net/quic/core/crypto/proof_verifier.h" 7 #include "net/quic/core/crypto/proof_verifier.h"
9 #include "net/quic/core/quic_connection.h" 8 #include "net/quic/core/quic_connection.h"
10 #include "net/quic/core/quic_flags.h" 9 #include "net/quic/core/quic_flags.h"
11 #include "net/quic/core/quic_flow_controller.h" 10 #include "net/quic/core/quic_flow_controller.h"
12 #include "net/quic/platform/api/quic_bug_tracker.h" 11 #include "net/quic/platform/api/quic_bug_tracker.h"
13 #include "net/quic/platform/api/quic_logging.h" 12 #include "net/quic/platform/api/quic_logging.h"
13 #include "net/quic/platform/api/quic_map_util.h"
14 #include "net/quic/platform/api/quic_str_cat.h" 14 #include "net/quic/platform/api/quic_str_cat.h"
15 15
16 using base::StringPiece; 16 using base::StringPiece;
17 using std::string; 17 using std::string;
18 18
19 namespace net { 19 namespace net {
20 20
21 #define ENDPOINT \ 21 #define ENDPOINT \
22 (perspective() == Perspective::IS_SERVER ? "Server: " : " Client: ") 22 (perspective() == Perspective::IS_SERVER ? "Server: " : " Client: ")
23 23
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 if (frame.fin) { 76 if (frame.fin) {
77 QuicStreamOffset final_byte_offset = frame.offset + frame.data_length; 77 QuicStreamOffset final_byte_offset = frame.offset + frame.data_length;
78 UpdateFlowControlOnFinalReceivedByteOffset(stream_id, final_byte_offset); 78 UpdateFlowControlOnFinalReceivedByteOffset(stream_id, final_byte_offset);
79 } 79 }
80 return; 80 return;
81 } 81 }
82 stream->OnStreamFrame(frame); 82 stream->OnStreamFrame(frame);
83 } 83 }
84 84
85 void QuicSession::OnRstStream(const QuicRstStreamFrame& frame) { 85 void QuicSession::OnRstStream(const QuicRstStreamFrame& frame) {
86 if (base::ContainsKey(static_stream_map_, frame.stream_id)) { 86 if (QuicContainsKey(static_stream_map_, frame.stream_id)) {
87 connection()->CloseConnection( 87 connection()->CloseConnection(
88 QUIC_INVALID_STREAM_ID, "Attempt to reset a static stream", 88 QUIC_INVALID_STREAM_ID, "Attempt to reset a static stream",
89 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); 89 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
90 return; 90 return;
91 } 91 }
92 92
93 QuicStream* stream = GetOrCreateDynamicStream(frame.stream_id); 93 QuicStream* stream = GetOrCreateDynamicStream(frame.stream_id);
94 if (!stream) { 94 if (!stream) {
95 HandleRstOnValidNonexistentStream(frame); 95 HandleRstOnValidNonexistentStream(frame);
96 return; // Errors are handled by GetOrCreateStream. 96 return; // Errors are handled by GetOrCreateStream.
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 } 304 }
305 QuicConsumedData data = connection_->SendStreamData(id, iov, offset, fin, 305 QuicConsumedData data = connection_->SendStreamData(id, iov, offset, fin,
306 std::move(ack_listener)); 306 std::move(ack_listener));
307 write_blocked_streams_.UpdateBytesForStream(id, data.bytes_consumed); 307 write_blocked_streams_.UpdateBytesForStream(id, data.bytes_consumed);
308 return data; 308 return data;
309 } 309 }
310 310
311 void QuicSession::SendRstStream(QuicStreamId id, 311 void QuicSession::SendRstStream(QuicStreamId id,
312 QuicRstStreamErrorCode error, 312 QuicRstStreamErrorCode error,
313 QuicStreamOffset bytes_written) { 313 QuicStreamOffset bytes_written) {
314 if (base::ContainsKey(static_stream_map_, id)) { 314 if (QuicContainsKey(static_stream_map_, id)) {
315 QUIC_BUG << "Cannot send RST for a static stream with ID " << id; 315 QUIC_BUG << "Cannot send RST for a static stream with ID " << id;
316 return; 316 return;
317 } 317 }
318 318
319 if (connection()->connected()) { 319 if (connection()->connected()) {
320 // Only send a RST_STREAM frame if still connected. 320 // Only send a RST_STREAM frame if still connected.
321 connection_->SendRstStream(id, error, bytes_written); 321 connection_->SendRstStream(id, error, bytes_written);
322 } 322 }
323 CloseStreamInner(id, true); 323 CloseStreamInner(id, true);
324 } 324 }
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 const CryptoHandshakeMessage& /*message*/) {} 617 const CryptoHandshakeMessage& /*message*/) {}
618 618
619 QuicConfig* QuicSession::config() { 619 QuicConfig* QuicSession::config() {
620 return &config_; 620 return &config_;
621 } 621 }
622 622
623 void QuicSession::ActivateStream(std::unique_ptr<QuicStream> stream) { 623 void QuicSession::ActivateStream(std::unique_ptr<QuicStream> stream) {
624 QuicStreamId stream_id = stream->id(); 624 QuicStreamId stream_id = stream->id();
625 QUIC_DLOG(INFO) << ENDPOINT << "num_streams: " << dynamic_stream_map_.size() 625 QUIC_DLOG(INFO) << ENDPOINT << "num_streams: " << dynamic_stream_map_.size()
626 << ". activating " << stream_id; 626 << ". activating " << stream_id;
627 DCHECK(!base::ContainsKey(dynamic_stream_map_, stream_id)); 627 DCHECK(!QuicContainsKey(dynamic_stream_map_, stream_id));
628 DCHECK(!base::ContainsKey(static_stream_map_, stream_id)); 628 DCHECK(!QuicContainsKey(static_stream_map_, stream_id));
629 dynamic_stream_map_[stream_id] = std::move(stream); 629 dynamic_stream_map_[stream_id] = std::move(stream);
630 if (IsIncomingStream(stream_id)) { 630 if (IsIncomingStream(stream_id)) {
631 ++num_dynamic_incoming_streams_; 631 ++num_dynamic_incoming_streams_;
632 } 632 }
633 // Increase the number of streams being emulated when a new one is opened. 633 // Increase the number of streams being emulated when a new one is opened.
634 connection_->SetNumOpenStreams(dynamic_stream_map_.size()); 634 connection_->SetNumOpenStreams(dynamic_stream_map_.size());
635 } 635 }
636 636
637 QuicStreamId QuicSession::GetNextOutgoingStreamId() { 637 QuicStreamId QuicSession::GetNextOutgoingStreamId() {
638 QuicStreamId id = next_outgoing_stream_id_; 638 QuicStreamId id = next_outgoing_stream_id_;
639 next_outgoing_stream_id_ += 2; 639 next_outgoing_stream_id_ += 2;
640 return id; 640 return id;
641 } 641 }
642 642
643 QuicStream* QuicSession::GetOrCreateStream(const QuicStreamId stream_id) { 643 QuicStream* QuicSession::GetOrCreateStream(const QuicStreamId stream_id) {
644 StaticStreamMap::iterator it = static_stream_map_.find(stream_id); 644 StaticStreamMap::iterator it = static_stream_map_.find(stream_id);
645 if (it != static_stream_map_.end()) { 645 if (it != static_stream_map_.end()) {
646 return it->second; 646 return it->second;
647 } 647 }
648 return GetOrCreateDynamicStream(stream_id); 648 return GetOrCreateDynamicStream(stream_id);
649 } 649 }
650 650
651 void QuicSession::StreamDraining(QuicStreamId stream_id) { 651 void QuicSession::StreamDraining(QuicStreamId stream_id) {
652 DCHECK(base::ContainsKey(dynamic_stream_map_, stream_id)); 652 DCHECK(QuicContainsKey(dynamic_stream_map_, stream_id));
653 if (!base::ContainsKey(draining_streams_, stream_id)) { 653 if (!QuicContainsKey(draining_streams_, stream_id)) {
654 draining_streams_.insert(stream_id); 654 draining_streams_.insert(stream_id);
655 if (IsIncomingStream(stream_id)) { 655 if (IsIncomingStream(stream_id)) {
656 ++num_draining_incoming_streams_; 656 ++num_draining_incoming_streams_;
657 } 657 }
658 } 658 }
659 } 659 }
660 660
661 bool QuicSession::MaybeIncreaseLargestPeerStreamId( 661 bool QuicSession::MaybeIncreaseLargestPeerStreamId(
662 const QuicStreamId stream_id) { 662 const QuicStreamId stream_id) {
663 if (stream_id <= largest_peer_created_stream_id_) { 663 if (stream_id <= largest_peer_created_stream_id_) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
696 696
697 bool QuicSession::ShouldYield(QuicStreamId stream_id) { 697 bool QuicSession::ShouldYield(QuicStreamId stream_id) {
698 if (stream_id == currently_writing_stream_id_) { 698 if (stream_id == currently_writing_stream_id_) {
699 return false; 699 return false;
700 } 700 }
701 return write_blocked_streams()->ShouldYield(stream_id); 701 return write_blocked_streams()->ShouldYield(stream_id);
702 } 702 }
703 703
704 QuicStream* QuicSession::GetOrCreateDynamicStream( 704 QuicStream* QuicSession::GetOrCreateDynamicStream(
705 const QuicStreamId stream_id) { 705 const QuicStreamId stream_id) {
706 DCHECK(!base::ContainsKey(static_stream_map_, stream_id)) 706 DCHECK(!QuicContainsKey(static_stream_map_, stream_id))
707 << "Attempt to call GetOrCreateDynamicStream for a static stream"; 707 << "Attempt to call GetOrCreateDynamicStream for a static stream";
708 708
709 DynamicStreamMap::iterator it = dynamic_stream_map_.find(stream_id); 709 DynamicStreamMap::iterator it = dynamic_stream_map_.find(stream_id);
710 if (it != dynamic_stream_map_.end()) { 710 if (it != dynamic_stream_map_.end()) {
711 return it->second.get(); 711 return it->second.get();
712 } 712 }
713 713
714 if (IsClosedStream(stream_id)) { 714 if (IsClosedStream(stream_id)) {
715 return nullptr; 715 return nullptr;
716 } 716 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
765 // Stream is active 765 // Stream is active
766 return false; 766 return false;
767 } 767 }
768 if (!IsIncomingStream(id)) { 768 if (!IsIncomingStream(id)) {
769 // Locally created streams are strictly in-order. If the id is in the 769 // Locally created streams are strictly in-order. If the id is in the
770 // range of created streams and it's not active, it must have been closed. 770 // range of created streams and it's not active, it must have been closed.
771 return id < next_outgoing_stream_id_; 771 return id < next_outgoing_stream_id_;
772 } 772 }
773 // For peer created streams, we also need to consider available streams. 773 // For peer created streams, we also need to consider available streams.
774 return id <= largest_peer_created_stream_id_ && 774 return id <= largest_peer_created_stream_id_ &&
775 !base::ContainsKey(available_streams_, id); 775 !QuicContainsKey(available_streams_, id);
776 } 776 }
777 777
778 bool QuicSession::IsOpenStream(QuicStreamId id) { 778 bool QuicSession::IsOpenStream(QuicStreamId id) {
779 DCHECK_NE(0u, id); 779 DCHECK_NE(0u, id);
780 if (base::ContainsKey(static_stream_map_, id) || 780 if (QuicContainsKey(static_stream_map_, id) ||
781 base::ContainsKey(dynamic_stream_map_, id)) { 781 QuicContainsKey(dynamic_stream_map_, id)) {
782 // Stream is active 782 // Stream is active
783 return true; 783 return true;
784 } 784 }
785 return false; 785 return false;
786 } 786 }
787 787
788 size_t QuicSession::GetNumOpenIncomingStreams() const { 788 size_t QuicSession::GetNumOpenIncomingStreams() const {
789 return num_dynamic_incoming_streams_ - num_draining_incoming_streams_ + 789 return num_dynamic_incoming_streams_ - num_draining_incoming_streams_ +
790 num_locally_closed_incoming_streams_highest_offset_; 790 num_locally_closed_incoming_streams_highest_offset_;
791 } 791 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 861
862 size_t QuicSession::MaxAvailableStreams() const { 862 size_t QuicSession::MaxAvailableStreams() const {
863 return max_open_incoming_streams_ * kMaxAvailableStreamsMultiplier; 863 return max_open_incoming_streams_ * kMaxAvailableStreamsMultiplier;
864 } 864 }
865 865
866 bool QuicSession::IsIncomingStream(QuicStreamId id) const { 866 bool QuicSession::IsIncomingStream(QuicStreamId id) const {
867 return id % 2 != next_outgoing_stream_id_ % 2; 867 return id % 2 != next_outgoing_stream_id_ % 2;
868 } 868 }
869 869
870 } // namespace net 870 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/quic_sent_packet_manager.cc ('k') | net/quic/core/quic_session_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698