xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/qbone/qbone_server_session.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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