Skip to content

Commit

Permalink
move proxy protocol TLV parser into core
Browse files Browse the repository at this point in the history
  • Loading branch information
jronak committed Feb 2, 2025
1 parent 44d5fa0 commit aece64a
Show file tree
Hide file tree
Showing 12 changed files with 117 additions and 37 deletions.
3 changes: 2 additions & 1 deletion api/envoy/config/core/v3/proxy_protocol.proto
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ message ProxyProtocolTLV {
// <https://www.haproxy.org/download/2.1/doc/proxy-protocol.txt>`_ for details.
uint32 type = 1 [(validate.rules).uint32 = {lt: 256}];

// TLV value.
// TLV value is defined as a byte array in proxy protocol. See `the spec
// <https://www.haproxy.org/download/2.1/doc/proxy-protocol.txt>`_ for details.
bytes value = 2;
}

Expand Down
21 changes: 21 additions & 0 deletions source/common/proxy_protocol/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
load(
"//bazel:envoy_build_system.bzl",
"envoy_cc_library",
"envoy_package",
)

licenses(["notice"]) # Apache 2

envoy_package()

envoy_cc_library(
name = "proxy_protocol_lib",
srcs = ["proxy_protocol.cc"],
hdrs = ["proxy_protocol.h"],
visibility = ["//visibility:public"],
deps = [
"//envoy/network:proxy_protocol_options_lib",
"@com_google_absl//absl/types:optional",
"@envoy_api//envoy/config/core/v3:pkg_cc_proto",
],
)
19 changes: 19 additions & 0 deletions source/common/proxy_protocol/proxy_protocol.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#include "source/common/proxy_protocol/proxy_protocol.h"

namespace Envoy {
namespace Common {
namespace ProxyProtocol {

Network::ProxyProtocolTLVVector
parseTLVs(absl::Span<const envoy::config::core::v3::ProxyProtocolTLV* const> tlvs) {
Network::ProxyProtocolTLVVector tlv_vector;
for (const auto& tlv : tlvs) {
const std::vector<unsigned char> value(tlv->value().begin(), tlv->value().end());
tlv_vector.push_back({static_cast<uint8_t>(tlv->type()), value});
}
return tlv_vector;
}

} // namespace ProxyProtocol
} // namespace Common
} // namespace Envoy
18 changes: 18 additions & 0 deletions source/common/proxy_protocol/proxy_protocol.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#pragma once

#include "envoy/config/core/v3/proxy_protocol.pb.h"
#include "envoy/network/proxy_protocol.h"

#include "absl/types/span.h"

namespace Envoy {
namespace Common {
namespace ProxyProtocol {

// Parses proxy protocol TLVs from the given configuration.
Network::ProxyProtocolTLVVector
parseTLVs(absl::Span<const envoy::config::core::v3::ProxyProtocolTLV* const> tlvs);

} // namespace ProxyProtocol
} // namespace Common
} // namespace Envoy
2 changes: 1 addition & 1 deletion source/common/tcp_proxy/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -83,13 +83,13 @@ envoy_cc_library(
"//source/common/network:upstream_socket_options_filter_state_lib",
"//source/common/network:utility_lib",
"//source/common/protobuf:utility_lib",
"//source/common/proxy_protocol:proxy_protocol_lib",
"//source/common/router:metadatamatchcriteria_lib",
"//source/common/stream_info:stream_id_provider_lib",
"//source/common/stream_info:stream_info_lib",
"//source/common/stream_info:uint64_accessor_lib",
"//source/common/upstream:load_balancer_context_base_lib",
"//source/common/upstream:od_cds_api_lib",
"//source/extensions/common/proxy_protocol:proxy_protocol_header_lib",
"//source/extensions/upstreams/tcp/generic:config",
"@envoy_api//envoy/config/accesslog/v3:pkg_cc_proto",
"@envoy_api//envoy/extensions/filters/network/tcp_proxy/v3:pkg_cc_proto",
Expand Down
5 changes: 2 additions & 3 deletions source/common/tcp_proxy/tcp_proxy.cc
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,12 @@
#include "source/common/network/transport_socket_options_impl.h"
#include "source/common/network/upstream_server_name.h"
#include "source/common/network/upstream_socket_options_filter_state.h"
#include "source/common/proxy_protocol/proxy_protocol.h"
#include "source/common/router/metadatamatchcriteria_impl.h"
#include "source/common/router/shadow_writer_impl.h"
#include "source/common/stream_info/stream_id_provider_impl.h"
#include "source/common/stream_info/uint64_accessor_impl.h"
#include "source/common/tracing/http_tracer_impl.h"
#include "source/extensions/common/proxy_protocol/proxy_protocol_header.h"

namespace Envoy {
namespace TcpProxy {
Expand Down Expand Up @@ -155,8 +155,7 @@ Config::SharedConfig::SharedConfig(
}

if (!config.proxy_protocol_tlvs().empty()) {
proxy_protocol_tlvs_ =
Extensions::Common::ProxyProtocol::parseTLVs(config.proxy_protocol_tlvs());
proxy_protocol_tlvs_ = Common::ProxyProtocol::parseTLVs(config.proxy_protocol_tlvs());
}
}

Expand Down
2 changes: 1 addition & 1 deletion source/common/tcp_proxy/tcp_proxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ class Config {
Random::RandomGenerator& randomGenerator() { return random_generator_; }
bool flushAccessLogOnConnected() const { return shared_config_->flushAccessLogOnConnected(); }
Regex::Engine& regexEngine() const { return regex_engine_; }
Network::ProxyProtocolTLVVector proxyProtocolTLVs() const {
const Network::ProxyProtocolTLVVector& proxyProtocolTLVs() const {
return shared_config_->proxyProtocolTLVs();
}

Expand Down
10 changes: 0 additions & 10 deletions source/extensions/common/proxy_protocol/proxy_protocol_header.cc
Original file line number Diff line number Diff line change
Expand Up @@ -173,16 +173,6 @@ void generateV2LocalHeader(Buffer::Instance& out) {
out.add(addr_fam_protocol_and_length, 4);
}

Network::ProxyProtocolTLVVector
parseTLVs(absl::Span<const envoy::config::core::v3::ProxyProtocolTLV* const> tlvs) {
Network::ProxyProtocolTLVVector tlv_vector;
for (const auto& tlv : tlvs) {
const std::vector<unsigned char> value(tlv->value().begin(), tlv->value().end());
tlv_vector.push_back({static_cast<uint8_t>(tlv->type()), value});
}
return tlv_vector;
}

} // namespace ProxyProtocol
} // namespace Common
} // namespace Extensions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,6 @@ void generateV2LocalHeader(Buffer::Instance& out);
bool generateV2Header(const Network::ProxyProtocolData& proxy_proto_data, Buffer::Instance& out,
bool pass_all_tlvs, const absl::flat_hash_set<uint8_t>& pass_through_tlvs);

// Parses proxy protocol TLVs from the given configuration.
Network::ProxyProtocolTLVVector
parseTLVs(absl::Span<const envoy::config::core::v3::ProxyProtocolTLV* const> tlvs);

} // namespace ProxyProtocol
} // namespace Common
} // namespace Extensions
Expand Down
19 changes: 19 additions & 0 deletions test/common/proxy_protocol/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
load(
"//bazel:envoy_build_system.bzl",
"envoy_cc_test",
"envoy_package",
)

licenses(["notice"]) # Apache 2

envoy_package()

envoy_cc_test(
name = "proxy_protocol_test",
srcs = ["proxy_protocol_test.cc"],
rbe_pool = "6gig",
deps = [
"//source/common/proxy_protocol:proxy_protocol_lib",
"//test/test_common:utility_lib",
],
)
34 changes: 34 additions & 0 deletions test/common/proxy_protocol/proxy_protocol_test.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#include "source/common/common/logger.h"
#include "source/common/proxy_protocol/proxy_protocol.h"

#include "test/test_common/utility.h"

#include "gmock/gmock.h"
#include "gtest/gtest.h"

namespace Envoy {
namespace Common {
namespace ProxyProtocol {
namespace {

TEST(ProxyProtocolHeaderTest, ParseTLVs) {
Protobuf::RepeatedPtrField<envoy::config::core::v3::ProxyProtocolTLV> tlvs;
auto* tlv = tlvs.Add();
tlv->set_type(0x1);
tlv->set_value("tlv1");
tlv = tlvs.Add();
tlv->set_type(0xE1);
tlv->set_value("tlv2");
const auto tlv_vector = parseTLVs(tlvs);

EXPECT_EQ(2, tlv_vector.size());
EXPECT_EQ(0x1, tlv_vector[0].type);
EXPECT_EQ(std::vector<unsigned char>({'t', 'l', 'v', '1'}), tlv_vector[0].value);
EXPECT_EQ(0xE1, tlv_vector[1].type);
EXPECT_EQ(std::vector<unsigned char>({'t', 'l', 'v', '2'}), tlv_vector[1].value);
}

} // namespace
} // namespace ProxyProtocol
} // namespace Common
} // namespace Envoy
Original file line number Diff line number Diff line change
Expand Up @@ -211,23 +211,6 @@ TEST(ProxyProtocolHeaderTest, GeneratesV2WithTLVExceedingLengthLimit) {
generateV2Header(proxy_proto_data, buff, true, {}));
}

TEST(ProxyProtocolHeaderTest, ParseTLVs) {
Protobuf::RepeatedPtrField<envoy::config::core::v3::ProxyProtocolTLV> tlvs;
auto* tlv = tlvs.Add();
tlv->set_type(0x1);
tlv->set_value("tlv1");
tlv = tlvs.Add();
tlv->set_type(0xE1);
tlv->set_value("tlv2");
const auto tlv_vector = parseTLVs(tlvs);

EXPECT_EQ(2, tlv_vector.size());
EXPECT_EQ(0x1, tlv_vector[0].type);
EXPECT_EQ(std::vector<unsigned char>({'t', 'l', 'v', '1'}), tlv_vector[0].value);
EXPECT_EQ(0xE1, tlv_vector[1].type);
EXPECT_EQ(std::vector<unsigned char>({'t', 'l', 'v', '2'}), tlv_vector[1].value);
}

} // namespace
} // namespace ProxyProtocol
} // namespace Common
Expand Down

0 comments on commit aece64a

Please sign in to comment.