Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

http: add CONNECT-UDP support #27714

Merged
merged 36 commits into from
Jun 22, 2023
Merged

Conversation

jeongseokson
Copy link
Contributor

@jeongseokson jeongseokson commented May 31, 2023

Commit Message:
This commit adds CONNECT-UDP (RFC 9298) support. UdpConnPool is added to create a UDP socket for a new CONNECT-UDP request, and UDPUpstream is added to maintain the socket and other relevant data associated with UDP upstreams.

We added an integration test for the terminating CONNECT-UDP proxy, but not the forwarding proxy in this commit. We are going to add test cases to cover the forwarding proxy scenario in a subsequent commit.

Additional Description:
Risk Level: Medium, the feature can only be enabled by the new configuration added in this commit.
Testing: Integration test
Runtime guard: envoy.reloadable_features.enable_connect_udp_support
Release Notes: added support for CONNECT-UDP (RFC 9298). Can be disabled by setting runtime feature envoy.reloadable_features.enable_connect_udp_support to false.

jeongseokson and others added 10 commits May 31, 2023 00:36
I also added a basic integration test of sending and receiving data
between a client and UDP server through Envoy proxy using CONNECT-UDP.

Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
@repokitteh-read-only
Copy link

CC @envoyproxy/api-shepherds: Your approval is needed for changes made to (api/envoy/|docs/root/api-docs/).
envoyproxy/api-shepherds assignee is @lizan
CC @envoyproxy/api-watchers: FYI only for changes made to (api/envoy/|docs/root/api-docs/).

🐱

Caused by: #27714 was opened by jeongseokson.

see: more, trace.

@jeongseokson
Copy link
Contributor Author

/assign @DavidSchinazi

David will do a first pass review. Thank you!

@jeongseokson
Copy link
Contributor Author

What's the right way to add api/envoy/extensions/upstreams/http/udp/v3/udp_connection_pool.proto? The check_and_fix_proto_format CI complains about it.

@tyxia
Copy link
Member

tyxia commented Jun 1, 2023

What's the right way to add api/envoy/extensions/upstreams/http/udp/v3/udp_connection_pool.proto? The check_and_fix_proto_format CI complains about it.

Drive-by comment.... The proto BUILD file is generated by tool. Once you have the correct proto change (e.g., import, namespace, etc), you can run fix_proto_format. I used sudo ./ci/run_envoy_docker.sh '\''./ci/do_ci.sh fix_proto_format locally.

@jeongseokson
Copy link
Contributor Author

What's the right way to add api/envoy/extensions/upstreams/http/udp/v3/udp_connection_pool.proto? The check_and_fix_proto_format CI complains about it.

Drive-by comment.... The proto BUILD file is generated by tool. Once you have the correct proto change (e.g., import, namespace, etc), you can run fix_proto_format. I used sudo ./ci/run_envoy_docker.sh '\''./ci/do_ci.sh fix_proto_format locally.

I tried it and it deleted both the proto and the BUILD file. Tried it with the proto file alone then it complained about missing the BUILD file. I guess I should have written the proto in a different way? I don't see any Envoy documentation about this.

Copy link
Contributor

@DavidSchinazi DavidSchinazi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, this is overall in great shape!

~GenericConnPoolFactory() override = default;

/*
* @param options for creating the transport socket
* @return may be null
*/
virtual GenericConnPoolPtr
createGenericConnPool(Upstream::ThreadLocalCluster& thread_local_cluster, bool is_connect,
createGenericConnPool(Upstream::ThreadLocalCluster& thread_local_cluster,
GenericConnPoolFactory::UpstreamProtocol is_connect,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we rename is_connect to upstream_protocol?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RIght, done.

// Rewrites the host of CONNECT-UDP requests.
if (HeaderUtility::isConnectUdp(*request_headers_) &&
!HeaderUtility::rewriteAuthorityForConnectUdp(*request_headers_)) {
sendLocalReply(Code::BadRequest, "Invalid URI Template in the path", nullptr, absl::nullopt,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this makes more sense to be Code::NotFound similar to CONNECT above – conceptually, the path the client used isn't invalid, we just don't expect CONNECT-UDP there.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense. Done.

@@ -20,6 +20,15 @@
namespace Envoy {
namespace Http {

namespace {

const Regex::CompiledGoogleReMatcher& connectUdpPathMatcher() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A regex seems pretty heavyweight for something this simple. I'd assume we'd get noticeably better performance by checking whether the path is prefixed by /.well-known/masque/udp/, removing the prefix and then splitting on /.

That said, this could be a premature optimization. Is there precedent for regex vs split in the codebase currently?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regex is used in Envoy mainly for rewriting headers based on the user configuration. I agree that in this case, regex could be an overkill. I think this could make more sense in a later stage if we want to support more custom URI Templates. I will remove regex as you suggested.

source/common/http/header_utility.cc Show resolved Hide resolved
// TODO(https://github.com/envoyproxy/envoy/issues/23564): Http3 Datagram support should be
// turned on by returning quic::HttpDatagramSupport::kRfc once the CONNECT-UDP support work is
// completed.
#ifdef ENVOY_ENABLE_HTTP_DATAGRAMS
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be a runtime guard instead of compile time? Ideally the presence of CONNECT-UDP in the config should enable this. Same comment for all other uses of this macro in this PR

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So this macro is for excluding HTTP Capsule support from the Envoy Mobile builds. I think the right way would be adding the runtime guard as well as this macro guard. I will add the runtime guard accordingly.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added the runtime guard.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the purpose of removing this from Envoy Mobile at compile time? They're tight on binary size but this is something that will be needed there eventually and a macro adds complexity

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was added in the previous PR as Alyssa and Ryan wanted to have an option to include or exclude Http Datagram support in the Envoy Mobile build. Here's the relevant discussion in the previous PR: #25925 (comment)

If we all agree that it's no longer necessary, I would like to remove it likewise. Perhaps it would be a separate PR to make this one concise.

bool UdpUpstream::OnCapsule(const quiche::Capsule& capsule) {
quiche::CapsuleType capsule_type = capsule.capsule_type();
if (capsule_type != quiche::CapsuleType::DATAGRAM) {
// Silently drops Datagram Capsules with an unknown type.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: these aren't datagram capsules

Suggested change
// Silently drops Datagram Capsules with an unknown type.
// Silently drops capsules with an unknown type.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. Thanks.


Network::SocketPtr createSocket(const Upstream::HostConstSharedPtr& host) {
return std::make_unique<Network::SocketImpl>(Network::Socket::Type::Datagram, host->address(),
nullptr, Network::SocketCreationOptions{});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: /*variable_name=*/nullptr

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

std::string received_capsule_fragment =
absl::HexStringToBytes("00" // DATAGRAM capsule type
"08" // capsule length
"a1a2a3a4a5a6a7a8" // HTTP Datagram payload
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why doesn't this have the 00 byte of the contextID=0?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think I misunderstood the specification. Fixed the error in the test cases as well as the UdpUpstream.

Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
Copy link
Contributor Author

@jeongseokson jeongseokson left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks a lot for reviewing the PR, David. I will send another commit to complete the fix.

// Rewrites the host of CONNECT-UDP requests.
if (HeaderUtility::isConnectUdp(*request_headers_) &&
!HeaderUtility::rewriteAuthorityForConnectUdp(*request_headers_)) {
sendLocalReply(Code::BadRequest, "Invalid URI Template in the path", nullptr, absl::nullopt,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense. Done.

// TODO(https://github.com/envoyproxy/envoy/issues/23564): Http3 Datagram support should be
// turned on by returning quic::HttpDatagramSupport::kRfc once the CONNECT-UDP support work is
// completed.
#ifdef ENVOY_ENABLE_HTTP_DATAGRAMS
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So this macro is for excluding HTTP Capsule support from the Envoy Mobile builds. I think the right way would be adding the runtime guard as well as this macro guard. I will add the runtime guard accordingly.

Event::FileReadyType::Read);
}

void UdpUpstream::encodeData(Buffer::Instance& data, bool /*end_stream*/) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your assumption is correct. Thanks for catching this. I thought Capsules could not span across multiple DATA frames. Done.

}

Envoy::Http::Status UdpUpstream::encodeHeaders(const Envoy::Http::RequestHeaderMap&,
bool /*end_stream*/) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If end_stream is set, it means the request is header only. The existing CONNECT (TCP) implementation in Envoy uses it only for supporting PROXY protocol, which I assume not relevant to CONNECT-UDP, so I didn't find the use of the end_stream in this method. Let me know if you think otherwise.


Network::SocketPtr createSocket(const Upstream::HostConstSharedPtr& host) {
return std::make_unique<Network::SocketImpl>(Network::Socket::Type::Datagram, host->address(),
nullptr, Network::SocketCreationOptions{});
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

std::string received_capsule_fragment =
absl::HexStringToBytes("00" // DATAGRAM capsule type
"08" // capsule length
"a1a2a3a4a5a6a7a8" // HTTP Datagram payload
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think I misunderstood the specification. Fixed the error in the test cases as well as the UdpUpstream.

@@ -20,6 +20,15 @@
namespace Envoy {
namespace Http {

namespace {

const Regex::CompiledGoogleReMatcher& connectUdpPathMatcher() {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regex is used in Envoy mainly for rewriting headers based on the user configuration. I agree that in this case, regex could be an overkill. I think this could make more sense in a later stage if we want to support more custom URI Templates. I will remove regex as you suggested.

source/common/http/header_utility.cc Show resolved Hide resolved
Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
@repokitteh-read-only
Copy link

CC @envoyproxy/runtime-guard-changes: FYI only for changes made to (source/common/runtime/runtime_features.cc).

🐱

Caused by: #27714 was synchronize by jeongseokson.

see: more, trace.

Copy link
Contributor Author

@jeongseokson jeongseokson left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resolved the rest of the issues such as IPv6 parsing. Can you please review my new changes, David? Thank you.

source/common/http/header_utility.cc Show resolved Hide resolved
// TODO(https://github.com/envoyproxy/envoy/issues/23564): Http3 Datagram support should be
// turned on by returning quic::HttpDatagramSupport::kRfc once the CONNECT-UDP support work is
// completed.
#ifdef ENVOY_ENABLE_HTTP_DATAGRAMS
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added the runtime guard.

Copy link
Contributor

@DavidSchinazi DavidSchinazi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall this looks great! Please send to wider review after addressing these last comments

ASSERT(!ip_address.empty());
// Removes the Zone ID in the IPv6 address.
std::vector<absl::string_view> ip_address_split = absl::StrSplit(ip_address, '%');
if (ip_address_split.empty()) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be an assert? The array should have at least one element when the string isn't empty

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, yes this is not necessary because ip_address_split will be empty anyway if the ip_address is empty and the function will return false. Done.

if (ip_address_split.empty()) {
return false;
}
sockaddr_in6 addr_in;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: seems like you don't need a full sockaddr_in6 here, just an in6_addr

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

source/common/http/header_utility.cc Show resolved Hide resolved
// TODO(https://github.com/envoyproxy/envoy/issues/23564): Http3 Datagram support should be
// turned on by returning quic::HttpDatagramSupport::kRfc once the CONNECT-UDP support work is
// completed.
#ifdef ENVOY_ENABLE_HTTP_DATAGRAMS
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the purpose of removing this from Envoy Mobile at compile time? They're tight on binary size but this is something that will be needed there eventually and a macro adds complexity

}

Envoy::Http::Status UdpUpstream::encodeHeaders(const Envoy::Http::RequestHeaderMap&,
bool /*end_stream*/) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Per the spec The lifetime of the socket is tied to the request stream so if we get a FIN on the stream then we should tear everything down. It would be silly for the client to FIN the stream right after the headers but if it happens we should tear everything down and not bother opening the socket at all. Maybe reply with status code 400?

TEST(HeaderIsValidTest, IsConnectUdp) {
EXPECT_TRUE(
HeaderUtility::isConnectUdp(Http::TestRequestHeaderMapImpl{{"upgrade", "connect-udp"}}));
// Extended CONNECT requests should be normalied to HTTP/1.1.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// Extended CONNECT requests should be normalied to HTTP/1.1.
// Extended CONNECT requests should be normalized to HTTP/1.1.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

EXPECT_TRUE(HeaderUtility::rewriteAuthorityForConnectUdp(connect_udp_request));
EXPECT_EQ(connect_udp_request.getHostValue(), "foo.lyft.com:80");
TestRequestHeaderMapImpl connect_udp_request_ipv6{
{":path", "/.well-known/masque/udp/2001:0db8:85a3::8a2e:0370:7334/80/"},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Per the spec if "target_host" contains an IPv6 literal, the colons (":") MUST be percent-encoded. For example, if the target host is "2001:db8::42", it will be encoded in the URI as "2001%3Adb8%3A%3A42".

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

source/common/http/header_utility.cc Show resolved Hide resolved
const std::string sent_capsule_fragment =
absl::HexStringToBytes("00" // DATAGRAM capsule type
"08" // capsule length
"00a1a2a3a4a5a6a7" // UDP Proxying HTTP Datagram payload
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"00a1a2a3a4a5a6a7" // UDP Proxying HTTP Datagram payload
"00" // context ID
"a1a2a3a4a5a6a7" // UDP Proxying Payload

Same below

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Neat! Done.

Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
@RyanTheOptimist
Copy link
Contributor

Thank you, @lizan.

@RyanTheOptimist I figured out the cause of the timeout error. It's the combination of QUICHE's expiration time of QUIC Datagram in its Datagram queue, and Envoy using the defer_send_in_response_to_packets_ of the QUIC connection config for CPU usage optimization.

I've made a temporary fix in this PR by setting a higher expiry time for QUIC Datagrams on the Envoy side, but the real fix requires the QUICHE library change, probably setting the default minimum expiry time higher. If you are fine with this temporary fix, I will send a subsequent PR for removing the temporary fix after this one gets merged, the QUICHE change is made, and rolled into Envoy.

Looks like the CI is blocked due to the conflict in the changelogs/current.yaml. Could you resolve it? Thank you!

To fix the changelog you'll need to do a main merge.

Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
@jeongseokson
Copy link
Contributor Author

/retest

@RyanTheOptimist
Copy link
Contributor

Looks like some tidy failures here:

https://dev.azure.com/cncf/envoy/_build/results?buildId=140504&view=logs&jobId=b7634614-24f3-5416-e791-4f3affaaed6c&j=b7634614-24f3-5416-e791-4f3affaaed6c&t=d565ee52-b888-5d80-7fea-dfaed104c390

Also coverage:

Code coverage for source/extensions/upstreams is lower than limit of 96.6 (93.8)
Code coverage for source/extensions/upstreams/http is lower than limit of 96.6 (93.1)
Code coverage for source/extensions/upstreams/http/generic is lower than limit of 96.6 (84.6)
Code coverage for source/extensions/upstreams/http/udp is lower than limit of 96.6 (78.0)

Detailed coverage results here:
https://storage.googleapis.com/envoy-pr/e9f2ada/coverage/index.html

Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
@RyanTheOptimist
Copy link
Contributor

/wait
on CI

I also added the extensions/upstreams/http/generic to the exception list
for the coverage test due to the coverage bug of excluding brackets of
    case statements.

Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
@repokitteh-read-only
Copy link

CC @envoyproxy/coverage-shephards: FYI only for changes made to (test/per_file_coverage.sh).
envoyproxy/coverage-shephards assignee is @RyanTheOptimist

🐱

Caused by: #27714 was synchronize by jeongseokson.

see: more, trace.

@jeongseokson
Copy link
Contributor Author

jeongseokson commented Jun 22, 2023

Hi @RyanTheOptimist

I added more test cases to increase the test coverage.

Because of the coverage bug of excluding nested brackets of case statements, it's not possible to reach the coverage threshold in extensions/upstreams/http/generic/config.cc (https://storage.googleapis.com/envoy-pr/e9f2ada/coverage/source/extensions/upstreams/http/generic/config.cc.gcov.html). I added an additional test case to cover "return nullptr;" but still the maximum coverage I can achieve is 88.5 because of the bug of the coverage CI.

I added it to the exception list to make it pass the coverage test. I set the threshold as 85.0 to leave some headroom. Let me know if you have any comments or questions. Thank you!

Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
@jeongseokson
Copy link
Contributor Author

/retest

Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
@RyanTheOptimist RyanTheOptimist merged commit b4f3755 into envoyproxy:main Jun 22, 2023
92 checks passed
asheryerm pushed a commit to asheryerm/envoy that referenced this pull request Jul 5, 2023
Commit Message:
This commit adds CONNECT-UDP (RFC 9298) support. UdpConnPool is added to create a UDP socket for a new CONNECT-UDP request, and UDPUpstream is added to maintain the socket and other relevant data associated with UDP upstreams.

We added an integration test for the terminating CONNECT-UDP proxy, but not the forwarding proxy in this commit. We are going to add test cases to cover the forwarding proxy scenario in a subsequent commit.

Additional Description:
Risk Level: Medium, the feature can only be enabled by the new configuration added in this commit.
Testing: Integration test
Runtime guard: envoy.reloadable_features.enable_connect_udp_support
Release Notes: added support for CONNECT-UDP (RFC 9298). Can be disabled by setting runtime feature envoy.reloadable_features.enable_connect_udp_support to false.

Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
Co-authored-by: asingh-g <abhisinghx@google.com>
Signed-off-by: asheryer <asheryer@amazon.com>
reskin89 pushed a commit to reskin89/envoy that referenced this pull request Jul 11, 2023
Commit Message:
This commit adds CONNECT-UDP (RFC 9298) support. UdpConnPool is added to create a UDP socket for a new CONNECT-UDP request, and UDPUpstream is added to maintain the socket and other relevant data associated with UDP upstreams.

We added an integration test for the terminating CONNECT-UDP proxy, but not the forwarding proxy in this commit. We are going to add test cases to cover the forwarding proxy scenario in a subsequent commit.

Additional Description:
Risk Level: Medium, the feature can only be enabled by the new configuration added in this commit.
Testing: Integration test
Runtime guard: envoy.reloadable_features.enable_connect_udp_support
Release Notes: added support for CONNECT-UDP (RFC 9298). Can be disabled by setting runtime feature envoy.reloadable_features.enable_connect_udp_support to false.

Signed-off-by: Jeongseok Son <jeongseok.son@gmail.com>
Co-authored-by: asingh-g <abhisinghx@google.com>
Signed-off-by: Ryan Eskin <ryan.eskin89@protonmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

10 participants