Skip to content

Commit

Permalink
Add an option to set the socket buffer size
Browse files Browse the repository at this point in the history
Signed-off-by: Fredy Wijaya <[email protected]>
  • Loading branch information
fredyw committed Jul 15, 2024
1 parent c29e205 commit 868693a
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 0 deletions.
13 changes: 13 additions & 0 deletions mobile/library/cc/engine_builder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,11 @@ EngineBuilder& EngineBuilder::setSocketReceiveBufferSize(int32_t size) {
return *this;
}

EngineBuilder& EngineBuilder::setSocketSendBufferSize(int32_t size) {
socket_send_buffer_size_ = size;
return *this;
}

EngineBuilder& EngineBuilder::enableDrainPostDnsRefresh(bool drain_post_dns_refresh_on) {
enable_drain_post_dns_refresh_ = drain_post_dns_refresh_on;
return *this;
Expand Down Expand Up @@ -734,6 +739,14 @@ std::unique_ptr<envoy::config::bootstrap::v3::Bootstrap> EngineBuilder::generate
rcv_buf_sock_opt->set_int_value(socket_receive_buffer_size_);
rcv_buf_sock_opt->set_description(
absl::StrCat("SO_RCVBUF = ", socket_receive_buffer_size_, " bytes"));

envoy::config::core::v3::SocketOption* snd_buf_sock_opt =
base_cluster->mutable_upstream_bind_config()->add_socket_options();
snd_buf_sock_opt->set_name(SO_SNDBUF);
snd_buf_sock_opt->set_level(SOL_SOCKET);
snd_buf_sock_opt->set_int_value(socket_send_buffer_size_);
snd_buf_sock_opt->set_description(
absl::StrCat("SO_SNDBUF = ", socket_send_buffer_size_, " bytes"));
// Set the network service type on iOS, if supplied.
#if defined(__APPLE__)
if (ios_network_service_type_ > 0) {
Expand Down
5 changes: 5 additions & 0 deletions mobile/library/cc/engine_builder.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ class EngineBuilder {
// Sets whether to use GRO for upstream UDP sockets (QUIC/HTTP3).
EngineBuilder& setUseGroIfAvailable(bool use_gro_if_available);
EngineBuilder& setSocketReceiveBufferSize(int32_t size);
EngineBuilder& setSocketSendBufferSize(int32_t size);
EngineBuilder& enforceTrustChainVerification(bool trust_chain_verification_on);
EngineBuilder& setUpstreamTlsSni(std::string sni);
EngineBuilder& enablePlatformCertificatesValidation(bool platform_certificates_validation_on);
Expand Down Expand Up @@ -183,6 +184,10 @@ class EngineBuilder {
// This is the same value Cronet uses for QUIC:
// https://source.chromium.org/chromium/chromium/src/+/main:net/quic/quic_context.h;drc=ccfe61524368c94b138ddf96ae8121d7eb7096cf;l=87
int32_t socket_receive_buffer_size_ = 1024 * 1024; // 1MB
// This is the same value Cronet uses for QUIC:
// https://source.chromium.org/chromium/chromium/src/+/main:net/quic/quic_session_pool.cc;l=790-793;drc=7f04a8e033c23dede6beae129cd212e6d4473d72
// https://source.chromium.org/chromium/chromium/src/+/main:net/third_party/quiche/src/quiche/quic/core/quic_constants.h;l=43-47;drc=34ad7f3844f882baf3d31a6bc6e300acaa0e3fc8
int32_t socket_send_buffer_size_ = 1452 * 20;
};

using EngineBuilderSharedPtr = std::shared_ptr<EngineBuilder>;
Expand Down
30 changes: 30 additions & 0 deletions mobile/test/cc/unit/envoy_config_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,36 @@ TEST(TestConfig, SocketReceiveBufferSize) {
EXPECT_EQ(rcv_buf_option->level(), SOL_SOCKET);
EXPECT_EQ(rcv_buf_option->int_value(), 1024 * 1024 /* 1 MB */);
}

TEST(TestConfig, SocketSendBufferSize) {
EngineBuilder engine_builder;
engine_builder.enableHttp3(true);

std::unique_ptr<Bootstrap> bootstrap = engine_builder.generateBootstrap();
Cluster const* base_cluster = nullptr;
for (const Cluster& cluster : bootstrap->static_resources().clusters()) {
if (cluster.name() == "base") {
base_cluster = &cluster;
break;
}
}

// The base H3 cluster should always be found.
ASSERT_THAT(base_cluster, NotNull());

SocketOption const* snd_buf_option = nullptr;
for (const SocketOption& sock_opt : base_cluster->upstream_bind_config().socket_options()) {
if (sock_opt.name() == SO_SNDBUF) {
snd_buf_option = &sock_opt;
break;
}
}

// When using an H3 cluster, the UDP send buffer size option should always be set.
ASSERT_THAT(snd_buf_option, NotNull());
EXPECT_EQ(snd_buf_option->level(), SOL_SOCKET);
EXPECT_EQ(snd_buf_option->int_value(), 1452 * 20);
}
#endif

TEST(TestConfig, EnablePlatformCertificatesValidation) {
Expand Down

0 comments on commit 868693a

Please sign in to comment.