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 8 #include <cstdint> 9 10 #include "absl/strings/string_view.h" 11 #include "quiche/quic/core/quic_crypto_server_stream_base.h" 12 #include "quiche/quic/core/quic_crypto_stream.h" 13 #include "quiche/quic/platform/api/quic_export.h" 14 #include "quiche/quic/qbone/qbone_control.pb.h" 15 #include "quiche/quic/qbone/qbone_control_stream.h" 16 #include "quiche/quic/qbone/qbone_packet_processor.h" 17 #include "quiche/quic/qbone/qbone_packet_writer.h" 18 #include "quiche/quic/qbone/qbone_session_base.h" 19 20 namespace quic { 21 22 // A helper class is used by the QuicCryptoServerStream. 23 class QboneCryptoServerStreamHelper 24 : public QuicCryptoServerStreamBase::Helper { 25 public: 26 // This will look for the QBONE alpn. 27 bool CanAcceptClientHello(const CryptoHandshakeMessage& chlo, 28 const QuicSocketAddress& client_address, 29 const QuicSocketAddress& peer_address, 30 const QuicSocketAddress& self_address, 31 std::string* error_details) const override; 32 }; 33 34 class QUIC_EXPORT_PRIVATE QboneServerSession 35 : public QboneSessionBase, 36 public QbonePacketProcessor::OutputInterface, 37 public QbonePacketProcessor::StatsInterface { 38 public: 39 QboneServerSession(const quic::ParsedQuicVersionVector& supported_versions, 40 QuicConnection* connection, Visitor* owner, 41 const QuicConfig& config, 42 const QuicCryptoServerConfig* quic_crypto_server_config, 43 QuicCompressedCertsCache* compressed_certs_cache, 44 QbonePacketWriter* writer, QuicIpAddress self_ip, 45 QuicIpAddress client_ip, size_t client_ip_subnet_length, 46 QboneServerControlStream::Handler* handler); 47 QboneServerSession(const QboneServerSession&) = delete; 48 QboneServerSession& operator=(const QboneServerSession&) = delete; 49 ~QboneServerSession() override; 50 51 // Override to create control stream at FORWARD_SECURE encryption level. 52 void SetDefaultEncryptionLevel(quic::EncryptionLevel level) override; 53 54 virtual bool SendClientRequest(const QboneClientRequest& request); 55 56 void ProcessPacketFromNetwork(absl::string_view packet) override; 57 void ProcessPacketFromPeer(absl::string_view packet) override; 58 59 // QbonePacketProcessor::OutputInterface implementation. 60 void SendPacketToClient(absl::string_view packet) override; 61 void SendPacketToNetwork(absl::string_view packet) override; 62 63 // QbonePacketProcessor::StatsInterface implementation. OnPacketForwarded(QbonePacketProcessor::Direction direction,uint8_t traffic_class)64 void OnPacketForwarded(QbonePacketProcessor::Direction direction, 65 uint8_t traffic_class) override {} OnPacketDroppedSilently(QbonePacketProcessor::Direction direction,uint8_t traffic_class)66 void OnPacketDroppedSilently(QbonePacketProcessor::Direction direction, 67 uint8_t traffic_class) override {} OnPacketDroppedWithIcmp(QbonePacketProcessor::Direction direction,uint8_t traffic_class)68 void OnPacketDroppedWithIcmp(QbonePacketProcessor::Direction direction, 69 uint8_t traffic_class) override {} OnPacketDroppedWithTcpReset(QbonePacketProcessor::Direction direction,uint8_t traffic_class)70 void OnPacketDroppedWithTcpReset(QbonePacketProcessor::Direction direction, 71 uint8_t traffic_class) override {} OnPacketDeferred(QbonePacketProcessor::Direction direction,uint8_t traffic_class)72 void OnPacketDeferred(QbonePacketProcessor::Direction direction, 73 uint8_t traffic_class) override {} RecordThroughput(size_t bytes,QbonePacketProcessor::Direction direction,uint8_t traffic_class)74 void RecordThroughput(size_t bytes, QbonePacketProcessor::Direction direction, 75 uint8_t traffic_class) override {} 76 77 protected: 78 // QboneSessionBase interface implementation. 79 std::unique_ptr<QuicCryptoStream> CreateCryptoStream() override; 80 81 // Instantiates QboneServerControlStream. 82 virtual void CreateControlStream(); 83 84 // Instantiates QboneServerControlStream from the pending stream and returns a 85 // pointer to it. 86 QuicStream* CreateControlStreamFromPendingStream(PendingStream* pending); 87 88 // The packet processor. 89 QbonePacketProcessor processor_; 90 91 // Config for QUIC crypto server stream, used by the server. 92 const QuicCryptoServerConfig* quic_crypto_server_config_; 93 94 private: 95 // Used by QUIC crypto server stream to track most recently compressed certs. 96 QuicCompressedCertsCache* compressed_certs_cache_; 97 // This helper is needed when create QuicCryptoServerStream. 98 QboneCryptoServerStreamHelper stream_helper_; 99 // Passed to the control stream. 100 QboneServerControlStream::Handler* handler_; 101 // The unowned control stream. 102 QboneServerControlStream* control_stream_ = nullptr; 103 }; 104 105 } // namespace quic 106 107 #endif // QUICHE_QUIC_QBONE_QBONE_SERVER_SESSION_H_ 108