1
#pragma once
2

            
3
#include "envoy/config/typed_config.h"
4
#include "envoy/network/socket.h"
5
#include "envoy/server/factory_context.h"
6

            
7
#include "quiche/quic/core/connection_id_generator.h"
8
#include "quiche/quic/load_balancer/load_balancer_encoder.h"
9

            
10
namespace Envoy {
11
namespace Quic {
12

            
13
using QuicConnectionIdGeneratorPtr = std::unique_ptr<quic::ConnectionIdGeneratorInterface>;
14
// A function similar to the BPF program from createCompatibleLinuxBpfSocketOption, it takes
15
// a QUIC packet and returns the appropriate worker_index.
16
using QuicConnectionIdWorkerSelector =
17
    std::function<uint32_t(const Buffer::Instance& packet, uint32_t default_value)>;
18

            
19
/**
20
 * A factory interface to provide QUIC connection IDs and compatible BPF code for stable packet
21
 * routing.
22
 */
23
class EnvoyQuicConnectionIdGeneratorFactory {
24
public:
25
2159
  virtual ~EnvoyQuicConnectionIdGeneratorFactory() = default;
26

            
27
  /**
28
   * Create a connection ID generator object.
29
   * @param worker_index an index to be encoded to QUIC connection ID for routing packets to the
30
   * current listener.
31
   */
32
  virtual QuicConnectionIdGeneratorPtr createQuicConnectionIdGenerator(uint32_t worker_index) PURE;
33

            
34
  /**
35
   * Create a socket option with BPF program to consistently route QUIC packets to the right listen
36
   * socket. Linux only.
37
   * @param concurrency the total number of worker threads.
38
   */
39
  virtual Network::Socket::OptionConstSharedPtr
40
  createCompatibleLinuxBpfSocketOption(uint32_t concurrency) PURE;
41

            
42
  /**
43
   * Returns a function to retrieve the worker index associated with a QUIC packet; the same
44
   * principle as the BPF program above, but for contexts where BPF is unavailable.
45
   */
46
  virtual QuicConnectionIdWorkerSelector
47
  getCompatibleConnectionIdWorkerSelector(uint32_t concurrency) PURE;
48
};
49

            
50
using EnvoyQuicConnectionIdGeneratorFactoryPtr =
51
    std::unique_ptr<EnvoyQuicConnectionIdGeneratorFactory>;
52

            
53
class EnvoyQuicConnectionIdGeneratorConfigFactory : public Config::TypedFactory {
54
public:
55
1026
  std::string category() const override { return "envoy.quic.connection_id_generator"; }
56

            
57
  /**
58
   * Returns a connection ID factory based on the given config.
59
   */
60
  virtual EnvoyQuicConnectionIdGeneratorFactoryPtr
61
  createQuicConnectionIdGeneratorFactory(const Protobuf::Message& config,
62
                                         ProtobufMessage::ValidationVisitor& validation_visitor,
63
                                         Server::Configuration::FactoryContext& context) PURE;
64
};
65

            
66
} // namespace Quic
67
} // namespace Envoy