// TODO(danzh): this is called on each write. Consider to return an address instance on the stack if
quic::QuicSocketAddress envoyIpAddressToQuicSocketAddress(const Network::Address::Ip* envoy_ip) {
*reinterpret_cast<absl::uint128*>(ipv6_addr->sin6_addr.s6_addr) = envoy_ip->ipv6()->address();
headers.iterate([&header_block](const Http::HeaderEntry& header) -> Http::HeaderMap::Iterate {
quic::QuicRstStreamErrorCode envoyResetReasonToQuicRstError(Http::StreamResetReason reason) {
Http::StreamResetReason quicRstErrorToEnvoyLocalResetReason(quic::QuicRstStreamErrorCode rst_err) {
Http::StreamResetReason quicRstErrorToEnvoyRemoteResetReason(quic::QuicRstStreamErrorCode rst_err) {
std::function<void(Network::ConnectionSocket&, quic::QuicNetworkHandle)> custom_bind_func) {
connection_socket->addOptions(Network::SocketOptionFactory::buildRxQueueOverFlowOptions());
int deduceSignatureAlgorithmFromPublicKey(const EVP_PKEY* public_key, std::string* error_details) {
if (ecdsa_group == nullptr || EC_GROUP_get_curve_name(ecdsa_group) != NID_X9_62_prime256v1) {
int32_t max_streams = PROTOBUF_GET_WRAPPED_OR_DEFAULT(config, max_concurrent_streams, 100);
quic_config.SetConnectionOptionsToSend(quic::ParseQuicTagVector(config.connection_options()));
void configQuicInitialFlowControlWindow(const envoy::config::core::v3::QuicProtocolOptions& config,
// Config connection level flow control window shouldn't be smaller than the minimum flow control