1
#pragma once
2

            
3
#include "envoy/buffer/buffer.h"
4
#include "envoy/config/core/v3/proxy_protocol.pb.h"
5
#include "envoy/network/address.h"
6
#include "envoy/network/connection.h"
7

            
8
#include "absl/container/flat_hash_set.h"
9

            
10
namespace Envoy {
11
namespace Extensions {
12
namespace Common {
13
namespace ProxyProtocol {
14

            
15
// See https://github.com/haproxy/haproxy/blob/master/doc/proxy-protocol.txt for definitions
16

            
17
constexpr char PROXY_PROTO_V1_SIGNATURE[] = "PROXY ";
18
constexpr auto PROXY_PROTO_V1_AF_INET = "TCP4";
19
constexpr auto PROXY_PROTO_V1_AF_INET6 = "TCP6";
20
constexpr auto PROXY_PROTO_V1_UNKNOWN = "UNKNOWN";
21

            
22
constexpr char PROXY_PROTO_V2_SIGNATURE[] = "\x0d\x0a\x0d\x0a\x00\x0d\x0a\x51\x55\x49\x54\x0a";
23

            
24
constexpr uint32_t PROXY_PROTO_V1_SIGNATURE_LEN = 6;
25
constexpr uint32_t PROXY_PROTO_V2_SIGNATURE_LEN = 12;
26
constexpr uint32_t PROXY_PROTO_V2_HEADER_LEN = 16;
27

            
28
constexpr uint32_t PROXY_PROTO_V2_VERSION = 0x2;
29
constexpr uint32_t PROXY_PROTO_V2_ONBEHALF_OF = 0x1;
30
constexpr uint32_t PROXY_PROTO_V2_LOCAL = 0x0;
31

            
32
constexpr uint32_t PROXY_PROTO_V2_AF_INET = 0x1;
33
constexpr uint32_t PROXY_PROTO_V2_AF_INET6 = 0x2;
34
constexpr uint32_t PROXY_PROTO_V2_AF_UNIX = 0x3;
35

            
36
constexpr uint8_t PROXY_PROTO_V2_TRANSPORT_STREAM = 0x1;
37
constexpr uint8_t PROXY_PROTO_V2_TRANSPORT_DGRAM = 0x2;
38

            
39
constexpr uint32_t PROXY_PROTO_V2_ADDR_LEN_UNSPEC = 0;
40
constexpr uint32_t PROXY_PROTO_V2_ADDR_LEN_INET = 12;
41
constexpr uint32_t PROXY_PROTO_V2_ADDR_LEN_INET6 = 36;
42
constexpr uint32_t PROXY_PROTO_V2_ADDR_LEN_UNIX = 216;
43

            
44
constexpr uint32_t PROXY_PROTO_V2_TLV_TYPE_LENGTH_LEN = 3;
45

            
46
// Generates the v1 PROXY protocol header and adds it to the specified buffer
47
void generateV1Header(const std::string& src_addr, const std::string& dst_addr, uint32_t src_port,
48
                      uint32_t dst_port, Network::Address::IpVersion ip_version,
49
                      Buffer::Instance& out);
50
void generateV1Header(const Network::Address::Ip& source_address,
51
                      const Network::Address::Ip& dest_address, Buffer::Instance& out);
52

            
53
// Generates the v2 PROXY protocol header and adds it to the specified buffer
54
// TCP is assumed as the transport protocol
55
void generateV2Header(const std::string& src_addr, const std::string& dst_addr, uint32_t src_port,
56
                      uint32_t dst_port, Network::Address::IpVersion ip_version,
57
                      uint16_t extension_length, Buffer::Instance& out);
58
void generateV2Header(const std::string& src_addr, const std::string& dst_addr, uint32_t src_port,
59
                      uint32_t dst_port, Network::Address::IpVersion ip_version,
60
                      Buffer::Instance& out);
61
void generateV2Header(const Network::Address::Ip& source_address,
62
                      const Network::Address::Ip& dest_address, Buffer::Instance& out);
63

            
64
// Generates the appropriate proxy proto header and appends it to the supplied buffer.
65
void generateProxyProtoHeader(const envoy::config::core::v3::ProxyProtocolConfig& config,
66
                              const Network::Connection& connection, Buffer::Instance& out);
67

            
68
// Generates the v2 PROXY protocol local command header and adds it to the specified buffer
69
void generateV2LocalHeader(Buffer::Instance& out);
70

            
71
// Generates the v2 PROXY protocol header including the TLV vector into the specified buffer.
72
bool generateV2Header(const Network::ProxyProtocolData& proxy_proto_data, Buffer::Instance& out,
73
                      bool pass_all_tlvs, const absl::flat_hash_set<uint8_t>& pass_through_tlvs,
74
                      const std::vector<Envoy::Network::ProxyProtocolTLV>& custom_tlvs);
75

            
76
} // namespace ProxyProtocol
77
} // namespace Common
78
} // namespace Extensions
79
} // namespace Envoy