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 5 #ifndef QUICHE_QUIC_CORE_UBER_QUIC_STREAM_ID_MANAGER_H_ 6 #define QUICHE_QUIC_CORE_UBER_QUIC_STREAM_ID_MANAGER_H_ 7 8 #include "quiche/quic/core/quic_stream_id_manager.h" 9 #include "quiche/quic/core/quic_types.h" 10 11 namespace quic { 12 13 namespace test { 14 class QuicSessionPeer; 15 class UberQuicStreamIdManagerPeer; 16 } // namespace test 17 18 class QuicSession; 19 20 // This class comprises two QuicStreamIdManagers, which manage bidirectional and 21 // unidirectional stream IDs, respectively. 22 class QUICHE_EXPORT UberQuicStreamIdManager { 23 public: 24 UberQuicStreamIdManager( 25 Perspective perspective, ParsedQuicVersion version, 26 QuicStreamIdManager::DelegateInterface* delegate, 27 QuicStreamCount max_open_outgoing_bidirectional_streams, 28 QuicStreamCount max_open_outgoing_unidirectional_streams, 29 QuicStreamCount max_open_incoming_bidirectional_streams, 30 QuicStreamCount max_open_incoming_unidirectional_streams); 31 32 // Called on |max_open_streams| outgoing streams can be created because of 1) 33 // config negotiated or 2) MAX_STREAMS received. Returns true if new 34 // streams can be created. 35 bool MaybeAllowNewOutgoingBidirectionalStreams( 36 QuicStreamCount max_open_streams); 37 bool MaybeAllowNewOutgoingUnidirectionalStreams( 38 QuicStreamCount max_open_streams); 39 40 // Sets the limits to max_open_streams. 41 void SetMaxOpenIncomingBidirectionalStreams(QuicStreamCount max_open_streams); 42 void SetMaxOpenIncomingUnidirectionalStreams( 43 QuicStreamCount max_open_streams); 44 45 // Returns true if next outgoing bidirectional stream ID can be allocated. 46 bool CanOpenNextOutgoingBidirectionalStream() const; 47 48 // Returns true if next outgoing unidirectional stream ID can be allocated. 49 bool CanOpenNextOutgoingUnidirectionalStream() const; 50 51 // Returns the next outgoing bidirectional stream id. 52 QuicStreamId GetNextOutgoingBidirectionalStreamId(); 53 54 // Returns the next outgoing unidirectional stream id. 55 QuicStreamId GetNextOutgoingUnidirectionalStreamId(); 56 57 // Returns true if the incoming |id| is within the limit. 58 bool MaybeIncreaseLargestPeerStreamId(QuicStreamId id, 59 std::string* error_details); 60 61 // Called when |id| is released. 62 void OnStreamClosed(QuicStreamId id); 63 64 // Called when a STREAMS_BLOCKED frame is received. 65 bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame, 66 std::string* error_details); 67 68 // Returns true if |id| is still available. 69 bool IsAvailableStream(QuicStreamId id) const; 70 71 // Once called, the incoming max streams limit will never be increased. 72 void StopIncreasingIncomingMaxStreams(); 73 74 // Check whether the MAX_STREAMS window has opened up enough and, if so, 75 // generate and send a MAX_STREAMS frame. 76 void MaybeSendMaxStreamsFrame(); 77 78 QuicStreamCount GetMaxAllowdIncomingBidirectionalStreams() const; 79 80 QuicStreamCount GetMaxAllowdIncomingUnidirectionalStreams() const; 81 82 QuicStreamId GetLargestPeerCreatedStreamId(bool unidirectional) const; 83 84 QuicStreamId next_outgoing_bidirectional_stream_id() const; 85 QuicStreamId next_outgoing_unidirectional_stream_id() const; 86 87 QuicStreamCount max_outgoing_bidirectional_streams() const; 88 QuicStreamCount max_outgoing_unidirectional_streams() const; 89 90 QuicStreamCount max_incoming_bidirectional_streams() const; 91 QuicStreamCount max_incoming_unidirectional_streams() const; 92 93 QuicStreamCount advertised_max_incoming_bidirectional_streams() const; 94 QuicStreamCount advertised_max_incoming_unidirectional_streams() const; 95 96 QuicStreamCount outgoing_bidirectional_stream_count() const; 97 QuicStreamCount outgoing_unidirectional_stream_count() const; 98 99 private: 100 friend class test::QuicSessionPeer; 101 friend class test::UberQuicStreamIdManagerPeer; 102 103 ParsedQuicVersion version_; 104 // Manages stream IDs of bidirectional streams. 105 QuicStreamIdManager bidirectional_stream_id_manager_; 106 107 // Manages stream IDs of unidirectional streams. 108 QuicStreamIdManager unidirectional_stream_id_manager_; 109 }; 110 111 } // namespace quic 112 113 #endif // QUICHE_QUIC_CORE_UBER_QUIC_STREAM_ID_MANAGER_H_ 114