QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 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 | #include "net/third_party/quiche/src/quic/core/uber_quic_stream_id_manager.h" |
| 6 | |
| 7 | #include "net/third_party/quiche/src/quic/core/quic_session.h" |
| 8 | #include "net/third_party/quiche/src/quic/core/quic_utils.h" |
| 9 | |
| 10 | namespace quic { |
| 11 | namespace { |
| 12 | |
| 13 | Perspective Reverse(Perspective perspective) { |
| 14 | return perspective == Perspective::IS_SERVER ? Perspective::IS_CLIENT |
| 15 | : Perspective::IS_SERVER; |
| 16 | } |
| 17 | |
| 18 | } // namespace |
| 19 | |
| 20 | UberQuicStreamIdManager::UberQuicStreamIdManager( |
| 21 | QuicSession* session, |
| 22 | size_t max_open_outgoing_streams, |
| 23 | size_t max_open_incoming_streams) |
| 24 | : bidirectional_stream_id_manager_( |
| 25 | session, |
| 26 | QuicUtils::GetFirstBidirectionalStreamId( |
| 27 | session->connection()->transport_version(), |
| 28 | session->perspective()), |
| 29 | session->perspective() == Perspective::IS_SERVER |
| 30 | ? QuicUtils::GetCryptoStreamId( |
| 31 | session->connection()->transport_version()) |
| 32 | : QuicUtils::GetInvalidStreamId( |
| 33 | session->connection()->transport_version()), |
| 34 | QuicUtils::GetFirstBidirectionalStreamId( |
| 35 | session->connection()->transport_version(), |
| 36 | Reverse(session->perspective())), |
| 37 | max_open_outgoing_streams, |
| 38 | max_open_incoming_streams), |
| 39 | unidirectional_stream_id_manager_( |
| 40 | session, |
| 41 | QuicUtils::GetFirstUnidirectionalStreamId( |
| 42 | session->connection()->transport_version(), |
| 43 | session->perspective()), |
| 44 | QuicUtils::GetInvalidStreamId( |
| 45 | session->connection()->transport_version()), |
| 46 | QuicUtils::GetFirstUnidirectionalStreamId( |
| 47 | session->connection()->transport_version(), |
| 48 | Reverse(session->perspective())), |
| 49 | max_open_outgoing_streams, |
| 50 | max_open_incoming_streams) {} |
| 51 | |
| 52 | void UberQuicStreamIdManager::RegisterStaticStream(QuicStreamId id) { |
| 53 | if (QuicUtils::IsBidirectionalStreamId(id)) { |
| 54 | bidirectional_stream_id_manager_.RegisterStaticStream(id); |
| 55 | return; |
| 56 | } |
| 57 | unidirectional_stream_id_manager_.RegisterStaticStream(id); |
| 58 | } |
| 59 | |
| 60 | void UberQuicStreamIdManager::SetMaxOpenOutgoingStreams(size_t max_streams) { |
| 61 | bidirectional_stream_id_manager_.SetMaxOpenOutgoingStreams(max_streams); |
| 62 | unidirectional_stream_id_manager_.SetMaxOpenOutgoingStreams(max_streams); |
| 63 | } |
| 64 | |
| 65 | void UberQuicStreamIdManager::SetMaxOpenIncomingStreams(size_t max_streams) { |
| 66 | bidirectional_stream_id_manager_.SetMaxOpenIncomingStreams(max_streams); |
| 67 | unidirectional_stream_id_manager_.SetMaxOpenIncomingStreams(max_streams); |
| 68 | } |
| 69 | |
| 70 | bool UberQuicStreamIdManager::CanOpenNextOutgoingBidirectionalStream() { |
| 71 | return bidirectional_stream_id_manager_.CanOpenNextOutgoingStream(); |
| 72 | } |
| 73 | |
| 74 | bool UberQuicStreamIdManager::CanOpenNextOutgoingUnidirectionalStream() { |
| 75 | return unidirectional_stream_id_manager_.CanOpenNextOutgoingStream(); |
| 76 | } |
| 77 | |
| 78 | QuicStreamId UberQuicStreamIdManager::GetNextOutgoingBidirectionalStreamId() { |
| 79 | return bidirectional_stream_id_manager_.GetNextOutgoingStreamId(); |
| 80 | } |
| 81 | |
| 82 | QuicStreamId UberQuicStreamIdManager::GetNextOutgoingUnidirectionalStreamId() { |
| 83 | return unidirectional_stream_id_manager_.GetNextOutgoingStreamId(); |
| 84 | } |
| 85 | |
| 86 | bool UberQuicStreamIdManager::MaybeIncreaseLargestPeerStreamId( |
| 87 | QuicStreamId id) { |
| 88 | if (QuicUtils::IsBidirectionalStreamId(id)) { |
| 89 | return bidirectional_stream_id_manager_.MaybeIncreaseLargestPeerStreamId( |
| 90 | id); |
| 91 | } |
| 92 | return unidirectional_stream_id_manager_.MaybeIncreaseLargestPeerStreamId(id); |
| 93 | } |
| 94 | |
| 95 | void UberQuicStreamIdManager::OnStreamClosed(QuicStreamId id) { |
| 96 | if (QuicUtils::IsBidirectionalStreamId(id)) { |
| 97 | bidirectional_stream_id_manager_.OnStreamClosed(id); |
| 98 | return; |
| 99 | } |
| 100 | unidirectional_stream_id_manager_.OnStreamClosed(id); |
| 101 | } |
| 102 | |
| 103 | bool UberQuicStreamIdManager::OnMaxStreamIdFrame( |
| 104 | const QuicMaxStreamIdFrame& frame) { |
| 105 | if (QuicUtils::IsBidirectionalStreamId(frame.max_stream_id)) { |
| 106 | return bidirectional_stream_id_manager_.OnMaxStreamIdFrame(frame); |
| 107 | } |
| 108 | return unidirectional_stream_id_manager_.OnMaxStreamIdFrame(frame); |
| 109 | } |
| 110 | |
| 111 | bool UberQuicStreamIdManager::OnStreamIdBlockedFrame( |
| 112 | const QuicStreamIdBlockedFrame& frame) { |
| 113 | if (QuicUtils::IsBidirectionalStreamId(frame.stream_id)) { |
| 114 | return bidirectional_stream_id_manager_.OnStreamIdBlockedFrame(frame); |
| 115 | } |
| 116 | return unidirectional_stream_id_manager_.OnStreamIdBlockedFrame(frame); |
| 117 | } |
| 118 | |
| 119 | bool UberQuicStreamIdManager::IsIncomingStream(QuicStreamId id) const { |
| 120 | if (QuicUtils::IsBidirectionalStreamId(id)) { |
| 121 | return bidirectional_stream_id_manager_.IsIncomingStream(id); |
| 122 | } |
| 123 | return unidirectional_stream_id_manager_.IsIncomingStream(id); |
| 124 | } |
| 125 | |
| 126 | bool UberQuicStreamIdManager::IsAvailableStream(QuicStreamId id) const { |
| 127 | if (QuicUtils::IsBidirectionalStreamId(id)) { |
| 128 | return bidirectional_stream_id_manager_.IsAvailableStream(id); |
| 129 | } |
| 130 | return unidirectional_stream_id_manager_.IsAvailableStream(id); |
| 131 | } |
| 132 | |
| 133 | size_t UberQuicStreamIdManager::GetMaxAllowdIncomingBidirectionalStreams() |
| 134 | const { |
| 135 | return bidirectional_stream_id_manager_.max_allowed_incoming_streams(); |
| 136 | } |
| 137 | |
| 138 | size_t UberQuicStreamIdManager::GetMaxAllowdIncomingUnidirectionalStreams() |
| 139 | const { |
| 140 | return unidirectional_stream_id_manager_.max_allowed_incoming_streams(); |
| 141 | } |
| 142 | |
| 143 | void UberQuicStreamIdManager::SetLargestPeerCreatedStreamId( |
| 144 | QuicStreamId largest_peer_created_stream_id) { |
| 145 | if (QuicUtils::IsBidirectionalStreamId(largest_peer_created_stream_id)) { |
| 146 | bidirectional_stream_id_manager_.set_largest_peer_created_stream_id( |
| 147 | largest_peer_created_stream_id); |
| 148 | return; |
| 149 | } |
| 150 | unidirectional_stream_id_manager_.set_largest_peer_created_stream_id( |
| 151 | largest_peer_created_stream_id); |
| 152 | } |
| 153 | |
| 154 | QuicStreamId UberQuicStreamIdManager::next_outgoing_bidirectional_stream_id() |
| 155 | const { |
| 156 | return bidirectional_stream_id_manager_.next_outgoing_stream_id(); |
| 157 | } |
| 158 | |
| 159 | QuicStreamId UberQuicStreamIdManager::next_outgoing_unidirectional_stream_id() |
| 160 | const { |
| 161 | return unidirectional_stream_id_manager_.next_outgoing_stream_id(); |
| 162 | } |
| 163 | |
| 164 | QuicStreamId |
| 165 | UberQuicStreamIdManager::max_allowed_outgoing_bidirectional_stream_id() const { |
| 166 | return bidirectional_stream_id_manager_.max_allowed_outgoing_stream_id(); |
| 167 | } |
| 168 | |
| 169 | QuicStreamId |
| 170 | UberQuicStreamIdManager::max_allowed_outgoing_unidirectional_stream_id() const { |
| 171 | return unidirectional_stream_id_manager_.max_allowed_outgoing_stream_id(); |
| 172 | } |
| 173 | |
| 174 | size_t UberQuicStreamIdManager::max_allowed_outgoing_bidirectional_streams() |
| 175 | const { |
| 176 | return bidirectional_stream_id_manager_.max_allowed_outgoing_streams(); |
| 177 | } |
| 178 | |
| 179 | size_t UberQuicStreamIdManager::max_allowed_outgoing_unidirectional_streams() |
| 180 | const { |
| 181 | return unidirectional_stream_id_manager_.max_allowed_outgoing_streams(); |
| 182 | } |
| 183 | |
| 184 | QuicStreamId |
| 185 | UberQuicStreamIdManager::actual_max_allowed_incoming_bidirectional_stream_id() |
| 186 | const { |
| 187 | return bidirectional_stream_id_manager_ |
| 188 | .actual_max_allowed_incoming_stream_id(); |
| 189 | } |
| 190 | |
| 191 | QuicStreamId |
| 192 | UberQuicStreamIdManager::actual_max_allowed_incoming_unidirectional_stream_id() |
| 193 | const { |
| 194 | return unidirectional_stream_id_manager_ |
| 195 | .actual_max_allowed_incoming_stream_id(); |
| 196 | } |
| 197 | |
| 198 | QuicStreamId UberQuicStreamIdManager:: |
| 199 | advertised_max_allowed_incoming_bidirectional_stream_id() const { |
| 200 | return bidirectional_stream_id_manager_ |
| 201 | .advertised_max_allowed_incoming_stream_id(); |
| 202 | } |
| 203 | |
| 204 | QuicStreamId UberQuicStreamIdManager:: |
| 205 | advertised_max_allowed_incoming_unidirectional_stream_id() const { |
| 206 | return unidirectional_stream_id_manager_ |
| 207 | .advertised_max_allowed_incoming_stream_id(); |
| 208 | } |
| 209 | |
| 210 | } // namespace quic |