| OLD | NEW |
| 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 // A QuicSession, which demuxes a single connection to individual streams. | 5 // A QuicSession, which demuxes a single connection to individual streams. |
| 6 | 6 |
| 7 #ifndef NET_QUIC_CORE_QUIC_SESSION_H_ | 7 #ifndef NET_QUIC_CORE_QUIC_SESSION_H_ |
| 8 #define NET_QUIC_CORE_QUIC_SESSION_H_ | 8 #define NET_QUIC_CORE_QUIC_SESSION_H_ |
| 9 | 9 |
| 10 #include <cstddef> | 10 #include <cstddef> |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 // then a new stream is created and returned. In all other cases, nullptr is | 243 // then a new stream is created and returned. In all other cases, nullptr is |
| 244 // returned. | 244 // returned. |
| 245 QuicStream* GetOrCreateStream(const QuicStreamId stream_id); | 245 QuicStream* GetOrCreateStream(const QuicStreamId stream_id); |
| 246 | 246 |
| 247 // Mark a stream as draining. | 247 // Mark a stream as draining. |
| 248 virtual void StreamDraining(QuicStreamId id); | 248 virtual void StreamDraining(QuicStreamId id); |
| 249 | 249 |
| 250 // Returns true if this stream should yield writes to another blocked stream. | 250 // Returns true if this stream should yield writes to another blocked stream. |
| 251 bool ShouldYield(QuicStreamId stream_id); | 251 bool ShouldYield(QuicStreamId stream_id); |
| 252 | 252 |
| 253 void set_respect_goaway(bool respect_goaway) { |
| 254 respect_goaway_ = respect_goaway; |
| 255 } |
| 256 |
| 253 protected: | 257 protected: |
| 254 using StaticStreamMap = QuicSmallMap<QuicStreamId, QuicStream*, 2>; | 258 using StaticStreamMap = QuicSmallMap<QuicStreamId, QuicStream*, 2>; |
| 255 | 259 |
| 256 using DynamicStreamMap = | 260 using DynamicStreamMap = |
| 257 QuicSmallMap<QuicStreamId, std::unique_ptr<QuicStream>, 10>; | 261 QuicSmallMap<QuicStreamId, std::unique_ptr<QuicStream>, 10>; |
| 258 | 262 |
| 259 using ClosedStreams = std::vector<std::unique_ptr<QuicStream>>; | 263 using ClosedStreams = std::vector<std::unique_ptr<QuicStream>>; |
| 260 | 264 |
| 265 // TODO(ckrasic) - For all *DynamicStream2 below, rename after |
| 266 // quic_reloadable_flag_quic_refactor_stream_creation is deprecated. |
| 267 |
| 268 // Returns true if an incoming stream can be created. |
| 269 virtual bool ShouldCreateIncomingDynamicStream2(QuicStreamId id); |
| 270 |
| 271 // Returns true if an outgoing stream can be created. |
| 272 virtual bool ShouldCreateOutgoingDynamicStream2(); |
| 273 |
| 261 // Creates a new stream to handle a peer-initiated stream. | 274 // Creates a new stream to handle a peer-initiated stream. |
| 262 // Caller does not own the returned stream. | 275 // Caller does not own the returned stream. |
| 263 // Returns nullptr and does error handling if the stream can not be created. | 276 // Returns nullptr and does error handling if the stream can not be created. |
| 277 virtual QuicStream* MaybeCreateIncomingDynamicStream(QuicStreamId id); |
| 278 |
| 279 // Create a new stream to handle a locally-initiated stream. |
| 280 // Caller does not own the returned stream. |
| 281 // Returns nullptr if max streams have already been opened. |
| 282 virtual QuicStream* MaybeCreateOutgoingDynamicStream(SpdyPriority priority); |
| 283 |
| 284 // TODO(ckrasic) - For all Create*DynamicStream below, remove when |
| 285 // quic_reloadable_flag_quic_refactor_stream_creation is deprecated. |
| 286 |
| 287 // Creates a new stream to handle a peer-initiated stream. |
| 288 // Caller does not own the returned stream. |
| 289 // Returns nullptr and does error handling if the stream can not be created. |
| 264 virtual QuicStream* CreateIncomingDynamicStream(QuicStreamId id) = 0; | 290 virtual QuicStream* CreateIncomingDynamicStream(QuicStreamId id) = 0; |
| 265 | 291 |
| 266 // Create a new stream to handle a locally-initiated stream. | 292 // Create a new stream to handle a locally-initiated stream. |
| 267 // Caller does not own the returned stream. | 293 // Caller does not own the returned stream. |
| 268 // Returns nullptr if max streams have already been opened. | 294 // Returns nullptr if max streams have already been opened. |
| 269 virtual QuicStream* CreateOutgoingDynamicStream(SpdyPriority priority) = 0; | 295 virtual QuicStream* CreateOutgoingDynamicStream(SpdyPriority priority) = 0; |
| 270 | 296 |
| 271 // Return the reserved crypto stream. | 297 // Return the reserved crypto stream. |
| 272 virtual QuicCryptoStream* GetMutableCryptoStream() = 0; | 298 virtual QuicCryptoStream* GetMutableCryptoStream() = 0; |
| 273 | 299 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 296 // peer sent on that stream. | 322 // peer sent on that stream. |
| 297 // When this data arrives (via stream frame w. FIN, trailing headers, or RST) | 323 // When this data arrives (via stream frame w. FIN, trailing headers, or RST) |
| 298 // this method is called, and correctly updates the connection level flow | 324 // this method is called, and correctly updates the connection level flow |
| 299 // controller. | 325 // controller. |
| 300 virtual void OnFinalByteOffsetReceived(QuicStreamId id, | 326 virtual void OnFinalByteOffsetReceived(QuicStreamId id, |
| 301 QuicStreamOffset final_byte_offset); | 327 QuicStreamOffset final_byte_offset); |
| 302 | 328 |
| 303 // Return true if given stream is peer initiated. | 329 // Return true if given stream is peer initiated. |
| 304 bool IsIncomingStream(QuicStreamId id) const; | 330 bool IsIncomingStream(QuicStreamId id) const; |
| 305 | 331 |
| 332 // Unconditionally creates a stream. Subclasses should use this to |
| 333 // provide streams appropriately subclassed from |QuicStream|, |
| 334 // e.g. |QuicSpdySession::CreateStream()| creates a |QuicSpdyStream|. |
| 335 virtual std::unique_ptr<QuicStream> CreateStream(QuicStreamId id) = 0; |
| 336 |
| 337 // Creates a stream and activates it, owned by the session. |
| 338 QuicStream* CreateAndActivateStream(QuicStreamId id); |
| 339 |
| 306 StaticStreamMap& static_streams() { return static_stream_map_; } | 340 StaticStreamMap& static_streams() { return static_stream_map_; } |
| 307 const StaticStreamMap& static_streams() const { return static_stream_map_; } | 341 const StaticStreamMap& static_streams() const { return static_stream_map_; } |
| 308 | 342 |
| 309 DynamicStreamMap& dynamic_streams() { return dynamic_stream_map_; } | 343 DynamicStreamMap& dynamic_streams() { return dynamic_stream_map_; } |
| 310 const DynamicStreamMap& dynamic_streams() const { | 344 const DynamicStreamMap& dynamic_streams() const { |
| 311 return dynamic_stream_map_; | 345 return dynamic_stream_map_; |
| 312 } | 346 } |
| 313 | 347 |
| 314 ClosedStreams* closed_streams() { return &closed_streams_; } | 348 ClosedStreams* closed_streams() { return &closed_streams_; } |
| 315 | 349 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 bool MaybeIncreaseLargestPeerStreamId(const QuicStreamId stream_id); | 386 bool MaybeIncreaseLargestPeerStreamId(const QuicStreamId stream_id); |
| 353 | 387 |
| 354 void InsertLocallyClosedStreamsHighestOffset(const QuicStreamId id, | 388 void InsertLocallyClosedStreamsHighestOffset(const QuicStreamId id, |
| 355 QuicStreamOffset offset); | 389 QuicStreamOffset offset); |
| 356 // If stream is a locally closed stream, this RST will update FIN offset. | 390 // If stream is a locally closed stream, this RST will update FIN offset. |
| 357 // Otherwise stream is a preserved stream and the behavior of it depends on | 391 // Otherwise stream is a preserved stream and the behavior of it depends on |
| 358 // derived class's own implementation. | 392 // derived class's own implementation. |
| 359 virtual void HandleRstOnValidNonexistentStream( | 393 virtual void HandleRstOnValidNonexistentStream( |
| 360 const QuicRstStreamFrame& frame); | 394 const QuicRstStreamFrame& frame); |
| 361 | 395 |
| 396 bool respect_goaway() const { return respect_goaway_; } |
| 397 |
| 362 private: | 398 private: |
| 363 friend class test::QuicSessionPeer; | 399 friend class test::QuicSessionPeer; |
| 364 | 400 |
| 365 // Called in OnConfigNegotiated when we receive a new stream level flow | 401 // Called in OnConfigNegotiated when we receive a new stream level flow |
| 366 // control window in a negotiated config. Closes the connection if invalid. | 402 // control window in a negotiated config. Closes the connection if invalid. |
| 367 void OnNewStreamFlowControlWindow(QuicStreamOffset new_window); | 403 void OnNewStreamFlowControlWindow(QuicStreamOffset new_window); |
| 368 | 404 |
| 369 // Called in OnConfigNegotiated when we receive a new connection level flow | 405 // Called in OnConfigNegotiated when we receive a new connection level flow |
| 370 // control window in a negotiated config. Closes the connection if invalid. | 406 // control window in a negotiated config. Closes the connection if invalid. |
| 371 void OnNewSessionFlowControlWindow(QuicStreamOffset new_window); | 407 void OnNewSessionFlowControlWindow(QuicStreamOffset new_window); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 // The latched error with which the connection was closed. | 473 // The latched error with which the connection was closed. |
| 438 QuicErrorCode error_; | 474 QuicErrorCode error_; |
| 439 | 475 |
| 440 // Used for connection-level flow control. | 476 // Used for connection-level flow control. |
| 441 QuicFlowController flow_controller_; | 477 QuicFlowController flow_controller_; |
| 442 | 478 |
| 443 // The stream id which was last popped in OnCanWrite, or 0, if not under the | 479 // The stream id which was last popped in OnCanWrite, or 0, if not under the |
| 444 // call stack of OnCanWrite. | 480 // call stack of OnCanWrite. |
| 445 QuicStreamId currently_writing_stream_id_; | 481 QuicStreamId currently_writing_stream_id_; |
| 446 | 482 |
| 483 // If this is set to false, the session will ignore peer GOAWAYs and |
| 484 // allow the creation of outgoing streams regardless of the high |
| 485 // chance they will fail. |
| 486 bool respect_goaway_; |
| 487 |
| 447 DISALLOW_COPY_AND_ASSIGN(QuicSession); | 488 DISALLOW_COPY_AND_ASSIGN(QuicSession); |
| 448 }; | 489 }; |
| 449 | 490 |
| 450 } // namespace net | 491 } // namespace net |
| 451 | 492 |
| 452 #endif // NET_QUIC_CORE_QUIC_SESSION_H_ | 493 #endif // NET_QUIC_CORE_QUIC_SESSION_H_ |
| OLD | NEW |