wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 1 | // Copyright (c) 2019 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_QBONE_QBONE_SERVER_SESSION_H_ |
| 6 | #define QUICHE_QUIC_QBONE_QBONE_SERVER_SESSION_H_ |
| 7 | |
vasilvv | 1436e34 | 2020-10-09 12:31:16 -0700 | [diff] [blame] | 8 | #include "absl/strings/string_view.h" |
QUICHE team | 5be974e | 2020-12-29 18:35:24 -0500 | [diff] [blame] | 9 | #include "quic/core/quic_crypto_server_stream_base.h" |
| 10 | #include "quic/core/quic_crypto_stream.h" |
| 11 | #include "quic/platform/api/quic_export.h" |
| 12 | #include "quic/qbone/qbone_control.pb.h" |
| 13 | #include "quic/qbone/qbone_control_stream.h" |
| 14 | #include "quic/qbone/qbone_packet_processor.h" |
| 15 | #include "quic/qbone/qbone_packet_writer.h" |
| 16 | #include "quic/qbone/qbone_session_base.h" |
wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 17 | |
| 18 | namespace quic { |
| 19 | |
| 20 | // A helper class is used by the QuicCryptoServerStream. |
nharper | 5f23a2d | 2020-02-20 10:44:09 -0800 | [diff] [blame] | 21 | class QboneCryptoServerStreamHelper |
| 22 | : public QuicCryptoServerStreamBase::Helper { |
wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 23 | public: |
bnc | c384327 | 2020-02-27 04:58:51 -0800 | [diff] [blame] | 24 | // This will look for the QBONE alpn. |
wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 25 | bool CanAcceptClientHello(const CryptoHandshakeMessage& chlo, |
| 26 | const QuicSocketAddress& client_address, |
| 27 | const QuicSocketAddress& peer_address, |
| 28 | const QuicSocketAddress& self_address, |
QUICHE team | b80d7c3 | 2020-02-23 23:44:20 -0800 | [diff] [blame] | 29 | std::string* error_details) const override; |
wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 30 | }; |
| 31 | |
| 32 | class QUIC_EXPORT_PRIVATE QboneServerSession |
| 33 | : public QboneSessionBase, |
| 34 | public QbonePacketProcessor::OutputInterface, |
| 35 | public QbonePacketProcessor::StatsInterface { |
| 36 | public: |
| 37 | QboneServerSession(const quic::ParsedQuicVersionVector& supported_versions, |
| 38 | QuicConnection* connection, |
| 39 | Visitor* owner, |
| 40 | const QuicConfig& config, |
| 41 | const QuicCryptoServerConfig* quic_crypto_server_config, |
| 42 | QuicCompressedCertsCache* compressed_certs_cache, |
| 43 | QbonePacketWriter* writer, |
| 44 | QuicIpAddress self_ip, |
| 45 | QuicIpAddress client_ip, |
| 46 | size_t client_ip_subnet_length, |
| 47 | QboneServerControlStream::Handler* handler); |
| 48 | QboneServerSession(const QboneServerSession&) = delete; |
| 49 | QboneServerSession& operator=(const QboneServerSession&) = delete; |
| 50 | ~QboneServerSession() override; |
| 51 | |
| 52 | void Initialize() override; |
| 53 | |
| 54 | virtual bool SendClientRequest(const QboneClientRequest& request); |
| 55 | |
vasilvv | 1436e34 | 2020-10-09 12:31:16 -0700 | [diff] [blame] | 56 | void ProcessPacketFromNetwork(absl::string_view packet) override; |
| 57 | void ProcessPacketFromPeer(absl::string_view packet) override; |
wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 58 | |
| 59 | // QbonePacketProcessor::OutputInterface implementation. |
vasilvv | 1436e34 | 2020-10-09 12:31:16 -0700 | [diff] [blame] | 60 | void SendPacketToClient(absl::string_view packet) override; |
| 61 | void SendPacketToNetwork(absl::string_view packet) override; |
wub | f975eac | 2019-08-19 19:41:01 -0700 | [diff] [blame] | 62 | |
| 63 | // QbonePacketProcessor::StatsInterface implementation. |
| 64 | void OnPacketForwarded(QbonePacketProcessor::Direction direction) override {} |
| 65 | void OnPacketDroppedSilently( |
| 66 | QbonePacketProcessor::Direction direction) override {} |
| 67 | void OnPacketDroppedWithIcmp( |
| 68 | QbonePacketProcessor::Direction direction) override {} |
| 69 | void OnPacketDroppedWithTcpReset( |
| 70 | QbonePacketProcessor::Direction direction) override {} |
| 71 | void OnPacketDeferred(QbonePacketProcessor::Direction direction) override {} |
| 72 | |
| 73 | protected: |
| 74 | // QboneSessionBase interface implementation. |
| 75 | std::unique_ptr<QuicCryptoStream> CreateCryptoStream() override; |
| 76 | // The packet processor. |
| 77 | QbonePacketProcessor processor_; |
| 78 | |
| 79 | private: |
| 80 | // Config for QUIC crypto server stream, used by the server. |
| 81 | const QuicCryptoServerConfig* quic_crypto_server_config_; |
| 82 | // Used by QUIC crypto server stream to track most recently compressed certs. |
| 83 | QuicCompressedCertsCache* compressed_certs_cache_; |
| 84 | // This helper is needed when create QuicCryptoServerStream. |
| 85 | QboneCryptoServerStreamHelper stream_helper_; |
| 86 | // Passed to the control stream. |
| 87 | QboneServerControlStream::Handler* handler_; |
| 88 | // The unowned control stream. |
| 89 | QboneServerControlStream* control_stream_; |
| 90 | }; |
| 91 | |
| 92 | } // namespace quic |
| 93 | |
| 94 | #endif // QUICHE_QUIC_QBONE_QBONE_SERVER_SESSION_H_ |