1 // Copyright (c) 2018 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 #ifndef QUICHE_QUIC_CORE_LEGACY_QUIC_STREAM_ID_MANAGER_H_ 5 #define QUICHE_QUIC_CORE_LEGACY_QUIC_STREAM_ID_MANAGER_H_ 6 7 #include "net/third_party/quiche/src/quic/core/quic_stream_id_manager.h" 8 #include "net/third_party/quiche/src/quic/core/quic_types.h" 9 #include "net/third_party/quiche/src/quic/core/quic_versions.h" 10 11 namespace quic { 12 13 namespace test { 14 class QuicSessionPeer; 15 } // namespace test 16 17 class QuicSession; 18 19 // Manages Google QUIC stream IDs. This manager is responsible for two 20 // questions: 1) can next outgoing stream ID be allocated (if yes, what is the 21 // next outgoing stream ID) and 2) can a new incoming stream be opened. 22 class QUIC_EXPORT_PRIVATE LegacyQuicStreamIdManager { 23 public: 24 LegacyQuicStreamIdManager(Perspective perspective, 25 QuicTransportVersion transport_version, 26 size_t max_open_outgoing_streams, 27 size_t max_open_incoming_streams); 28 29 ~LegacyQuicStreamIdManager(); 30 31 // Returns true if the next outgoing stream ID can be allocated. 32 bool CanOpenNextOutgoingStream() const; 33 34 // Returns true if a new incoming stream can be opened. 35 bool CanOpenIncomingStream() const; 36 37 // Returns false when increasing the largest created stream id to |id| would 38 // violate the limit, so the connection should be closed. 39 bool MaybeIncreaseLargestPeerStreamId(const QuicStreamId id); 40 41 // Returns true if |id| is still available. 42 bool IsAvailableStream(QuicStreamId id) const; 43 44 // Returns the stream ID for a new outgoing stream, and increments the 45 // underlying counter. 46 QuicStreamId GetNextOutgoingStreamId(); 47 48 // Called when a new stream is open. 49 void ActivateStream(bool is_incoming); 50 51 // Called when a stream ID is closed. 52 void OnStreamClosed(bool is_incoming); 53 54 // Return true if |id| is peer initiated. 55 bool IsIncomingStream(QuicStreamId id) const; 56 57 size_t MaxAvailableStreams() const; 58 set_max_open_incoming_streams(size_t max_open_incoming_streams)59 void set_max_open_incoming_streams(size_t max_open_incoming_streams) { 60 max_open_incoming_streams_ = max_open_incoming_streams; 61 } 62 set_max_open_outgoing_streams(size_t max_open_outgoing_streams)63 void set_max_open_outgoing_streams(size_t max_open_outgoing_streams) { 64 max_open_outgoing_streams_ = max_open_outgoing_streams; 65 } 66 set_largest_peer_created_stream_id(QuicStreamId largest_peer_created_stream_id)67 void set_largest_peer_created_stream_id( 68 QuicStreamId largest_peer_created_stream_id) { 69 largest_peer_created_stream_id_ = largest_peer_created_stream_id; 70 } 71 max_open_incoming_streams()72 size_t max_open_incoming_streams() const { 73 return max_open_incoming_streams_; 74 } 75 max_open_outgoing_streams()76 size_t max_open_outgoing_streams() const { 77 return max_open_outgoing_streams_; 78 } 79 next_outgoing_stream_id()80 QuicStreamId next_outgoing_stream_id() const { 81 return next_outgoing_stream_id_; 82 } 83 largest_peer_created_stream_id()84 QuicStreamId largest_peer_created_stream_id() const { 85 return largest_peer_created_stream_id_; 86 } 87 88 size_t GetNumAvailableStreams() const; 89 num_open_incoming_streams()90 size_t num_open_incoming_streams() const { 91 return num_open_incoming_streams_; 92 } num_open_outgoing_streams()93 size_t num_open_outgoing_streams() const { 94 return num_open_outgoing_streams_; 95 } 96 97 private: 98 friend class test::QuicSessionPeer; 99 100 const Perspective perspective_; 101 const QuicTransportVersion transport_version_; 102 103 // The maximum number of outgoing streams this connection can open. 104 size_t max_open_outgoing_streams_; 105 106 // The maximum number of incoming streams this connection will allow. 107 size_t max_open_incoming_streams_; 108 109 // The ID to use for the next outgoing stream. 110 QuicStreamId next_outgoing_stream_id_; 111 112 // Set of stream ids that are less than the largest stream id that has been 113 // received, but are nonetheless available to be created. 114 QuicHashSet<QuicStreamId> available_streams_; 115 116 QuicStreamId largest_peer_created_stream_id_; 117 118 // A counter for peer initiated open streams. 119 size_t num_open_incoming_streams_; 120 121 // A counter for self initiated open streams. 122 size_t num_open_outgoing_streams_; 123 }; 124 125 } // namespace quic 126 127 #endif // QUICHE_QUIC_CORE_LEGACY_QUIC_STREAM_ID_MANAGER_H_ 128