1
#pragma once
2

            
3
#include "source/common/quic/envoy_quic_connection_id_generator_factory.h"
4

            
5
#include "quiche/quic/core/deterministic_connection_id_generator.h"
6

            
7
#if defined(__linux__)
8
#include <linux/filter.h>
9
#endif
10

            
11
namespace Envoy {
12
namespace Quic {
13

            
14
// This class modifies connection ids that are too long in an Envoy fashion.
15
class EnvoyDeterministicConnectionIdGenerator : public quic::DeterministicConnectionIdGenerator {
16

            
17
  using DeterministicConnectionIdGenerator::DeterministicConnectionIdGenerator;
18

            
19
public:
20
  // Hashes |original| to create a new connection ID in Envoy fashion.
21
  absl::optional<quic::QuicConnectionId>
22
  GenerateNextConnectionId(const quic::QuicConnectionId& original) override;
23
  // Replace the connection ID if and only if |original| is not of the expected
24
  // length in Envoy fashion.
25
  absl::optional<quic::QuicConnectionId>
26
  MaybeReplaceConnectionId(const quic::QuicConnectionId& original,
27
                           const quic::ParsedQuicVersion& version) override;
28
};
29

            
30
class EnvoyDeterministicConnectionIdGeneratorFactory
31
    : public EnvoyQuicConnectionIdGeneratorFactory {
32
public:
33
  // EnvoyQuicConnectionIdGeneratorFactory.
34
  QuicConnectionIdGeneratorPtr createQuicConnectionIdGenerator(uint32_t worker_index) override;
35
  Network::Socket::OptionConstSharedPtr
36
  createCompatibleLinuxBpfSocketOption(uint32_t concurrency) override;
37
  QuicConnectionIdWorkerSelector
38
  getCompatibleConnectionIdWorkerSelector(uint32_t concurrency) override;
39

            
40
private:
41
#if defined(SO_ATTACH_REUSEPORT_CBPF) && defined(__linux__)
42
  sock_fprog prog_;
43
  std::vector<sock_filter> filter_;
44
#endif
45
};
46

            
47
} // namespace Quic
48
} // namespace Envoy