• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 QUIC_EXPORT_PRIVATE 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   QuicStreamCount GetMaxAllowdIncomingBidirectionalStreams() const;
72 
73   QuicStreamCount GetMaxAllowdIncomingUnidirectionalStreams() const;
74 
75   QuicStreamId GetLargestPeerCreatedStreamId(bool unidirectional) const;
76 
77   QuicStreamId next_outgoing_bidirectional_stream_id() const;
78   QuicStreamId next_outgoing_unidirectional_stream_id() const;
79 
80   QuicStreamCount max_outgoing_bidirectional_streams() const;
81   QuicStreamCount max_outgoing_unidirectional_streams() const;
82 
83   QuicStreamCount max_incoming_bidirectional_streams() const;
84   QuicStreamCount max_incoming_unidirectional_streams() const;
85 
86   QuicStreamCount advertised_max_incoming_bidirectional_streams() const;
87   QuicStreamCount advertised_max_incoming_unidirectional_streams() const;
88 
89   QuicStreamCount outgoing_bidirectional_stream_count() const;
90   QuicStreamCount outgoing_unidirectional_stream_count() const;
91 
92  private:
93   friend class test::QuicSessionPeer;
94   friend class test::UberQuicStreamIdManagerPeer;
95 
96   ParsedQuicVersion version_;
97   // Manages stream IDs of bidirectional streams.
98   QuicStreamIdManager bidirectional_stream_id_manager_;
99 
100   // Manages stream IDs of unidirectional streams.
101   QuicStreamIdManager unidirectional_stream_id_manager_;
102 };
103 
104 }  // namespace quic
105 
106 #endif  // QUICHE_QUIC_CORE_UBER_QUIC_STREAM_ID_MANAGER_H_
107